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

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Chiusa
cuccagna
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 423
Iscrizione: giovedì 26 marzo 2009, 15:50

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

Messaggio da cuccagna »

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.
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

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

Messaggio da Zoff »

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: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
cuccagna
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 423
Iscrizione: giovedì 26 marzo 2009, 15:50

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

Messaggio da cuccagna »

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.
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

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

Messaggio da Zoff »

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: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
deepswing
Prode Principiante
Messaggi: 11
Iscrizione: martedì 9 gennaio 2007, 18:47
Località: Perugia
Contatti:

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

Messaggio da deepswing »

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.
cuccagna
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 423
Iscrizione: giovedì 26 marzo 2009, 15:50

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

Messaggio da cuccagna »

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: 423
Iscrizione: giovedì 26 marzo 2009, 15:50

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

Messaggio da cuccagna »

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: 423
Iscrizione: giovedì 26 marzo 2009, 15:50

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

Messaggio da cuccagna »

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
Mikycol
Prode Principiante
Messaggi: 80
Iscrizione: venerdì 5 ottobre 2007, 15:36

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

Messaggio da Mikycol »

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
cuccagna
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 423
Iscrizione: giovedì 26 marzo 2009, 15:50

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

Messaggio da cuccagna »

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
Mikycol
Prode Principiante
Messaggi: 80
Iscrizione: venerdì 5 ottobre 2007, 15:36

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

Messaggio da Mikycol »

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.
cuccagna
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 423
Iscrizione: giovedì 26 marzo 2009, 15:50

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

Messaggio da cuccagna »

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.
JavaForEver
Prode Principiante
Messaggi: 2
Iscrizione: giovedì 16 marzo 2017, 17:40

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

Messaggio da JavaForEver »

Qua un semplice esempio di lettura file tramite la libreria POI:
<link rimosso dallo staff per spam>

:ciao:
Avatar utente
tokijin
Moderatore Globale
Moderatore Globale
Messaggi: 4606
Iscrizione: mercoledì 3 giugno 2009, 23:10
Desktop: plasma 5.27.4
Distribuzione: Kubuntu 23.04
Località: Abruzzo

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

Messaggio da tokijin »

@JavaForEver
Controlliamo le date, non è bene riportare in vita una discussione ferma dal 2010.

Chiudo.
Sei abbruzzese se dopo che ti sei strafogato un chilogrammo di pasta, hai il coraggio di dire alla cuoca "cacc ch'è cott" - Se entra un piccione in casa..chiudi le finestre!
Ubuntu User #28657 - Il mio vecchio hardware - Tag Codice
Chiusa

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 9 ospiti