====== 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("");
}
}
}