2016-08-08 70 views
0

我想在poi的特定位置插入一個表,但會生成該表,但我發現該表不可見。HWPF-POI:插入到poi hwpf文檔中的表不可見

使用macOS及其文本工具預覽或編輯此文檔時,doc中生成的表格可見,POI也可以讀取表格和內容。我計劃上傳4張照片來顯示該過程,但我只能張貼2張圖片,對此抱歉。

@Test 
public void exportDoc() throws Exception { 
    FileInputStream readFile = new FileInputStream(new File(readDoc)); 
    FileOutputStream replaceFile = new FileOutputStream(new File(replaceDoc)); 
    HWPFDocument document = new HWPFDocument(readFile); 
    Table table = WordUtil.insertNewTable(document,"${table}"); 
    insertTableInDoc(table); 
    document.write(replaceFile); 
    readFile.close(); 
    replaceFile.close(); 
} 

private Table insertNewTable(HWPFDocument doc, String sourceValue) { 
    Range range = doc.getRange(); 
    Table table = null; 
    for (int i = 0; i < range.numSections(); ++i) { 
     Section s = range.getSection(i); 
     for (int x = 0; x < s.numParagraphs(); x++) { 
      Paragraph p = s.getParagraph(x); 
      if (p.text().contains(sourceValue)) { 
       //remove target text 
       range.replaceText(sourceValue, ""); 
       table = p.insertTableBefore((short) 3, 3); 
       return table; 
      } 
     } 
    } 
    return table; 
} 

private void insertTableInDoc(Table table) { 
    int count = 1; 
    for (int rowNum = 0; rowNum < table.numRows(); rowNum++) { 
     TableRow tableRow = table.getRow(rowNum); 
     for (int colNum = 0; colNum < tableRow.numCells(); colNum++) { 
      TableCell cell = tableRow.getCell(colNum); 
      Paragraph paragraph = cell.getParagraph(0); 
      CharacterRun characterRun = paragraph.getCharacterRun(0);   
      characterRun.insertBefore("number: " + count++); 
     } 
    } 
} 
  1. the original doc

  2. the doc after table insert

PS:

我確定這不是microsoft for mac的問題,windows平臺的doc中的生成表也是不可見的。

(第一時間問問題,如果有什麼錯誤或我的表達是不明確的,請讓我知道,我會修改,而不會延遲。謝謝)

+0

供您參考:我可以重現您的問題。好像添加了insertTableBefore的表的固定寬度爲0.甚至Word GUI也無法修復此問題。但我不會再用HWPF(二進制Word格式)。此格式自2007年起已過時.XWPF(Office OpenXML)是當前的格式。由於沒有人回答,我相信我不是唯一有此意見的人。 –

+0

非常感謝您的關注和答覆。我之前向我的產品經理解釋了doc和docx之間的區別,但她堅持支持doc類型。看來我們必須改變我們的策略,只允許用戶在docx類型的表中輸出帶有表格的單詞。 –

回答

1

隨着HWPF項目的當前狀態,你可能嘗試將內容插入到.doc文件時運氣不佳。你最好的選擇是使用不同的格式(docx)。

我沒有看HWPF在過去的一年,所以我可能是錯在這裏關於HWPF的當前狀態:

幾年前,我正在開發一個定製HWPF庫的客戶端。該自定義庫的主要目標是能夠修改.doc文件,並且Word可以正確處理修改後的文件。因此,我知道最終修改.doc文件的級別有多少。當涉及到修改(文本框,雙字節字符範圍,形狀文件,嵌套表等等)時,公共HWPF庫無法處理.doc文件格式的許多方面。

要正確處理修改,特定.doc文件的所有「功能」必須由庫支持。因此,當.doc文件中有形狀時,即使插入簡單的文本片段並且未觸摸形狀,HWPF也必須調整形狀的位置表。如果不處理形狀,Word將在打開輸出文件時崩潰。

所以如果可以的話,使用docx或rtf。如果它是一個選項,你可以嘗試一個能夠處理.doc文件的商業庫。

+0

非常感謝您的關注和答覆。你理解很多關於POI的內部細節,你的建議是合理的。真的很感謝你的回答:) –