读UTF-8编码的文本里面的内容表中MS-Word文件使用Apache POI
我想读表和详细的数据在Microsoft Word文档(DOCX文件)使用Apache POI细胞。该文件包含UTF-8编码的字符(僧伽罗语言)。我正在使用以下代码块。读UTF-8编码的文本里面的内容表中MS-Word文件使用Apache POI
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编码的字符?
我发现了一个解决方案,为单元格设置字体(作为peragraph)。
代码:
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);
来调用。
会看到有什么可以用编码来完成。 (因为,我一旦字体加载它没有段落也工作正常)
此解决方案适用于eclipse,但不适用于我现在正在使用的Intelij IDEA。事实上,后来我发现这是一个IDE控制台问题,而不是程序错误。 –
您是否尝试过'URLEncoder.encode(cell.getText(), “UTF-8”)'?并打印这个呢? – alirabiee
@alirabiee,刚刚尝试过,它也没有工作。无论如何,文本不是一个URL。 –
这是IDE的控制台设置的问题。哪个IDE被使用?通常'System.out.println(cell.getText());'应该工作。没有明确的'PrintStream'定义需要。 –