View Full Version : [Java] Eseguire un'operazione su molti file
Fabietto206
29-07-2011, 16:56
Salve gente, sto facendo un programmino in java che deve leggere molti file excel di una directory.
Ora riesco a leggerne uno solo, dato che gli passo la directory in cui si trova il file con l'istruzione
InputStream input = new FileInputStream("D:\\Documents and Settings\\nome.xls");
Io vorrei generalizzare il tutto in modo da dirgli di prendere tutti i file .xls presenti nella directory, come faccio?
banryu79
29-07-2011, 17:36
Io vorrei generalizzare il tutto in modo da dirgli di prendere tutti i file .xls presenti nella directory, come faccio?
Come parametro passi solo la directory (come tipo File)
File parent = new File("D:\\Documents and Settings\\");
A questo punto puoi farti dare da 'parent' tutti i file che esso contiene e che hanno '.xls' come estensione:
String[] files = parent.list(new FileNameFilter() {
@Override public void accept(File dir, String name) {
return dir.isFile() &&
name.toLowercase().endsWith(".xls");
}
});
File e FileNameFilter fanno parte del package java.io
Fabietto206
29-07-2011, 23:33
Domani testo la tua dritta e ti faccio sapere....
Fabietto206
30-07-2011, 21:25
Non ho capito come dovrei fare, al momento ho scritto così:
public static void main( String [] args ) {
try {
//Apriamo uno stream per recuperare il file
InputStream input = new FileInputStream("D:\\Documents and Settings\\....\\file.xls
//e lo rendiamo utilizzabile dalle librerie POI
POIFSFileSystem fs = new POIFSFileSystem(input);
//un file excel è un WorkBook contenente diversi fogli
HSSFWorkbook wb = new HSSFWorkbook(fs);
//di cui ne leggiamo il primo
HSSFSheet sheet = wb.getSheetAt(0);
Iterator rows = sheet.rowIterator();
Al momento quindi mi legge solo un file, mentre io (come scritto prima) vorrei fargli leggere tutti i file di una certa directory, come posso modificare il codice?
kevinpirola
31-07-2011, 02:09
non ho idea di cosa tu abbia fatto, ma non hai usato il list a quanto pare
metti un list tra un while has next element... e sei apposto
Fabietto206
31-07-2011, 15:19
Allo stato attuale il mio codice è il seguente:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Collection;
import java.util.HashMap;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
public class FromXLS {
//Oggetto Hash Map
HashMap hMap = new HashMap();
@SuppressWarnings("deprecation")
public static void main( String [] args ) {
try {
//Apriamo uno stream per recuperare il file
InputStream input = new FileInputStream("D:\\.....\\file.xls");
//e lo rendiamo utilizzabile dalle librerie POI
POIFSFileSystem fs = new POIFSFileSystem(input);
//un file excel è un WorkBook contenente diversi fogli
HSSFWorkbook wb = new HSSFWorkbook(fs);
//di cui ne leggiamo il primo
HSSFSheet sheet = wb.getSheetAt(0);
Iterator rows = sheet.rowIterator();
//Iteriamo su tutte le righe del foglio
while( rows.hasNext() ) {
HSSFRow row = (HSSFRow) rows.next();
System.out.println( "N. Riga = " + row.getRowNum() );
Iterator cells = row.cellIterator();
while( cells.hasNext() ) {
//Per ogni riga scorriamo tutte le celle
HSSFCell cell = (HSSFCell) cells.next();
System.out.println( "N. Cella = "
+ cell.getCellNum() );
/*Per ogni cella verifichiamo la tipologia del dato
* che contiene e lo scriviamo nel canale di output */
switch ( cell.getCellType() ) {
//Tipo numerico
case HSSFCell.CELL_TYPE_NUMERIC:
if (cell.getNumericCellValue() != 0)
System.out.println((int)cell.getNumericCellValue() );
break;
//Tipo stringa
case HSSFCell.CELL_TYPE_STRING:
System.out.println(cell.getStringCellValue() );
break;
//Tipo formula
case HSSFCell.CELL_TYPE_FORMULA:
if (cell.getNumericCellValue() != 0)
System.out.println((int)cell.getNumericCellValue());
break;
//Altro
default:
System.out.println("unsuported cell type" );
break;
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
Io dovrei fare in modo che legga una serie di file .xls contenuti in una certa directory.
Deve creare una Hash Map in cui il campo chiave sia una determinata colonna e il campo valore sia un numero che viene incrementato.
Consigli su come operare?
Fabietto206
31-07-2011, 18:17
I file xls sono fatti così:
http://img31.imageshack.us/img31/8510/immagineppq.jpg (http://imageshack.us/photo/my-images/31/immagineppq.jpg/)
Uploaded with ImageShack.us (http://imageshack.us)
A me interessano solo le colonne KEY e TOT.
Quindi ogni volta che si incontra la stessa KEY in un file xls seguente, bisogna sommare il valore di TOT vecchio con quello appena letto.
In ogni file xls sono presenti le stesse KEY, quindi credo che basti memorizzarle una volta sola nell'Hash Map.
Consigli su come operare?
Fabietto206
01-08-2011, 12:30
Sono andato avanti un pochino, ora sono "riuscito" a fargli prendere l'intera lista di file in una data directory.
public class FromXLS {
private static FilenameFilter xls;
//Metodo che prende in input un file excel ed estrae il contenuto di righe e colonne
@SuppressWarnings("deprecation")
public static void elaboraFile(File excel){
try {
//Apriamo uno stream per recuperare il file
InputStream input = new FileInputStream(excel);
//e lo rendiamo utilizzabile dalle librerie POI
POIFSFileSystem fs = new POIFSFileSystem(input);
//un file excel è un WorkBook contenente diversi fogli
HSSFWorkbook wb = new HSSFWorkbook(fs);
//di cui ne leggiamo il primo
HSSFSheet sheet = wb.getSheetAt(0);
Iterator rows = sheet.rowIterator();
//Iteriamo su tutte le righe del foglio
while( rows.hasNext() ) {
HSSFRow row = (HSSFRow) rows.next();
//System.out.println( "N. Riga = " + row.getRowNum() );
Iterator cells = row.cellIterator();
while( cells.hasNext() ) {
//Per ogni riga scorriamo tutte le celle
HSSFCell cell = (HSSFCell) cells.next();
/*Per ogni cella verifichiamo la tipologia del dato
* che contiene e lo scriviamo nel canale di output */
switch ( cell.getCellType() ) {
//Tipo numerico
case HSSFCell.CELL_TYPE_NUMERIC:
if (cell.getCellNum() == 2 || cell.getCellNum() == 5)
System.out.println((int)cell.getNumericCellValue() );
break;
//Tipo stringa
case HSSFCell.CELL_TYPE_STRING:
if (cell.getCellNum() == 2 || cell.getCellNum() == 5)
System.out.println(cell.getStringCellValue() );
break;
//Tipo formula
case HSSFCell.CELL_TYPE_FORMULA:
if (cell.getCellNum() == 2 || cell.getCellNum() == 5)
System.out.println((int)cell.getNumericCellValue());
break;
//Altro
default:
if (cell.getCellNum() == 2 || cell.getCellNum() == 5)
System.out.println("unsuported cell type" );
break;
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
//Directory contenente tutti i file .xls da elaborare
File mainDir = new File("I://rep_ vorwerk//Luglio_2011");
//Filtro sui file .xls
File files[] = mainDir.listFiles(xls);
//Oggetto Hash Map
Map<String, Integer> map = new HashMap<String, Integer>();
//Per tutti i file della directory
for( File file : files ){
System.out.println("Nome file: " + file);
elaboraFile(file);
}
}
}
Ora devo popolare l'Hash map con i valori, come posso fare?
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.