我正在尝试使用 apache poi 读取 Microsoft Word 文档(docx 文件)中的表格和精确数据。该文件包含 UTF-8 编码字符(僧伽罗语)。我正在使用以下代码块。
FileInputStream fis = new FileInputStream("path\\to\\file.docx");
XWPFDocument doc = new XWPFDocument(fis);
Iterator<IBodyElement> iter = doc.getBodyElementsIterator();
while (iter.hasNext()) {
IBodyElement elem = iter.next();
if (elem instanceof XWPFTable) {
List<XWPFTableRow> rows = ((XWPFTable) elem).getRows();
for(XWPFTableRow row :rows){
List<XWPFTableCell> cells = row.getTableCells();
for(XWPFTableCell cell : cells){
PrintStream out = new PrintStream(System.out, true, "UTF-8");
out.println(cell.getText());
}
}
}
}
但是我在输出控制台中没有得到正确的 UTF-8 字符。
我已经引用了几种解决方案,包括以下内容。
How to parse UTF-8 characters in Excel files using POI |我正在尝试读取 Word 文件中的表格。所以我的 Cell
对象没有 getStringCellValue()
方法。
http://www.herongyang.com/Java-Tools/native2ascii-Set-UTF-8-Encoding-in-PrintStream.html |我已经尝试过这个解决方案,但它不起作用。
有谁知道如何使用apache poi读取word文件中的UTF-8编码字符?
最佳答案
我找到了一个为单元格设置字体(作为图表)的解决方案。
代码:
private static final String FILE_NAME = "/tmp/Diskade.docx";
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream(FILE_NAME);
XWPFDocument doc = new XWPFDocument(fis);
Iterator<IBodyElement> iter = doc.getBodyElementsIterator();
while (iter.hasNext()) {
IBodyElement elem = iter.next();
if (elem instanceof XWPFTable) {
List<XWPFTableRow> rows = ((XWPFTable) elem).getRows();
for(XWPFTableRow row :rows){
List<XWPFTableCell> cells = row.getTableCells();
for(XWPFTableCell cell : cells){
String celltext = cell.getText();
XWPFParagraph paragraph = cell.addParagraph();
setRun(paragraph.createRun() , "Arial" , 10, "2b5079" , celltext , false, false);
System.out.print(cell.getParagraphs().get(0).getParagraphText() + " - ");
}
System.out.println();
}
}
}
}
private static void setRun (XWPFRun run , String fontFamily , int fontSize , String colorRGB , String text , boolean bold , boolean addBreak) {
run.setFontFamily(fontFamily);
run.setFontSize(fontSize);
run.setColor(colorRGB);
run.setText(text);
run.setBold(bold);
if (addBreak) run.addBreak();
}
编辑:
后来我注意到,实际上添加段落就足够了。您不需要 setRun 方法或将其调用为 setRun(paragraph.createRun() , "Arial", 10, "2b5079", celltext , false, false);
。
看看是否可以通过编码来完成任何事情。 (因为,对我来说,一旦加载字体,即使没有段落也可以正常工作)
关于java - 使用 Apache POI 读取 MS-word 文件中表格单元格内的 UTF-8 编码文本内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46020769/