2017-09-03 64 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控制檯問題,而不是程序錯誤。 –

相關問題