Apr 30

Generare file excel in Java con Poi

Tag: Tecnologia, Web, javaGiampiero Granatella @ 15:20

Scopo di questi appunti è creare una servlet che esporti dei dati in excel. Per fare questo userò la libreria POI di Apache.

POI è un insieme di libreire per creare/accedere a diversi tipi di documenti Microsoft (basandosi su Microsoft OLE).

Questa libreria vi permette di creare dei completi documenti Excel suddivisi in fogli, con formule o altri valori ammissibili in Excel. Di seguito riporto una servlet che compone on-line un foglio Excel. Come si può vedere dal codice (che ho volutamente riempito di commenti) POI è di semplicissimo uso.

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;

import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

public class StampaXls extends HttpServlet implements Servlet {
    public StampaXls() {
        super();
    }
    protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
        generate(arg0, arg1);
    }
    private void generate(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        //Metto a opsto il corretto MIME per excel
        res.setContentType(”application/msexcel”);
        //Prendo l’outputStream dal response
        OutputStream out = res.getOutputStream();        
        //Creo un Workbook e poi un foglio di lavoro
        HSSFWorkbook wb          = new HSSFWorkbook();
        HSSFSheet sheet = wb.createSheet();
        // Ora creo una riga notare che sia le righe che le colonne si indirizzano con un numero
        HSSFRow row     = sheet.createRow((short)0);
        //Butto diversi tipi di valori all’interno delle celle
        row.createCell((short)1).setCellValue(1.5);
        row.createCell((short)2).setCellValue(”Una strings”);
        row.createCell((short)3).setCellValue(true);
        out.flush();
        //Scrivo quanto fatto sull'output
        wb.write(out);      
    }
    protected void doPost(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
        generate(arg0, arg1);
    }

}

