打印 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()
将直接获取内容。
我在 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()
将直接获取内容。