Excel-Dateien mit Apache POI bearbeiten

Ein für viele Entwickler eher unerfreuliches Thema ist die Arbeit mit Microsoft Office Dateien in Java. Insbesondere Excel-Dateien werden von Fachabteilungen gerne als Ein- oder Ausgabeformat gesehen. Oft kann man sich dann auf einen Import bzw. Export via csv einigen. Wenn dies nicht möglich ist, lohnt es sich, einen Blick auf Apache POI zu werfen. Das Projekt hat sich der MS-Office-Thematik angenommen und gliedert sich in mehrere Subprojekte, die sich jeweils mit den einzelnen Office-Formaten beschäftigen. Viele dieser Subprojekte sind noch in einem sehr frühen Stadium und daher mit Vorsicht einzusetzen. Als ziemlich ausgereift kann man hingegen die Subprojekte HSSF und XSSF bezeichnen. HSSF liefert Unterstützung für das alte Excel-Dateinformat, das bis einschließlich Excel 2003 eingesetzt wurde. XSSF dagegen liefert die Unterstützung für das neuere XML-basierte Format, das mit Excel 2007 eingeführt wurde. Im folgenden soll anhand eines kurzen Beispiels ein erster Einblick in die Arbeit mit HSSF/XSSF gegeben werden. Dabei wird die Version 3.6 von POI eingesetzt.

HSSF und XSSF arbeiten mit einer Reihe von gemeinsamen Interfaces, die die Bestandteile einer Excel-Datei repräsentieren. Die folgenden Interfaces kommen in unserem Beispiel zum Einsatz:

  • Workbook repräsentiert eine Excel-Datei
  • Sheet repräsentiert eine einzelne Tabelle
  • Row repräsentiert eine einzelne Tabellenzeile
  • Column repräsentiert eine einzelne Tabellenspalte
  • Cell repräsentiert eine einzelne Tabellenzelle

Um nun eine einfache Excel-Tabelle zu erstellen und in einer xls-Datei zu speichern gehen wir wie folgt vor:

Workbook workbook;
File outputFile;
// wir wollen eine Excel 97 xls-Datei erzeugen, verwenden also HSSF
workbook = new HSSFWorkbook();
outputFile = new File("c:/Dateiname.xls");
 
// bei der Erzeugung der Daten arbeiten wir nur noch mit den Interfaces und damit
// formatunabhängig:
Sheet sheet = workbook.createSheet("Einkäufe");
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
cell.setCellType(Cell.CELL_TYPE_STRING);
cell.setCellValue("Ware");
cell = row.createCell(1);
cell.setCellType(Cell.CELL_TYPE_STRING);
cell.setCellValue("Preis");
row = sheet.createRow(1);
cell = row.createCell(0);
cell.setCellType(Cell.CELL_TYPE_STRING);
cell.setCellValue("Brot");
cell = row.createCell(1);
cell.setCellType(Cell.CELL_TYPE_NUMERIC);
cell.setCellValue(1.19);
row = sheet.createRow(2);
cell = row.createCell(0);
cell.setCellType(Cell.CELL_TYPE_STRING);
cell.setCellValue("Butter");
cell = row.createCell(1);
cell.setCellType(Cell.CELL_TYPE_NUMERIC);
cell.setCellValue(0.89);
row = sheet.createRow(3);
cell = row.createCell(0);
cell.setCellType(Cell.CELL_TYPE_STRING);
cell.setCellValue("Summe");
cell = row.createCell(1);
cell.setCellType(Cell.CELL_TYPE_NUMERIC);
// wir können mit setCellFormula auch Formeln für einzelne Zellen angeben
cell.setCellFormula("SUM(B2:B3)");
 
// Schreiben der Datei
FileOutputStream fileOutputStream = new FileOutputStream(outputFile);
workbook.write(fileOutputStream);
fileOutputStream.close();

Um stattdessen eine xslx-Datei (Excel 2007) zu erzeugen müssen wir im obigen Beispiel lediglich die Zeilen

workbook = new HSSFWorkbook();
outputFile = new File("c:/Dateiname.xls");

durch

workbook = new XSSFWorkbook();
outputFile = new File("c:/Dateiname.xlsx");

ersetzen. Der restliche Code bleibt unverändert. Ziemlich einfach, oder?

Ich wünsche viel Spaß beim Ausprobieren!


Malte Wulf
  • Share/Bookmark

Hinterlasse eine Antwort