2012-07-21 130 views
1

我正在查找讀取和寫入MS Word文檔的Java庫。 我要做的是:將MS Word文檔與Java合併

  • 從另一個Word文檔讀取模板文件,.DOT或.doc,並與數據庫讀取一些數據填充它
  • 取數據和合並,與該文件描述以上,保留段落格式

用戶可以對文件進行更新。

我搜索並找到POI Apache和UNO OpenOffice。 第一個可以輕鬆地讀取模板並用我自己的數據庫替換任何佔位符。我沒有發現關於合併兩個或更多文檔的任何內容。 OpenOffice UNO看起來更穩定但也很複雜。此外,我不確定它有能力合併文件。

我們正在尋找正確的方向?

我想過的另一個解決方案是將doc文件轉換爲docx。通過這種方式,我找到了更多可以幫助我們合併文檔的庫。 但我該怎麼做?

謝謝!

+0

http://stackoverflow.com/questions/2494549/is-there-any-java-library-maybe-poi-which-allows-to-merge-docx-files – 2012-07-21 12:09:51

+0

感謝,但requiriment是.doc文件! – frengo 2012-07-21 12:11:36

+0

「合併」文檔意味着什麼?只是將一個內容附加到另一個? – 2012-07-21 13:16:37

回答

1

您可以看看Docmosis,因爲它提供了您提到的四個功能(數據填充,模板/文檔合併,DOC格式和java界面)。它有幾種口味(下載,在線服務),但是你可以註冊一個免費的雲服務試用版,看Docmosis是否可以做你想做的(然後你不需要安裝任何東西)或者在線閱讀文檔。

它在底層使用OpenOffice(您可以從開發者指南安裝說明中看到),它在文檔之間做了相當不錯的轉換。 UNO API有一些複雜性 - 我建議Docmosis或JODReports將您的項目直接與UNO隔離。

希望有所幫助。

0
import java.io.File; 
import java.util.List; 

import javax.xml.bind.JAXBException; 

import org.docx4j.dml.CTBlip; 
import org.docx4j.openpackaging.exceptions.Docx4JException; 
import org.docx4j.openpackaging.packages.WordprocessingMLPackage; 
import org.docx4j.openpackaging.parts.Part; 
import org.docx4j.openpackaging.parts.PartName; 
import org.docx4j.openpackaging.parts.WordprocessingML.ImageBmpPart; 
import org.docx4j.openpackaging.parts.WordprocessingML.ImageEpsPart; 
import org.docx4j.openpackaging.parts.WordprocessingML.ImageGifPart; 
import org.docx4j.openpackaging.parts.WordprocessingML.ImageJpegPart; 
import org.docx4j.openpackaging.parts.WordprocessingML.ImagePngPart; 
import org.docx4j.openpackaging.parts.WordprocessingML.ImageTiffPart; 
import org.docx4j.openpackaging.parts.relationships.RelationshipsPart; 
import org.docx4j.openpackaging.parts.relationships.RelationshipsPart.AddPartBehaviour; 
import org.docx4j.relationships.Relationship; 

public class MultipleDocMerge { 


    public static void main(String[] args) throws Docx4JException, JAXBException { 
     File first = new File("D:\\Mreg.docx"); 
     File second = new File("D:\\Mreg1.docx"); 
     File third = new File("D:\\Mreg4&19.docx"); 
     File fourth = new File("D:\\test12.docx"); 
     WordprocessingMLPackage f = WordprocessingMLPackage.load(first); 
     WordprocessingMLPackage s = WordprocessingMLPackage.load(second); 
     WordprocessingMLPackage a = WordprocessingMLPackage.load(third); 
     WordprocessingMLPackage e = WordprocessingMLPackage.load(fourth); 

     List body = s.getMainDocumentPart().getJAXBNodesViaXPath("//w:body", false); 
     for(Object b : body){ 
      List filhos = ((org.docx4j.wml.Body)b).getContent(); 
      for(Object k : filhos) 
       f.getMainDocumentPart().addObject(k); 
     } 

     List body1 = a.getMainDocumentPart().getJAXBNodesViaXPath("//w:body", false); 
     for(Object b : body1){ 
      List filhos = ((org.docx4j.wml.Body)b).getContent(); 
      for(Object k : filhos) 
       f.getMainDocumentPart().addObject(k); 
     } 

     List body2 = e.getMainDocumentPart().getJAXBNodesViaXPath("//w:body", false); 
     for(Object b : body2){ 
      List filhos = ((org.docx4j.wml.Body)b).getContent(); 
      for(Object k : filhos) 
       f.getMainDocumentPart().addObject(k); 
     } 


     List<Object> blips = e.getMainDocumentPart().getJAXBNodesViaXPath("//a:blip", false); 
     for(Object el : blips){ 
      try { 

        CTBlip blip = (CTBlip) el; 
        RelationshipsPart parts = e.getMainDocumentPart().getRelationshipsPart(); 
        Relationship rel = parts.getRelationshipByID(blip.getEmbed()); 
        Part part = parts.getPart(rel); 
        if(part instanceof ImagePngPart) 
         System.out.println(((ImagePngPart) part).getBytes()); 
        if(part instanceof ImageJpegPart) 
         System.out.println(((ImageJpegPart) part).getBytes()); 
        if(part instanceof ImageBmpPart) 
         System.out.println(((ImageBmpPart) part).getBytes()); 
        if(part instanceof ImageGifPart) 
         System.out.println(((ImageGifPart) part).getBytes()); 
        if(part instanceof ImageEpsPart) 
         System.out.println(((ImageEpsPart) part).getBytes()); 
        if(part instanceof ImageTiffPart) 
         System.out.println(((ImageTiffPart) part).getBytes()); 
        Relationship newrel = f.getMainDocumentPart().addTargetPart(part,AddPartBehaviour.RENAME_IF_NAME_EXISTS); 
        blip.setEmbed(newrel.getId()); 
        f.getMainDocumentPart().addTargetPart(e.getParts().getParts().get(new PartName("/word/"+rel.getTarget()))); 
       } catch (Exception ex){ 
         ex.printStackTrace(); 
       } } 

     File saved = new File("D:\\saved1.docx"); 
     f.save(saved); 




    } 

} 
+0

嘗試添加解釋也。 – 2018-02-15 05:55:51