首页 > 解决方案 > Apache POI - 重新排序行

问题描述

我正在尝试解决问题,在不破坏引用这些行的公式的情况下交换 Excel 工作表中的行。

例子:

Sheet1: rows 1,2,3,4

行需要重新排序如下

Sheet1: rows 4,3,2,1

我已经尝试过 POI shift 方法,但我无法实现我的目标。

有什么指导吗?

提前致谢。

标签: apache-poi

解决方案


我已经考虑了好几天,我读到 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);
}

该代码很容易调试它以对其进行分析,有必要将其包含在为公式和其他复制单元格的策略中。


推荐阅读