Springboot使用jxls實(shí)現(xiàn)excel模板導(dǎo)出excel方式
jxls的正確使用,需要使用到下面的表達(dá)式。
# 設(shè)置 列表數(shù)據(jù)展示
jx:each(items="item.itemsList" var="obj" lastCell="H11" varIndex="ojbIndex")
jx:if(condition="item.productType.equals('財(cái)務(wù)報(bào)表')&&ojbIndex==0" lastCell="H11" areas=["A11:H11"])
# 設(shè)置表title 范圍
jx:area(lastCell=”H12”)但本次,并未使用到上面的要求,直接進(jìn)行指定xls模板數(shù)據(jù)填充與導(dǎo)出。
依賴引入
<!-- excel 填充 -->
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>net.sf.jxls</groupId>
<artifactId>jxls-core</artifactId>
<version>1.0.6</version>
</dependency>
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-poi</artifactId>
<version>2.8.1</version>
</dependency>編寫一個導(dǎo)出模板
如下所示:

放在springboot項(xiàng)目中的src\main\resources下的templates_report中,命名為test_user2.xls。

編寫工具類
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.Map;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import net.sf.jxls.transformer.XLSTransformer;
public class ExcelUtil {
/**
* 下載excel
*
* @param sourcePath 模板路徑
* @param beanParams excel內(nèi)容
* @return
*/
public static byte[] downLoadExcel(String sourcePath, Map<String, Object> beanParams) throws Exception {
ByteArrayOutputStream os = new ByteArrayOutputStream();
//讀取模板
Resource resource = new ClassPathResource(sourcePath);
InputStream is = resource.getInputStream();
XLSTransformer transformer = new XLSTransformer();
//向模板中寫入內(nèi)容
Workbook workbook = transformer.transformXLS(is, beanParams);
//寫入成功后轉(zhuǎn)化為輸出流
workbook.write(os);
byte[] bytes = os.toByteArray();
return bytes;
}
}編寫測試類
@GetMapping("/report-xls")
public void excelReport(HttpServletResponse response) throws Exception {
Map<String, Object> map = new HashMap();
List<Map<String, Object>> dataList = Lists.newArrayList();
for (int i = 0; i < 10; i++) {
Map<String, Object> params = new HashMap<>();
params.put("num","1_"+i);
params.put("name","xj_"+i);
params.put("age",22);
params.put("mail","專注寫bug測試中文");
dataList.add(params);
}
// ${item.num}
map.put("item",dataList);
byte[] bytes = ExcelUtil.downLoadExcel("/templates_report/test_user2.xls", map);
String fileName = UUID.randomUUID().toString() + "_001_test.xls";
generateFile(response, bytes, fileName);
}導(dǎo)出測試
http://localhost/report/report-xls

使用 jx 表達(dá)式填充(2023.08.08)
就如文章開始的一樣,說到了jx的表達(dá)式語法,3種樣式:
# 設(shè)置 列表數(shù)據(jù)展示
jx:each(items="item.itemsList" var="obj" lastCell="H11" varIndex="ojbIndex")
jx:if(condition="item.productType.equals('財(cái)務(wù)報(bào)表')&&ojbIndex==0" lastCell="H11" areas=["A11:H11"])
# 設(shè)置表title 范圍
jx:area(lastCell=”H12”)這里分幾種使用情況,做一個大致的說明:
簡單報(bào)表
如下圖所示,需要導(dǎo)出一個簡單的報(bào)表數(shù)據(jù)信息。何為簡單?
就是普通的表格

注意圖中標(biāo)明的兩個方框。其中分別寫了如下的批注。
- 表格頭部
Administrator: jx:area(lastCell=”P2”)
這里必須設(shè)置范圍,也就是lastCell。表示:表頭最多寬度只到P2。
- 表格內(nèi)容(列表數(shù)據(jù))
Administrator: jx:each(items="dataList" var="item" lastCell="P2")
這里也有范圍,設(shè)置的是lastCell為P2。
【注意】lastCell 設(shè)置的是橫向最大延伸到P2。
列表多條數(shù)據(jù),只看第一行即可!
復(fù)雜的單行數(shù)據(jù)填充
如下面的excel導(dǎo)出模板。

