在之前的文章中,介绍了jxls
的基础使用。但导出表头属于写死的,并未采取动态渲染。
本次进行动态渲染操作,动态渲染表头和填充数据。
依赖引入
springboot测试项目中,引入下列依赖以及版本。
<dependency> <groupid>org.jxls</groupid> <artifactid>jxls</artifactid> <version>2.4.5</version> </dependency> <dependency> <!-- 可以使用poi的实现也可以用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>
制作导出模板
导出模板依旧采取批注
的方式,进行定义内容范围
、表头区域
、数据区域
。
a1
中的批注如下:
jx:area(lastcell=”a3”)
指定一条数据填充时的范围
。
a2
中的批注如下:
jx:grid(lastcell=“a3” headers=“hdatas” data=“bdatas” areas=[a2:a2, a3:a3] formatcells=“bigdecimal:c1,date:d1”)
headers
指定哪个list集合属于动态表头数据。data
指定使用哪个数据集合作为数据渲染源。areas
指定表头和数据的范围。a2:a2 表示 表头数据的区域。a3:a3 表示 第一个数据单元格所在的区域。formatcells
官方文档说的是指定数据格式,测试时不属于必填项
。
测试类
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(); // 动态头 context.putvar("hdatas", arrays.aslist("编号","名称","年龄","邮箱")); // 数据集合 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); } }
导出效果
注意事项
1、表头的数据格式为list<string>
。
2、数据部分的格式为list<list<object>>
。或者list<xxxxpo>
,但第2种数据格式暂未进行验证。
3、使用动态表头方式,必须使用org.jxls.common.context
来承接数据信息。
context context = new context(); // 动态头 context.putvar(“hdatas”, arrays.aslist(“编号”,“名称”,“年龄”,“邮箱”)); // 数据集合 list<list> datalist = lists.newarraylist(); context.putvar(“bdatas”,datalist);
4、表头与数据单元格部分,必须强制使用${header}
和${cell}
。自定义命名会导致数据不会填充!
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论