Generowanie arkusza przy użyciu biblioteki XSSFWorkbook

Ten wpis będzie dotyczył projektu Apache POI, którego celem jest stworzenie API do pracy z plikami w formatach opartych na Office Open XML oraz Microsoft OLE2.

Strona projektu znajduje się pod adresem https://poi.apache.org/index.html, bibliotekę można pobrać z sekcji Download lub poprzez repozytoria mavena.

Tworząc poniższy kod wzorowałem się na przykładowym projekcie dostępnym na stronie https://poi.apache.org/spreadsheet/examples.html#business-plan

Wynikiem działania programu będzie utworzenie arkusza jak na poniższym obrazku. W arkuszu, w kolumnie E, będzie wstawiona funkcja dodająca wartości z kolumny C i D.

Zaczynamy od klasy z danymi.

public class DataRecord {

    private Integer id;
    private String name;
    private Integer value1;
    private Integer value2;

    DataRecord(Integer id, String name, Integer value1, Integer value2) {
        this.id = id;
        this.name = name;
        this.value1 = value1;
        this.value2 = value2;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getValue1() {
        return value1;
    }

    public void setValue1(Integer value1) {
        this.value1 = value1;
    }

    public Integer getValue2() {
        return value2;
    }

    public void setValue2(Integer value2) {
        this.value2 = value2;
    }

}

Kolejny krok to utworzenie listy z danymi:

public class DataList {

    private List<DataRecord> list;

    public DataList() {
        this.list = new ArrayList<>();
        list.add(new DataRecord(1, "name1", 4, 7));
        list.add(new DataRecord(2, "name2", 2, 19));
        list.add(new DataRecord(3, "name3", 20, 11));
        list.add(new DataRecord(4, "name4", 2, 19));
    }

    public List<DataRecord> getList() {
        return list;
    }

}

W konstruktorze klasy dodaję do listy 4 obiekty klasy DataRecord.

Ostatnia klasa służy do wygenerowania i zapisania arkusza z danymi. W kodzie opisałem za co odpowiadają poszczególne fragmenty. Opisy są po angielsku, ale myślę że nie będzie problemu z ich zrozumieniem.

    public static void main(String[] args) throws Exception {
        DataList dl = new DataList();

        //create workbook
        Workbook wb = new XSSFWorkbook();

        //create sheet
        Sheet sheet = wb.createSheet("List1");

        //create row header with names
        Row rowHeader = sheet.createRow(0);
        rowHeader.createCell(0).setCellValue("id");
        rowHeader.createCell(1).setCellValue("name");
        rowHeader.createCell(2).setCellValue("value 1");
        rowHeader.createCell(3).setCellValue("value 2");
        rowHeader.createCell(4).setCellValue("sum");

        //set header style: font: bold, text align:center
        CellStyle headerStyle = wb.createCellStyle();
        Font headerFont = wb.createFont();
        headerFont.setBold(true);
        headerStyle.setFont(headerFont);
        headerStyle.setAlignment(HorizontalAlignment.CENTER);
        
        //set cells style in header row 
        for (int i = 0; i < 5; i++) {
            rowHeader.getCell(i).setCellStyle(headerStyle);
        }

        Row row;
        int rowNumber = 1;
        //loop to create row for every record on a list
        for (DataRecord dr : dl.getList()) {
            
            //create new row
            row = sheet.createRow(rowNumber);

            //create cells in newly created row
            Cell cellId = row.createCell(0);
            cellId.setCellValue(dr.getId());

            Cell cellName = row.createCell(1);
            cellName.setCellValue(dr.getName());

            Cell cellValue1 = row.createCell(2);
            cellValue1.setCellValue(dr.getValue1());

            Cell cellValue2 = row.createCell(3);
            cellValue2.setCellValue(dr.getValue2());

            //create cell with formula
            Cell cellSum = row.createCell(4);
            cellSum.setCellFormula("c" + (rowNumber + 1) + "+d" + (rowNumber + 1));

            rowNumber++;
        }

        //set file name
        String file = "example.xlsx";
        FileOutputStream out = new FileOutputStream(file);
        
        //write workbook to file
        wb.write(out);
        wb.close();
    }

Plik xlsx jest zapisywany w katalogu, z którego został wywołany program.