Как получить последний номер строки листа XSLX и последний номер столбца с Docx4j - PullRequest
0 голосов
/ 17 апреля 2020

Я использую Docx4j в Eclipse для чтения файлов XSLX. Я хотел бы, из моего WorksheetPart, получить абсолютный размер моего стола.

Например, если у меня есть ячейки A3, B3 и D5 со значением, я хотел бы получить:

  • latestColumn = 4 (а не 3)
  • latestRow = 5 (а не 2)

Есть ли способ сделать это легко? В объекте WorksheetPart эта информация, по-видимому, отсутствует.

1 Ответ

0 голосов
/ 20 апреля 2020

Возможно получить самую последнюю строку, но не последний столбец (вам нужно вычислить его по именам ячеек).

Более подробно, вот пример того, что я сделал, чтобы решить эту проблему.

Вы можете получить свой файл так:

InputStream is = new FileInputStream("Path/to/my/file.xlsx"); 
SpreadsheetMLPackage xlsxPackage = SpreadsheetMLPackage.load(is);
WorkbookPart wb = xlsxPackage.getWorkbookPart();

Допустим, мы хотим работать с первым листом вашего файла:

int indexSheet = 0;
List<org.xlsx4j.sml.Row> rowsList = wb.getWorksheet(indexSheet).getContents().getSheetData().getRow();

Затем, чтобы получить последнюю строку, вы можете использовать getR, который дает вам соответствующий номер строки Excel:

Long lastRowIndex = rowsList.get(rowsList.size() - 1).getR();

Чтобы получить Последний номер столбца вам нужно больше работы. Во-первых, вам нужен способ преобразовать имя столбца в целое число (например, AB - 28). Вы можете сделать что-то вроде этого:

private Integer computeColumnIndex(String cellName) {

    String columnLetters = cellName.replaceAll("\\d","");

    double sum = Double.valueOf(0);
    int len = columnLetters.length();
    for(int i = 0; i < len; i++) {
        sum += (columnLetters.charAt(i) - 'A' + 1)*Math.pow(26,  len-i-1) ;
    }

    return (int)sum;
};

Затем для каждой строки вы можете вычислить columnIndex последней ячейки строки и сохранить наибольшее значение:

int lastColumnIndex = 1;
for(org.xlsx4j.sml.Row row: rowsList) {

    String cellName = Iterables.getLast(row.getC()).getR();
    int columnIndex = computeColumnIndex(cellName);

    lastColumnIndex = Math.max(lastColumnIndex, columnIndex);           
}
...