版本为当前最新版本3.2.1
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.2.1</version>
</dependency>
刚开始网上搜了一下,全是复制粘贴的使用什么模板withTemplate
的,去尝试导出csv的时候,报如下异常:
com.alibaba.excel.exception.ExcelGenerateException: csv cannot use template.
at com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder.copyTemplate(WriteWorkbookHolder.java:239)
at com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder.<init>(WriteWorkbookHolder.java:207)
at com.alibaba.excel.context.WriteContextImpl.initCurrentWorkbookHolder(WriteContextImpl.java:107)
at com.alibaba.excel.context.WriteContextImpl.<init>(WriteContextImpl.java:90)
at com.alibaba.excel.write.ExcelBuilderImpl.<init>(ExcelBuilderImpl.java:36)
at com.alibaba.excel.ExcelWriter.<init>(ExcelWriter.java:39)
at com.alibaba.excel.write.builder.ExcelWriterBuilder.build(ExcelWriterBuilder.java:104)
github上有一个一模一样问题的issues是22年提的https://github.com/alibaba/easyexcel/issues/2860。
.csv
根本不支持使用模板,具体 .xls
或者 .xlsx
能不能用我也没去试,无法追加写入的具体原因如下:
测试代码
//写csv
EasyExcel.write(file, CheckAccount.class)
.excelType(ExcelTypeEnum.CSV)
.sheet("特约商户统一对账单明细清单")
.doWrite(rtList);
//使用的实体类
@Data
public static class CheckAccount{
@ExcelProperty(value = "序列号", index = 0)
private Long serialNumber;
@ExcelProperty(value = "对账单日期",index = 1)
private String checkDate;
@ExcelProperty(value = "集团编号",index = 2)
private String groupNumber;
@ExcelProperty(value = "集团名称",index = 3)
private String groupName;
}
首次运行
可以看到导出一个573
字节的8条
数据的.csv
文件,后续每次执行都是一样的数据,无法追加写入。
最终通过一行一行代码debug定位,最终确定为 com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder
类的构造器中,代码如下:
当file
存在时,会执行this.outputStream = new FileOutputStream(this.file);
new FileOutputStream(file)
如果目标文件已经存在,会先清空
目标文件的内容,然后再写入新的数据, 如果想追加写入的话,需要额外传入参数 append = true
。
解决办法
项目下创建同路径的com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder
类。
将this.outputStream = new FileOutputStream(this.file);
改为 this.outputStream = new FileOutputStream(this.file, true);
测试结果
可以追加写入,但是表头会每次都新加一个,将写csv的代码改为如下逻辑:
File file = new File("/Users/wangsaichao/Downloads/newnew.csv");
if (file.exists()){
// 第二次按照原有格式,不需要表头
EasyExcel.write(file, CheckAccount.class)
.needHead(false)
.excelType(ExcelTypeEnum.CSV)
.sheet("特约商户统一对账单明细清单")
.doWrite(rtList);
}else {
// 第一次写入需要表头
EasyExcel.write(file, CheckAccount.class)
.excelType(ExcelTypeEnum.CSV)
.sheet("特约商户统一对账单明细清单")
.doWrite(rtList);
}