Mexoff
Mexoff

Reputation: 103

JOpenDocument: problems with blank rows and cells

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

Answers (2)

ivanmc-007
ivanmc-007

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

jopendocument has a function for that: getUsedRange()

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

=> RANGE: Feuille1.A1:.C8 (example)

Upvotes: 2

Related Questions