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.