所以......基本上我有一個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標籤。
任何人都有一些猜測......? –
您是否嘗試將行結束符更改爲Windows版本?它會確認或否認你懷疑行結束是問題。這樣,人們可以通過確認指出正確的道路,或者如果問題是別的東西,不要浪費時間走錯路。 –
那麼......儘管我們知道'docx'文件實際上是包含各種'xml'的zip文件。現在......儘管我可以在所有的xml文件中改變它。我不確定如何從這些修改後的'xml'中正確地創建一個'docx'文件。這意味着......我們需要以某種方式在寫入文件輸出流時強制行結束。 –