Java 導出 Excel 利器:JXLS
jxls 是一個輕量級的 Java 庫,用於基於模板的 Excel 報表生成。
jxls 作爲一個開源工具,提供了一種高效且易於維護的方式來處理複雜的 Excel 導出需求。它允許用戶通過在 Excel 模板中放置特定的標記或註釋來定義數據的輸出格式和佈局,從而避免了編寫大量重複且易出錯的代碼。
標註:簡單的 excel 格式,用簡單的 poi,easyExcel 等工具都能導出。但是針對複雜的 excel,有固定的樣式、合併單元格、動態列等各類要求,導致 excel 導出需要花很大一部分精力去寫代碼。jxls 在很大程度上解決了以上問題。
以下是 jxls 的一些主要特點:
-
簡單性: jxls 的設計哲學是簡單和直觀,使得即使是初學者也能快速上手並使用它來創建複雜的 Excel 報表。
-
靈活性: 通過在 Excel 模板中使用類似 jsp 的標籤,jXls 提供了極高的靈活性,可以輕鬆地生成各種格式的報表。
-
輕量級: 與其他 Java Excel 庫相比,jxls 更加輕量,不會給項目增加太多的負擔。
-
功能強大: jxls 特別適合於處理包含固定樣式、合併單元格和動態列等複雜要求的 Excel 導出任務。
-
易於維護: 使用 jxls 可以減少因手動編碼導致的維護成本和出錯概率,提高項目的可維護性。
添加 jar
很高興在編寫文章時發現 jxls 的大版本升級了,所使用的 jdk 版本也來到了 17。
對於原先的 jxls2.x 版本的使用者來說,新的構建器 API 取代了 JxlsHelper
。TransformerFactory
和 createTransformer()
方法也已被刪除。
Context 現在包含創建報表所需的所有信息。但數據以Map<String, Object>
的形式傳遞給 JxlsTemplateFiller
。
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-poi</artifactId>
<version>3.0.0</version>
</dependency>
XlsArea 區域
Area 是 jXLS 中的一個主要概念,它本質上代表了一個矩形區域,這個區域包含了需要進行數據轉換的單元格。每個 Area 可以包含一組轉換命令和一組嵌套的子區域,這些子區域也是 Area,它們有自己的命令和子區域。
如下命令表示需要處理的區域爲從 A1 至 K 列第 4 行:
jx:area(lastCell="K4")
創建報表
因爲大版本的升級,我們不再使用如下方式:
Context context = new Context();
context.putVar("list", list);
JxlsHelper.getInstance().setEvaluateFormulas(evaluateFormulas).processTemplate(inputStream, outPutStream, context);
而是:
Map<String, Object> data = new HashMap<>();
data.put("employees", employees);
JxlsPoiTemplateFillerBuilder.newInstance()
.withTemplate("template.xlsx")
.build()
.fill(data, new File("report.xlsx"));
循環
循環是用的最多的標籤,用於循環輸出各列數據:
jx:each(items="weeks" var="week" lastCell="B4")
示例:
public class Employee {
private String name;
private Date birthDate;
private BigDecimal payment;
private BigDecimal bonus;
// getters/setters ...
public Employee(String name, Date birthDate, double payment, double bonus) {
this(name, birthDate, new BigDecimal(payment), new BigDecimal(bonus));
}
public String getSalaryGroup() {
return payment.doubleValue() > 2000d ? "high" : "normal";
}
}
List<Employee> employees = new ArrayList<>();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MMM-dd", Locale.US);
employees.add(new Employee("Elsa", dateFormat.parse("1970-Jul-10"), 1500, 0.15));
employees.add(new Employee("Oleg", dateFormat.parse("1973-Apr-30"), 2300, 0.25));
employees.add(new Employee("John", dateFormat.parse("1970-Jul-10"), 3500, 0.10));
employees.add(new Employee("Neil", dateFormat.parse("1975-Oct-05"), 2500, 0.00));
employees.add(new Employee("Maria", dateFormat.parse("1978-Jan-07"), 1700, 0.15));
employees.add(new Employee("John", dateFormat.parse("1969-May-30"), 2800, 0.20));
employees.add(new Employee("Oleg", dateFormat.parse("1988-Apr-30"), 1500, 0.15));
employees.add(new Employee("Maria", dateFormat.parse("1970-Jul-10"), 3000, 0.10));
employees.add(new Employee("John", dateFormat.parse("1973-Apr-30"), 1000, 0.05));
return employees;
將模版編輯爲如下:
根據輸出報表查看結果。
unsetunset1.multisheet 多 sheet 頁 unsetunset
jx:each(items="employees" var="e" multisheet="sheetNames" lastCell="B4")
輸出:
unsetunset2. 方向向右 unsetunset
默認值爲 direction=“DOWN”
,將創建行。將使用 direction=“RIGHT”
創建列。
您也可以爲特殊情況設置自己的 cellRefGenerator
,但在此不再進一步描述。
jx:each(items="e.departments" var="d" lastCell="D2" direction="RIGHT")
unsetunset3. 索引 unsetunset
有時我們需要顯示循環的索引。使用屬性 varIndex
指定將保存從 0 開始的迭代索引的變量名稱。
jx:each(items="employees" var="e" varIndex="index" lastCell="C2")
顯示:
unsetunset4. 過濾 unsetunset
只有選擇條件爲 true 的項纔會成爲輸出的一部分。
jx:each(items="employees" var="e" select="e.payment > 2000" lastCell="C2")
unsetunset5. 分組和分組排序 unsetunset
在屬性中指定 var name + “.” + 屬性名稱
以對項目進行分組。還必須在屬性中指定 ASC、DESC 此時將在組內部進行排序。
比如employee
類中有salaryGroup
(工資)方法來指定該人是否大於 2000 元。
示例代碼:
jx:each(items="employees" var="g" groupBy="g.salaryGroup" groupOrder="ASC" lastCell="C3")
示例圖:
判斷
jx:if
命令根據條件表達式顯示 / 隱藏單元格。這就像 Java 中的 if
或 if,else
。
jx:if(condition="e.payment<2000" lastCell="C2" areas=["A2:C2","A3:C3"])
condition:
如果表達式結果爲真,則顯示區域,否則隱藏區域; 如果表達式結果不爲 true,則顯示其他區域,否則隱藏其他區域。
動態行列
jx:grid
命令可用於生成具有標題區域和數據行區域的動態網格。
jx:grid(headers="headers" data="items" areas=["A3:A3","A4:A4"] formatCells="BigDecimal:C1,Date:D1" lastCell="A4")
合併單元格
jx:mergeCells(cols="" rows="" minCols="" minRows="" lastCell="C2")
-
cols: 組合列數
-
rows: 合併的行數
-
minCols: 要合併的最小列數
-
minRows: 要合併的最小行數
-
lastCell: 合併單元格範圍。
圖片
使用此命令將圖像添加到工作表中。
jx:image(src="image" lastCell="A2")
-
src: 返回包含圖像數據的
byte[]
數組的表達式 -
imageType: 可以包含以下值:
PNG
(默認值)、JPEG
(非 JPG)、EMF
、WMF
、PICT
、DIB
。 -
scaleX 和 scaleY: 縮放參數(可選)
-
lastCell: 區域結束
excel 公式處理
參數化公式允許在公式中使用變量, 必須將其括在$[ ]
符號中,比如我們需要把數據輸出的同時進行計算,比如我們數據中的比率值是 1(excel 上最終需要顯示爲 1%)。我們可以修改代碼爲$[${item.taxRate}/100]
,其中${item.taxRate}
表示我們自己的迭代變量, 同時改變單元格樣式爲百分比,此時輸出的值纔會是 1%
JXLS 官網:https://jxls.sourceforge.net/
作者:jpq+
來源:https://blog.csdn.net/weixin_57057153
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/CDatc5-i689G13OB2lEMPg