java - 如何在 apache-poi 中对 sheet.getMergedRegions() 的结果进行排序
问题描述
我使用了 apache poi 的 getMergedRegions() 函数,它返回一个 cellRangeAddresses 列表。然而,结果似乎杂乱无章。
List<CellRangeAddress> cellRangeAddressList = sheet.getMergedRegions();
这给出了以下结果:
[org.apache.poi.ss.util.CellRangeAddress [C2:C5],org.apache.poi.ss.util.CellRangeAddress [B2:B5],org.apache.poi.ss.util.CellRangeAddress [A2:A5 ], [org.apache.poi.ss.util.CellRangeAddress [C6:C9], org.apache.poi.ss.util.CellRangeAddress [B6:B9], org.apache.poi.ss.util.CellRangeAddress [A6 :A9], ]org.apache.poi.ss.util.CellRangeAddress [C10:C13], org.apache.poi.ss.util.CellRangeAddress [B10:B13], org.apache.poi.ss.util.CellRangeAddress [A10:A13]]
结果的顺序对我的代码没有帮助。我希望订单是
[org.apache.poi.ss.util.CellRangeAddress [A2:A5],org.apache.poi.ss.util.CellRangeAddress [B2:B5],org.apache.poi.ss.util.CellRangeAddress [C2:C5 ], [org.apache.poi.ss.util.CellRangeAddress [A6:A9], org.apache.poi.ss.util.CellRangeAddress [B6:B9], org.apache.poi.ss.util.CellRangeAddress [C6 :C9], ]org.apache.poi.ss.util.CellRangeAddress [A10:A13], org.apache.poi.ss.util.CellRangeAddress [B10:B13], org.apache.poi.ss.util.CellRangeAddress [C10:C13]]
有什么办法可以得到这个吗?
解决方案
Sheet.getMergedRegions
按添加的顺序获取合并的区域。但是当然有Collections.sort可以List
使用给定的给定排序Comparator
。
所以主要任务是定义那个Comparator
。
工作草案:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.ss.util.*;
import java.util.List;
import java.util.Collections;
class ExcelMergedRegions {
public static void main(String[] args) throws Exception {
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet();
sheet.addMergedRegion(new CellRangeAddress(1,4,2,2)); //C2:C5
sheet.addMergedRegion(new CellRangeAddress(1,4,1,1)); //B2:B5
sheet.addMergedRegion(new CellRangeAddress(1,4,0,0)); //A2:A5
sheet.addMergedRegion(new CellRangeAddress(5,8,2,2)); //C6:C9
sheet.addMergedRegion(new CellRangeAddress(5,8,1,1)); //B6:B9
sheet.addMergedRegion(new CellRangeAddress(5,8,0,0)); //A6:A9
sheet.addMergedRegion(new CellRangeAddress(9,12,2,2)); //C10:C13
sheet.addMergedRegion(new CellRangeAddress(9,12,0,0)); //A10:A13
sheet.addMergedRegion(new CellRangeAddress(1,5,3,4)); //D2:E6
sheet.addMergedRegion(new CellRangeAddress(2,2,5,7)); //F3:H3
List<CellRangeAddress> cellRangeAddressList = sheet.getMergedRegions();
System.out.println(cellRangeAddressList);
System.out.println("Sorted list:");
Collections.sort(cellRangeAddressList, new CellRangeAddressComperator());
System.out.println(cellRangeAddressList);
}
static class CellRangeAddressComperator implements java.util.Comparator<CellRangeAddress> {
public int compare(CellRangeAddress o1, CellRangeAddress o2) {
int r = 0;
// first compare first rows
r = o1.getFirstRow() - o2.getFirstRow();
if (r != 0 ) return r;
// if first rows are equal, compare first columns
r = o1.getFirstColumn() - o2.getFirstColumn();
if (r != 0 ) return r;
// if first rows and first columns are equal, compare last rows
r = o1.getLastRow() - o2.getLastRow();
if (r != 0 ) return r;
// if even last rows are equal, compare last columns
r = o1.getLastColumn() - o2.getLastColumn();
if (r != 0 ) return r;
// if all is equal, return 0
return r;
}
}
}
我希望我的Comparator
定义对所有可能的情况都有意义。但是,如果没有,您应该能够对其进行改进。使用 a 的方法Comparator
绝对是正确的。
推荐阅读
- c++ - 难以实现 C++17
- typescript - *.d.ts 不一致的位置
- javascript - 如何在行 express.js 中显示 4 个产品
- flutter - Flutter 错误 - 用于空值的空检查运算符(PDF 查看器)
- clock - 如何将模块上的系统连接到我的定制载板
- python - 熊猫。在巨大的df中只留下最频繁的行
- python - Kivy (python) 允许用户为 background_colors 和 texts 选择“color_options”
- java - 为什么我的程序忽略 else 语句
- php - 未在用户提及时创建通知
- javascript - 如何使显示的元素接收滚动事件?