2017-09-03 56 views
1

我想读表和详细的数据在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字符。

console output

我已经参考了多种解决方案,包括以下内容。

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编码的字符?

+0

您是否尝试过'URLEncoder.encode(cell.getText(), “UTF-8”)'?并打印这个呢? – alirabiee

+0

@alirabiee,刚刚尝试过,它也没有工作。无论如何,文本不是一个URL。 –

+2

这是IDE的控制台设置的问题。哪个IDE被使用?通常'System.out.println(cell.getText());'应该工作。没有明确的'PrintStream'定义需要。 –

回答

1

我发现了一个解决方案,为单元格设置字体(作为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);来调用。

enter image description here

会看到有什么可以用编码来完成。 (因为,我一旦字体加载它没有段落也工作正常)

+0

此解决方案适用于eclipse,但不适用于我现在正在使用的Intelij IDEA。事实上,后来我发现这是一个IDE控制台问题,而不是程序错误。 –

相关问题