[Risolto][Java] Problema con lettura da file excel e uso libreria POI

Linguaggi di programmazione: php, perl, python, C, bash, ecc.

[Risolto][Java] Problema con lettura da file excel e uso libreria POI

Messaggioda cuccagna » venerdì 10 settembre 2010, 23:16

Sto cercando di leggere da file excel tramite le API POI.
Ho scaricato il sorgente, poi decompresso l'ho piazzato sul desktop.
Sto sotto Windows 7.

Compilo da terminale con:
javac -cp .;C:\Programmi\Java\jdk1.6.0_20;C:\Users\Nick\Desktop\poi-3.6\src\java Apri.java

E spunta sulla shell:
Note: Apri.java uses or overrides a deprecated API
Note: Recompile with -Xlint: deprecation for details

Eseguo con
java -cp .;C:\Programmi\Java\jdk1.6.0_20;C:\Users\Nick\Desktop\poi-3.6\src\java Apri

Ma non da alcun risultato
Probabilmente sbaglio qualcosa nell'impostazione del classpath. Ma è un pò che sbatto e non me ne avvedo. Qualcuno può aiutarmi?
Questo codice dovrebbe leggere dal file già esistente Prova.xls e stampare C5.
Codice: Seleziona tutto
import java.io.*;
import org.apache.poi.poifs.filesystem.*;
import org.apache.poi.hssf.usermodel.*;

public class Apri
{
   public static void main(String args[])
   {
      try
      {
      POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("Prova.xls"));
      HSSFWorkbook wb = new HSSFWorkbook(fs);
      HSSFSheet sheet = wb.getSheetAt((short)1);
      int row_index = 3;
      HSSFRow row = sheet.getRow(row_index);
      HSSFCell cell_esempio = row.getCell((short)5); //indice della colonna
      double valore = cell_esempio.getNumericCellValue();
      System.out.println(valore);
      }

      catch(IOException e)
      {
System.exit(1);
      }
   }
}
Ultima modifica di cuccagna il mercoledì 13 ottobre 2010, 8:31, modificato 1 volta in totale.
cuccagna
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 379
Iscrizione: marzo 2009

Re: [Java] Problema con lettura da file excel e uso libreria POI

Messaggioda Zoff » sabato 11 settembre 2010, 2:20

L'errore deriva dal warning che ti viene visualizzato durante la compilazione, getCell(short) è deprecato, ed è anche il motivo per cui il codice si pianta.

Terminare il programma in caso di eccezione senza stampare nulla è un ottimo modo per complciarsi la vita in caso di problemi.
Prima di usare delle librerie sarebbe bene avere almeno un idea di come si usa un linguaggio...
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: viewtopic.php?f=70&t=597066
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
 
Messaggi: 33297
Iscrizione: ottobre 2007

Re: [Java] Problema con lettura da file excel e uso libreria POI

Messaggioda cuccagna » sabato 11 settembre 2010, 15:58

Zoff ha scritto:'errore deriva dal warning che ti viene visualizzato durante la compilazione, getCell(short) è deprecato, ed è anche il motivo per cui il codice si pianta.

Terminare il programma in caso di eccezione senza stampare nulla è un ottimo modo per complciarsi la vita in caso di problemi.
Prima di usare delle librerie sarebbe bene avere almeno un idea di come si usa un linguaggio...

Non avevo mai incontrato un simile warning. Cercando sul web ho visto che deprecato vuol dire il metodo in questione è obsoleto. Guardando tra i commenti del metodo getCell(short) ho visto che è deprecato dall'Agosto 2008. Infatti passando un intero il warning sparisce.

Per quanto riguarda la gestione delle eccezioni trovo già fastidioso il fatto che alcune classi di eccezioni devono essere gestite o rilanciate pena errore di compilazione, per questo spesso lascio vuoto il blocco catch. Cmq mi ero accorto che System.exit(1) veniva eseguito dato che l'esecuzione non terminava normalmente dato che 3 non veniva stampato.

