Apache-POI 在 Excel 中对行进行排序

2022-09-04 03:52:41

我想按字符串列之一对工作表中的行进行排序。我试图使用Sheet.shiftRows方法实现这一目标,但我无法做到这一点。它不会在我的方法中切换行的位置。我的代码中出了什么问题?或者也许有更好的方法按Excel中的任何字符串列对行进行排序?

/**
 * Sorts (A-Z) rows by String column
 * @param sheet - sheet to sort
 * @param column - String column to sort by
 * @param rowStart - sorting from this row down
 */
private void sortSheet(Sheet sheet, int column, int rowStart) {
    boolean sorting = true;
    int lastRow = sheet.getLastRowNum();
    while (sorting == true) {
        sorting = false;
        for (Row row : sheet) {
            // skip if this row is before first to sort
            if (row.getRowNum()<rowStart) continue;
            // end if this is last row
            if (lastRow==row.getRowNum()) break;
            Row row2 = sheet.getRow(row.getRowNum()+1);
            if (row2 == null) continue;
            String firstValue = (row.getCell(column) != null) ? row.getCell(column).getStringCellValue() : "";
            String secondValue = (row2.getCell(column) != null) ? row2.getCell(column).getStringCellValue() : "";
            //compare cell from current row and next row - and switch if secondValue should be before first
            if (secondValue.compareToIgnoreCase(firstValue)<0) {                    
                sheet.shiftRows(row2.getRowNum(), row2.getRowNum(), -1);
                sheet.shiftRows(row.getRowNum(), row.getRowNum(), 1);
                sorting = true;
            }
        }
    }
}

任何想法如何管理工作表中的行排序?

更新上述方法自Apache-POI 3.9版本起有效。

编辑:添加了缺少的括号-helvio


答案 1

Poi没有内置的排序机制,尽管您当然远非第一个有这种需求的机制。

我认为你遇到了麻烦,因为你正在移动你正在迭代的行。我已经运行了上面的代码,似乎正在发生的事情是,在代码执行结束时,行从工作表中消失了。

该问题尝试对读入工作表进行就地修改。我认为创建第二个输出表会更合适。

因此,基本方法是读取工作表,在java中排序,就像处理任何其他排序问题一样,写入输出工作表。如果您做了一个行号的映射,该行号对于您感兴趣的列的字符串值是唯一的,那么您可以按值对映射进行排序。如果您只预见到需要对单个列进行排序,则这种方法是有效的。无论如何,它并不像从excel中选择排序菜单选项那么简单。


答案 2

现在我现在为什么它不起作用。shiftRows 方法中存在一个错误。当第三个参数(要移位的行数)为负数时,会引起麻烦。

如下所述:https://issues.apache.org/bugzilla/show_bug.cgi?id=53798

更新此错误已从版本 3.9 修复


推荐