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]
Java:1.8 POI:3.17
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)
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).
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.
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 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.
Recommended Posts