Cmq voglio farti contento
Codice: Seleziona tutto
import java.io.*;
import org.apache.poi.poifs.filesystem.*;
import org.apache.poi.hssf.usermodel.*;

public class Apri
{
   public static void main(String args[])
   {
      try
      {
      POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("Prova.xlsx"));
      HSSFWorkbook wb = new HSSFWorkbook(fs);
      HSSFSheet sheet = wb.getSheetAt((short)1);
      int row_index = 3;
      HSSFRow row = sheet.getRow(row_index);
      HSSFCell cell_esempio = row.getCell(5); //indice della colonna
      double valore = cell_esempio.getNumericCellValue();
      System.out.println(valore);
   
      }

      catch(IOException e)
      {
         
         e.printStackTrace();
      }
   }
}


Il problema stava nel fatto che l'estensione del file non è .xls ma .xlsx, per questo non trovava il file e veniva lanciata l'eccezione.
Ora il problema sta nel fatto che viene lanciata l'eccezione OfficeXmlFileException perchè la  classe da me usata non sa gestire il tipo di file che ho usato. Quindi devo uasre le classi di XSSF. Che pa.lle.
Se qualcuno le sa usare mi sparagna di andare a spulciare le classi.
cuccagna
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 379
Iscrizione: marzo 2009

Re: [Java] Problema con lettura da file excel e uso libreria POI

Messaggioda Zoff » sabato 11 settembre 2010, 17:08

cuccagna ha scritto:Per quanto riguarda la gestione delle eccezioni trovo già fastidioso il fatto che alcune classi di eccezioni devono essere gestite o rilanciate pena errore di compilazione, per questo spesso lascio vuoto il blocco catch. Cmq mi ero accorto che System.exit(1) veniva eseguito dato che l'esecuzione non terminava normalmente dato che 3 non veniva stampato.

Molto male. Le eccezioni sono un concetto fondamentale della programmazione ad oggetti.
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: viewtopic.php?f=70&t=597066
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
 
Messaggi: 33297
Iscrizione: ottobre 2007

Re: [Java] Problema con lettura da file excel e uso libreria POI

Messaggioda deepswing » sabato 11 settembre 2010, 18:50

cuccagna ha scritto:Se qualcuno le sa usare mi sparagna di andare a spulciare le classi.


OT

sei di foggia?? (good) (good)

/OT


per la classe, vedo un po' e poi ti scrivo qualcosa.
Avatar utente
deepswing
Prode Principiante
 
Messaggi: 11
Iscrizione: gennaio 2007
Località: Perugia

Re: [Java] Problema con lettura da file excel e uso libreria POI

Messaggioda cuccagna » martedì 21 settembre 2010, 19:16

Mi interessa leggere da file xlsx (e tramite la libreria POI si può fare sicuro) perchè devo implementare il codice per il seguente problema:
Ho due file .xlsx
Entembi contengono nel primo foglio nella colonna A dei numeri di telefono.
Devo restituire su file(non necessariamente file excel) tutti i numeri di telefono presenti sia nel primo che nel secondo file (che matchanno cioè) in modo che se nel primo elenco di numeri vi sono più numeri uguali che hanno anche solo 1 corrispondenza nel secondo elenco di numeri verranno riportati tutti nella colonna risultato. Non è vero il viceversa.

Ho pensato di fare una macro che viene azionata da un bottone.
E ci sono riuscito imparando un pò di visual basic (credo) dagli esempi della guida di excel stesso.
Tuttavia il problema è che così costringo il fruitore(il client per intenderci) a copiare manualmente l'elenco dei numeri di telefono nel file excel che ho creato nella colonna A ed in quella C.
Invece dovrei leggere automaticamente i file. Io vi chiedo
1) Sapete come fare la lettura di un file(chiuso e nella stessa directory) .xlsx in visual basic?
2) effettuare tutto in java, cosa che preferisco dato che conosco bene il linguaggio, quindi come usare la libreria POI per aprire e leggere un file .xlsx?

