按模板导出 excel 的过程如下:

- 制作excel模板:模板中可以规定单元格的格式、字体等;
- 准备数据:数据对象的属性可以有:数值类、字符串、日期、对象、list;
- 配置:在application.yml中配置相关导出的属性和数据对应的单元格(也可以手动实例化一个 ExcelProperties 对象);
- 一行代码导出:调用ExTplExporter的export方法导出,最后生成如上图的结果。(截图为反面例子,导出的方法调用最好不要换行)
详细配置属性可以参考 上一篇文章 中的两个表格说明。
nameLocationMap 是一个用来确定数据在excel中位置的map,key为数据实体的属性名、value为期望数据在 excel 单元格中的位置。其中表示位置的 B2、D4 的字母不区分大小写。
实验功能:
如果导出的数据中有List集合类型,并且不能确定list的大小,而list后面的数据该怎样写位置呢?

可以如图写 D+4,指与 list 的相对位置为 +4,此功能要求list属性的位置配置必须在此之前,并且一张表只允许一个list。
使用实例
springboot中使用
0.依赖导入
<dependency>
<groupId>com.jvm123</groupId>
<artifactId>excel-converter-stater</artifactId>
<version>1.0</version>
</dependency>
可在中央仓库查询是否有最新版本: https://mvnrepository.com/artifact/com.jvm123
1.配置
excel:
converter:
props-map:
grade:
sheet-index: 0
date-pattern: yyyy年MM月dd日
name-location-map:
name: B2
address: B4
age: D2
date: D15
gradeList:
project: b8
grade: c8
totalGrade:
project: B13
grade: C13
sheet-index配置了需要导出到的sheet;name-location-map配置了属性与导出位置坐标的对应关系。
2.调用导出
@RestController
public class DemoExcelConvertController {
@Autowired
private ExTplExporter exTplExporter;
@GetMapping("test5")
public void test5(HttpServletResponse response) throws IOException {
Person person = createPerson();
response.addHeader("Content-Disposition","attachment;filename=grade.xlsx");
exTplExporter.export("成绩单模板.xlsx", person,
response.getOutputStream(), "grade");
}
}
非springboot环境使用
<dependency>
<groupId>com.jvm123</groupId>
<artifactId>excel-converter</artifactId>
<version>1.0</version>
</dependency>
可在中央仓库查询是否有最新版本: https://mvnrepository.com/artifact/com.jvm123
- 实例化ExcelTplExporter对象
- 设置ExcelProperties
- 调用export方法即可按照模板导出excel文件
public class Test3 {
public static void main(String[] args) throws FileNotFoundException {
Person p = new Person();
p.setAddress("广东广州黄浦区科技企业加速器开元大道");
p.setAge("12");
p.setName("柳成功");
List<Map> gradeList = new ArrayList<>();
Map<String, Object> yuwen = new HashMap<>();
yuwen.put("project", "语文");
yuwen.put("grade", "90");
Map<String, Object> shuxue = new HashMap<>();
shuxue.put("project", "数学");
shuxue.put("grade", "100");
gradeList.add(yuwen);
gradeList.add(shuxue);
p.setGradeList(gradeList);
Map<String, Object> totalGrade = new HashMap<>();
totalGrade.put("project", "总分");
totalGrade.put("grade", "190");
p.setTotalGrade(totalGrade);
ExcelProperties properties = new ExcelProperties();
LinkedHashMap<String, Object> nameLocationMap = new LinkedHashMap<>();
nameLocationMap.put("name", "B2");
nameLocationMap.put("age", "D2");
nameLocationMap.put("address", "b4");
LinkedHashMap<String, String> gradeMap = new LinkedHashMap<>();
gradeMap.put("project", "b8");
gradeMap.put("grade", "c8");
nameLocationMap.put("gradeList", gradeMap);
LinkedHashMap<String, String> totalGradeMap = new LinkedHashMap<>();
totalGradeMap.put("project", "b13");
totalGradeMap.put("grade", "c13");
nameLocationMap.put("totalGrade", totalGradeMap);
properties.setNameLocationMap(nameLocationMap);
ExcelTplExporter tplExporter = new ExcelTplExporter();
tplExporter.setProperties(properties);
tplExporter.export("成绩单模板.xlsx", p, new FileOutputStream(p.getName() + "同学成绩单.xlsx"));
}
}
我觉得应该在检测到是list时,要用 sheet.createRow增加一行,不然模板后面的内容不会相应下移
文章说的 把位置配置成D+4这样的格式,就是相对于列表的最后一行,下移了4行。实现来说,普通的每行处理完,给行数加1,而这里就给行数加了4。
请问下,模板中带有list表格,不确定行数,用相对位置处理。list下面的文字没有对应下移相应行数,怎么处理
如果没有下移,首先看看有没有使用最新版本,因为1.0版本这里有些问题,最新1.2.1,然后是需要把列表的配置放在这个D+4这种配置前面。
因为设置模板时,不确定list行数有几行,所以列表只留了一行,然后下面还有其他内容。
我debug了源码,设置完list的值后,假如是4行,在设置list下面的值时,行数是会加4,
但是行数加4的位置原本单元格就有值,所以有冲突。我意思是 在给list赋值时,不能单纯的
只将行数往下加,实际上模板要用sheet.createRow增加行数,像手工在excel里插入行一样,
这样list下面的内容会往下移对应的行数
模板行数不够,这点我的确没考虑到,代码里也没做相应的处理。如果你需要使用的话,可以在https://gitee.com/yawensilence/excel-converter-starter先下载源码,自己修改一下先用着
行,因为我这个项目需要maven打包,我先用poi底层的方法自己把目前的功能先实现,
等有时间我去下载代码,然后给你发Pull Requests
你好,我在码云上提交了代码合并,能不能审核下,顺带帮忙发到maven仓库,万分感谢
好
还有一种可能是,spring boot 读取application.properties文件中配置的属性时,顺序没法保证。所以只能使用yml文件配置这些属性,再使用spring.profiles.include=xxx导入yml配置。http://jvm123.com/2019/09/excel-converter-2.html
这篇文章我看到了,我没用配置文件,自己初始化的ExcelProperties
PingbackExcel-converter:一行代码实现java中excel数据导入导出 – jvm123