Willkommen beim Apache POI Tutorial. Manchmal müssen wir Daten aus Microsoft Excel-Dateien lesen oder Berichte im Excel-Format generieren, meistens für geschäftliche oder finanzielle Zwecke. Java bietet keine integrierte Unterstützung für die Arbeit mit Excel-Dateien, daher müssen wir nach Open-Source-APIs suchen. Bei meiner Recherche wurde mir häufig JExcel oder Apache POI empfohlen. Nach weiteren Untersuchungen stellte ich fest, dass Apache POI aus folgenden Hauptgründen die beste Wahl ist:
- Unterstützung durch die Apache Foundation.
- JExcel unterstützt nicht das xlsx-Format, während POI sowohl xls- als auch xlsx-Formate unterstützt.
- Apache POI bietet streambasierte Verarbeitung, die für große Dateien geeignet ist und weniger Speicher benötigt.
Apache POI
Apache POI bietet ausgezeichnete Unterstützung für die Arbeit mit Microsoft Excel-Dokumenten. Apache POI kann sowohl XLS- als auch XLSX-Formate von Tabellenkalkulationen verarbeiten. Einige wichtige Punkte zur Apache POI-API sind:
- Apache POI enthält die HSSF-Implementierung für das Excel-’97(-2007)-Dateiformat, d. h. XLS.
- Apache POI XSSF-Implementierung sollte für das Excel-2007-OOXML (.xlsx)-Dateiformat verwendet werden.
- Die Apache POI HSSF- und XSSF-API bietet Mechanismen zum Lesen, Schreiben oder Modifizieren von Excel-Tabellen.
- Apache POI bietet auch die SXSSF-API, eine Erweiterung von XSSF, um mit sehr großen Excel-Tabellen zu arbeiten. Die SXSSF-API benötigt weniger Speicher und ist geeignet, wenn Sie mit sehr großen Tabellen arbeiten und der Heap-Speicher begrenzt ist.
- Es gibt zwei Modelle zur Auswahl – das Event-Modell und das Benutzermodell. Das Event-Modell benötigt weniger Speicher, da die Excel-Datei in Token eingelesen wird und diese verarbeitet werden müssen. Das Benutzermodell ist objektorientierter und benutzerfreundlicher, und wir werden dies in unseren Beispielen verwenden.
- Apache POI bietet ausgezeichnete Unterstützung für zusätzliche Excel-Funktionen wie die Arbeit mit Formeln, das Erstellen von Zellformatierungen durch das Füllen von Farben und Rahmen, Schriften, Kopf- und Fußzeilen, Datenvalidierungen, Bilder, Hyperlinks usw.
Apache POI Maven-Abhängigkeiten
Wenn Sie Maven verwenden, fügen Sie die unten stehenden Apache POI-Abhängigkeiten hinzu.
<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>
Die aktuelle Version von Apache POI ist 3.10-FINAL. Wenn Sie eine eigenständige Java-Anwendung haben, fügen Sie die Jars aus dem unten stehenden Bild hinzu.
Apache POI Beispiel – Excel-Datei lesen
Angenommen, wir haben eine Excel-Datei „Sample.xlsx“ mit zwei Blättern und Daten wie im folgenden Bild. Wir möchten die Excel-Datei lesen und eine Liste der Länder erstellen. Blatt1 enthält einige zusätzliche Daten, die wir beim Parsen ignorieren werden.
Unser Code für die Java-Bean „Country“ sieht wie folgt aus:
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;
}
}
Ein Beispielprogramm für Apache POI, um eine Excel-Datei in eine Liste von Ländern zu lesen, sieht wie folgt aus: 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 {
//Erstelle den Eingabestrom aus der xlsx/xls Datei
FileInputStream fis = new FileInputStream(fileName);
//Erstelle eine Workbook-Instanz für den Eingabestrom der xlsx/xls Datei
Workbook workbook = null;
if(fileName.toLowerCase().endsWith("xlsx")){
workbook = new XSSFWorkbook(fis);
}else if(fileName.toLowerCase().endsWith("xls")){
workbook = new HSSFWorkbook(fis);
}
//Erhalte die Anzahl der Blätter in der xlsx-Datei
int numberOfSheets = workbook.getNumberOfSheets();
//Schleife über jedes Blatt
for(int i=0; i < numberOfSheets; i++){
//Erhalte das n-te Blatt aus der Workbook-Instanz
Sheet sheet = workbook.getSheetAt(i);
//Jedes Blatt hat Zeilen, iteriere über sie
Iterator rowIterator = sheet.iterator();
while (rowIterator.hasNext())
{
String name = "";
String shortCode = "";
//Erhalte das Zeilenobjekt
Row row = rowIterator.next();
//Jede Zeile hat Spalten, erhalte den Spalten-Iterator und iteriere über sie
Iterator cellIterator = row.cellIterator();
while (cellIterator.hasNext())
{
//Erhalte das Zellenobjekt
Cell cell = cellIterator.next();
//Überprüfe den Zellentyp und verarbeite ihn entsprechend
switch(cell.getCellType()){
case Cell.CELL_TYPE_STRING:
if(shortCode.equalsIgnoreCase("")){
shortCode = cell.getStringCellValue().trim();
}else if(name.equalsIgnoreCase("")){
//2. Spalte
name = cell.getStringCellValue().trim();
}else{
//Zufällige Daten, ignoriere sie
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
//Schließe den Datei-Eingabestrom
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);
}
}
|
Das Programm ist sehr einfach zu verstehen und besteht aus folgenden Schritten:
- Erstellen Sie eine Instanz des
Workbook
-Objekts basierend auf dem Dateityp. Verwenden SieXSSFWorkbook
für das xlsx-Format undHSSFWorkbook
für das xls-Format. Beachten Sie, dass wir eine Wrapper-Klasse mit dem Factory-Muster erstellen könnten, um die Instanz des Arbeitsmappenobjekts basierend auf dem Dateinamen zu erhalten. - Verwenden Sie die Methode
getNumberOfSheets()
der Arbeitsmappe, um die Anzahl der Arbeitsblätter zu erhalten, und verwenden Sie dann eine Schleife, um jedes der Blätter zu analysieren. Verwenden Sie die MethodegetSheetAt(int i)
, um dieSheet
-Instanz zu erhalten. - Holen Sie sich den Iterator für die
Row
und dann den Iterator für dieCell
, um dasCell
-Objekt zu erhalten. Apache POI verwendet hier das Iterator-Muster. - Verwenden Sie switch-case, um den Zellentyp zu lesen und entsprechend zu verarbeiten.
Wenn wir nun das oben genannte Beispielprogramm von Apache POI ausführen, wird folgende Ausgabe auf der Konsole erzeugt.
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]
Apache POI Beispiel – Excel-Datei schreiben
Das Schreiben einer Excel-Datei in Apache POI ist ähnlich wie das Lesen, außer dass wir hier zuerst die Arbeitsmappe erstellen. Legen Sie dann Werte für Blätter, Zeilen und Zellen fest und verwenden Sie FileOutputStream, um sie in eine Datei zu schreiben. Lassen Sie uns ein einfaches Apache POI-Beispiel schreiben, in dem wir die Liste der Länder aus der obigen Methode verwenden, um sie in einer einzelnen Tabelle in eine andere Datei zu speichern. 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());
}
// Lassen Sie uns die Excel-Daten jetzt in die Datei schreiben
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);
}
}
Wenn ich das oben stehende Apache POI-Beispielprogramm ausführe, sieht die generierte Excel-Datei wie das folgende Bild aus.
Apache POI Beispiel – Excel-Formel lesen
Manchmal müssen wir komplexe Excel-Dateien mit Formeln bearbeiten. Lassen Sie uns ein einfaches Apache POI-Beispiel sehen, um die Formel einer Zelle mit ihrem Wert zu lesen.
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);
// angenommen, es handelt sich um eine xlsx-Datei
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");
}
}
|
Wenn wir das oben stehende Apache POI-Beispielprogramm ausführen, erhalten wir folgende Ausgabe.
1.0
2.0
3.0
4.0
Cell Formula=A1*A2*A3*A4
Cell Formula Result Type=0
Formula Value=24.0
Apache POI Beispiel – Excel Formel schreiben
Manchmal müssen wir Berechnungen durchführen und dann die Zellenwerte schreiben. Wir können die Excel-Formeln verwenden, um diese Berechnung durchzuführen, und das wird genauer, weil sich die Werte ändern werden, wenn sich die Zellenwerte in den Berechnungen ändern. Schauen wir uns ein einfaches Beispiel an, um eine Excel-Datei mit Formeln unter Verwendung der Apache POI API zu schreiben. 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);
// Formelzelle einstellen
row.createCell(3).setCellFormula("A1*B1*C1");
// schreiben wir in die Datei
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");
}
}
Die mit dem obigen Apache POI API Beispielprogramm erstellte Excel-Datei sieht wie das folgende Bild aus. Das ist alles zum Apache POI-Tutorial für die Arbeit mit Excel-Dateien, schauen Sie sich die Apache POI-Klassenmethoden an, um mehr Funktionen davon zu erfahren. Referenzen: Apache POI Entwicklerhandbuch
Source:
https://www.digitalocean.com/community/tutorials/apache-poi-tutorial