[alibaba/easyexcel]ExcelWriter#write方法,接收data的类型为map时的问题. Excel没有数据

2024-05-11 427 views
7

触发Bug的代码

   `JSONArray jsonArray = JSON.parseArray(data);

            // 创建工作簿
            WriteWorkbook writeWorkbook = new WriteWorkbook();
            writeWorkbook.setExcelType(ExcelTypeEnum.XLSX);
            writeWorkbook.setCharset(Charset.forName("UTF-8"));
            writeWorkbook.setOutputStream(outputStream);
            writeWorkbook.setAutoCloseStream(Boolean.FALSE);

            // 创建sheet
            WriteSheet writeSheet = new WriteSheet();
            writeSheet.setSheetName(fileName);

            // 创建写入者,指定对应的工作簿
            ExcelWriter writer = new ExcelWriter(writeWorkbook);

            // 执行写入
            writer.write(head, writeSheet);
            writer.write(jsonArray.toJavaList(Map.class), writeSheet);#跟踪源码至com.alibaba.excel.write.executor.ExcelWriteAddExecutor#addOneRowOfDataToExcel中发现变量oneRowData判断为map类型
addBasicTypeToExcel(new MapRowData((Map<Integer, ?>)oneRowData), row, rowIndex, relativeRowIndex);
这一行的(Map<Integer, ?>)oneRowData是否应该是有问题的呢, 导致这个map没有变成预期的Map类型后面根据这个map获取key的时候入参是index但是对应的key实际上还是原本的字符串类型
最后导致出现问题的位置在com.alibaba.excel.write.executor.ExcelWriteAddExecutor#doAddBasicTypeToExcel内的一行
cellWriteHandlerContext.setOriginalValue(oneRowData.get(dataIndex));
`

提示的异常或者没有达到的效果 这个问题出现的现象是excel是没有具体数据的,因为对应写cell的时候根据map获取数据为null Snipaste_2021-12-29_17-01-50

回答

2

和这个情况直接使用 list 即可

2

和这个情况直接使用 list 即可

我也遇到同样问题,您这句话怎么理解?

1

用的时候只能写入List<Map<Integer, Object>>这种形式的数据,本质上还是当成了List<List>来用。如果要改成支持List<Map<String, Object>> 的话,可以从doAddBasicTypeToExcel方法的head参数中,拿到headNameList,第一个值就是了,暂时没测试过多级表头。另外由于它是用下标取值的,excelWriterBuilder.includeColumnFieldNames也会无效。