Apache-POI сортировка строк в excel

Я хотел бы отсортировать строки на листе по одному из столбцов строки. Я попытался достичь этого, используя 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

2 ответов


Poi не имеет встроенного механизма сортировки, хотя, конечно, вы далеки от первого с этой необходимостью.

Я думаю, что у вас проблемы, потому что вы перемещаете строки, которые вы повторяете. Я запустил код выше, и кажется, что происходит, что строки исчезают с листа к концу выполнения кода.

вопрос пытается сделать модификацию на месте листа чтения. Я считаю, что создание второго листа продукция быть более подходящим.

таким образом, основной подход будет читать лист, сортировать на java так же, как вы рассматриваете любую другую проблему сортировки, писать на выходной лист. Если вы сделали карту номера строки, которая уникальна для строкового значения интересующего вас столбца, вы можете отсортировать карту по значению. Такой подход будет работать, если вы только предвидите необходимость сортировки по одному столбцу. В любом случае, это не так просто, как просто выбрать опцию Меню сортировки изнутри превосходить.


теперь я теперь, почему это не работает. Существует ошибка в методе shiftRows. Когда третий аргумент (количество строк для сдвига) отрицателен, это вызывает проблемы.

это описано здесь: https://issues.apache.org/bugzilla/show_bug.cgi?id=53798

обновление Эта ошибка была исправлена начиная с версии 3.9