Questo è il codice in Visual Basic
Codice: Seleziona tutto
Private Sub CommandButton2_Click()
riga = 2
rigaRisultato = 2
Do Until Range("A" & riga & "").Value = ""
valore = Range("A" & riga & "").Value
rigaDue = 2
Do Until Range("C" & rigaDue & "").Value = ""
If Range("C" & rigaDue & "").Value = valore Then
Range("E" & rigaRisultato & "").Value = valore
rigaRisultato = rigaRisultato + 1
Exit Do
End If
rigaDue = rigaDue + 1
Loop
riga = riga + 1
Loop
End Sub
Ultima modifica di cuccagna il martedì 21 settembre 2010, 19:19, modificato 1 volta in totale.
cuccagna
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 379
Iscrizione: marzo 2009

Re: [Java] Problema con lettura da file excel e uso libreria POI

Messaggioda cuccagna » martedì 21 settembre 2010, 19:19

deepswing ha scritto:
cuccagna ha scritto:Se qualcuno le sa usare mi sparagna di andare a spulciare le classi.


OT

sei di foggia?? (good) (good)

/OT
NO


per la classe, vedo un po' e poi ti scrivo qualcosa.
Ultima modifica di cuccagna il martedì 21 settembre 2010, 19:20, modificato 1 volta in totale.
cuccagna
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 379
Iscrizione: marzo 2009

Re: [Java] Problema con lettura da file excel e uso libreria POI

Messaggioda cuccagna » mercoledì 22 settembre 2010, 15:21

cuccagna ha scritto:Mi interessa leggere da file xlsx (e tramite la libreria POI si può fare sicuro) perchè devo implementare il codice per il seguente problema:
Ho due file .xlsx
Entembi contengono nel primo foglio nella colonna A dei numeri di telefono.
Devo restituire su file(non necessariamente file excel) tutti i numeri di telefono presenti sia nel primo che nel secondo file (che matchanno cioè) in modo che se nel primo elenco di numeri vi sono più numeri uguali che hanno anche solo 1 corrispondenza nel secondo elenco di numeri verranno riportati tutti nella colonna risultato. Non è vero il viceversa.

Ho pensato di fare una macro che viene azionata da un bottone.
E ci sono riuscito imparando un pò di visual basic (credo) dagli esempi della guida di excel stesso.
Tuttavia il problema è che così costringo il fruitore(il client per intenderci) a copiare manualmente l'elenco dei numeri di telefono nel file excel che ho creato nella colonna A ed in quella C.
Invece dovrei leggere automaticamente i file. Io vi chiedo
1) Sapete come fare la lettura di un file(chiuso e nella stessa directory) .xlsx in visual basic?
2) effettuare tutto in java, cosa che preferisco dato che conosco bene il linguaggio, quindi come usare la libreria POI per aprire e leggere un file .xlsx?

Questo è il codice in Visual Basic
Codice: Seleziona tutto
Private Sub CommandButton2_Click()
riga = 2
rigaRisultato = 2
Do Until Range("A" & riga & "").Value = ""
valore = Range("A" & riga & "").Value
rigaDue = 2
Do Until Range("C" & rigaDue & "").Value = ""
If Range("C" & rigaDue & "").Value = valore Then
Range("E" & rigaRisultato & "").Value = valore
rigaRisultato = rigaRisultato + 1
Exit Do
End If
rigaDue = rigaDue + 1
Loop
riga = riga + 1
Loop
End Sub


Ncopp
Nessuno?Non siate timidi
cuccagna
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 379
Iscrizione: marzo 2009

Re: [Java] Problema con lettura da file excel e uso libreria POI

Messaggioda Mikycol » mercoledì 22 settembre 2010, 16:07

