2015-04-07 60 views
11

所以......基本上我有一個docx文件。我必須在幾個段落中進行一些格式更改,然後保存在一個新文件中。我所做的基本上是遵循。Outpout docx中使用Apache Poi的無限虛假網頁

import scala.collection.JavaConversions._ 
import org.apache.poi.xwpf.usermodel._ 

def format(sourceDocumentPath: String, outputDocumentPath: String) { 

    val sourceXWPFDocument = new XWPFDocument(new FileInputStream(sourcePath)) 

    // lets say I have a list of paragraph numbers... I want to format 
    val parasToFormat = List(2, 10, 15, 20) 

    val allParagraphs = sourceXWPFDocument.getParagraphs 

    for ((paragraph, index) <- allParagraphs.zipWithIndex) { 
    if(parasToFormat.contains(index)) { 
     formatParagraph(paragraph) 
    } 
    } 

    val outputDocx = new FileOutputStream(new File(outputDocumentPath)); 
    xwpfDocument.write(outputDocx) 
    outputDocx.close() 

} 

def formatParagraph(paragraph: XWPFParagraph): Unit = { 
    // Do some color changing to few runs 
    // Add few runs with new text. 
} 

大多數情況下,一切工作正常。輸出docx在我的Ubuntu上在LibreOffice中打開好了。

但是,當我將這個輸出docx傳輸到Windows系統,並試圖在MS Word中打開這個輸出docx時,我得到無限的(不斷增長的)垃圾頁。

任何來自Poi社區的明智人士的猜測都是值得歡迎的。

另外...我的猜測之一是 - 可能是文件中的行結尾是令人困惑的MS Word。由於Ubuntu使用(LF - \n)行結尾,而Windows使用(CRLF - \r\n)。如果這實際上是問題......那麼我該如何解決它?

雖然......我的代碼是在Scala中......我認爲類似的東西也應該適用於Java代碼......並且大部分Poi用戶都將在Java社區中......所以我也添加了Java標籤。

+0

任何人都有一些猜測......? –

+0

您是否嘗試將行結束符更改爲Windows版本?它會確認或否認你懷疑行結束是問題。這樣,人們可以通過確認指出正確的道路,或者如果問題是別的東西,不要浪費時間走錯路。 –

+0

那麼......儘管我們知道'docx'文件實際上是包含各種'xml'的zip文件。現在......儘管我可以在所有的xml文件中改變它。我不確定如何從這些修改後的'xml'中正確地創建一個'docx'文件。這意味着......我們需要以某種方式在寫入文件輸出流時強制行結束。 –

回答

3

那麼......所以我嘗試了各種各樣的事情,最終解決了這個問題。

基本上這個問題是由以下非常簡單的事情引起的,

def copyRunFontSizeAttribute(sourceRun: XWPFRun, targetRun: XWPFRun): Unit = { 
    targetRun.setFontSize(sourceRun.getFontSize) 
} 

不知何故,設置一個實例XWPFRun的字體大小,可以說xWPFRunTargetxWPFRunSource.getFontSize返回值(其中xWPFRunSource是另一個實例XWPFRun)會導致一些非常奇怪和意想不到的結果。

因此...目前我刪除了所有這些位,我在這裏做了這個copyRunFontSizeAttribute事情解決了問題。