文章目录
- 前言
- 依赖引入
- 制作导出模板
- 测试类
- 导出效果
- 注意事项
前言
再之前的博客中,介绍了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}
。自定义命名会导致数据不会填充!