Eccoti un esempio per la lettura di un file EXCEL (l'ho usata per file xls, ma se non vado errato funziona pure per xlsx):
Codice: Seleziona tutto
try {
   // Apre il file Excel
   HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream("c:\\fileExcel.xls"));
   // Si posiziona sullo sheet numero 0 (il primo)
   HSSFSheet sheet = wb.getSheetAt(0);
   // Itero tutte le row "esistenti" sullo sheet selezionato
   for (int r = 0; r < sheet.getPhysicalNumberOfRows(); r++)
   {
      // Seleziono la row di interesse
      HSSFRow row = sheet.getRow(r);
      // Itero tutte le cell "esistenti" sulla row selezionata
      for (int c = 0; c < row.getPhysicalNumberOfCells(); c++)
      {
         // Seleziono la cella di interesse (Non ricordo ma mi sembra pure queste partono dall'inidice 0)
         HSSFCell cell = row.getCell(c);
         System.out.print("Riga/Cella - " + r + "/" + c + ": ");
         // Seleziono il tipo di get corretto in base al contenuto della cell
         switch (cell.getCellType()) {
         case HSSFCell.CELL_TYPE_STRING:
            System.out.println(cell.getStringCellValue());
            break;
         case HSSFCell.CELL_TYPE_BOOLEAN:
            System.out.println(cell.getBooleanCellValue());
            break;
         case HSSFCell.CELL_TYPE_NUMERIC:
            System.out.println(cell.getNumericCellValue());
            break;
         case HSSFCell.CELL_TYPE_FORMULA:
            System.out.println(cell.getCellFormula());
            break;
         case HSSFCell.CELL_TYPE_ERROR:
            System.out.println(cell.getErrorCellValue());
            break;
         case HSSFCell.CELL_TYPE_BLANK:
            System.out.println("Cella BLANK");
            break;
         default:
            System.out.println("DEFAULT");
            break;
         }
      }
   }
} catch (Exception e) {
   e.printStackTrace(System.out);
}


Se serve chiedi pure!

Ps. io sono di Vieste :P
Mikycol
Prode Principiante
 
Messaggi: 80
Iscrizione: ottobre 2007

Re: [Java] Problema con lettura da file excel e uso libreria POI

Messaggioda cuccagna » mercoledì 22 settembre 2010, 19:17

Mikycol ha scritto:Eccoti un esempio per la lettura di un file EXCEL (l'ho usata per file xls, ma se non vado errato funziona pure per xlsx):
Codice: Seleziona tutto
try {
   // Apre il file Excel
   HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream("c:\\fileExcel.xls"));
   // Si posiziona sullo sheet numero 0 (il primo)
   HSSFSheet sheet = wb.getSheetAt(0);
   // Itero tutte le row "esistenti" sullo sheet selezionato
   for (int r = 0; r < sheet.getPhysicalNumberOfRows(); r++)
   {
      // Seleziono la row di interesse
      HSSFRow row = sheet.getRow(r);
      // Itero tutte le cell "esistenti" sulla row selezionata
      for (int c = 0; c < row.getPhysicalNumberOfCells(); c++)
      {
         // Seleziono la cella di interesse (Non ricordo ma mi sembra pure queste partono dall'inidice 0)
         HSSFCell cell = row.getCell(c);
         System.out.print("Riga/Cella - " + r + "/" + c + ": ");
         // Seleziono il tipo di get corretto in base al contenuto della cell
         switch (cell.getCellType()) {
         case HSSFCell.CELL_TYPE_STRING:
            System.out.println(cell.getStringCellValue());
            break;
         case HSSFCell.CELL_TYPE_BOOLEAN:
            System.out.println(cell.getBooleanCellValue());
            break;
         case HSSFCell.CELL_TYPE_NUMERIC:
            System.out.println(cell.getNumericCellValue());
            break;
         case HSSFCell.CELL_TYPE_FORMULA:
            System.out.println(cell.getCellFormula());
            break;
         case HSSFCell.CELL_TYPE_ERROR:
            System.out.println(cell.getErrorCellValue());
            break;
         case HSSFCell.CELL_TYPE_BLANK:
            System.out.println("Cella BLANK");
            break;
         default:
            System.out.println("DEFAULT");
            break;
         }
      }
   }
} catch (Exception e) {
   e.printStackTrace(System.out);
}


