【问题标题】:How to get XSLX sheet latest row number and latest column number with Docx4j如何使用 Docx4j 获取 XSLX 表的最新行号和最新列号
【发布时间】:2020-07-30 23:31:23
【问题描述】:

我在 Eclipse 中使用 Docx4j 来读取 XSLX 文件。我想从我的WorksheetPart 获得我的桌子的绝对大小。

例如,如果我的单元格 A3B3D5 有一个值,我想得到:

  • latestColumn = 4(而不是 3)
  • latestRow = 5(而不是 2)

有没有办法轻松做到这一点?在WorksheetPart 对象中,似乎缺少此信息。

【问题讨论】:

    标签: java xlsx docx4j


    【解决方案1】:

    可以获得最新的行但不能获得最新的列(您需要根据单元格名称计算它)。

    更详细地说,这是我为解决此问题所做的一个示例。

    你可以像这样得到你的文件:

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

    【讨论】:

      猜你喜欢
      • 2021-12-07
      • 2022-08-24
      • 2022-01-27
      • 2010-10-15
      • 2011-02-25
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多