JOpenDocument: проблемы с пустыми строками и ячейками

У меня проблема при анализе файла.ods с помощью JOpenDocument. В моем файле три строки и четыре столбца, но когда я анализирую этот файл, я получаю 1024 столбца и слишком много строк. Есть много пустых ячеек.
Я открыл этот файл.ods, как XML, и в нем не было много строк.
И я не смог найти метод для проверки пустой ячейки в JOpenDocument API.

Вот мой код, где я создаю строку с данными:

ArrayList rowData = new ArrayList();
int countCol = sheet.getColumnCount();

for (int i = 0; i < countCol; i++) {
    rowData.add(getCellData(sheet.getName(), num, i));
}

Как я могу исправить эту проблему? Может мне надо сменить библиотеку?

2 ответа

Решение

Для этого есть функция jopendocument: getUsedRange ()

Range range=sheet.getUsedRange();
System.out.println("RANGE: "+range.toString());

=> ДИАПАЗОН: Feuille1.A1:.C8 (пример)

В org.jopendocument:jOpenDocument:1.3. Sheet.getUsedRange() работает слишком медленно. Таким образом, вы можете настроить метод ниже. Например, чтобы передать indexRow в качестве параметра.

      import org.jopendocument.dom.spreadsheet.Cell;
import org.jopendocument.dom.spreadsheet.Range;
import org.jopendocument.dom.spreadsheet.Sheet;
/**
 * Find used range
 * @return Range or null if it wasn't detected
 */
private Range findUsedRange(Sheet sheet) {
    int rowIndexStart = -1;
    int cellIndexStart = -1;
    int rowIndexEnd = -1;
    int cellIndexEnd = -1;
    // Size 4096 was taken at random. The larger the size, the slower the method works
    for (int indexRow = 0; indexRow < 4096; indexRow++) {
        for (int indexCell = 0; indexCell < sheet.getColumnCount(); indexCell++) {
            Cell<?> cell = sheet.getImmutableCellAt(indexCell, indexRow);
            if (cell == null)
                continue;
            if (!cell.isEmpty()) {
                if (cellIndexStart < 0 || indexCell < cellIndexStart)
                    cellIndexStart = indexCell;
                if (rowIndexStart < 0 || indexRow < rowIndexStart)
                    rowIndexStart = indexRow;
                if (cellIndexEnd < 0 || indexCell > cellIndexEnd)
                    cellIndexEnd = indexCell;
                if (rowIndexEnd < 0 || indexRow > rowIndexEnd)
                    rowIndexEnd = indexRow;
            }
        }
    }
    if (rowIndexStart == -1 || cellIndexStart == -1 || rowIndexEnd == -1 || cellIndexEnd == -1)
        return null;
    return new Range(sheet.getName(), new Point(cellIndexStart, rowIndexStart), new Point(cellIndexEnd, rowIndexEnd));
}
Другие вопросы по тегам