除了前2行左上部分是集合列表,其他都只需要顯示一條對應(yīng)的數(shù)據(jù)即可!
其實(shí)并不需要用到列表集合,全部是單條數(shù)據(jù)。只是需要顯示很多行而已。
像這樣的數(shù)據(jù),如何實(shí)現(xiàn)呢?
依舊還是使用jx表達(dá)式,限制導(dǎo)出文本的范圍。
如下:
表頭部分:
Administrator: jx:area(lastCell=”M20”)
這里的范圍,其實(shí)只需要大于等于需要導(dǎo)出的excel的范圍就行。
如果小了,則只顯示部分?jǐn)?shù)據(jù)。
數(shù)據(jù)部分,jx表達(dá)式如下所示:
Administrator: jx:each(items="dataList" var="item" lastCell="M20")
這里的lastCell是寫的M20,也就是
從標(biāo)注添加處開始算起,直至 M列的第20行,都算一個集合的一列數(shù)據(jù)!
也就是從A2~M20這個構(gòu)成的長方形,包括的范圍,都只當(dāng)做一個集合中的一個對象。
List<User>中第一個 user 對象
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
java基礎(chǔ)之接口組成更新的實(shí)現(xiàn)
本文主要介紹了java基礎(chǔ)之接口組成更新的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
Hibernate框架數(shù)據(jù)分頁技術(shù)實(shí)例分析
這篇文章主要介紹了Hibernate框架數(shù)據(jù)分頁技術(shù),結(jié)合實(shí)例形式分析了Hibernate框架實(shí)現(xiàn)數(shù)據(jù)分頁的原理,步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-03-03
SpringBoot+輕量級分布式日志框架GrayLog實(shí)踐
將SpringBoot日志遷移至GrayLog的實(shí)戰(zhàn)經(jīng)驗(yàn),稱其配置簡單、輕量高效,支持多環(huán)境分布式,通過GELF格式實(shí)現(xiàn)快速日志追蹤與報(bào)警,尤其強(qiáng)調(diào)traceId在跨服務(wù)定位中的關(guān)鍵作用,降低維護(hù)成本并提升故障排查效率2025-08-08
SpringBoot整合websocket實(shí)現(xiàn)即時(shí)通信聊天
這篇文章主要介紹了SpringBoot整合websocket實(shí)現(xiàn)即時(shí)通信聊天,實(shí)時(shí)通信是一個實(shí)時(shí)通信系統(tǒng),允許兩人或多人使用網(wǎng)絡(luò)實(shí)時(shí)的傳遞文字消息、文件、語音與視頻交流,需要的朋友可以參考下2022-05-05
SpringBoot內(nèi)置服務(wù)器(Tomcat/Jetty/Undertow)切換的操作指南
本文介紹了如何在SpringBoot中切換內(nèi)置服務(wù)器(Tomcat、Jetty和Undertow),分析了它們的核心差異和適用場景,通過修改pom.xml和application.yml文件,可以實(shí)現(xiàn)服務(wù)器的切換和自定義配置,最后給出了選型建議和注意事項(xiàng),需要的朋友可以參考下2026-03-03
SpringBoot實(shí)現(xiàn)驗(yàn)證碼的案例分享
驗(yàn)證碼可以有效防止其他人對某一個特定的注冊用戶用特定的程序,破解方式進(jìn)行不斷的登錄嘗試,我們其實(shí)很經(jīng)常看到,登錄一些網(wǎng)站其實(shí)是需要驗(yàn)證碼的,所以本文給大家分享了SpringBoot實(shí)現(xiàn)驗(yàn)證碼的案例,需要的朋友可以參考下2024-11-11

