====== Come leggere e scrivere file excel da java? ====== ===== Guida che mi è stata molto utile ===== [[http://howtodoinjava.com/apache-commons/readingwriting-excel-files-in-java-poi-tutorial/]] ===== Snipplet di codice ===== FIXME :!: Questo codice è una bozza!! Serve per leggere un file excel con i dati non normalizzati presenti su più fogli. Crea una riga per ogni foglio, le colonne sono la linearizzazione di ogni foglio nel senso che tale linearizzazione viene fatta per riga: per primo verranno messi in file gli elementi della prima riga, poi quelli della seconda, .... ad ogni cambio di foglio si crea una riga nuova. Nota, nel codice è inserito un limite al numero di righe o colonne da importare package net.flaviocdc.java.sici; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; 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.xssf.usermodel.XSSFWorkbook; public class LinearizzaTabella { public static void main(String[] args) throws IOException { String prefissoCella = "CELLA_"; String fileName = args[0]; String sCi = args[1]; String sCf = args[2]; String sRi = args[3]; String sRf = args[4]; InputStream is = null; OutputStream os = null; int colonnaInizio = Integer.valueOf(sCi); int colonnaFine = Integer.valueOf(sCf); int rigaInizio = Integer.valueOf(sRi); int rigaFIne = Integer.valueOf(sRf); int nRighe = rigaFIne - rigaInizio ; int nColonne = colonnaFine - colonnaInizio; int colonnePerFoglio = nRighe * nColonne; Workbook leggiWB = null; Workbook scriviWB = null; try { is = new FileInputStream(fileName); //TODO parametrizzare os = new FileOutputStream("aa.xlsx"); leggiWB = new XSSFWorkbook(is); scriviWB = new XSSFWorkbook(); //Scrivo intestazione Sheet scriviSheet = scriviWB.createSheet("dati"); scriviIntestazione(scriviSheet, colonnePerFoglio, prefissoCella); //adesso il numero di riga deve essere aumentato di uno! for (int i = 0 ; i < leggiWB.getNumberOfSheets() ; i ++) { Sheet foglioCorrente = leggiWB.getSheetAt(i); Row rigaDaScrivere = scriviSheet.createRow(i +1); // creo riga i+1 int iCellaDaScrivere = 0; for (int j = rigaInizio ; j < rigaFIne; j++) { Row rigaCorrente = foglioCorrente.getRow(j); for (int k = colonnaInizio ; k < colonnaFine ; k++){ Cell cellaCorrente = rigaCorrente.getCell(k); Cell cellaDaScrivere = rigaDaScrivere.createCell(iCellaDaScrivere); if (cellaCorrente != null) { switch (cellaCorrente.getCellType()) { case Cell.CELL_TYPE_NUMERIC: double val = cellaCorrente.getNumericCellValue(); cellaDaScrivere.setCellValue(val); break; case Cell.CELL_TYPE_STRING: String s1 = cellaCorrente.getStringCellValue(); cellaDaScrivere.setCellValue(s1); break; case Cell.CELL_TYPE_BOOLEAN: boolean bval = cellaCorrente.getBooleanCellValue(); cellaDaScrivere.setCellValue(bval); break; case Cell.CELL_TYPE_FORMULA: String fval = cellaCorrente.getCellFormula(); cellaDaScrivere.setCellValue(fval); break; default: String s2 = cellaCorrente.getStringCellValue(); cellaDaScrivere.setCellValue(s2); break; } } else { cellaDaScrivere.setCellValue(""); } iCellaDaScrivere++; } } } scriviWB.write(os); } finally { chiudiSicuro(leggiWB); chiudiSicuro(scriviWB); chiudiSicuro(is); chiudiSicuro(os); } } /** * @param scriviSheet foglio su cui scrivere l'intestazione * @param colonnePerFoglio numero di colonne da scrivere * @deprecated Use {@link #scriviIntestazione(Sheet,int,String)} instead */ public static void scriviIntestazione(Sheet scriviSheet, int colonnePerFoglio) { scriviIntestazione(scriviSheet, colonnePerFoglio, "CELLA_"); } /** * @param scriviSheet foglio su cui scrivere l'intestazione * @param colonnePerFoglio numero di colonne da scrivere * @param prefisso TODO */ public static void scriviIntestazione(Sheet scriviSheet, int colonnePerFoglio, String prefisso) { Row r = scriviSheet.createRow(0); for (int i = 0 ; i < colonnePerFoglio ; i++) { Cell c = r.createCell(i); c.setCellValue(prefisso + i); } } public static void chiudiSicuro(Workbook is) { if (is != null) { try { is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void chiudiSicuro(OutputStream is) { if (is != null) { try { is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void chiudiSicuro(InputStream is) { if (is != null) { try { is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } ===== RImappatura colonne ===== package net.flaviocdc.java.sici; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.util.Properties; 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.xssf.usermodel.XSSFWorkbook; public class RimappaColonne { public static void main(String[] args) throws IOException { InputStream is = null; OutputStream os = null; InputStream pis = null; InputStream pis2 = null; Workbook leggiWB = null; Workbook scriviWB = null; Properties prop = new Properties(); String fIn = args[0]; String fOut = args[1]; String fProp = args[2]; try { pis = new FileInputStream(fProp); pis2 = new FileInputStream(fProp); is = new FileInputStream(fIn); os = new FileOutputStream(fOut); prop.load( pis); leggiWB = new XSSFWorkbook(is); scriviWB = new XSSFWorkbook(); //sheet per scrivere Sheet scriviSheet = scriviWB.createSheet("dati"); Sheet leggiSheet = leggiWB.getSheetAt(0); scriviIntestazione(pis2, scriviSheet); for (int nriga = 1 ; nriga < leggiSheet.getLastRowNum() ; nriga++ ) { Row leggiRiga = leggiSheet.getRow(nriga); Row scriviRiga = scriviSheet.createRow(nriga); int colonnaDaScrivere = 0; for (int col = 0 ; col < leggiRiga.getLastCellNum() ; col++) { Cell leggiCella = leggiRiga.getCell(col); String nomeCella = Utils.nomeCella(leggiCella); String val = prop.getProperty(nomeCella) ; if (val != null) { //trovata mappatura colonne! Cell scriviCella = scriviRiga.createCell(colonnaDaScrivere); Utils.copiaCella(leggiCella, scriviCella); colonnaDaScrivere++; } } } scriviWB.write(os); } finally { Utils.chiudiSicuro(os); Utils.chiudiSicuro(pis); Utils.chiudiSicuro(pis2); Utils.chiudiSicuro(is); Utils.chiudiSicuro(leggiWB); Utils.chiudiSicuro(scriviWB); } } private static void scriviIntestazione(InputStream is, Sheet scriviSheet) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(is)); try { //leggo riga per riga int ic = 0; String s = reader.readLine(); Row r = scriviSheet.createRow(0); while (s != null) { String[] sarr = s.split("="); String col = sarr[1]; Cell c = r.createCell(ic); c.setCellValue(col); ic++; s = reader.readLine(); } } finally { Utils.chiudiSicuro(reader); } } } package net.flaviocdc.java.sici; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.Reader; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.util.CellReference; public class Utils { public static void chiudiSicuro(InputStream is) { if (is != null) { try { is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void chiudiSicuro(Reader is) { if (is != null) { try { is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void chiudiSicuro(Workbook is) { if (is != null) { try { is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void chiudiSicuro(OutputStream is) { if (is != null) { try { is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static String nomeCella(Cell leggiCella) { return CellReference.convertNumToColString(leggiCella.getColumnIndex()); } /** * * @param cellaCorrente cella da leggere * @param cellaDaScrivere cella di destinazione */ public static void copiaCella(Cell cellaCorrente, Cell cellaDaScrivere) { if (cellaCorrente != null) { switch (cellaCorrente.getCellType()) { case Cell.CELL_TYPE_NUMERIC: double val = cellaCorrente.getNumericCellValue(); cellaDaScrivere.setCellValue(val); break; case Cell.CELL_TYPE_STRING: String s1 = cellaCorrente.getStringCellValue(); cellaDaScrivere.setCellValue(s1); break; case Cell.CELL_TYPE_BOOLEAN: boolean bval = cellaCorrente.getBooleanCellValue(); cellaDaScrivere.setCellValue(bval); break; case Cell.CELL_TYPE_FORMULA: String fval = cellaCorrente.getCellFormula(); cellaDaScrivere.setCellValue(fval); break; default: String s2 = cellaCorrente.getStringCellValue(); cellaDaScrivere.setCellValue(s2); break; } } else { cellaDaScrivere.setCellValue(""); } } }