大家在使用Excel的時候,最常用的功能之一莫過於Excel的公式,如果把Excel公式寫好,即使幾個單元格數字有變動,整張Excel的數字都會動態改動,非常方便。
而前面介紹的JasperReports所匯出的Excel只是後端程式計算好的數字,匯出來的Excel就缺少了公式的靈活性,不過要做的話,JasperReports還是做得到喔~
以一個簡易的報價單為例(如下圖),希望金額欄位以及合計單元格使用Excel公式計算的話要怎麼設定呢?
模板的佈局一樣是欄位名稱放Column Header,Fields放Detail,由於Excel不分頁,合計放Page Footer或Summary都可以,要放公式的金額欄位與合計單元格都先空著。
在這個報價單例子中,序號僅僅是編號,沒有商業邏輯,因此不想寫在後端程式中的話,可以利用JasperReports-為報表加上頁碼這篇所介紹的預設變數COLUMN_COUNT來顯示當前資料列數。
添加屬性:
net.sf.jasperreports.export.xls.formula
表達式:
$F{quantity} + "*" + $F{price}
$V{COLUMN_COUNT}
會是最後一個序號的值,表達式可以寫為"SUM(E4:E" + (4 + $V{COLUMN_COUNT} - 1) + ")"
新增一些範例DataSource
@Data
@AllArgsConstructor
public class QuotationModel {
private String item;
private Integer quantity;
private BigDecimal price;
}
QuotationModel quotationModel1 = new QuotationModel("原子習慣", 2, new BigDecimal(260));
QuotationModel quotationModel2 = new QuotationModel("被討厭的勇氣", 1, new BigDecimal(300));
QuotationModel quotationModel3 = new QuotationModel("阿德勒心理學講義", 10, new BigDecimal(268));
QuotationModel quotationModel4 = new QuotationModel("新制多益TOEIC聽力/閱讀題庫解析", 1, new BigDecimal(1232));
List<QuotationModel> quotationModelList = new ArrayList<>();
quotationModelList.add(quotationModel1);
quotationModelList.add(quotationModel2);
quotationModelList.add(quotationModel3);
quotationModelList.add(quotationModel4);
Map<String, Object> parametersMap = new HashMap<>();
LocalDate date = new Date().toInstant()
.atZone(ZoneId.systemDefault()).toLocalDate();
parametersMap.put("date", date
.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日")));
匯出的步驟與之前的範例相同,直接看看結果吧
可以看到金額與合計欄位都已經是Excel的公式,可以自動計算價錢囉