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));
}