前言
在之前的文章中springboot——使用jxls实现excel模板导出excel,具体说明了jxls框架的基本使用。
除了最简单的单列表展示外,jxls还具有同sheet页展示多个列表的能力,接下来一起继续探究。
制定模板
1、限定模板数据的范围
采取下面的批注,指定需要渲染显示的报表范围。
这里的范围只考虑第一行的范围!
命令如下所示:
jx:area(lastcell=”h15”)

2、设定报表展示项
报表一,只显示单条数据。

报表二,进行列表展示,并设置批注,如下所示:
jx:each(items="datalist2" var="item" lastcell="c8")

报表三,与报表二中的批注一样,只是接收参数变量名不同。
批注如下所示:
jx:each(items="datalist3" var="item" lastcell="c12")
编写测试类
1、将xls模板文件放于 resource 下的 doc文件夹中

2、导入依赖文件
<!-- 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>3、编写接口和导出逻辑
@requestmapping("/ss")
public void download(httpservletrequest request,httpservletresponse response) throws exception {
map<string, object> map = new hashmap();
map.put("name1","xiangjiao");
map.put("age1","10");
map.put("are1","中国");
// 报表二
list<map<string, object>> datalist = new arraylist();
for (int i = 0; i < 10; i++) {
map<string, object> params = new hashmap<>();
params.put("name2","1_"+i);
params.put("age2","xj_"+i);
params.put("are2",22);
datalist.add(params);
}
// ${item.num}
map.put("datalist2",datalist);
// 报表三
list<map<string, object>> datalist3 = new arraylist();
for (int i = 0; i < 10; i++) {
map<string, object> params = new hashmap<>();
params.put("name2","1_"+i);
params.put("age2","xj_"+i);
params.put("are2",22);
datalist3.add(params);
}
// ${item.num}
map.put("datalist3",datalist3);
export(map,"test.xls","666.xls",response);
}
public static void export(map<string, object> datamap, string reportname,string filename, httpservletresponse response) throws ioexception {
resource resource = new classpathresource("/doc" +file.separator+ reportname);
inputstream in = resource.getinputstream();
// 这里的context是jxls框架上的context内容
context context = poitransformer.createinitialcontext();
context.tomap().putall(datamap);
workbook workbook = workbookfactory.create(in);
// changing name of the first sheet
workbook.setsheetname(0, "sheet1");
poitransformer transformer = poitransformer.createtransformer(workbook);
outputstream out = response.getoutputstream();
transformer.setoutputstream(out);
// 文件名 - 解决中文乱码问题
string filename = urlencoder.encode(filename, "utf-8");
// 设置响应编码
response.setcharacterencoding("utf-8");
response.setcontenttype("application/x-download");
response.setheader("content-disposition", "attachment;filename=" + filename);
jxlshelper.getinstance().processtemplate(context, transformer);
in.close();
out.flush();
out.close();
}效果预览

结论
jxls能够完美的实现样式自定义、单数据、多报表集成。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论