打印xlsx表的内容

时间:2015-05-31 10:03:24

标签: java eclipse docx4j import-from-excel

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

| asd | sd |

| 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

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

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

1 个答案:

答案 0 :(得分:1)

在XLSX中,单元格的文本内容不直接存储在工作表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内的该示例中已完成此操作。

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