Creare file Microsoft Excel .XLS e .XLSX con Apache POI

DOMANDA:

In Java è possibile creare un file Microsoft Excel .xls o .xlsx?


RISPOSTA:

Così come visto per i file Microsoft Word .doc e .docx è possibile creare dei file Microsoft Excel .xls e .xlsx con la libreria gratuita Apache Poi.

Guardiamo insieme un esempio:

package xsl;

import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

public class XlsApachePoi {
   public static void main(String[] args) throws Throwable {
      Workbook wb = new SXSSFWorkbook(100); // creo il file (100 righe massimo in memoria)
      Sheet sh = wb.createSheet(); // creo un foglio

      for(int numRighe = 0; numRighe < 100; numRighe++){
         Row row = sh.createRow(numRighe); // creo una riga

         for(int cellnum = 0; cellnum < 10; cellnum++) {
            Cell cell = row.createCell(cellnum); // creo una cella all'interno della riga
            String indirizzoCella = new CellReference(cell).formatAsString(); // prendo le coordinate della cella
            cell.setCellValue(indirizzoCella); // setto il valore
         }
      }

      FileOutputStream out = new FileOutputStream("C:\\prova.xlsx");
      wb.write(out);
      out.close();
      System.out.println("File creato correttamente");
   }
}

Per far funzionare l'esempio sono necessari i seguenti jar, tutti disponibili nelle librerie Apache Poi versione 3.8, da importare, ovviamente, nel Build Path del nostro progetto:
- poi-3.8-xxxxxxxx.jar (al posto delle x c'è la data di rilascio)
- poi-ooxml-3.8-xxxxxxxx.jar

Lanciando la classe XlsApachePoi, in C:\ troverete il file prova.xlsx correttamente riempito.


Il codice è abbastanza semplice, ma merita un approfondimento la seguente riga:

Workbook wb = new SXSSFWorkbook(100);

L'oggetto SXSSFSWorkbook accetta come parametro il numero massimo di righe da tenere in memoria prima di scriverle sul disco (in un file temporaneo). Nel nostro caso abbiamo abbiamo deciso che non ne conserva più di 100, dopodiché farà un flush di dati dalla memoria al disco.

Il problema a cui si può andare incontro quando si lavora con molte righe è che, mettendo un valore troppo alto o -1 (che disabilita l'autoflush sul disco), il file temporaneo generato potrebbe arrivare ad occupare troppo spazio (20 MB di dati csv possono occupare più di un GB nel file temporaneo xml!!).


Per rimediare possiamo sostituire la riga in questione con:

SXSSFWorkbook wb = new SXSSFWorkbook();
wb.setCompressTempFiles(true);

Aggiungendo il setCompressTempFiles(true) il file temporaneo verrà gzippato risparmiando notevole spazio.


Per gli approfondimenti su Apache POI vi rimando al sito ufficiale.


Commenti

Post popolari in questo blog

Arrotondamento e troncamento in Java

Eclipse: Shortcuts (scorciatoie) da tastiera

Strutture dati: List, Set, Map

Creare un eseguibile Java