当前位置: 首页 > 后端技术 > Java

easypoi模板导出foreach单行多结果集+合并单元格问题

时间:2023-04-01 14:31:15 Java

上一篇文章的补充。解决遗留问题:mergedRegionHelper改造完成后,不支持模板配置为一行多个结果集,且结果集中有合并单元格的情况。例如:在导出数据的时候,系统会报错:经过分析,是因为我们虽然修改了mergedRegionHelper的算法,插入行后不再调整缓存的数据,而是记录插入行数,但是因为easypoi处理模板的方式是从上到下,从左到右,逐行逐列地处理模板的单元格。如上模板所示,在处理第二行第一列的时候,遇到了foreash。如果我们给的数据集不止一条数据,则插入一行,调用mergedRegionHelper的shiftrow方法更新我们新的一条。属性rowsSfhited。当继续处理第2行的第二个foreach时,调用mergedRegionHelper判断是否为合并单元格时会出现问题,因为此时mergedRegionHelper的rowsShifted已经更新:publicbooleanisMergedRegion(introw,intcol){//20230211新增SHIFTMETHOD_KEEP_MERGEDCACHEif(shiftMethod==SHIFTMETHOD_KEEP_MERGEDCACHE)row-=rowsShifted;返回mergedCache.containsKey(row+"_"+col);第2行,因此会导致错误。解决bug,仔细分析修改后的mergedRegionHelper逻辑。其实我们只要在处理完一行数据,准备处理下一行数据的时候,更新mergedRegionHelper的rowsShfited属性,就不会有问题。所以我们找到这个逻辑的位置。在ExcelExportOfTemplateUtil#parseTemplate方法中,我们需要初始化新变量shiftCache(shiftCache是??为支持单行多数据集而引入的缓存变量,用于记录每个foreach行插入多少行数据):然后在循环遍历当前行的所有列并跳转到下一行之前处理mergedRegionHelper:=null&&!tempCreateCellSet.contains(row.getRowNum()+"_"+row.getCell(i).getColumnIndex())){setValueForCellByMap(row.getCell(i),地图);}}//20230212检查从shiftCache转移的行并设置为mergedRegionHelper//当我们移动到下一行时if(shiftCache.get(row.getRowNum()+1)!=null){mergedRegionHelper.shiftRows(sheet,row.getRowNum(),shiftCache.get(row.getRowNum()+1),sheet.getLastRowNum());}重新运行,成功得到结果:前面easypoi模板导出中的公式和foreach合并单元格下一个Quartz相关线程的问题

最新推荐
猜你喜欢