【发布时间】:2020-07-30 23:31:23
【问题描述】:
我在 Eclipse 中使用 Docx4j 来读取 XSLX 文件。我想从我的WorksheetPart 获得我的桌子的绝对大小。
例如,如果我的单元格 A3、B3 和 D5 有一个值,我想得到:
- latestColumn = 4(而不是 3)
- latestRow = 5(而不是 2)
有没有办法轻松做到这一点?在WorksheetPart 对象中,似乎缺少此信息。
【问题讨论】:
我在 Eclipse 中使用 Docx4j 来读取 XSLX 文件。我想从我的WorksheetPart 获得我的桌子的绝对大小。
例如,如果我的单元格 A3、B3 和 D5 有一个值,我想得到:
有没有办法轻松做到这一点?在WorksheetPart 对象中,似乎缺少此信息。
【问题讨论】:
可以获得最新的行但不能获得最新的列(您需要根据单元格名称计算它)。
更详细地说,这是我为解决此问题所做的一个示例。
你可以像这样得到你的文件:
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);
}
【讨论】: