Benvenuto nel Tutorial di Apache POI. A volte è necessario leggere dati da Microsoft Excel Files o generare report in formato Excel, principalmente per scopi aziendali o finanziari. Java non fornisce un supporto integrato per lavorare con file Excel, quindi dobbiamo cercare API open source per il lavoro. Quando ho iniziato la ricerca di API Java per Excel, la maggior parte delle persone ha consigliato JExcel o Apache POI. Dopo ulteriori ricerche, ho scoperto che Apache POI è la scelta giusta per i seguenti motivi principali. Ci sono altre ragioni legate alle funzionalità avanzate, ma non entriamo troppo nei dettagli.
- Supporto della fondazione Apache.
- JExcel non supporta il formato xlsx, mentre POI supporta sia i formati xls che xlsx.
- Apache POI offre un processo basato su flusso, adatto per file di grandi dimensioni e richiede meno memoria.
Apache POI
Apache POI fornisce un eccellente supporto per lavorare con documenti Microsoft Excel. Apache POI è in grado di gestire sia i formati di fogli di calcolo XLS che XLSX. Alcuni punti importanti sull’API di Apache POI sono:
- Apache POI contiene l’implementazione HSSF per il formato di file Excel ’97(-2007) ovvero XLS.
- L’implementazione XSSF di Apache POI dovrebbe essere utilizzata per il formato di file Excel 2007 OOXML (.xlsx).
- L’API Apache POI HSSF e XSSF fornisce meccanismi per leggere, scrivere o modificare fogli di calcolo Excel.
- Apache POI fornisce anche l’API SXSSF che è un’estensione di XSSF per lavorare con fogli di calcolo Excel molto grandi. L’API SXSSF richiede meno memoria ed è adatta quando si lavora con fogli di calcolo molto grandi e la memoria heap è limitata.
- Ci sono due modelli tra cui scegliere: il modello di evento e il modello utente. Il modello di evento richiede meno memoria perché il file Excel viene letto in token e richiede di elaborarli. Il modello utente è più orientato agli oggetti e facile da usare e lo utilizzeremo nei nostri esempi.
- Apache POI fornisce un eccellente supporto per ulteriori funzionalità di Excel come lavorare con formule, creare stili di cella riempiendo colori e bordi, caratteri, intestazioni e piè di pagina, convalidhe dei dati, immagini, collegamenti ipertestuali ecc.
Apache POI Dipendenze Maven
Se stai usando Maven, aggiungi le dipendenze Apache POI di seguito.
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.10-FINAL</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.10-FINAL</version>
</dependency>
La versione corrente di Apache POI è 3.10-FINAL. Se stai utilizzando un’applicazione Java autonoma, includi i jar dall’immagine sottostante.
Esempio di Apache POI – Leggi il file Excel
Supponiamo di avere un file Excel “Sample.xlsx” con due fogli e con dati come nell’immagine sottostante. Vogliamo leggere il file Excel e creare una lista di Paesi. Il foglio 1 ha alcuni dati aggiuntivi, che ignoreremo durante l’analisi.
Il codice del nostro bean Java Country è:
Country.java
package com.journaldev.excel.read;
public class Country {
private String name;
private String shortCode;
public Country(String n, String c){
this.name=n;
this.shortCode=c;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getShortCode() {
return shortCode;
}
public void setShortCode(String shortCode) {
this.shortCode = shortCode;
}
@Override
public String toString(){
return name + "::" + shortCode;
}
}
Un esempio di programma Apache POI per leggere il file Excel e creare una lista di Paesi è il seguente. ReadExcelFileToList.java
package com.journaldev.excel.read;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ReadExcelFileToList {
public static List readExcelData(String fileName) {
List countriesList = new ArrayList();
try {
// Creare lo stream di input dal file xlsx/xls
FileInputStream fis = new FileInputStream(fileName);
// Creare un'istanza di Workbook per lo stream di input del file xlsx/xls
Workbook workbook = null;
if(fileName.toLowerCase().endsWith("xlsx")){
workbook = new XSSFWorkbook(fis);
}else if(fileName.toLowerCase().endsWith("xls")){
workbook = new HSSFWorkbook(fis);
}
// Ottenere il numero di fogli nel file xlsx
int numberOfSheets = workbook.getNumberOfSheets();
// Iterare su ciascuno dei fogli
for(int i=0; i < numberOfSheets; i++){
// Ottenere l'n-esimo foglio dal workbook
Sheet sheet = workbook.getSheetAt(i);
// Ogni foglio ha righe, iterare su di esse
Iterator rowIterator = sheet.iterator();
while (rowIterator.hasNext())
{
String name = "";
String shortCode = "";
// Ottenere l'oggetto riga
Row row = rowIterator.next();
// Ogni riga ha colonne, ottenere l'iteratore delle colonne e iterare su di esse
Iterator cellIterator = row.cellIterator();
while (cellIterator.hasNext())
{
// Ottenere l'oggetto Cell
Cell cell = cellIterator.next();
// Controllare il tipo di cella e elaborare di conseguenza
switch(cell.getCellType()){
case Cell.CELL_TYPE_STRING:
if(shortCode.equalsIgnoreCase("")){
shortCode = cell.getStringCellValue().trim();
}else if(name.equalsIgnoreCase("")){
// Seconda colonna
name = cell.getStringCellValue().trim();
}else{
// Dati casuali, lasciarli così
System.out.println("Random data::"+cell.getStringCellValue());
}
break;
case Cell.CELL_TYPE_NUMERIC:
System.out.println("Random data::"+cell.getNumericCellValue());
}
} //end of cell iterator
Country c = new Country(name, shortCode);
countriesList.add(c);
} //end of rows iterator
} //end of sheets for loop
// Chiudere lo stream di input del file
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
return countriesList;
}
public static void main(String args[]){
List list = readExcelData("Sample.xlsx");
System.out.println("Country List\n"+list);
}
}
|
Il programma è molto facile da capire e contiene i seguenti passaggi:
- Crea un’istanza di
Workbook
in base al tipo di file.XSSFWorkbook
per il formato xlsx eHSSFWorkbook
per il formato xls. Nota che avremmo potuto creare una classe wrapper con il pattern factory per ottenere l’istanza del workbook in base al nome del file. - Utilizza il metodo workbook getNumberOfSheets() per ottenere il numero di fogli e quindi utilizza un ciclo for per analizzare ciascun foglio. Ottieni l’istanza di
Sheet
utilizzando il metodo getSheetAt(int i). - Ottieni l’iteratore di
Row
e poi l’iteratore diCell
per ottenere l’oggetto Cell. Apache POI sta utilizzando il pattern dell’iteratore qui. - Utilizza switch-case per leggere il tipo di Cell e processalo di conseguenza.
Ora, quando eseguiamo il programma di esempio di Apache POI sopra, produce il seguente output sulla console.
Random data::1.0
Random data::2.0
Random data::3.0
Random data::4.0
Country List
[India::IND, Afghanistan::AFG, United States of America::USA, Anguilla::AIA,
Denmark ::DNK, Dominican Republic ::DOM, Algeria ::DZA, Ecuador ::ECU]
Esempio di Apache POI – Scrivi file Excel
Scrivere un file Excel in apache POI è simile alla lettura, tranne che qui creiamo prima il workbook. Impostiamo poi i valori delle fogli, righe e celle e utilizziamo FileOutputStream per scriverlo su file. Scriviamo ora un semplice esempio di apache POI in cui useremo una lista di paesi dal metodo sopra per salvarla in un altro file in un singolo foglio. WriteListToExcelFile.java
package com.journaldev.excel.read;
import java.io.FileOutputStream;
import java.util.Iterator;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class WriteListToExcelFile {
public static void writeCountryListToFile(String fileName, List countryList) throws Exception{
Workbook workbook = null;
if(fileName.endsWith("xlsx")){
workbook = new XSSFWorkbook();
}else if(fileName.endsWith("xls")){
workbook = new HSSFWorkbook();
}else{
throw new Exception("invalid file name, should be xls or xlsx");
}
Sheet sheet = workbook.createSheet("Countries");
Iterator iterator = countryList.iterator();
int rowIndex = 0;
while(iterator.hasNext()){
Country country = iterator.next();
Row row = sheet.createRow(rowIndex++);
Cell cell0 = row.createCell(0);
cell0.setCellValue(country.getName());
Cell cell1 = row.createCell(1);
cell1.setCellValue(country.getShortCode());
}
//scriviamo i dati Excel su file ora
FileOutputStream fos = new FileOutputStream(fileName);
workbook.write(fos);
fos.close();
System.out.println(fileName + " written successfully");
}
public static void main(String args[]) throws Exception{
List list = ReadExcelFileToList.readExcelData("Sample.xlsx");
WriteListToExcelFile.writeCountryListToFile("Countries.xls", list);
}
}
Quando eseguo il programma di esempio apache POI sopra, il file Excel generato appare come nell’immagine sottostante.
Esempio di Apache POI – Leggere la formula Excel
A volte è necessario gestire file Excel complessi con formule, vediamo un semplice esempio di apache POI per leggere la formula di una cella con il suo valore.
ReadExcelFormula.java
package com.journaldev.excel.read;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Iterator;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ReadExcelFormula {
public static void readExcelFormula(String fileName) throws IOException{
FileInputStream fis = new FileInputStream(fileName);
//supponendo un file xlsx
Workbook workbook = new XSSFWorkbook(fis);
Sheet sheet = workbook.getSheetAt(0);
Iterator rowIterator = sheet.iterator();
while (rowIterator.hasNext())
{
Row row = rowIterator.next();
Iterator cellIterator = row.cellIterator();
while (cellIterator.hasNext())
{
Cell cell = cellIterator.next();
switch(cell.getCellType()){
case Cell.CELL_TYPE_NUMERIC:
System.out.println(cell.getNumericCellValue());
break;
case Cell.CELL_TYPE_FORMULA:
System.out.println("Cell Formula="+cell.getCellFormula());
System.out.println("Cell Formula Result Type="+cell.getCachedFormulaResultType());
if(cell.getCachedFormulaResultType() == Cell.CELL_TYPE_NUMERIC){
System.out.println("Formula Value="+cell.getNumericCellValue());
}
}
}
}
}
public static void main(String args[]) throws IOException {
readExcelFormula("FormulaMultiply.xlsx");
}
}
|
Quando eseguiamo il programma di esempio apache poi sopra, otteniamo l’output seguente.
1.0
2.0
3.0
4.0
Cell Formula=A1*A2*A3*A4
Cell Formula Result Type=0
Formula Value=24.0
Esempio di Apache POI – Scrittura di una Formula Excel
A volte, è necessario effettuare alcuni calcoli e quindi scrivere i valori delle celle. Possiamo utilizzare le formule di Excel per effettuare questi calcoli e ciò renderà il risultato più accurato perché i valori cambieranno se i valori delle celle utilizzati nei calcoli cambieranno. Vediamo un semplice esempio per scrivere un file Excel con formule utilizzando l’API di Apache POI. WriteExcelWithFormula.java
package com.journaldev.excel.read;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class WriteExcelWithFormula {
public static void writeExcelWithFormula(String fileName) throws IOException{
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Numbers");
Row row = sheet.createRow(0);
row.createCell(0).setCellValue(10);
row.createCell(1).setCellValue(20);
row.createCell(2).setCellValue(30);
// Imposta la cella della formula
row.createCell(3).setCellFormula("A1*B1*C1");
// Scriviamo nel file
FileOutputStream fos = new FileOutputStream(fileName);
workbook.write(fos);
fos.close();
System.out.println(fileName + " written successfully");
}
public static void main(String[] args) throws IOException {
writeExcelWithFormula("Formulas.xlsx");
}
}
Il file Excel prodotto con il programma di esempio sopra dell’API di Apache POI appare come nell’immagine sotto. Questo è tutto per il tutorial di Apache POI per lavorare con file Excel, consulta i metodi delle classi di Apache POI per apprendere ulteriori funzionalità. Riferimenti: Guida dello sviluppatore di Apache POI
Source:
https://www.digitalocean.com/community/tutorials/apache-poi-tutorial