Pagina 1 di 1

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

Inviato: venerdì 10 settembre 2010, 23:16
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);
		}
	}
}

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

Inviato: sabato 11 settembre 2010, 2:20
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...

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

Inviato: sabato 11 settembre 2010, 15:58
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.

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

Inviato: sabato 11 settembre 2010, 17:08
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.

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

Inviato: sabato 11 settembre 2010, 18:50
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.

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

Inviato: martedì 21 settembre 2010, 19:16
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

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

Inviato: martedì 21 settembre 2010, 19:19
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.

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

Inviato: mercoledì 22 settembre 2010, 15:21
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

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

Inviato: mercoledì 22 settembre 2010, 16:07
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

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

Inviato: mercoledì 22 settembre 2010, 19:17
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

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

Inviato: giovedì 23 settembre 2010, 0:05
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);
}

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

Inviato: mercoledì 13 ottobre 2010, 8:27
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);
}

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

Inviato: giovedì 16 marzo 2017, 17:42
da JavaForEver
Qua un semplice esempio di lettura file tramite la libreria POI:
<link rimosso dallo staff per spam>

:ciao:

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

Inviato: giovedì 4 maggio 2017, 14:07
da tokijin
@JavaForEver
Controlliamo le date, non è bene riportare in vita una discussione ferma dal 2010.

Chiudo.