jxls2.4.5如何動態(tài)導(dǎo)出excel表頭與數(shù)據(jù)
在之前的文章中,介紹了jxls
的基礎(chǔ)使用。但導(dǎo)出表頭屬于寫死的,并未采取動態(tài)渲染。
本次進行動態(tài)渲染操作,動態(tài)渲染表頭和填充數(shù)據(jù)。
依賴引入
springboot測試項目中,引入下列依賴以及版本。
<dependency> <groupId>org.jxls</groupId> <artifactId>jxls</artifactId> <version>2.4.5</version> </dependency> <dependency> <!-- 可以使用poi的實現(xiàn)也可以用jexcelapi的 --> <groupId>org.jxls</groupId> <artifactId>jxls-poi</artifactId> <version>1.0.15</version> </dependency> <dependency> <groupId>org.jxls</groupId> <artifactId>jxls-jexcel</artifactId> <version>1.0.7</version> </dependency> <dependency> <groupId>net.sf.jxls</groupId> <artifactId>jxls-core</artifactId> <version>1.0.6</version> </dependency>
制作導(dǎo)出模板
導(dǎo)出模板依舊采取批注
的方式,進行定義內(nèi)容范圍
、表頭區(qū)域
、數(shù)據(jù)區(qū)域
。
A1
中的批注如下:
jx:area(lastCell=”A3”)
指定一條數(shù)據(jù)填充時的范圍
。
A2
中的批注如下:
jx:grid(lastCell=“A3” headers=“hDatas” data=“bDatas” areas=[A2:A2, A3:A3] formatCells=“BigDecimal:C1,Date:D1”)
headers
指定哪個list集合屬于動態(tài)表頭數(shù)據(jù)。data
指定使用哪個數(shù)據(jù)集合作為數(shù)據(jù)渲染源。areas
指定表頭和數(shù)據(jù)的范圍。A2:A2 表示 表頭數(shù)據(jù)的區(qū)域。A3:A3 表示 第一個數(shù)據(jù)單元格所在的區(qū)域。formatCells
官方文檔說的是指定數(shù)據(jù)格式,測試時不屬于必填項
。
測試類
package cn.xj.controller; import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.jxls.common.Context; import org.jxls.util.JxlsHelper; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import java.io.*; import java.util.*; @Slf4j public class Test3 { public static void main(String[] args) throws Exception { //Map<String, Object> map = new HashMap(); Context context = new Context(); // 動態(tài)頭 context.putVar("hDatas", Arrays.asList("編號","名稱","年齡","郵箱")); // 數(shù)據(jù)集合 List<List<Object>> dataList = Lists.newArrayList(); for (int i = 0; i < 10; i++) { List<Object> list = new ArrayList<>(); Map<String, Object> params = new HashMap<>(); list.add("1_"+i); list.add("xj_"+i); list.add(22); list.add("專注寫bug測試中文"); dataList.add(list); } // ${item.num} context.putVar("bDatas",dataList); Resource resource = new ClassPathResource("/report/test_user2.xlsx"); InputStream is = resource.getInputStream(); String outFile = System.getProperty("user.dir")+ File.separator+"springboot-poi"+File.separator+"pdf"+File.separator+System.currentTimeMillis()+ ".xlsx"; OutputStream outputStream = new FileOutputStream(outFile); JxlsHelper.getInstance().processTemplate(is, outputStream, context); } }
導(dǎo)出效果
注意事項
1、表頭的數(shù)據(jù)格式為List<String>
。
2、數(shù)據(jù)部分的格式為List<List<Object>>
?;蛘?code>List<xxxxPo>,但第2種數(shù)據(jù)格式暫未進行驗證。
3、使用動態(tài)表頭方式,必須使用org.jxls.common.Context
來承接數(shù)據(jù)信息。
Context context = new Context(); // 動態(tài)頭 context.putVar(“hDatas”, Arrays.asList(“編號”,“名稱”,“年齡”,“郵箱”)); // 數(shù)據(jù)集合 List<List> dataList = Lists.newArrayList(); context.putVar(“bDatas”,dataList);
4、表頭與數(shù)據(jù)單元格部分,必須強制使用${header}
和${cell}
。自定義命名會導(dǎo)致數(shù)據(jù)不會填充!
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot后端配置多個數(shù)據(jù)源、Mysql數(shù)據(jù)庫的便捷方法
實現(xiàn)springboot 后端配置多個數(shù)據(jù)源、Mysql數(shù)據(jù)庫,只需要新建 Mapper、實體類 相應(yīng)的文件夾,將不同數(shù)據(jù)源的文件保存到對應(yīng)的文件夾下,添加綁定數(shù)據(jù)庫配置Config,就可以輕松完成2021-08-08一天時間用Java寫了個飛機大戰(zhàn)游戲,朋友直呼高手
前兩天我發(fā)現(xiàn)論壇有兩篇飛機大戰(zhàn)的文章異?;鸨?但都是python寫的,竟然不是我大Java,說實話作為老java選手,我心里是有那么一些失落的,今天特地整理了這篇文章,需要的朋友可以參考下2021-05-05springboot Controller直接返回String類型帶來的亂碼問題及解決
文章介紹了在Spring Boot中,當(dāng)Controller直接返回String類型時可能出現(xiàn)的亂碼問題,并提供了解決辦法,通過在`application.yaml`中設(shè)置請求和響應(yīng)的編碼格式,并在自定義配置類中進行配置,可以有效解決這一問題2024-11-11