easyexcel
easyexcel copied to clipboard
使用填充excel功能时,填充完成后excel打开出现错误
触发场景描述 使用项目中已有的测试demo进行模版测试list填充(master分支)
com.alibaba.easyexcel.test.demo.fill.FillTest#listFill
使用项目的demo代码测试可以触发Bug
public class FillTest {
//省略其他代码
// ......
/**
* 填充列表
*
* @since 2.1.1
*/
@Test
public void listFill() {
// 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替
// 填充list 的时候还要注意 模板中{.} 多了个点 表示list
String templateFileName = TestFileUtil.getPath() + "demo" + File.separator + "fill" + File.separator + "list.xlsx";
String fileName = TestFileUtil.getPath() + "listFill" + System.currentTimeMillis() + ".xlsx";
// ...... 省略无关代码
// 方案3 分多次 填充 会使用文件缓存(省内存)
fileName = TestFileUtil.getPath() + "listFill" + System.currentTimeMillis() + ".xlsx";
try (ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build()) {
WriteSheet writeSheet = EasyExcel.writerSheet().build();
//这里新增一个循环填充
for (int i = 0; i < 100; i++) {
excelWriter.fill(data1(), writeSheet);
excelWriter.fill(data1(), writeSheet);
}
}
}
//新增data1()
private List<Map<String,String>> data1(){
Map<String, String> data1 = new HashMap<>();
data1.put("name", "张三三");
data1.put("number", "001");
data1.put("date", "2022-06-20");
//只放date
Map<String, String> data2 = new HashMap<>();
data2.put("date", "2022-06-20");
List<Map<String,String>> list = new ArrayList<>();
list.add(data1);
list.add(data2);
return list;
}
提示的异常或者没有达到的效果
填充过程未出现异常,但填充完后excel无法打开,出现错误,如下图:
另外:发现2.2.11不会有此问题
我这边测试是发现分多次 fill 的情况下,数据到 100 多行就会在 MS Excel 中打开报错,选择自动修复会丢失部分单元格数据,但是 macOS 预览和 Numbers 打开都没问题
这个是个 bug ,我后面想办法修复,你map 都要 put(key,null)
这个是个 bug ,我后面想办法修复,你map 都要 put(key,null)
@zhuangjiaju
我也遇到同样的问题了,您说的map 都要 put(key,null)指的是什么意思?
我的需求有点不太一样,我的是多列
这个例子里面的data2,data3的数据样式。而且模板也是用easyexcel生成的临时模板。请问我该怎么处理数据?
我的data也是一个for循环从一个List里面取的,循环里面根据index分别取的data{index}
我每次fill的时候,尝试将data(index)当前index之外的数据都设置为null,表格正常,但是出现了错行。
我的代码:
模板内容{data1.attriName} {data1.code} {data2.attriName} {data2.code} ........其余模板列模板类似如图(我测试的时候列数较多,超过4组data以上肯定有问题):
不知道为啥,我代码贴上去没法格式化。 换句话说,您自己的例子,compositeFill函数,模板里面多加几组data,数据量整到到100以上。就很容易发现问题
try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(template).build()){ WriteSheet writeSheet = EasyExcel.writerSheet(0).build(); for (int index=0;index<ruleAttrs.size();index++) { excelWriter.fill(new FillWrapper(StrUtil.format("data{}", index), data1(index) ), writeSheet); }
private List<Map<String,String>> data1(int i){ List<Map<String,String>> list = new ArrayList<>(); for (int ss=0;ss<100*i;ss++){ Map<String, String> data1 = new HashMap<>(); data1.put("attriName", String.valueOf(ss)); data1.put("code", String.valueOf(ss)); list.add(data1); } return list; }
我懂了,每一行的map有值的填值,没值的填null。 这样麻烦了一些,但是问题解决了,希望尽快解决该问题。
hi,请问有后续嘛?这个bug修复了嘛?
版本3.3.4问题还存在