Tutorial: Excel-Dateien in Java generieren (mit Apache POI)

Melden

Dieses Tutorial zeigt dir Schritt für Schritt, wie du mit Java professionelle Excel-Dateien (.xlsx) erstellst. Wir verwenden dafür die Bibliothek Apache POI, den Industriestandard für die Bearbeitung von Microsoft-Office-Dokumenten in Java.


In diesem Guide lernst du, wie du ein Projekt aufsetzt, Daten in Zellen schreibst, Formatierungen anwendest und die Datei speicherst.

1. Voraussetzungen

  • Java Development Kit (JDK): Version 8 oder höher.
  • Build-Tool: Maven oder Gradle (empfohlen).

2. Abhängigkeiten hinzufügen

Zuerst musst du die Apache POI Bibliotheken zu deinem Projekt hinzufügen.

Für Maven (pom.xml):

<dependencies>
    <!-- Apache POI für .xlsx (OOXML) -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>5.2.3</version>
    </dependency>
</dependencies>

3. Grundkonzepte von Apache POI

Bevor wir coden, hier die wichtigsten Klassen:

  • Workbook: Die gesamte Excel-Datei. Wir nutzen XSSFWorkbook für .xlsx.
  • Sheet: Ein einzelnes Tabellenblatt.
  • Row: Eine Zeile im Blatt (beginnend bei Index 0).
  • Cell: Eine einzelne Zelle in einer Zeile (beginnend bei Index 0).

4. Beispiel-Code: Eine einfache Excel-Datei erstellen

Hier ist ein vollständiges Beispiel, das eine Liste von Mitarbeitern in eine Excel-Datei schreibt.

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;
import java.io.IOException;

public class ExcelGenerator {

    public static void main(String[] args) {
        // 1. Workbook erstellen (das Dokument)
        try (Workbook workbook = new XSSFWorkbook()) {

            // 2. Tabellenblatt erstellen
            Sheet sheet = workbook.createSheet("Mitarbeiterliste");

            // 3. Header-Zeile erstellen (Index 0)
            Row headerRow = sheet.createRow(0);

            // Styling für den Header
            CellStyle headerStyle = workbook.createCellStyle();
            Font font = workbook.createFont();
            font.setBold(true);
            headerStyle.setFont(font);

            // Zellen für den Header füllen
            String[] columns = {"ID", "Name", "Abteilung", "Gehalt"};
            for (int i = 0; i < columns.length; i++) {
                Cell cell = headerRow.createCell(i);
                cell.setCellValue(columns[i]);
                cell.setCellStyle(headerStyle);
            }

            // 4. Beispieldaten hinzufügen
            Object[][] mitarbeiterDaten = {
                {1, "Max Mustermann", "IT", 55000.50},
                {2, "Erika Musterfrau", "Marketing", 62000.00},
                {3, "John Doe", "Sales", 48000.00}
            };

            int rowNum = 1;
            for (Object[] daten : mitarbeiterDaten) {
                Row row = sheet.createRow(rowNum++);
                row.createCell(0).setCellValue((int) daten[0]);
                row.createCell(1).setCellValue((String) daten[1]);
                row.createCell(2).setCellValue((String) daten[2]);
                row.createCell(3).setCellValue((double) daten[3]);
            }

            // 5. Spaltenbreite automatisch anpassen
            for (int i = 0; i < columns.length; i++) {
                sheet.autoSizeColumn(i);
            }

            // 6. Datei schreiben
            try (FileOutputStream fileOut = new FileOutputStream("Mitarbeiter.xlsx")) {
                workbook.write(fileOut);
                System.out.println("Excel-Datei erfolgreich erstellt: Mitarbeiter.xlsx");
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

5. Wichtige Formatierungen

Zahlenformate (z. B. Währung)

Damit Zahlen als Währung angezeigt werden, musst du ein DataFormat verwenden:

CellStyle currencyStyle = workbook.createCellStyle();
DataFormat df = workbook.createDataFormat();
currencyStyle.setDataFormat(df.getFormat("#,##0.00 €"));

Cell gehaltZelle = row.createCell(3);
gehaltZelle.setCellValue(55000.50);
gehaltZelle.setCellStyle(currencyStyle);

Farben und Rahmen

CellStyle styledCell = workbook.createCellStyle();
styledCell.setFillForegroundColor(IndexedColors.LIGHT_YELLOW.getIndex());
styledCell.setFillPattern(FillPatternType.SOLID_FOREGROUND);
styledCell.setBorderBottom(BorderStyle.THIN);

6. Best Practices

  1. Try-with-Resources: Nutze immer try (Workbook workbook = ...) und den FileOutputStream innerhalb eines Try-Blocks, damit alle Streams automatisch geschlossen werden. Dies verhindert Speicherlecks.
  2. SXSSFWorkbook für große Dateien: Wenn du Hunderttausende von Zeilen generieren musst, nutze SXSSFWorkbook (Streaming-Variante von Apache POI). Es verbraucht deutlich weniger RAM, da es Daten zwischendurch auf die Festplatte schreibt.
  3. Indizes: Denke daran, dass Spalten und Zeilen in POI bei 0 beginnen.

Fazit

Mit Apache POI ist das Erstellen von Excel-Dateien in Java sehr flexibel. Du kannst nicht nur einfache Tabellen erstellen, sondern auch Formeln einfügen, Diagramme generieren und komplexe Designs umsetzen. Für die meisten Standardaufgaben reicht das obige Grundgerüst völlig aus.

0