我在eclipse中使用docx4j来获取excel表的内容,但我得到的只是数字。为简单起见,假设这是我的表:
我用来加载内容的代码是:
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
我该怎么做才能获得实际内容?
注意:问题仅出现在字符串中。即如果单元格中有数字,我就可以毫无问题地获得它们。
答案 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()
将直接获取内容。