2010-03-22 95 views
7

我需要編寫一個可以合併docx文件的java應用程序。有什麼建議麼?是否有任何允許合併docx文件的java庫(也許poi?)?

+0

通過「合併」,你的意思是一些簡單的串聯?還是更有趣?合併部分或docx(而非doc)部分的難度是? – 2010-03-22 17:57:57

+0

合併應該給出與我們在MS Office第一個文檔中手動打開相同的結果,請按Ctrl + C,然後打開第二個文檔,直到它結束並按Ctrl + V。 – Roman 2010-03-22 18:07:23

回答

5

下面的Java API可用於處理OpenXML的MS Word文檔與Java:

還有一個,但我不記得這個名字了。

至於你的功能要求:合併兩個文件在技術上很難達到最終用戶期望的結果。大多數API不允許這樣做。您需要從兩個文檔中提取所需信息,然後根據這些信息自行創建一個新文檔。

+0

你如何決定使用哪一個?我介於Apache POI和OpenOffice.org之間。第二個將需要安裝開放式辦公室,我認爲這將成爲業績中的熱門,這是真的嗎? – Roger 2012-12-12 23:08:50

+0

欲瞭解更多關於技術上棘手的原因,請參閱http://www.docx4java.org/blog/2010/11/merging-word-documents/ – JasonPlutext 2014-03-20 05:37:25

+0

我想確定使用哪種方法的最好方法是嘗試使用它們文檔。您可以嘗試基於docx4j的商業工具,網址爲http://webapp.docx4java.org/OnlineDemo/forms/upload_MergeDocx.xhtml – JasonPlutext 2014-03-20 05:53:36

1

Aspose API是目前爲止合併word doc或docx文件到目前爲止最好的,但這不是免費或開源的,如果你需要一個免費和開源的工具有幾個API你可以選擇,你可以找到他們在這裏進行審查,

http://www.esupu.com/open-source-office-document-java-api-review/

+0

鏈接斷.... – paul 2016-03-07 10:16:00

11

隨着POI我的解決方案是:

public static void merge(InputStream src1, InputStream src2, OutputStream dest) throws Exception { 
    OPCPackage src1Package = OPCPackage.open(src1); 
    OPCPackage src2Package = OPCPackage.open(src2); 
    XWPFDocument src1Document = new XWPFDocument(src1Package);   
    CTBody src1Body = src1Document.getDocument().getBody(); 
    XWPFDocument src2Document = new XWPFDocument(src2Package); 
    CTBody src2Body = src2Document.getDocument().getBody();   
    appendBody(src1Body, src2Body); 
    src1Document.write(dest); 
} 

private static void appendBody(CTBody src, CTBody append) throws Exception { 
    XmlOptions optionsOuter = new XmlOptions(); 
    optionsOuter.setSaveOuter(); 
    String appendString = append.xmlText(optionsOuter); 
    String srcString = src.xmlText(); 
    String prefix = srcString.substring(0,srcString.indexOf(">")+1); 
    String mainPart = srcString.substring(srcString.indexOf(">")+1,srcString.lastIndexOf("<")); 
    String sufix = srcString.substring(srcString.lastIndexOf("<")); 
    String addPart = appendString.substring(appendString.indexOf(">") + 1, appendString.lastIndexOf("<")); 
    CTBody makeBody = CTBody.Factory.parse(prefix+mainPart+addPart+sufix); 
    src.set(makeBody); 
} 

隨着Docx4j我的解決方案是:

public class MergeDocx { 
    private static long chunk = 0; 
    private static final String CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; 

    public void mergeDocx(InputStream s1, InputStream s2, OutputStream os) throws Exception { 
     WordprocessingMLPackage target = WordprocessingMLPackage.load(s1); 
     insertDocx(target.getMainDocumentPart(), IOUtils.toByteArray(s2)); 
     SaveToZipFile saver = new SaveToZipFile(target); 
     saver.save(os); 
    } 

    private static void insertDocx(MainDocumentPart main, byte[] bytes) throws Exception { 
      AlternativeFormatInputPart afiPart = new AlternativeFormatInputPart(new PartName("/part" + (chunk++) + ".docx")); 
      afiPart.setContentType(new ContentType(CONTENT_TYPE)); 
      afiPart.setBinaryData(bytes); 
      Relationship altChunkRel = main.addTargetPart(afiPart); 

      CTAltChunk chunk = Context.getWmlObjectFactory().createCTAltChunk(); 
      chunk.setId(altChunkRel.getId()); 

      main.addObject(chunk); 
    } 
} 
+0

謝謝你這個答案你的Poi代碼適合我,但在我的情況下,我還需要合併.doc文件,所以我必須使用org.apache.poi.hwpf.HWPFDocument。所以通過遵循你的docx代碼,我想從.doc文件中獲得xml格式,但是我沒有找到辦法做到這一點。任何想法將不勝感激:) – AmiraGL 2014-03-21 15:08:28

+0

這工作完美。謝謝! – 2015-06-08 20:09:26

+0

@atott POI代碼爲我工作,但如果附加文檔有圖像,而不是合併圖像不存在,請將所有文本與確切格式合併。 – 2016-10-20 07:10:49

相關問題