【问题标题】:Printing contents of xlsx sheet打印 xlsx 表的内容
【发布时间】:2015-05-31 10:03:23
【问题描述】:

我在 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

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

注意:这个问题只发生在字符串上。即,如果单元格中有数字,我可以毫无问题地得到它们。

【问题讨论】:

    标签: java eclipse docx4j import-from-excel


    【解决方案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() 将直接获取内容。

    【讨论】:

    • 谢谢!它起作用了,这个例子很有用。只是一个小说明,System.out.println( " " + c.getR() + " contains " + sharedStrings.getJaxbElement().getSi().get(Integer.parseInt(c.getV())).getT());这一行返回的是字符串的内存地址,要获取字符串的值只需加上.getValue()即可。
    猜你喜欢
    • 1970-01-01
    • 2013-03-10
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    相关资源
    最近更新 更多