在做一个小的数据处理任务时,我需要从数据库中提取用户的部门和他们的部门链信息。如果一个用户有多个亲属信息,则前面几列用户信息需要合并单元格。
最初,我用Java写了代码(虽然这方法已经不太推荐了,而且找这个方法也费了不少功夫),手动合并单元格。
int rowCount = 2;
int startRowIndex = 0;
int endIndex = 0;
for (InData data : inDatas) {
if (!instanceId.equals(data.getS1())) {
instanceId = data.getS1();
if (startRowIndex != endIndex) {
for (int i = 0; i < 7; i++) {
//合并前七列
Sheet currentSheet = excelWriter.writeContext().getCurrentSheet();
CellRangeAddress rangeAddress = new CellRangeAddress(startRowIndex, endIndex, i, i);
currentSheet.addMergedRegion(rangeAddress);
}
}
startRowIndex = rowCount;
endIndex = rowCount;
} else {
endIndex++;
}
//其他逻辑
}
小量数据的时候还好,但当数据量增加到超过6万行的时候,处理时间变得特别长,甚至花了五个小时都没能完成。
所以,最后决定先把数据处理好,再用Excel的VBA宏来做剩下的事情。
Sub MergeCellsBasedOnAColumn()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim startRow As Long
' 设置工作表
Set ws = ThisWorkbook.Sheets("模板")
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row ' 找到最后一个非空单元格的行号
startRow = 3 ' 假设从第2行开始有数据
For i = 3 To lastRow
If ws.Cells(i, 29).Value <> ws.Cells(i + 1, 29).Value Then
' 当前A列的值与下一行不同,进行合并操作
If startRow < i Then
' 合并A列单元格 懒得琢磨循环代码了
ws.Range(ws.Cells(startRow, 1), ws.Cells(i, 1)).Merge
ws.Range(ws.Cells(startRow, 2), ws.Cells(i, 2)).Merge
ws.Range(ws.Cells(startRow, 3), ws.Cells(i, 3)).Merge
ws.Range(ws.Cells(startRow, 4), ws.Cells(i, 4)).Merge
ws.Range(ws.Cells(startRow, 5), ws.Cells(i, 5)).Merge
ws.Range(ws.Cells(startRow, 6), ws.Cells(i, 6)).Merge
ws.Range(ws.Cells(startRow, 7), ws.Cells(i, 7)).Merge
ws.Range(ws.Cells(startRow, 8), ws.Cells(i, 8)).Merge
ws.Range(ws.Cells(startRow, 9), ws.Cells(i, 9)).Merge
End If
startRow = i + 1 ' 更新startRow为下一个分组的开始
End If
Next i
' 如果循环结束时还有未处理的合并(即最后一组)
If startRow <= lastRow Then
ws.Range(ws.Cells(startRow, 1), ws.Cells(lastRow, 1)).Merge
ws.Range(ws.Cells(startRow, 1), ws.Cells(lastRow, 1)).Merge
ws.Range(ws.Cells(startRow, 2), ws.Cells(lastRow, 2)).Merge
ws.Range(ws.Cells(startRow, 3), ws.Cells(lastRow, 3)).Merge
ws.Range(ws.Cells(startRow, 4), ws.Cells(lastRow, 4)).Merge
ws.Range(ws.Cells(startRow, 5), ws.Cells(lastRow, 5)).Merge
ws.Range(ws.Cells(startRow, 6), ws.Cells(lastRow, 6)).Merge
ws.Range(ws.Cells(startRow, 7), ws.Cells(lastRow, 7)).Merge
ws.Range(ws.Cells(startRow, 8), ws.Cells(lastRow, 8)).Merge
ws.Range(ws.Cells(startRow, 9), ws.Cells(lastRow, 9)).Merge
End If
End Sub
Function JoinRangeValues(rng As Range, delimiter As String) As String
Dim cell As Range
Dim result As String
result = ""
For Each cell In rng
If result = "" Then
result = cell.Value
Else
result = result & delimiter & cell.Value
End If
Next cell
JoinRangeValues = result
End Function
小提示: 没接触过VB的小白,询问AI后只用了30分钟就搞定了转用了VBA宏处理数据。AI牛批!