Ich musste eine große XLSX-Datei in CSV konvertieren, also habe ich Apache POI verwendet, um damit umzugehen. Ich werde eine Notiz hinterlassen, worüber ich vorsichtig war. Das Beispielprojekt ist [hier]
Java:1.8 POI:3.17
Es gibt keine Unterstützung für Zellformate oder -formate. Das xls-Format (2003-Format) wird nicht unterstützt (offiziell gab es eine Beispielquelle, die xls unterstützt).
Verwenden Sie die API Streaming (ala SAX) in der Funktionsübersicht auf der offiziellen Website (https://poi.apache.org/spreadsheet/). Es scheint nicht viel Speicher zu verbrauchen, da es von SAX (Simple API for XML) gelesen wird.
Sie können XLSX in CSV konvertieren, indem Sie die folgende Quelle kopieren und die Konvertierungsmethode ausführen.
Beispiel für die Konvertierung von XLSX in CSV
/**
*Konvertieren Sie die XLSX-Datei in eine CSV-Datei<br>
*Selbst wenn die XLSX-Datei mehrere Blätter enthält, wird nur das erste Blatt als Ziel ausgewählt.
*
* @param fromXlsxPath Pfad der zu konvertierenden XLSX-Datei
* @param toCsvPath Pfad der zu konvertierenden CSV-Datei (überschreiben, wenn vorhandener Pfad angegeben ist)
*/
public static void convert(Path fromXlsxPath, Path toCsvPath) {
System.out.println("Starten Sie XlsxToCsvUtil#convert");
try (OPCPackage pkg = OPCPackage.open(fromXlsxPath.toAbsolutePath().toString(), PackageAccess.READ);
BufferedWriter bw = Files.newBufferedWriter(toCsvPath, StandardCharsets.UTF_8)) {
ReadOnlySharedStringsTable strings = new ReadOnlySharedStringsTable(pkg);
XSSFReader xssfReader = new XSSFReader(pkg);
StylesTable styleTable = xssfReader.getStylesTable();
try (InputStream is = xssfReader.getSheetsData().next()) {
//Handler-Generierung zum Parsen
ContentHandler handler = new XSSFSheetXMLHandler(
styleTable, null, strings, new XlsxRowHandler(bw), new DataFormatter(), false);
//XML-Reader-Generierung zum Parsen
XMLReader sheetParser = SAXHelper.newXMLReader();
sheetParser.setContentHandler(handler);
System.out.println("Perspektive starten");
sheetParser.parse(new InputSource(is));
System.out.println("Ende der Perspektive");
}
} catch (InvalidOperationException | IOException | SAXException | OpenXML4JException
| ParserConfigurationException e) {
System.out.println("Fehler XlsxToCsvUtil#convert");
}
System.out.println("Fertige XlsxToCsvUtil#convert");
}
/**
*
*/
public static class XlsxRowHandler implements SheetContentsHandler {
private final List<String> row = new ArrayList<>();
private final BufferedWriter bw;
public XlsxRowHandler(BufferedWriter bw) throws IOException {
this.bw = bw;
}
@Override
public void startRow(int rowNum) {
System.out.println(rowNum + "Beginnen Sie mit dem Lesen der Zeile");
row.clear();
}
@Override
public void cell(String cellReference, String formattedValue, XSSFComment comment) {
row.add(formattedValue);
}
@Override
public void endRow(int rowNum) {
try {
bw.write(String.join(",", row.stream().map(c -> "\"" + c + "\"").collect(Collectors.toList())));
bw.newLine();
} catch (IOException e) {
}
}
@Override
public void headerFooter(String text, boolean isHeader, String tagName) {
}
}
Die folgenden Klassen werden vom POI vorbereitet und die Proben sind fast gleich. Ich verstehe die Details nicht.
Das Wichtigste ist "XlsxRowHandler". Dies ist eine Klasse, die die vom POI vorbereitete Schnittstelle implementiert. Die CSV-Ausgabe erfolgt durch Lesen des Inhalts der Zelle mit dieser Klasse und Ausschreiben mit BufferedWriter. Wie Sie anhand des Methodennamens sehen können, wird die Methode zum folgenden Zeitpunkt ausgeführt.
Die SheetContentsHandler # -Zellenmethode wird nicht für leere Zellen aufgerufen. Beim Umgang mit XLSX-Dateien mit leeren Zellen ist eine entsprechende Implementierung erforderlich.
Offizielle Website Auf der Seite hier "[XLSX2CSV](https://svn.apache.org/repos/asf/poi/trunk/" src / examples / src / org / apache / poi / xssf / eventusermodel / XLSX2CSV.java) "ist das offizielle Beispiel.
Recommended Posts