[JAVA] Convertissez de gros fichiers XLSX en CSV avec Apache POI

Aperçu

J'avais besoin de convertir un gros fichier XLSX en CSV, j'ai donc utilisé Apache POI pour le gérer. Je vais laisser une note de ce à quoi j'ai fait attention. L'exemple de projet est [here]

environnement

Java:1.8 POI:3.17

point important

Il n'y a pas de support pour les formats ou formats de cellule. Il ne prend pas en charge le format xls (format 2003) (il y avait officiellement un exemple de source prenant en charge xls)

Politique de correspondance

Utilisez l'API qui dit Streaming (ala SAX) dans l'aperçu des fonctionnalités sur le site officiel (https://poi.apache.org/spreadsheet/). Il ne semble pas consommer beaucoup de mémoire car il est lu par SAX (Simple API for XML).

Spreadsheet API Feature Summary

La source

Vous pouvez convertir XLSX en CSV en copiant la source suivante et en exécutant la méthode de conversion.

Exemple de conversion XLSX vers CSV


	/**
	 *Convertir le fichier XLSX en fichier CSV<br>
	 *Même s'il existe plusieurs feuilles dans le fichier XLSX, seule la première feuille est ciblée.
	 *
	 * @param fromXlsxPath Chemin du fichier XLSX à convertir
	 * @param toCsvPath Chemin du fichier CSV à convertir (écrasé si le chemin existant est spécifié)
	 */
	public static void convert(Path fromXlsxPath, Path toCsvPath) {
		System.out.println("Démarrez 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()) {
				//Génération de gestionnaire pour l'analyse
				ContentHandler handler = new XSSFSheetXMLHandler(
						styleTable, null, strings, new XlsxRowHandler(bw), new DataFormatter(), false);

				//Génération de lecteurs XML pour l'analyse
				XMLReader sheetParser = SAXHelper.newXMLReader();
				sheetParser.setContentHandler(handler);
				System.out.println("Démarrer la perspective");
				sheetParser.parse(new InputSource(is));
				System.out.println("Fin de perspective");
			}

		} catch (InvalidOperationException | IOException | SAXException | OpenXML4JException
				| ParserConfigurationException e) {
			System.out.println("Erreur XlsxToCsvUtil#convert");
		}

		System.out.println("Terminé 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 + "Commencer à lire la ligne");
			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) {
		}
	}

Les classes suivantes sont préparées par POI et les échantillons sont presque les mêmes. Je ne comprends pas les détails.

L'important est "XlsxRowHandler". C'est une classe qui implémente l'interface préparée par POI. La sortie CSV est effectuée en lisant le contenu de la cellule avec cette classe et en l'écrivant avec BufferedWriter. Comme vous pouvez le voir en regardant le nom de la méthode, la méthode est exécutée au moment suivant.

Précautions de mise en œuvre

La méthode de cellule SheetContentsHandler # n'est pas appelée sur des cellules vides. Lorsque vous traitez des fichiers XLSX avec des cellules vides, il est nécessaire de les implémenter en conséquence.

Site de référence

Site officiel Sur la page here, "[XLSX2CSV](https://svn.apache.org/repos/asf/poi/trunk/" src / examples / src / org / apache / poi / xssf / eventusermodel / XLSX2CSV.java) "est l'exemple officiel.

Exemple de projet créé

Recommended Posts

Convertissez de gros fichiers XLSX en CSV avec Apache POI
Téléchargez des fichiers volumineux avec Apache JMeter
Je veux éviter OutOfMemory lors de la sortie de gros fichiers avec POI
[Java] Gérer les fichiers Excel avec Apache POI
Conversion du fichier TSV en fichier CSV (avec BOM) en Ruby
Sortie CSV par Apache Commons CSV
Comment utiliser Apache POI
Manipuler Excel avec Apache POI
Évitez les erreurs de bombe Zip lors de la lecture de gros fichiers avec POI
Convertir un tableau bidimensionnel au format csv avec l'API Java 8 Stream
Convertissez Markdown en HTML avec flexmark-java
Gérer les fichiers CSV téléchargés sur GCS
Modifiez SVG avec Java + Apache Batik et convertissez-le en PNG ou JPEG
Notes pour lire et générer des fichiers xlsx à partir de Java à l'aide d'Apache POI
Comment partager des fichiers avec Docker Toolbox
Convertir le langage C en JavaScript avec Emscripten
Convertir des fichiers SVG en fichiers PNG en Java
Conversion de JSON en TSV et TSV en JSON avec Ruby
Convertissez une chaîne en un tableau caractère par caractère avec Swift
Comment sortir un fichier de ressources avec spring-boot
Graver des fichiers sur CD / DVD avec Ubuntu 18.04 LTS