首页 > 其他分享 >解决easyexcel合并单元格数组求和重复问题

解决easyexcel合并单元格数组求和重复问题

时间:2024-03-08 23:34:25浏览次数:54  
标签:sheet 相同 求和 easyexcel 单元格 合并 cellRangeAddr

背景

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);
}
...

标签:sheet,相同,求和,easyexcel,单元格,合并,cellRangeAddr
From: https://www.cnblogs.com/yelanggu/p/18062066

相关文章

  • EasyExcel合并行处理并优化
    业务场景由于业务需要导出如下图中订单数据和订单项信息,而一个订单对应多个订单项,所以会涉及到自定义合并行 1.简单处理项目使用的EasyExcel,经查找发现Excel种有个AbstractMergeStrategy抽象类,可以用于合并单元格。于是先简单的写一个工具类实现根据数据自定义合并单元行,基本......
  • 把图片插在excel单元格里
    本文以WPS专业版举例1、如下图,选择对应的单元格 2、通过“插入”菜单插入图片或直接粘贴图片3、如下图,对插入的图片点击鼠标右键,选择“切换为嵌入单元格图片”4、完成 ......
  • L1-009 N个数求和
    MD...提交过了好几次才通过。第三个测试点:需要使用longlong,要求长整型。干脆就把int全部替换成longlong。第五个测试点:随便试出来的,我输入了21/2-1/2,发现啥都没打印出来。原来是忽略了结果是0的情况,如果整数部分和分子部分都是0,那么就把这个0打印出来,然后加了这部分,第......
  • List集合中的某个元素的求和
    第一种方式intsuma=list.stream().map(e->e.getAge()).reduce(Integer::sum).get();//求和System.out.println(suma);intmaxa=list.stream().map(e->e.getAge()).reduce(Integer::max).get();//最大System.out.println(maxa);intmina=list.stream().map(e->e.g......
  • Npoi操作Excel单元格合并
    publicasyncTask<byte[]>ExportNewReportByQuotationId(GuidquotationId){//stringsql=@$"select""Id""asModelId,(q.qq).keyaskey,(q.qq).valueasmyValuefrom(withaas(select""Id"&q......
  • P1874 快速求和 题解
    updon2023/12/22:修改了代码,现已通过所有hack数据。首先定义状态:令\(dp_{i,j}\)表示前\(i\)个数字要变成\(j\)所需要的最少加号个数。同时,我们还需要一个辅助数组:令\(num_{i,j}\)表示\(i\simj\)的数字组成的数(不添加加号)。然后进行转移。显然可以枚举......
  • Vuex系列之(五)求和案例
    求和案例//index.jsimportVuefrom'vue'importVuexfrom'vuex'Vue.use(Vuex)constactions={ //对于不包含业务逻辑也不进行Ajax请求转发的操作可以不经过actions,直接调用mutations中的方法即可 //jia(context,value){ // console.log('actions被调用了',conte......
  • 杜教筛——亚线性处理数论函数求和
    问题引入给定一个数论函数\(f(x)\),求\(\sum\limits_{i=1}^nf(i)\)。对\(n\le10^7\)甚至\(n\le10^8\)都是好做的,\(\mathcalO(n)\)解决即可,但如果\(n<2^{31}\)呢?这就需要亚线性时间复杂度的算法,杜教筛就是其一。杜教筛杜教筛是一种能在幂时间\(\mathcalO(......
  • 学习之请求和响应
    3.2请求和响应报文3.2.1报文的格式主体上分为报文首部和报文主体,中间空行隔开报文部首可以继续细分为"行"和"头"3.2.2请求报文客户端发给服务端的报文请求报文格式请求首行(请求行);GET/POST资源路径?参数HTTP/1.1(默认是通过GET请求获取服务器信......
  • 假期vue学习笔记14 求和案例vue版本
     <template>  <div>    <h1>当前求和为:{{sum}}</h1>    <selectv-model.number="n">      <optionvalue="1">1</option>      <optionvalue="2">2</option>......