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>編寫一個(gè)導(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;
}
}編寫測(cè)試類
@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測(cè)試中文");
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)出測(cè)試
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”)這里分幾種使用情況,做一個(gè)大致的說明:
簡(jiǎn)單報(bào)表
如下圖所示,需要導(dǎo)出一個(gè)簡(jiǎn)單的報(bào)表數(shù)據(jù)信息。何為簡(jiǎn)單?
就是普通的表格

注意圖中標(biāo)明的兩個(gè)方框。其中分別寫了如下的批注。
- 表格頭部
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行左上部分是集合列表,其他都只需要顯示一條對(duì)應(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行,都算一個(gè)集合的一列數(shù)據(jù)!
也就是從A2~M20這個(gè)構(gòu)成的長(zhǎng)方形,包括的范圍,都只當(dāng)做一個(gè)集合中的一個(gè)對(duì)象。
List<User>中第一個(gè) user 對(duì)象
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Log4j定時(shí)打印日志及添加模塊名配置的Java代碼實(shí)例
這篇文章主要介紹了Log4j定時(shí)打印日志及添加模塊名配置的Java代碼實(shí)例,Log4j是Apache的一個(gè)開源Java日志項(xiàng)目,需要的朋友可以參考下2016-01-01
SpringBoot使用前綴樹實(shí)現(xiàn)敏感詞過濾示例
最近項(xiàng)目用到了敏感詞過濾,本文主要就來介紹一下SpringBoot使用前綴樹實(shí)現(xiàn)敏感詞過濾示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
Java基礎(chǔ)教程之基本類型數(shù)據(jù)類型、包裝類及自動(dòng)拆裝箱
這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)教程之基本類型數(shù)據(jù)類型、包裝類及自動(dòng)拆裝箱的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
Spring中使用JSR303請(qǐng)求約束判空的實(shí)現(xiàn)
這篇文章主要介紹了Spring中使用JSR303請(qǐng)求約束判空的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Caused by: java.io.IOException: DerInputStrea
這篇文章主要介紹了Caused by: java.io.IOException: DerInputStream.getLength(): lengthTag=111, too big,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-10-10
JavaWeb 實(shí)現(xiàn)多個(gè)文件壓縮下載功能
文件下載時(shí),我們可能需要一次下載多個(gè)文件,批量下載文件時(shí),需要將多個(gè)文件打包為zip,然后再下載。本文給大家分享實(shí)現(xiàn)思路及具體實(shí)現(xiàn)代碼,對(duì)javaweb實(shí)現(xiàn)文件壓縮下載功能感興趣的朋友一起學(xué)習(xí)吧2017-07-07
SpringBoot項(xiàng)目啟動(dòng)執(zhí)行任務(wù)的多種方法小結(jié)
這篇文章主要介紹了SpringBoot項(xiàng)目啟動(dòng)執(zhí)行任務(wù)的多種方法小結(jié),本文給大家分享的這幾種方法經(jīng)常會(huì)被用到,當(dāng)我們的項(xiàng)目啟動(dòng)后需要調(diào)用對(duì)應(yīng)的方法,用來項(xiàng)目的初始化等,本文通過示例代碼講解的非常詳細(xì),需要的朋友參考下吧2023-07-07
Spring Security認(rèn)證提供程序示例詳解
這篇文章主要給大家介紹了關(guān)于Spring Security認(rèn)證提供程序的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Security具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05

