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)文章
Log4j定時(shí)打印日志及添加模塊名配置的Java代碼實(shí)例
這篇文章主要介紹了Log4j定時(shí)打印日志及添加模塊名配置的Java代碼實(shí)例,Log4j是Apache的一個開源Java日志項(xiàng)目,需要的朋友可以參考下2016-01-01SpringBoot使用前綴樹實(shí)現(xiàn)敏感詞過濾示例
最近項(xiàng)目用到了敏感詞過濾,本文主要就來介紹一下SpringBoot使用前綴樹實(shí)現(xiàn)敏感詞過濾示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10Java基礎(chǔ)教程之基本類型數(shù)據(jù)類型、包裝類及自動拆裝箱
這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)教程之基本類型數(shù)據(jù)類型、包裝類及自動拆裝箱的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06Spring中使用JSR303請求約束判空的實(shí)現(xiàn)
這篇文章主要介紹了Spring中使用JSR303請求約束判空的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Caused by: java.io.IOException: DerInputStrea
這篇文章主要介紹了Caused by: java.io.IOException: DerInputStream.getLength(): lengthTag=111, too big,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-10-10JavaWeb 實(shí)現(xiàn)多個文件壓縮下載功能
文件下載時(shí),我們可能需要一次下載多個文件,批量下載文件時(shí),需要將多個文件打包為zip,然后再下載。本文給大家分享實(shí)現(xiàn)思路及具體實(shí)現(xiàn)代碼,對javaweb實(shí)現(xiàn)文件壓縮下載功能感興趣的朋友一起學(xué)習(xí)吧2017-07-07SpringBoot項(xiàng)目啟動執(zhí)行任務(wù)的多種方法小結(jié)
這篇文章主要介紹了SpringBoot項(xiàng)目啟動執(zhí)行任務(wù)的多種方法小結(jié),本文給大家分享的這幾種方法經(jīng)常會被用到,當(dāng)我們的項(xiàng)目啟動后需要調(diào)用對應(yīng)的方法,用來項(xiàng)目的初始化等,本文通過示例代碼講解的非常詳細(xì),需要的朋友參考下吧2023-07-07Spring Security認(rèn)證提供程序示例詳解
這篇文章主要給大家介紹了關(guān)于Spring Security認(rèn)證提供程序的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring Security具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05