[JAVA] Konvertieren Sie große XLSX-Dateien mit Apache POI in CSV

Überblick

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]

Umgebung

Java:1.8 POI:3.17

wichtiger Punkt

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).

Korrespondenzpolitik

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.

Spreadsheet API Feature Summary

Quelle

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.

Vorsichtsmaßnahmen für die Umsetzung

Die SheetContentsHandler # -Zellenmethode wird nicht für leere Zellen aufgerufen. Beim Umgang mit XLSX-Dateien mit leeren Zellen ist eine entsprechende Implementierung erforderlich.

Referenzseite

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.

Beispielprojekt erstellt

Recommended Posts

Konvertieren Sie große XLSX-Dateien mit Apache POI in CSV
Laden Sie große Dateien mit Apache JMeter herunter
Ich möchte OutOfMemory bei der Ausgabe großer Dateien mit POI vermeiden
[Java] Behandeln Sie Excel-Dateien mit Apache POI
Konvertieren von TSV-Dateien in CSV-Dateien (mit Stückliste) in Ruby
Verwendung von Apache POI
Bearbeiten Sie Excel mit Apache POI
Vermeiden Sie Zip-Bomb-Fehler beim Lesen großer Dateien mit POI
Konvertieren Sie ein zweidimensionales Array mit der Java 8 Stream-API in das CSV-Format
Konvertieren Sie Markdown mit flexmark-java in HTML
Behandeln Sie in GCS hochgeladene CSV-Dateien
Bearbeiten Sie SVG mit Java + Apache Batik und konvertieren Sie es in PNG oder JPEG
Hinweise zum Lesen und Generieren von XLSX-Dateien aus Java mit Apache POI
So teilen Sie Dateien mit Docker Toolbox
Konvertieren Sie die C-Sprache mit Emscripten in JavaScript
Konvertieren Sie SVG-Dateien in Java in PNG-Dateien
Konvertieren Sie mit Ruby von JSON nach TSV und von TSV nach JSON
Konvertieren Sie eine Zeichenfolge mit swift in ein zeichenweises Array
So löschen Sie eine Ressourcendatei mit Spring-Boot
Brennen Sie Dateien mit Ubuntu 18.04 LTS auf CD / DVD