Indice

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