Java使用JXLS導(dǎo)出Excel詳解
jxls是一個輕量級的Java庫,用于基于模板的Excel報(bào)表生成。
jxls作為一個開源工具,提供了一種高效且易于維護(hù)的方式來處理復(fù)雜的Excel導(dǎo)出需求。它允許用戶通過在Excel模板中放置特定的標(biāo)記或注釋來定義數(shù)據(jù)的輸出格式和布局,從而避免了編寫大量重復(fù)且易出錯的代碼。
標(biāo)注:簡單的excel格式,用簡單的poi,easyExcel等工具都能導(dǎo)出。但是針對復(fù)雜的excel,有固定的樣式、合并單元格、動態(tài)列等各類要求,導(dǎo)致excel 導(dǎo)出需要花很大一部分精力去寫代碼。jxls在很大程度上解決了以上問題。
以下是jxls的一些主要特點(diǎn):
- 簡單性: jxls的設(shè)計(jì)哲學(xué)是簡單和直觀,使得即使是初學(xué)者也能快速上手并使用它來創(chuàng)建復(fù)雜的Excel報(bào)表。
- 靈活性: 通過在Excel模板中使用類似jsp的標(biāo)簽,jXls提供了極高的靈活性,可以輕松地生成各種格式的報(bào)表。
- 輕量級: 與其他Java Excel庫相比,jxls更加輕量,不會給項(xiàng)目增加太多的負(fù)擔(dān)。
- 功能強(qiáng)大: jxls特別適合于處理包含固定樣式、合并單元格和動態(tài)列等復(fù)雜要求的Excel導(dǎo)出任務(wù)。
- 易于維護(hù): 使用jxls可以減少因手動編碼導(dǎo)致的維護(hù)成本和出錯概率,提高項(xiàng)目的可維護(hù)性。
添加jar
很高興在編寫文章時發(fā)現(xiàn)jxls的大版本升級了,所使用的jdk版本也來到了17。
對于原先的jxls2.x版本的使用者來說,新的構(gòu)建器 API 取代了 JxlsHelper
。TransformerFactory
和 createTransformer()
方法也已被刪除。
Context 現(xiàn)在包含創(chuàng)建報(bào)表所需的所有信息。但數(shù)據(jù)以Map<String, Object>
的形式傳遞給 JxlsTemplateFiller
。
<dependency> <groupId>org.jxls</groupId> <artifactId>jxls-poi</artifactId> <version>3.0.0</version> </dependency>
XlsArea 區(qū)域
Area是jXLS中的一個主要概念,它本質(zhì)上代表了一個矩形區(qū)域,這個區(qū)域包含了需要進(jìn)行數(shù)據(jù)轉(zhuǎn)換的單元格。每個Area可以包含一組轉(zhuǎn)換命令和一組嵌套的子區(qū)域,這些子區(qū)域也是Area,它們有自己的命令和子區(qū)域。
如下命令表示需要處理的區(qū)域?yàn)閺腁1至K列第4行:
jx:area(lastCell="K4")
創(chuàng)建報(bào)表
因?yàn)榇蟀姹镜纳墸覀儾辉偈褂萌缦路绞剑?/p>
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"));
循環(huán)
循環(huán)是用的最多的標(biāo)簽,用于循環(huán)輸出各列數(shù)據(jù):
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;
將模版編輯為如下:
根據(jù)輸出報(bào)表查看結(jié)果。
1.multisheet 多sheet頁
jx:each(items="employees" var="e" multisheet="sheetNames" lastCell="B4")
輸出:
2.方向向右
默認(rèn)值為 direction=“DOWN”
,將創(chuàng)建行。將使用 direction=“RIGHT”
創(chuàng)建列。
您也可以為特殊情況設(shè)置自己的 cellRefGenerator
,但在此不再進(jìn)一步描述。
jx:each(items="e.departments" var="d" lastCell="D2" direction="RIGHT")
3.索引
有時我們需要顯示循環(huán)的索引。使用屬性 varIndex
指定將保存從 0 開始的迭代索引的變量名稱。
jx:each(items="employees" var="e" varIndex="index" lastCell="C2")
顯示:
4.過濾
只有選擇條件為 true 的項(xiàng)才會成為輸出的一部分。
jx:each(items="employees" var="e" select="e.payment > 2000" lastCell="C2")
5. 分組和分組排序
在屬性中指定 var name + “.” + 屬性名稱
以對項(xiàng)目進(jìn)行分組。還必須在屬性中指定 ASC、DESC此時將在組內(nèi)部進(jìn)行排序。
比如employee
類中有salaryGroup
(工資)方法來指定該人是否大于2000元。
示例代碼:
jx:each(items="employees" var="g" groupBy="g.salaryGroup" groupOrder="ASC" lastCell="C3")
示例圖:
判斷
jx:if
命令根據(jù)條件表達(dá)式顯示/隱藏單元格。這就像 Java 中的 if
或 if,else
。
jx:if(condition="e.payment<2000" lastCell="C2" areas=["A2:C2","A3:C3"])
condition:
如果表達(dá)式結(jié)果為真,則顯示區(qū)域,否則隱藏區(qū)域; 如果表達(dá)式結(jié)果不為 true,則顯示其他區(qū)域,否則隱藏其他區(qū)域。
動態(tài)行列
jx:grid
命令可用于生成具有標(biāo)題區(qū)域和數(shù)據(jù)行區(qū)域的動態(tài) 網(wǎng)格。
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: 組合列數(shù)
- rows: 合并的行數(shù)
- minCols: 要合并的最小列數(shù)
- minRows: 要合并的最小行數(shù)
- lastCell: 合并單元格范圍。
圖片
使用此命令將圖像添加到工作表中。
jx:image(src="image" lastCell="A2")
- src: 返回包含圖像數(shù)據(jù)的
byte[]
數(shù)組的表達(dá)式 - imageType: 可以包含以下值:
PNG
(默認(rèn)值)、JPEG
(非 JPG)、EMF
、WMF
、PICT
、DIB
。 - scaleX和scaleY: 縮放參數(shù)(可選)
- lastCell: 區(qū)域結(jié)束
excel 公式**處理
參數(shù)化公式允許在公式中使用變量,必須將其括在$[ ]
符號中,比如我們需要把數(shù)據(jù)輸出的同時進(jìn)行計(jì)算,比如我們數(shù)據(jù)中的比率值是1(excel上最終需要顯示為1%)。我們可以修改代碼為$[${item.taxRate}/100]
,其中${item.taxRate}
表示我們自己的迭代變量,同時改變單元格樣式為百分比,此時輸出的值才會是1%
到此這篇關(guān)于Java使用JXLS導(dǎo)出Excel詳解的文章就介紹到這了,更多相關(guān)Java JXLS導(dǎo)出Excel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot?異步任務(wù)和定時任務(wù)的異步處理
本文介紹了Springboot異步任務(wù)和定時任務(wù)的異步處理,Springboot?中,異步任務(wù)和定時任務(wù)是經(jīng)常遇到的處理問題方式,為了能夠用好這兩項(xiàng)配置,不干擾正常的業(yè)務(wù),需要對其進(jìn)行異步化配置。怎么設(shè)置合理的異步處理線程就是其核心和關(guān)鍵,下文詳情需要的朋友可以參考下2022-05-05spring?aop?pointcut?添加多個execution方式
這篇文章主要介紹了spring?aop?pointcut?添加多個execution方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11Idea實(shí)現(xiàn)接口的方法上無法添加@Override注解的解決方案
文章介紹了在IDEA中實(shí)現(xiàn)接口方法時無法添加@Override注解的問題及其解決方法,主要步驟包括更改項(xiàng)目結(jié)構(gòu)中的Language level到支持該注解的版本,以及在pom.xml文件中指定maven-compiler-plugin的版本以解決自動更新后的問題2025-02-02springcloud 中 zuul 修改請求參數(shù)信息的方法
這篇文章主要介紹了springcloud 中 zuul 修改請求參數(shù)信息的方法,需要的朋友可以參考下2018-02-02關(guān)于SpringBoot2.7.6連接nacos遇到的一些問題
這篇文章主要介紹了關(guān)于SpringBoot2.7.6連接nacos遇到的一些問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06java后臺利用Apache poi 生成excel文檔提供前臺下載示例
本篇文章主要介紹了java后臺利用Apache poi 生成excel文檔提供前臺下載示例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-05-05阿里面試Nacos配置中心交互模型是push還是pull原理解析
這篇文章主要為大家介紹了阿里面試Nacos配置中心交互模型是push還是pull原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07