Se serve chiedi pure!

Ps. io sono di Vieste :P

Ti ringrazio per la risposta ma il codice da te postato come ho scritto prima non è in grado di aprire file .xlsx
Ora il problema sta nel fatto che viene lanciata l'eccezione OfficeXmlFileException perchè le  classi da te usate( e anche da me in precedenza) non sanno gestire il tipo di file che ho usato. Quindi devo uasre le classi di altri package della libreria credo XSSF. Che pa.lle.
Qualcuno sa come funziona la lettura di file .xlsx con POI 3.6?
Grazie

Ps:
Ma siete tutti di Foggia e provincia wuagliò  ;D
Io sono cresciuto a Castellammare di Stabia(Na).
Termini come sparagna, ncopp e wuagliò ce li avete copiati ;D
Sto a pazzià, nun va pigliat
cuccagna
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 379
Iscrizione: marzo 2009

Re: [Java] Problema con lettura da file excel e uso libreria POI

Messaggioda Mikycol » giovedì 23 settembre 2010, 0:05

Aspetta te lo scrivo per funzionare con xlsx, edito appena fatto!!!
Ti servono i seguenti jar per far funzionare il tutto:
  • dom4j-1.6.1.jar
  • poi-3.6-20091214.jar
  • poi-ooxml-3.6-20091214.jar
  • poi-ooxml-schemas-3.6-20091214.jar
  • xbean.jar

Codice: Seleziona tutto
try {
   // Apre il file Excel
    XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream("c:\\prova.xlsx"));
   // Si posiziona sullo sheet numero 0 (il primo)
   XSSFSheet sheet = wb.getSheetAt(0);
   // Itero tutte le row "esistenti" sullo sheet selezionato
   for (int r = 0; r < sheet.getPhysicalNumberOfRows(); r++)
   {
      // Seleziono la row di interesse
      XSSFRow row = sheet.getRow(r);
      if (row != null)
      {
         // Itero tutte le cell "esistenti" sulla row selezionata
         for (int c = 0; c < row.getPhysicalNumberOfCells(); c++)
         {
            // Seleziono la cella di interesse (Non ricordo ma mi sembra pure queste partono dall'inidice 0)
            XSSFCell cell = row.getCell(c);
            System.out.print("Riga/Cella - " + r + "/" + c + ": ");
            if (cell != null)
            {
               // Seleziono il tipo di get corretto in base al contenuto della cell
               switch (cell.getCellType()) {
               case XSSFCell.CELL_TYPE_STRING:
                  System.out.println(cell.getStringCellValue());
                  break;
               case XSSFCell.CELL_TYPE_BOOLEAN:
                  System.out.println(cell.getBooleanCellValue());
                  break;
               case XSSFCell.CELL_TYPE_NUMERIC:
                  System.out.println(cell.getNumericCellValue());
                  break;
               case XSSFCell.CELL_TYPE_FORMULA:
                  System.out.println(cell.getCellFormula());
                  break;
               case XSSFCell.CELL_TYPE_ERROR:
                  System.out.println(cell.getErrorCellValue());
                  break;
               case XSSFCell.CELL_TYPE_BLANK:
                  System.out.println("Cella BLANK");
                  break;
               default:
                  System.out.println("DEFAULT");
                  break;
               }
            }
            else
            {
               System.out.println("CELLA VUOTA");
            }
         }
      }
   }
} catch (Exception e) {
   e.printStackTrace(System.out);
}
Ultima modifica di Mikycol il giovedì 23 settembre 2010, 0:35, modificato 1 volta in totale.
Mikycol
Prode Principiante
 
