2017-09-03 12 views
1

Apacheのpoiを使用してMicrosoft Word文書(docxファイル)でテーブルと正確なデータを読み取ろうとしています。このファイルには、UTF-8エンコードされた文字(シンハラ語)が含まれています。私は次のコードブロックを使用しています。Apache POIを使用してMS-wordファイル内のテーブルセル内に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文字が表示されません。

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 |私はすでにこのソリューションを試して、それは動作していません。

誰もがUTF-8エンコードされた文字をワードファイルでapache poiを使って読む方法を知っていますか?

+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(); 
    } 


EDIT:
後、私は実際に段落を追加することは十分にある、と指摘しました。あなたはsetRunメソッドを必要とせず、setRun(paragraph.createRun() , "Arial" , 10, "2b5079" , celltext , false, false);と呼びます。

enter image description here

表示されます


は、エンコーディングで行うことができるものがあります。 (フォントが読み込まれると、段落もなくうまく動いていたので私にとっては)

+0

このソリューションはeclipseで動作しますが、現在使用しているIntelij IDEAでは動作しません。実際は後で私はこれがIDEコンソールの問題であり、プログラムのエラーではないことに気付きました。 –

関連する問題