技术记录

欲以犀利知性换啤酒,一杯又一杯。

  1. 1. 背景
  2. 2. 思路

背景

EasyExcel(根据条件动态合并单元格的重复数据))_Violet-CSDN博客_easyexcel动态合并单元格
现有的订单导出是使用的easyExcel完成的.对于相同单元格的合并是自定义的策略,问题是对于重复单元格的值会合并,表格求和时值会虚高
excel
现需要对合并格做修改,做到值只有一个。

思路

sheet合并代码主要为: sheet.addMergedRegionUnsafe(cellRangeAddr);
问题是为什么合并单元格时会带上原有的数据,猜测是删除合并区域问题(removeMergedRegion)

关键代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 比较当前行单元格与上一行是否相同,相同合并当前单元格与上一行  
if (curData.equals(preData)) {

Sheet sheet = writeSheetHolder.getSheet();
List<CellRangeAddress\> mergeRegions = sheet.getMergedRegions();
boolean isMerged = false;
for (int i = 0; i < mergeRegions.size() && !isMerged; i++) {
CellRangeAddress cellRangeAddr = mergeRegions.get(i);
// 若上一个单元格已经被合并,则先移出原有的合并单元,再重新添加合并单元
if (cellRangeAddr.isInRange(curRowIndex \- 1, curColIndex)) {
sheet.removeMergedRegion(i);
cellRangeAddr.setLastRow(curRowIndex);
sheet.addMergedRegionUnsafe(cellRangeAddr);
isMerged = true;
}
}
// 若上一个单元格未被合并,则新增合并单元
if (!isMerged) {
CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex \- 1, curRowIndex, curColIndex, curColIndex);
sheet.addMergedRegionUnsafe(cellRangeAddress);
}
}
  1. 查看了有关问题解决方案:
  1. 猜测是删除合并单元(removeMergedRegion)并没有删除包含的数据
  2. 准备一次合并所有相同单元格来实现
  3. 原有合并策略是根据行 列循环合并的,无法做到一次性合并,修改合并策略代价比较大,方案不可行。
  4. 通过写Excel时,如果一列有合并单元格时,用excel对该列求和,会重复计算 · Issue #1673 · alibaba/easyexcel 知道,需要将中间值置空来解决
  5. 尝试将合并cell 值设置为空
  6. 将当前cell值设置为空后,会导致无法触发值相同的条件判断,最多只能合并两行
  7. 修改合并条件判断,当单元格不是第一列且当前单元格第一列与上一列值相同,且当前单元格与上一单元格相同或 上一单元格为空时,值设置空.
  8. 测试可行 已解决 excel

解决代码:

1
2
3
4
5
6
7
// 比较当前行单元格与上一行是否相同,相同合并当前单元格与上一行 //重复值处理  
if (curData.equals(preData) || preCell.getCellTypeEnum().equals(CellType.BLANK)) {
//当前单元格不在第一列 值设置空
if (curColIndex != 0){
cell.setCellType(CellType.BLANK);
}
...
本文最后更新于 天前,文中所描述的信息可能已发生改变