74 Responses to “Generare file excel in Java con Poi”

  1. pietro says:

    Ciao Giampiero, ti faccio i miei complimenti sulle informazioni e i sorgenti da te realizzati, una cortesia, è possibile avere altri esempi su come realizzare web service con netbeans?

    Grazie,

    Pietro

  2. Antonio says:

    Ciao ho provatpo la tua servlet… premetto che mi sono affacciato da pochissimo nel mondo java e nella programmazione in generale.

    Cmq dicevo, ho provato la servlet e quando la eseguo mi crea un file sconosciuto e mi chiede se voglio salvarlo e cercare un programma in rete che possa aprirlo.

    L’ho salvato e ho cercato di aprirlo con ExCel ma non lo apre… mi dice: “impossibile leggere il file!”.

    Cosa significa? dove sbaglio?

    Ancora una cosa, io vorrei chiederti la cortesia di spiegarmi brevemente come si legge un EXCEL ho trovato qualcosa in rete ma devo dire che i tuoi commenti sono i più chiari.

    Grazie anticipatamente…
    Se rispondi al messaggio mi avvisi per mail per cortesia? magari mi posti il linck dove hai scritto il codice.

    Scusa ancora per il disturbo.
    Antonio

  3. Giampiero Granatella says:

    Per Pietro, appena posso faccio altri esempi.
    Per Antonio, ho poche informazioni per aiutarti. Ma quasi sicuramente ci sono degli errori nel riempire il contenuto dell’excel, se hai errori nel programma, ti sputa fuori un excel non corretto.

    Ciao a tutti

  4. Gaetano says:

    Ciao Giampiero,
    intanto ti faccio i complimenti per il Blog, molto utile e interessante, poi ti volevo chiedere una cosa. Ho la necessità di crearmi un file XLS con i dati di una query SQL, tutto questo lo vorrei fare con JAVA o con una Servlet che viene richiamata da un link. La cosa che non riesco a fare è che io voglio che il file lo salvi in una posizione predefinita del Disco (Server) e che non mi faccia fare il download del file. Mi puoi dare delle informazioni a riguardo se non ti chiedo troppo. Grazie Mille, Saluti

  5. Giampiero Granatella says:

    Ciao, grazie per i complimenti. Fare quello che chiedi è abbastanza semplice usa invece dell’OutputStream la classe figlia FileOutputStream
    ad esempio
    FileOutputStream fos = new FileOutputStream(new File(”c:\\file.xls”));
    e scrivi l’output su questo.

    Spero di esserti stato utile.
    Ciao
    Giampiero

  6. Gaetano says:

    Grazie Mille,
    ho risolto con il tuo Aiuto..

  7. Gaetano says:

    volevo chiederti un’altra info se non chiedo troppo, posso chiudere automaticamente il browser dopo avere salvato il file sul Disco Rigido senza nessuna interazione dell’utente.

    Cioè io voglio che dopo avermi creato il File sul Disco mi chiuda la finestra attiva o il browser.

    Grazie Mille

  8. Giampiero Granatella says:

    Lo puoi fare se hai aperto una pop up (che nell’esempio ho chiamato popWindow). A questo punto con javascript puoi mettere un link come questo per chiudere.

    <A HREF=”javascript:void(0)” onClick=”MyWindow.close();”>Chiudete la finestra </>

    Non puoi chiudere la finestra principale

  9. Gaetano says:

    Grazie. :-)

  10. Gaetano says:

    Ciao, ti disturbo ancora…
    Avrei la necessita di leggere da un file di testo una riga che contiene ad esempio:
    “Questa”,”e”,”una”,”prova” (vorrei che lo leggesse cosi come lo scritto)
    Dopo avere letto il file vorrei salvare il contenuto in un ARRAY di tipo STRING.
    Mi sapresti aiutare??

    Quello che ho fatto è la seguente:

    FileReader f = new FileReader(”c:\\prova.txt”);
    BufferedReader br = new BufferedReader(f);
    String line = br.readLine();
    f.close

    Cosi mi legge la riga ma la mette in una strina e non in un array.
    Mi sai dire come posso salvare la riga su un array di tipo string??

    grazie Mille per l’aiuto

  11. Giampiero Granatella says:

    Usa StringTokenizer fa quello che ti serve…

    Ciao

  12. Michele says:

    Ciao Gianpiero, ho visto che sei molto ferrato sull’utilizzo del poi per excel. Volevo chiederti se gentilmente puoi risolvermi questo proble. Devo leggere i dati contenuti su un file excel. però non di una riga-cella precisa, ma tutto il contenuto del foglio. Meglio se recupero anche la colonna (A,B,C …) Ciao e grazie. Michele

  13. Michele says:

    Scusa Giampietro, dimenticavo che sviluppo in java tramite NetBeans. Ciao Michele

  14. Giampiero says:

    Leggili riga per riga iterando come fosse un resultset di un db.

    ecco un esempio di codice.
    Ciao

    try {
    //Apro uno stream per leggere i dati
    InputStream input = new FileInputStream(filename);
    POIFSFileSystem fs = new POIFSFileSystem(input);
    HSSFWorkbook wb = new HSSFWorkbook(fs);
    HSSFSheet sheet = wb.getSheetAt(0);

    Iterator rows = sheet.rowIterator();

    int intestazione = 0;
    //Itero sulle righe del foglio
    while (rows.hasNext()) {

    //Fai qui quello che devi fare
    }
    }

  15. Luca Spinelli says:

    Ciao, io sto cercando di leggere un xml e esportarlo in excel. La cosa funziona con un xml “noto”, ma come posso scrivere in codice che si deve leggere tutto l’xml senza specificare tutti i campi??

    Grazie mille

  16. Giampiero Granatella says:

    Non ho capito bene cosa intendi fare. Mi sembra di avere intuito che hai un xml di cui non conosci la struttura e che devi riportare in un file excel.
    Se non sai come è fatto l’xml prova a parserizzarlo come fosse uno Stream, usando quindi StAX (trovi un esempio su questo sito).

    Spero di essere stato utile.

    Ciao

  17. alepuzio says:

    Ciao,complimenti per l’esempio decisamente chiaro!
    Anche io sto usando POI ma ho un problema penso di livello “basso”.
    Io esporto un file excel di circa 6M (qualche centinaio di righe per ogni foglio e 50 fogli). Quando lo apro con
    excel 2002 mi compaiono degli alert riguardo “troppi formati di cella usati”(ne uso solo 3!), dopodichè mi scombina
    tutta la formattazione (grasseto dove deve essere normale , etc). Tu sai di eventuali limiti
    alla quantià di dati da esportare o effetti laterali?
    Grazie e complimenti ancora!

  18. giampiero says:

    Grazie per i complimenti, purtroppo non ti so rispondere. I miei export sono sempre stati più piccoli come brevi report.

    Se scopri il problema o i limiti fammeli sapere che mi interessano.

    Ciao

  19. marco says:

    Ciao Giampiero! Navigando su google ho trovato il tuo sito e devo dire che è fatto veramente bene, oltre ad essere professionale e molto utile. Volevo chiederti una cortesia… Dovrei realizzare un programma (intendo utilizzare java) che legga dei dati da un file e li inserisca in maniera strutturata in un file excel. Sapresti dirmi che librerie mi servono e se è possibile farlo senza ricorrere ad Apache? Hai qualche suggerimento da darmi? Ti ringrazio in anticipo. Buona giornata!

  20. Giampiero Granatella says:

    Le librerie POI sono le migliori. Le includi nel progetto con semplicità. Non vedo motivo per non usarle (non farti ingannare dal nome di apache puoi usarle anche in applicazioni standalone).
    Ma se proprio non puoi/vuoi potresti accedere ad un foglio excel tramite JDBC-ODBC ed accedere al foglio come fosse una base dati.

    Esistono altre opzioni che non ho provato quali http://jexcelapi.sourceforge.net/

    Altra possibilità… prova ad interagire con Open Document Format, il formato di Open Office.

    Ciao
    Giampiero

  21. Battista says:

    complimenti per gli esempi, e per il bellissimo blog, ho trovato un sacco di cose interessantissime qui..

    ho utilizzato i tuoi suggerimenti su POI con profitto, e li ho inseriti immediatamente nella mia web app per generare fogli excel..

    grazie molte..

  22. Sara says:

    Ciao Gianpiero, complimenti per il blog.
    Ho la necessità di creare un foglio excel estraendo i dati da un database (mysql).
    Posso utilizzare la libreria POI?
    Grazie
    Sara

  23. Giampiero Granatella says:

    Certo, basta che apri una connessione JDBC a mysql estrai i dati in un ResultSet, lo scorri e inserisci i dati in excel tramite POI.

    Ciao
    Giampiero

  24. Nicola says:

    Ciao Giampiero, gran bel sito, utile e chiaro. Grazie al tuo esempio non ho avuto problemi a generare un file excel. Mi si presenta però un problema quando apro il file con OpenOffice: tutte le righe che contengono celle scritte da me, risultano nascoste e sono obbligato ad interagire con Calc, selezionando le righe e premendo su “Mostra”. Ti è mai capitata una cosa simile? Se sì, come hai risolto?

    Ciao e Grazie
    Nicola

  25. Giampiero Granatella says:

    Non ho mai provato. Prova a mettere la dimensione della cella fissata, magari basta quello.
    Se usi OpenOffice puoi usare, invece di POI, le API di OO.

    Ciao
    Giampiero

  26. Marco says:

    Ciao Giampiero,
    Ti illustro subito il mio “grosso” problema, a lavoro: ogni giorno ricevo in ufficio, nella mia mailbox outlook, decine di mail, in cui, chiaramente, è visualizzabile il mittente, l’ora della mail e il giorno. All’interno di ciascuna mail vi è come allegato un file excel sempre con lo stesso layout, cioe con gli stessi campi, ma, chiaramente con dati differenti, da mail a mail.
    Io vorrei creare un tool, una macro, una qualsiasi cosa che mi permetta di avere in output un file excel corredato dei seguenti campi:
    mittente mail data mail ora mail tipo preparazione tipo spedizione oggetto mail

    Tipo preparazione e tipo spedizione sono dei valori che estraggo dai vari file excel in allegato alle mail. Tipo preparazione puo assumere due valori: USU e USS. Nel file excel vi è una cella in cui è inserito il testo USS o USU (cieè la parola USS) e accanto alle due celle (posizionate una sopra l’altra) vi è una cella in cui è inserita una X per indicare il tipo di preparazione scelto.
    USS X
    USU
    La stessa cosa avviene per il tipo spedizione che puo assumere due valori: SPS o SPU e anche li vi è una X a seconda della scelta effettuata.
    Quindi, ricapitolando io dovrei estrarre da ciascuna mail il mittente, la data mail, l’ora mail, e l’oggetto e inserere i valori nel foglio excel di output. Poi dovrei poter aprire automaticamente, per ciascuna mail, il file excel in allegato, e estrarre, in base alla posizione della crocetta, il rispettivo tipo preparazione e tipo spedizione, cioe il testo USS piuttosto che USU, o SPS piuttosto che SPU. Ed avere cosi tutti questi valori in una sola riga che rappresenta una mail.
    Questo vorrei poterlo fare senza aprire per ciascuna mail l’allegato excel, e quindi poterlo fare col minimo sforzo.
    Il problema piu grosso sembrerebbe quello di trattare con due tipi di file diversi: un file excel (cioè l’allegato), e l’altro la mail di outlook, dal quale mi sembra molto complesso poter estrarre singolo dati (mittente, data mail…).
    Spero di essere stato abbastanza chiaro, e confido in un tuo aiuto. Ci tengo a precisare che non sono molto pratico di java, purtroppo.
    Anticipatamente ti ringrazio e spero davvero che tu possa e soprattutto voglia aiutarmi, perche sono davvero in grossa dificolta ed ho bisogno di un tool che mi permetta di velocizzare il lavoro, perche ad oggi faccio tutto a mano, cioè apro tutte le mail, e tutti gli allegati excel e copio, a mano, sul file riepilogativo, tutti i campi che vi ho illustrato. E’ un lavoro da pazzi!!!.
    Ti ringrazio.
    Ciao a tutti.

    MARCO

  27. Giampiero Granatella says:

    Ciao quello che chiedi non è impossibile ed anzi si può fare facilmente. Quello che mi preoccupa è che non conosci Java, anche se potresti fare la stessa cosa con .Net (Visual Basic o altro) e forse ancora più facilmente.

    Ti do qualche dritta per il mondo Java.
    Allora separa i problemi:
    1. devi leggere le mail che ti arrivano
    2. devi prendere i dati di queste mail e metterli in excel
    3. devi elaborare gli allegati

    Con Java riesci a fare queste operazioni in maniera semplice con la libreria POI per scrivere su Excel e Java Mail per scrivere delle classi che leggano la tua posta e prelevino i dati che ti servono (come mittente, oggetto, allegato, ecc…).

    Per POI puoi basarti sul mio articolo, mentre per Java Mail dai un occhio a questo tutorial che ho trovato in rete http://www.javaworld.com/javaworld/jw-10-2001/jw-1026-javamail.html.

    Spero di esserti stato utile.
    Ciao.
    Giampiero

  28. marco says:

    Ciao Giampiero. Scusa il disturbo! Sto realizzando un’applicazione in java che crea un foglio excel inserendo all’interno dei dati. Sto usando le librerie jxl. Sapresti dirmi come posso formattare la dimensione di una cella prima di inserirci un valore (ad esempio una stringa)?
    Ti ringrazio in anticipo.
    Ciao!
    Marco

  29. marco says:

    Pardon! Ho risolto. Grazie lo stesso. Ciao

  30. alepuzio says:

    ciao!
    Con un po’ di ritardo ho risolto il problema: il problema è proprio di Microsoft Excel che da di matto quando trova troppe formattazioni diverse.
    Per aggirarlo ho usato come attributi non modificabili i vari HSSFFont, HSSFStyle etc della classe che si occupa di creare l’Excel: la formattazione non è bella ma almeno spariscono alert e la formattazione non da sorprese.

  31. letizia says:

    ciao giampiero,io ho da realizzare un report in excel con dei dati che mi recupero da una query.solo che questi dati,vanno su u foglio excel…ma formattato nel senso che questo foglio deve avere
    come una maschera predefinita hai presente quando compili a mano una fattura???ecco ed io vorrei usare una servlet con un link che va su un action che recupera questa query e poi crea l’excel.Fino a qua lo so fare..mi manca come rendere il report in excel ben formattato…tipo maschera.Qualche idea??

  32. Giampiero Granatella says:

    Ciao Letizia. Qualche informazione sulla formattazione delle celle la puoi settare, ma se fosse particolarmente complesso perché non fare (a mano) un file xls che ti faccia da template, aprirlo programmaticamente e inserire i dati che ti servono?

    Spero di esserti stato utile
    Ciao
    Giampiero

  33. Giampiero Granatella says:

    Certo è possibile, non è tanto un problema di data quanto di formato.
    Usa il CellStyle (CellStyle style), imposta un dataformat (style.setDataFormat) e applicalo ad una cella (cell.setCellStyle(style)

    Grazie per i complimenti

    Ciao

  34. manuel says:

    Grazie per il consiglio funziona alla grande!!!!

  35. manuel says:

    Grazie hai tuoi consigli sono riuscito a creare un file xls.
    Ora ti vorrei chiedere un altro favore se possibile ho appena scritto una codice che legge il file xls creato. Però mi si verifica l’errore
    ERROR - Errore elaborando il file java.lang.NullPointerException
    at ridjlib.XLSReader.getRowCell(XLSReader.java:91)
    at ridjlib.XLSReader.parse(XLSReader.java:62)
    at ridimportatorelivelli.Engine.elaboraXlsFile(Engine.java:350)
    at ridimportatorelivelli.Engine.generateXMLFile
    COME SE IL FILE FOSSE VUOTO.
    Ti posto il frammento di codice
    public List parse() throws Exception {
    List dams = new ArrayList();

    int riga = 1;
    while (true)
    {
    Record dam = new Record();

    dam.name = getRowCell(riga, 0);

    dam.id = getRowCell(riga, 1);
    if (dam.id == null) break; if (dam.id.length() == 0)
    break;

    dam.ts = getRowCell(riga, 2);
    dam.value = getRowCell(riga, 3);

    dams.add(dam);

    ++riga;
    }

    return dams;
    }

    private String getRowCell(int rowNum, int colonna)
    throws Exception
    {
    HSSFRow row = sheet.getRow(rowNum);
    HSSFCell cell = row.getCell(colonna);

    String value = “”;

    if (cell != null)
    {
    switch (colonna)
    {
    case 0:
    value = cell.getStringCellValue();
    break;
    case 1:
    value = cell.getStringCellValue();
    break;
    case 2:
    value = getFormatDate(cell.getDateCellValue());
    break;
    case 3:
    value = String.valueOf(cell.getNumericCellValue());
    }

    }

    return value;
    }

  36. manuel says:

    Il problema dell’altra volta lo ho risolto.
    Vorrei ora chiederti una volta impostata la data nel formato desiderato ad esempio “m/d/yy h:mm” come posso togliere alla mia data due ore?Esiste in java un metodo che mi permette di fare cio.
    Ciao e grazie per la disponibilità

  37. Federico says:

    Ciao Giampiero, ti informo che il link “POI di Apache” non funziona: c’è un http// di troppo.
    Ciao e buon lavoro.

  38. Giampiero Granatella says:

    Messo a posto. Grazie

  39. alessandro says:

    Ciao scusate una domanda è poco che uso i “POI di Apache” ed avrei un problema sulla formattazione delle celle, attualmente le celle sono messe in modo generico pero quando gli arriva un numero mi compare un triangolino verde in alto a sinistra “numero memorizzato come testo”, avete consigli da darmi per risolvere il problema???
    grazie per l’aiuto
    Alessandro

  40. Alex says:

    Ciao vorrei avere delle info se possibile, è poco tempo che uso le “POI di Apache” però mi sono imbattuto in un problema che al momento non sono in grado di risolvere, ti spiego meglio.
    Riesco a generare il file xls come voglio, solo che su alcune celle devo inserire dei numeri, però excel mi ritorna questo errore “numero memorizzato come testo”.
    Sai per caso darmi qualche consiglio su come risolvere questo problema??
    grazie mille.
    Ciao
    Alessandro

  41. Giampiero Granatella says:

    Controlla di aver inserito il numero come row.createCell((short)1).setCellValue(1.5);
    e non come stringa row.createCell((short)1).setCellValue(”1.5″);

    Altro non ti saprei dire…
    Scusa

  42. Alex says:

    ok grazie mille, risolto. molto gentile ;)

  43. Alberto says:

    Ciao Giampiero,
    complimenti per il tuo aiuto innanzitutto…anzichè vedere un foglio Excel, mi viene creato un file sconosciuto che non riesco ad aprire con Excel, neppure dopo averlo salvato su file system.
    Sapresti darmi qualche aiuto? Grazie, ciao!

  44. Gianluca Costa says:

    Ciao Giampiero,
    vedo che sei espertissimo con creazione Excel :-) Io dovrei formattare una cella come valuta: € 1.234,67
    Con simbolo di euro compreso… Un qualcosa che vada bene con server linux e Windows, con Microsoft Excel o OpenOffice, con Internet Explorer O Firefox, con client windows o linux…Insomma sempre :-)
    Hai qualcosa in mente?
    Grazie mille
    Ciao
    Mitico

  45. Giampiero Granatella says:

    Per Gian. Prova questo

    Style style = wb.createCellStyle();
    style.setDataFormat(format.getFormat(”\u0080 #.##0,0000″));
    cell.setCellStyle(style); //applicalo alla cella desiderata

  46. Giampiero Granatella says:

    \u0080 è l’unicode per l’euro

  47. Lorenzo Bracci says:

    Lavorando con excel sono riuscito nella creazione di un programma tecnico, per il mio lavoro.
    Come posso rendere più piccoli i fogli di lavoro. (un foglio misura 9 mega)
    Premetto che sono un praticone, e per di più non conosco una parole di inglese.
    Scusa il disturbo.
    Saluti Lorenzo

  48. Cosimo says:

    Giampiero,
    come faccio a salvare il file con l’estensione .xls così può essere aperto senza che il sistema ti chieda ogni volta l’applicazione da utilizzare? Grazie

  49. Giampiero Granatella says:

    L’importante è settare correttamente il content-type. Questo dice al browser con cosa aprirlo.
    Altrimenti genera file temporanei sul server e falli scaricaricare.

    Ciao

  50. Michele says:

    Ciao, come si fa ad adattare la cella alla larghezza del testo contenuto in essa?

  51. Michele says:

    Ciao, ci sono per caso problemi di copyright quando si usano queste librerie per creare file in formato xls?

  52. lorena says:

    Ciao! scusami se disturbo…il mio problema è questo:
    ho un file con excel2007…voglio scrivere da java su delle celle…ma provando con il codice per un esempio ho tale errore

    Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/xmlbeans/XmlException
    at Excel.(Excel.java:36)
    at Main.main(Main.java:17)
    Caused by: java.lang.ClassNotFoundException: org.apache.xmlbeans.XmlException
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClassInternal(Unknown Source)
    … 2 more
    il codice usato è il seguente:

    import org.apache.poi.ss.usermodel.WorkbookFactory;
    import org.apache.poi.xssf.usermodel.XSSFCell;
    import org.apache.poi.xssf.usermodel.XSSFRow;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;

    public class Excel {

    public Excel() throws FileNotFoundException, IOException, InvalidFormatException{

    InputStream inp = new FileInputStream(”C:/Users/Lorena/workspace/Excel/src/java.xlsx”);
    //InputStream inp = new FileInputStream(”workbook.xlsx”);

    Workbook wb = new XSSFWorkbook();

    Sheet sheet = wb.getSheetAt(0);

    int row_index = 2; //indice della linea
    Row row = sheet.getRow(2);
    Cell cell_esempio = row.getCell(2); //indice della colonna
    Double valore = cell_esempio.getNumericCellValue();
    System.out.println(valore);

    }}

  53. Giampiero Granatella says:

    Ciao Lorena, l’errore dice che non trova la libreria di xmlbeans. Controlla di averla nel tuo classpath altrimenti scaricala (http://xmlbeans.apache.org) e aggiungila.

  54. alepuzio says:

    Ciao,
    Con un bel po’ di ritardo :) ti segnalo come ho risolto il problema: ho impostato un solo stile per tutte le parti dell’excel (titolo, dati, etc). Non è bello ma ho notato che creando un file excel di (grosso modo) 50 fogli, 30 righe ed 10 colonne è l’unica soluzione perhcè Microsoft Excel ha dei limiti per il numero di formattazioni.

    ciao

  55. Tania says:

    Ciao,
    come faccio ad aprire un file excel direttamante da web?
    Mi spiego meglio:
    ho una applicazione che genera un foglio excel e vorrei che questo si aprisse direttamente senza che compaia la maschera di
    download del browser che chiede se aprirlo direttamante o salvarlo.
    Grazie e ciao

  56. Giampiero Granatella says:

    Ciao Tania,
    non credo tu possa farlo lato server. Sono impostazioni lato client sul particolare browser che l’utente utilizzerà.

  57. Angelo says:

    Salve Giampiero
    innanzitutto complimenti per il lavoro svolto. Sto usando anch’io le stesse classi Java per portare dei file da DB400 ad Excel. Ho solo il problema che le formule scritte in alcuni campi vengono portate sul foglio Excel come testo e non vengono invece interpretate come formule (es =A1+B1 rimane come testo). Potrebbe dirmi cortesemente se c’è un modo per fare interpretare come formule il contenuto di alcuni campi?
    Grazie mille e buona giornata.
    Angelo

  58. Vania says:

    Salve,
    vorrei sapere come fare ad unire più celle insieme. Tipo il “rowspan” e il “colspan” dell’HTML.

    GRAZIE in anticipo.

  59. Roberto says:

    Ciao Giampiero,
    complimenti per il lavoro svolto che mi è stato di aiuto nella lettura di dati da fogli Excel.
    Ora però mi trovo dinanzi ad un problema che non so come risolvere: sto utilizzando XSSF per leggere un foglio Excel2007 ma quando tento l’apertura del foglio con le seguenti semplici righe

    XSSFWorkbook wb = new XSSFWorkbook(fileXls);
    foglio=wb.getSheetAt(0);

    mi segnala il seguente errore:

    java.io.IOException: org.apache.poi.openxml4j.exception.InvalidFormatException: Package should contain a content type part [M1.13]
    java.lang.NullPointerException

    Hai qualche idea da darmi? Io ho necessità di leggere uno specifico file Excel e mi sono arenato qui perchè mi pare di capire che il problema sia la struttura del file.
    Grazie in anticipo per la tua disponibilità.

  60. Giampiero Granatella says:

    Non riconosce il content type quasi come se fosse in un formato non ammissibile. Dai un occhio ai sorgenti https://svn.apache.org/repos/asf/poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/ZipPackage.java

    Ciao

  61. Giampiero Granatella says:

    Per Vania, fai il merge delle celle. Guarda qui l’API http://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFSheet.html#addMergedRegion(org.apache.poi.ss.util.CellRangeAddress)

  62. Giampiero Granatella says:

    Per angelo guarda il metodo setCellFormula http://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFCell.html#setCellFormula(java.lang.String)

  63. mix says:

    Ciao Giampiero complimenti.
    Volevo chiederti:ho un excel dove ogni record è tutto all’interno della prima cella di ciascuna riga e ogni campo del record è separato da un punto e virgola (ho ottenuto il file da un csv).. quali classi posso usare per distinguere il record in piu celle e quindi ottenere un excel formattato correttamente?
    In pratica vorrei fare quello che manualmente si fa cliccando sul tab “dati” e poi “testo in colonne” …
    Grazie ciao

  64. Ciro says:

    Ciao Giampiero,
    complimenti davvero per il tuo sito. Avrei bisogno, per favore, di un tuo aiuto.
    Sto realizzando un’applicazione desktop in java che salva dei dati in un foglio excel e grazie ai tuoi suggerimenti e alle api apache sembra che tutto prosegue per il meglio. Mi servirebbe capire solo 2 cose:

    -ho importato nel progetto le ultime librerie poi 3.7 ma non trovo al loro intrerno i richiami a:
    import org.apache.poi.ss.usermodel.WorkbookFactory;
    import org.apache.poi.xssf.usermodel.XSSFCell;
    import org.apache.poi.xssf.usermodel.XSSFRow;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    per la gestione dei fogli excel 2007 ho soltanto import org.apache.poi.xssf.usermodel.HSSFWorkbook per i fogli “xls”
    devo scaricare qualcos’altro?

    -io vorrei realizzare un grafico con i dati inseriti dall’applicazzione sul foglio e successivamente visualizzare il grafico stesso all’interno della mia GUI o altro contenitore tipo jPannel etc..
    e’ possibile??
    Grazie mille.
    Ciro

  65. Ciro says:

    ops…mi è scappata una “z” in + su applicazione!
    :-)

  66. Giampiero Granatella says:

    I fogli exel 2007 utilizzano open xml e su questo apache poi è indietro e cambia completamente la sua api. Non l’ho ancora guardata… devi guardare HSSF e non XSSF

    Per il grafico ti consiglio di usare jfreechart basato sui tuoi dati in excel. Crearli con POi non mi sembra possibile guarda qui: http://poi.apache.org/spreadsheet/limitations.html

    Ciao
    Giampiero

  67. Ciro says:

    Perfetto Giampiero
    ti ringrazio per la dritta.
    Utilizzando open xml ho effettivamento risolto.
    Per quanto riguarda i grafici,ora raccolgo un po di informazioni on-line su jfreechart e spero di riuscire.
    Visto che sei un maestro e io un patito della programmazione (…ancora alle prime armi con java), credo ti disturbero ancora per avere altri utili consigli.
    Grazie mille.
    Ciro

  68. Giampiero says:

    Ciao Giampiero, volevo farti una domanda:
    Ho iniziato da poco a maneggiare la libreria POI per scrivere e leggere con java su file excel (versione 2003). Ho un piccolo problema, riesco a leggere e scrivere in qualsiasi cella io voglia, ma si presenta un problema:
    Ho la necessità di scrivere in delle celle, che all’ora volta, sono input per altre celle che effetturano dei calcoli. Fin qua tutto bene, il problema e che io scrivo questi valori, excel lavora molto bene effettua i calcoli, ma quando vado a rileggerli su altre celle, questi non sono aggiornati. Se apro manualemnte il foglio excel vedo i miei dati inseriti e la corretta valorizzazione delle formule. Faccio chiudi ed excel mi dice: “All’apertura dei file con una versione precedentedi Excel, le formule contenute vengono ricalcolate”. Forse non sono stato chiarissimo e mi scuso, ma proprio non so come fare. Grazie mille.
    Giampiero

  69. Ciro says:

    Ciao Giampiero
    sono alle prese con il seguente problema:
    Devo determinare la pria cella vuota all’interno di un forglio excel per poter scrivere da li in poi.
    Mi sapresti dire quindi come si fa a leggere il contenuto di una cella?
    Grazie
    Ciro

  70. Marc says:

    Ciao Giampiero,
    volevo sapere di più su come trattare i grafici di Excel con Java.
    Hai giustamente consigliato di usare jfreechart, ma volevo sapere se permette proprio di creare dei grafici Excel e salvarli direttamente nel file.
    Grazie mille.
    Ciao
    Marcella

  71. Giampiero Granatella says:

    Ciao Marcella, come già dicevo generare i grafici per Excel via POI è impossibile. Con JFreechart li puoi fare ma non saprei metterli dentro il documento (forse ci si potrebbe riuscire come immagine, ma non ho mai provato)

    Ciao
    Giampiero

  72. maura says:

    Ciao Giampiero,
    ho trovato molto utile la tua guida, volevo sapere se era possibile da una stringa in java, rappresentante l’ora (es. 15.30), inserirla in un foglio excel con formato ora e in caso affermativo potresti darmi qualche dritta? ti ringrazio

  73. Giampiero Granatella says:

    Solo l’ora non saprei dirti, l’ho fatto solo tramite data.

    Ciao

  74. maura says:

    e tramite data come si fa? scusami ma è da poco che conosco le poi di apache

Leave a Reply

You must be logged in to post a comment.