我需要編寫一個可以合併docx文件的java應用程序。有什麼建議麼?是否有任何允許合併docx文件的java庫(也許poi?)?
回答
下面的Java API可用於處理OpenXML的MS Word文檔與Java:
還有一個,但我不記得這個名字了。
至於你的功能要求:合併兩個文件在技術上很難達到最終用戶期望的結果。大多數API不允許這樣做。您需要從兩個文檔中提取所需信息,然後根據這些信息自行創建一個新文檔。
你如何決定使用哪一個?我介於Apache POI和OpenOffice.org之間。第二個將需要安裝開放式辦公室,我認爲這將成爲業績中的熱門,這是真的嗎? – Roger 2012-12-12 23:08:50
欲瞭解更多關於技術上棘手的原因,請參閱http://www.docx4java.org/blog/2010/11/merging-word-documents/ – JasonPlutext 2014-03-20 05:37:25
我想確定使用哪種方法的最好方法是嘗試使用它們文檔。您可以嘗試基於docx4j的商業工具,網址爲http://webapp.docx4java.org/OnlineDemo/forms/upload_MergeDocx.xhtml – JasonPlutext 2014-03-20 05:53:36
它確實看起來像POI可以與docx
文件一起使用。你是否想弄清楚如何合併它們?
How to extract plain text from a DOCX file using the new OOXML support in Apache POI 3.5?
Aspose API是目前爲止合併word doc或docx文件到目前爲止最好的,但這不是免費或開源的,如果你需要一個免費和開源的工具有幾個API你可以選擇,你可以找到他們在這裏進行審查,
http://www.esupu.com/open-source-office-document-java-api-review/
鏈接斷.... – paul 2016-03-07 10:16:00
隨着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);
}
}
謝謝你這個答案你的Poi代碼適合我,但在我的情況下,我還需要合併.doc文件,所以我必須使用org.apache.poi.hwpf.HWPFDocument。所以通過遵循你的docx代碼,我想從.doc文件中獲得xml格式,但是我沒有找到辦法做到這一點。任何想法將不勝感激:) – AmiraGL 2014-03-21 15:08:28
這工作完美。謝謝! – 2015-06-08 20:09:26
@atott POI代碼爲我工作,但如果附加文檔有圖像,而不是合併圖像不存在,請將所有文本與確切格式合併。 – 2016-10-20 07:10:49
- 1. 立即創建* .docx(也許* .doc?)文件?
- 2. soundcloud:是否允許使用api-v2,並且是否有文檔?
- 3. 是Android庫中允許的java庫嗎?
- 4. 是否存在允許讀取excel文件的任何球拍庫?
- 5. Facebook是否允許CORS頭文件?
- 6. @符號是否允許命名文件?
- 7. 是否有任何JQuery插件允許上傳文件而不刷新頁面?
- 8. 是否有任何允許電子商務的PHP框架?
- 9. 是否有任何允許隱藏實體的UML工具?
- 10. 是否有任何允許回調的Thrift式RPC系統?
- 11. 是否有任何允許錄像的WebRTC實現?
- 12. 複合鍵是否允許重複
- 13. Apigee Usergrid:usergrid是否允許子集合?
- 14. 結合@MappedSuperclass和@SecondaryTable - 是否允許?
- 15. 是否有任何TTPickerTextField替代?也許在iOS4?
- 16. AngularUI typeahead插件是否允許任何類型的值?
- 17. 是否允許每個App Engine應用(不是1,000)允許3,000個文件?
- 18. java是否允許嵌套屬性?
- 19. 是否有任何htaccess或允許文件啓用跨站點腳本? Javascript
- 20. SLX雲是否允許自定義庫?
- 21. 是否允許「複製」API數據庫?
- 22. 是否有任何其他方式允許破折號在Codeigniter
- 23. 是否有任何協議規範允許使用TCP或UDP?
- 24. 是否有任何語言允許突破多個循環?
- 25. 是否有任何圖像格式允許打開註釋框?
- 26. 是否有任何SDK或庫允許我讀取iPad2上的條形碼?
- 27. 是否有任何允許POST消息異步可靠發送的iOS庫?
- 28. 是否有任何允許記錄級數據庫訪問的現代語言?
- 29. 是否有ORM允許「插件」擴展數據庫?
- 30. configSource文件'Unity.xml'也用於父項,這是不允許的
通過「合併」,你的意思是一些簡單的串聯?還是更有趣?合併部分或docx(而非doc)部分的難度是? – 2010-03-22 17:57:57
合併應該給出與我們在MS Office第一個文檔中手動打開相同的結果,請按Ctrl + C,然後打開第二個文檔,直到它結束並按Ctrl + V。 – Roman 2010-03-22 18:07:23