Messaggi: 80
Iscrizione: ottobre 2007

Re: [Java] Problema con lettura da file excel e uso libreria POI

Messaggioda cuccagna » mercoledì 13 ottobre 2010, 8:27

Mi sono accorto solo adesso che mi avevi risposto e pure tanto tempo fa, non ho guardato perche' avevo perso le speranze.
Grazie, funziona e ho risolto.

Solo che ho perso un po' di tempo per trovare le classi di XSSF e mettere l'import.
import org.apache.poi.xssf.usermodel.*;
import java.io.*;

Infine bisogna aggiungere un paio di uguali, li ho messi in rosso nel codice altrimenti salta gli ultimi valori in alcuni casi
e ad essere pignoli un else per chiudere il primo if per indicare la riga vuota ;D
Grazie e a buon rendere  (b2b)

Mikycol ha scritto:Aspetta te lo scrivo per funzionare con xlsx, edito appena fatto!!!
Ti servono i seguenti jar per far funzionare il tutto:
  • dom4j-1.6.1.jar
  • poi-3.6-20091214.jar
  • poi-ooxml-3.6-20091214.jar
  • poi-ooxml-schemas-3.6-20091214.jar
  • xbean.jar


try {
// Apre il file Excel
XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream("c:\\prova.xlsx"));
// Si posiziona sullo sheet numero 0 (il primo)
XSSFSheet sheet = wb.getSheetAt(0);
// Itero tutte le row "esistenti" sullo sheet selezionato
for (int r = 0; r < =sheet.getPhysicalNumberOfRows(); r++)
{
// Seleziono la row di interesse
XSSFRow row = sheet.getRow(r);
if (row != null)
{
// Itero tutte le cell "esistenti" sulla row selezionata
for (int c = 0; c <= row.getPhysicalNumberOfCells(); c++)
{
// Seleziono la cella di interesse (Non ricordo ma mi sembra pure queste partono dall'inidice 0)
XSSFCell cell = row.getCell(c);
System.out.print("Riga/Cella - " + r + "/" + c + ": ");
if (cell != null)
{
// Seleziono il tipo di get corretto in base al contenuto della cell
switch (cell.getCellType()) {
case XSSFCell.CELL_TYPE_STRING:
System.out.println(cell.getStringCellValue());
break;
case XSSFCell.CELL_TYPE_BOOLEAN:
System.out.println(cell.getBooleanCellValue());
break;
case XSSFCell.CELL_TYPE_NUMERIC:
System.out.println(cell.getNumericCellValue());
break;
case XSSFCell.CELL_TYPE_FORMULA:
System.out.println(cell.getCellFormula());
break;
case XSSFCell.CELL_TYPE_ERROR:
System.out.println(cell.getErrorCellValue());
break;
case XSSFCell.CELL_TYPE_BLANK:
System.out.println("Cella BLANK");
break;
default:
System.out.println("DEFAULT");
break;
}
}
else
{
System.out.println("CELLA VUOTA");
}
}
}
}
} catch (Exception e) {
e.printStackTrace(System.out);
}

Ultima modifica di cuccagna il mercoledì 13 ottobre 2010, 8:29, modificato 1 volta in totale.
cuccagna
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 379
Iscrizione: marzo 2009

Re: [Risolto][Java] Problema con lettura da file excel e uso

Messaggioda JavaForEver » giovedì 16 marzo 2017, 18:42

Qua un semplice esempio di lettura file tramite la libreria POI:
http://www.iljavarolo.com/java-lettura-file-excel/

:ciao:
JavaForEver
Prode Principiante
 
Messaggi: 1
Iscrizione: marzo 2017


Torna a Programmazione

Chi c’è in linea

Visualizzano questa sezione: 0 utenti registrati e 9 ospiti