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.
