打印 xlsx 的内容 sheet

Printing contents of xlsx sheet

我在 eclipse 中使用 docx4j 来获取 excel sheet 的内容,但我得到的只是数字。为简单起见,假设这是我的 sheet:

| asd|标准差 |

| hgn |

我用来加载内容的代码是:

public static void load(String outputfilepath) throws FileNotFoundException{
    try {
        SpreadsheetMLPackage exc = SpreadsheetMLPackage
                .load(new java.io.File(outputfilepath));
        WorksheetPart sheet = exc.getWorkbookPart().getWorksheet(0);
        System.out.println(sheet.getPartName().getName());
        Worksheet ws = sheet.getJaxbElement();
        SheetData data = ws.getSheetData();
        int ic = 0;
        for (Row r : data.getRow()) {
            System.out.println("row " + ic);
            int ir = 0;
            for (Cell c : r.getC()) {
                System.out.println("cell " + ir + " contains "
                        + c.getV().toString());
                ir++;
            }
            ic++;
        }
        System.out.println("\ndone");
    } catch (Docx4JException e) {
        e.printStackTrace();
    } catch (Xlsx4jException e) {
        e.printStackTrace();
    }
}

这是我的输出:

/xl/worksheets/sheet1.xml
row 0
cell 0 contains 0
cell 1 contains 1
row 1
cell 0 contains 2

done

我应该怎么做才能获得实际内容?

注意:该问题仅出现在字符串中。即,如果单元格中有数字,我可以毫无问题地获取它们。

在 XLSX 中,单元格的文本内容不直接存储在 sheet XML 中。 XLSX 存档中有一个 sharedStrings.xml

这就是为什么 docx4j 不读取带有 getV() 的文本内容,而是读取此内容在 sharedStrings.xml 中的索引。所以你有索引并且可以从 sharedStrings 中获取内容。

参见示例:https://github.com/plutext/docx4j/blob/master/src/samples/xlsx4j/org/xlsx4j/samples/PartsList.java

...
for (Cell c : r.getC() ) {
 if (c.getT().equals(STCellType.S)) {
  System.out.println( "  " + c.getR() + " contains " + sharedStrings.getJaxbElement().getSi().get(Integer.parseInt(c.getV())).getT() );
 } else {
  // TODO: handle other cell types
  System.out.println( "  " + c.getR() + " contains " + c.getV() );
 }
}
...

请注意,您必须先阅读 RelationshipsPart 才能获得 sharedStrings。这是在 public static void printInfo(Part p, StringBuilder sb, String indent) 中的那个示例中完成的,同时遍历 public static void traverseRelationships.

中的关系

数字和公​​式直接存储在sheetXML中。因此对于这些内容 getV() 将直接获取内容。