apache-poi - Apache POI - 重新排序行
问题描述
我正在尝试解决问题,在不破坏引用这些行的公式的情况下交换 Excel 工作表中的行。
例子:
Sheet1: rows 1,2,3,4
行需要重新排序如下
Sheet1: rows 4,3,2,1
我已经尝试过 POI shift 方法,但我无法实现我的目标。
有什么指导吗?
提前致谢。
解决方案
我已经考虑了好几天,我读到 XSSF 对象存在一个错误,当您在重新排序时插入第 0 行时会出现问题,所以我手动实现了它:
private static void reverseRows(XSSFWorkbook workbook, Integer sheetIndex) {
Sheet sheet = workbook.getSheetAt(sheetIndex);
Sheet newSheet = workbook.createSheet(sheet.getSheetName()+"AUX");
Integer numberOfRows = sheet.getPhysicalNumberOfRows();
for (int i = 0; i < numberOfRows; i ++) {
copyRow(workbook,workbook.getSheetIndex(sheet),workbook.getSheetIndex(newSheet),numberOfRows - 1 - i,i);
}
String oldName = sheet.getSheetName();
workbook.removeSheetAt(workbook.getSheetIndex(sheet));
workbook.cloneSheet(workbook.getSheetIndex(newSheet), oldName);
workbook.removeSheetAt(workbook.getSheetIndex(newSheet));
workbook.setSheetOrder(oldName, sheetIndex);
workbook.setActiveSheet(0);
}
private static void copyRow(XSSFWorkbook workbook,Integer srcSheetIndex, Integer destSheetIndex, Integer srcRowIndex,Integer destRowIndex) {
XSSFSheet srcSheet = workbook.getSheetAt(srcSheetIndex);
XSSFRow srcRow = srcSheet.getRow(srcRowIndex);
XSSFSheet destSheet = workbook.getSheetAt(destSheetIndex);
XSSFRow destRowAux = destSheet.createRow(destRowIndex + 1);
destRowAux.copyRowFrom(srcRow, new CellCopyPolicy());
XSSFRow destRow = destSheet.createRow(destRowIndex);
destRow.copyRowFrom(destRowAux, new CellCopyPolicy());
destSheet.removeRow(destRowAux);
}
该代码很容易调试它以对其进行分析,有必要将其包含在为公式和其他复制单元格的策略中。
推荐阅读
- c# - EasyNetQ - 如何重试失败的消息并在消息正文/标题中保留 RetryCount?
- java - 无法运行程序“adb”:错误=13,权限被拒绝
- java - 过滤列表哪个属性不包含在另一个列表的属性中
- javascript - 我可以在不使用 javascript 的情况下开始这个简单的 CSS 过渡吗
- office365 - 对于使用 javamail 处理的一个 Office365 邮箱,folder.close(true) 不会清除已删除的电子邮件
- php - MySQL/Eloquent force id by left join 即使为空
- qt - QWidget如何检测鼠标停止移动
- firebase - Flutter:如何在 Firebase 中计算孩子数?
- c - C 如果条件不接受参数
- puppet - Puppet 在代理上创建文件