Reputation: 103
I have a problem when I parse .ods file with JOpenDocument . There are three rows and four columns in my file, but when I parse this file I get 1024 columns and too many rows. There are many blank cells.
I opened this .ods file like xml and it didn't have many lines.
And I couldn't find method for check empty cell in JOpenDocument API.
Here is my code where I create row with data:
ArrayList rowData = new ArrayList();
int countCol = sheet.getColumnCount();
for (int i = 0; i < countCol; i++) {
rowData.add(getCellData(sheet.getName(), num, i));
}
How can I fix this problem? Maybe I have to change library?
Upvotes: 0
Views: 873
Reputation: 1
In org.jopendocument:jOpenDocument:1.3. Sheet.getUsedRange() works too slowly. So you can customize the method below. For example, to pass indexRow as a parameter.
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));
}
Upvotes: 0
Reputation: 3079
jopendocument has a function for that: getUsedRange()
Range range=sheet.getUsedRange();
System.out.println("RANGE: "+range.toString());
=> RANGE: Feuille1.A1:.C8 (example)
Upvotes: 2