用Java合并MS-Word文档
我正在寻找读写MS Word文档的java库。 我要做的是:用Java合并MS-Word文档,java,ms-word,Java,Ms Word,我正在寻找读写MS Word文档的java库。 我要做的是: 读取模板文件.dot或.doc,并用从DB读取的一些数据填充它 从另一个Word文档中获取数据,并将其与上述文件合并,保留段落格式 用户可以对文件进行更新 我已经搜索并找到了POI Apache和UNO OpenOffice。 第一个可以很容易地读取模板,并用我自己的数据库数据替换任何占位符。我没有发现任何关于合并两个或更多文档的信息。 OpenOffice UNO看起来更稳定,但也更复杂。此外,我不确定它是否有能力合并文档 我们
- 读取模板文件.dot或.doc,并用从DB读取的一些数据填充它
- 从另一个Word文档中获取数据,并将其与上述文件合并,保留段落格式
导入java.io.File;
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);
}
}
导入java.util.List;
导入javax.xml.bind.JAXBException;
导入org.docx4j.dml.CTBlip;
导入org.docx4j.openpackaging.exceptions.docx4jeexception;
导入org.docx4j.openpackaging.packages.WordprocessingMLPackage;
导入org.docx4j.openpackaging.parts.Part;
导入org.docx4j.openpackaging.parts.PartName;
导入org.docx4j.openpackaging.parts.WordprocessingML.ImageBmpPart;
导入org.docx4j.openpackaging.parts.WordprocessingML.imagepspart;
导入org.docx4j.openpackaging.parts.WordprocessingML.ImageGifPart;
导入org.docx4j.openpackaging.parts.WordprocessingML.ImageJpegPart;
导入org.docx4j.openpackaging.parts.WordprocessingML.ImagePngPart;
导入org.docx4j.openpackaging.parts.WordprocessingML.ImageTiffPart;
导入org.docx4j.openpackaging.parts.relationships.RelationshipsPart;
导入org.docx4j.openpackaging.parts.relationships.RelationshipsPart.addPartBehavior;
导入org.docx4j.relationships.Relationship;
公共类乘法器{
公共静态void main(字符串[]args)抛出Docx4JException、JAXBException{
文件优先=新文件(“D:\\Mreg.docx”);
文件秒=新文件(“D:\\Mreg1.docx”);
第三个文件=新文件(“D:\\Mreg4&19.docx”);
第四个文件=新文件(“D:\\test12.docx”);
WordprocessingMLPackage f=WordprocessingMLPackage.load(第一);
WordProcessingMLPackages=WordprocessingMLPackage.load(秒);
WordprocessingMLPackage a=WordprocessingMLPackage.load(第三个);
WordprocessingMLPackage e=WordprocessingMLPackage.load(第四);
List body=s.getMainDocumentPart().getJAXBNodesViaXPath(“//w:body”,false);
用于(对象b:主体){
List filhos=((org.docx4j.wml.Body)b.getContent();
用于(对象k:filhos)
f、 getMainDocumentPart().addObject(k);
}
List body1=a.getMainDocumentPart().getJAXBNodesViaXPath(“//w:body”,false);
用于(对象b:body1){
List filhos=((org.docx4j.wml.Body)b.getContent();
用于(对象k:filhos)
f、 getMainDocumentPart().addObject(k);
}
List body2=e.getMainDocumentPart().getJAXBNodesViaXPath(“//w:body”,false);
用于(对象b:body2){
List filhos=((org.docx4j.wml.Body)b.getContent();
用于(对象k:filhos)
f、 getMainDocumentPart().addObject(k);
}
List blips=e.getMainDocumentPart().getJAXBNodesViaXPath(“//a:blip”,false);
用于(对象el:光点){
试一试{
CTBlip blip=(CTBlip)el;
RelationshipsPart parts=e.getMainDocumentPart().getRelationshipsPart();
Relationship=parts.getrelationshippyid(blip.getEmbed());
Part Part=parts.getPart(rel);
if(ImagePngPart的零件实例)
System.out.println(((ImagePngPart)part.getBytes());
if(图像JPEG部件的部件实例)
System.out.println(((ImageJpegPart)part.getBytes());
if(ImageBmpPart的部件实例)
System.out.println(((ImageBmpPart)part.getBytes());
if(ImageGifPart的部件实例)
System.out.println(((ImageGifPart)part.getBytes());
if(ImagesPart的部件实例)
System.out.println(((imagepspart)part.getBytes());
if(ImageTiffPart的部件实例)
System.out.println(((ImageTiffPart)part.getBytes());
关系newrel=f.getMainDocumentPart().addTargetPart(part,AddPartBehavior.RENAME_,如果_NAME_存在);
setEmbed(newrel.getId());
f、 getMainDocumentPart().addTargetPart(例如getParts().getParts().get(新部件名(“/word/”+rel.getTarget()));
}捕获(例外情况除外){
例如printStackTrace();
} }
保存的文件=新文件(“D:\\saved1.docx”);
f、 保存(已保存);
}
}
我开发了下一个类(使用ApachePOI):
Apache POI代码不适用于图像。谢谢,但要求是.doc文档!“合并”文档是什么意思?只是附加了
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBody;
public class WordMerge {
private final OutputStream result;
private final List<InputStream> inputs;
private XWPFDocument first;
public WordMerge(OutputStream result) {
this.result = result;
inputs = new ArrayList<>();
}
public void add(InputStream stream) throws Exception{
inputs.add(stream);
OPCPackage srcPackage = OPCPackage.open(stream);
XWPFDocument src1Document = new XWPFDocument(srcPackage);
if(inputs.size() == 1){
first = src1Document;
} else {
CTBody srcBody = src1Document.getDocument().getBody();
first.getDocument().addNewBody().set(srcBody);
}
}
public void doMerge() throws Exception{
first.write(result);
}
public void close() throws Exception{
result.flush();
result.close();
for (InputStream input : inputs) {
input.close();
}
}
}
public static void main(String[] args) throws Exception {
FileOutputStream faos = new FileOutputStream("/home/victor/result.docx");
WordMerge wm = new WordMerge(faos);
wm.add( new FileInputStream("/home/victor/001.docx") );
wm.add( new FileInputStream("/home/victor/002.docx") );
wm.doMerge();
wm.close();
}