Excel导出序号连续性与单元格合并

Excel导出序号连续性与单元格合并

在生成Excel表格时,有时需要处理序号连续性单元格合并两项功能。特别是在处理类似任务编号这类数据时,我们需要确保任务编号列只在每组相同任务ID的首行显示,并且对任务编号列进行合并操作,避免重复显示。同时,序号也需要按照任务ID变化进行递增。以下是一个完整的实现流程,结合代码示例,帮助你理解如何处理这些需求。


1. 初始化数据与工具

在生成Excel表格时,首先需要初始化工作簿和相关配置。这里使用Apache POI库操作Excel,sheet.createRow(i) 用于创建行,sheet.addMergedRegion() 用于合并单元格。

// 创建工作表
XSSFSheet sheet = workbook.createSheet();
sheet.setDefaultColumnWidth(15);  // 设置单元格列宽

// 创建标题行(根据具体业务需求自定义)
createHeader(headersList, sheet);

// 初始化合并相关变量
int startZrwRow = 2;  // 任务编号列合并的起始行
int endZrwRow = 2;    // 任务编号列合并的结束行
String prevZrwId = ""; // 上一行任务ID
Integer xh = 1; // 序号初始值,从1开始

2. 序号连续性处理

序号通常从1开始,按顺序递增。但在处理合并单元格时,我们只在任务ID变化的地方显示序号,避免在任务编号相同的行重复显示序号。

  • 序号初始化:在初始化时,xh 从1开始。
  • 判定是否写入序号:当任务ID相同,序号保持不变;当任务ID变化时,序号递增。
for (int i = 0; i < resultList.size(); i++) {
    Map<String, Object> dataMap = resultList.get(i);
    Row row = sheet.createRow(i + 2);  // 创建当前行
    
    boolean shouldWriteXh = true; // 默认需要写序号
    String zrwID = resultList.get(i).get("ID") != null ? resultList.get(i).get("ID").toString() : "";
    
    // 如果当前任务ID与上一行任务ID相同,不需要写序号
    if (i > 0 && zrwID.equals(prevZrwId)) {
        shouldWriteXh = false;
    }

    if (shouldWriteXh) {
        dataMap.put("xh", xh); // 将当前序号放入数据中
        xh++; // 序号递增
    }
    
    // 写入当前行数据
    writeRow(headersList, dataMap, hbpcMap, rwztMap, row);
}
  • 判断条件 :

    • zrwID.equals(prevZrwId):判断当前行的任务ID是否与上一行相同。如果相同,不写入序号。
    • 如果不同,xh++ 序号递增,保证每次任务ID变化时序号都会变化。

3. 任务编号列单元格合并

任务编号列的合并是为了避免同一任务编号在多行中重复显示。我们会根据任务ID判断哪些行需要合并,只有任务ID变化时,才会进行合并操作。

  • 初始化合并相关变量
    • startZrwRow:合并区域的起始行。
    • endZrwRow:合并区域的结束行。
    • prevZrwId:上一个任务ID,用于判断当前任务ID与上一个是否相同。
  • 遍历数据并判断合并区域
    • 如果当前任务ID与上一行相同,延续合并区域。
    • 如果任务ID变化,执行合并操作,并更新合并区域的起始行和结束行。
for (int i = 0; i < resultList.size(); i++) {
    String zrwID = resultList.get(i).get("ID") != null ? resultList.get(i).get("ID").toString() : "";
    
    if (i == 0) {  // 第一个数据行
        prevZrwId = zrwID;
        startZrwRow = 2; 
        endZrwRow = 2;
    } else {
        if (zrwID.equals(prevZrwId)) {  // 任务ID相同
            endZrwRow = i + 2;  // 延续合并区域
        } else {  // 任务ID不同,执行合并操作
            if (startZrwRow != endZrwRow) {
                sheet.addMergedRegion(new CellRangeAddress(startZrwRow, endZrwRow, 0, 0)); // 合并任务编号列
            }
            startZrwRow = i + 2;  // 更新合并区域的起始行
            endZrwRow = i + 2;    // 更新合并区域的结束行
            prevZrwId = zrwID;    // 更新上一个任务ID
        }
    }
}
  • 合并操作:当任务ID发生变化时,调用 sheet.addMergedRegion(new CellRangeAddress(startZrwRow, endZrwRow, 0, 0)) 合并任务编号列。
    • CellRangeAddress(startRow, endRow, 0, 0):表示从 startRowendRow 的区域,合并第0列(任务编号列)。

4. 最后一组任务编号的合并

在遍历结束后,如果最后一组任务ID相同的行还未合并,我们需要在循环外部进行合并操作。

// 处理最后一组任务编号的合并
if (startZrwRow != endZrwRow) {
    sheet.addMergedRegion(new CellRangeAddress(startZrwRow, endZrwRow, 0, 0)); // 合并任务编号列
}
  • 原因:循环结束后,可能还有一组相同的任务ID未进行合并,因此需要进行最后一次合并。

总结
  1. 序号处理
    • 序号从1开始,按任务ID变化递增。
    • 任务ID相同的行只在第一行显示序号,后续行不重复显示。
  2. 合并任务编号列
    • 当多个连续行具有相同任务ID时,合并这些行的任务编号列,避免重复显示任务ID。
    • 使用 CellRangeAddress(startRow, endRow, 0, 0) 来合并任务编号列的单元格。
  3. 合并逻辑
    • 在任务ID变化时,更新合并区域的起始行和结束行,并执行合并。
    • 在数据遍历结束后,处理最后一组任务编号的合并。

通过这种方式,保证了数据的整洁和序号的连续性,同时避免了任务编号的重复显示。在导出Excel时,表格会更加美观、清晰,且符合合并单元格的规范。

  • 当合并逻辑比较复杂时,只需要复用合并逻辑就可以实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值