请告诉我如何使用java和docx4j在docx文件中附加数据。
我正在做的是,我正在使用docx格式的模板,其中某些字段在运行时由java填充,
我的问题是它为每组数据创建了一个新文件,我只想将新文件附加到1个文件中。这不是使用java流
完成的String outputfilepath = "e:\\Practice/DOC/output/generatedLatterOUTPUT.docx";
String outputfilepath1 = "e:\\Practice/DOC/output/generatedLatterOUTPUT1.docx";
WordprocessingMLPackage wordMLPackage;
public void templetsubtitution(String name, String age, String gender, Document document)
throws Exception {
// input file name
String inputfilepath = "e:\\Practice/DOC/profile.docx";
// out put file name
// id of Xml file
String itemId1 = "{A5D3A327-5613-4B97-98A9-FF42A2BA0F74}".toLowerCase();
String itemId2 = "{A5D3A327-5613-4B97-98A9-FF42A2BA0F74}".toLowerCase();
String itemId3 = "{A5D3A327-5613-4B97-98A9-FF42A2BA0F74}".toLowerCase();
// Load the Package
if (inputfilepath.endsWith(".xml")) {
JAXBContext jc = Context.jcXmlPackage;
Unmarshaller u = jc.createUnmarshaller();
u.setEventHandler(new org.docx4j.jaxb.JaxbValidationEventHandler());
org.docx4j.xmlPackage.Package wmlPackageEl = (org.docx4j.xmlPackage.Package) ((JAXBElement) u
.unmarshal(new javax.xml.transform.stream.StreamSource(
new FileInputStream(inputfilepath)))).getValue();
org.docx4j.convert.in.FlatOpcXmlImporter xmlPackage = new org.docx4j.convert.in.FlatOpcXmlImporter(
wmlPackageEl);
wordMLPackage = (WordprocessingMLPackage) xmlPackage.get();
} else {
wordMLPackage = WordprocessingMLPackage
.load(new File(inputfilepath));
}
CustomXmlDataStoragePart customXmlDataStoragePart = wordMLPackage
.getCustomXmlDataStorageParts().get(itemId1);
// Get the contents
CustomXmlDataStorage customXmlDataStorage = customXmlDataStoragePart
.getData();
// Change its contents
((CustomXmlDataStorageImpl) customXmlDataStorage).setNodeValueAtXPath(
"/ns0:orderForm[1]/ns0:record[1]/ns0:name[1]", name,
"xmlns:ns0='EasyForm'");
customXmlDataStoragePart = wordMLPackage.getCustomXmlDataStorageParts()
.get(itemId2);
// Get the contents
customXmlDataStorage = customXmlDataStoragePart.getData();
// Change its contents
((CustomXmlDataStorageImpl) customXmlDataStorage).setNodeValueAtXPath(
"/ns0:orderForm[1]/ns0:record[1]/ns0:age[1]", age,
"xmlns:ns0='EasyForm'");
customXmlDataStoragePart = wordMLPackage.getCustomXmlDataStorageParts()
.get(itemId3);
// Get the contents
customXmlDataStorage = customXmlDataStoragePart.getData();
// Change its contents
((CustomXmlDataStorageImpl) customXmlDataStorage).setNodeValueAtXPath(
"/ns0:orderForm[1]/ns0:record[1]/ns0:gender[1]", gender,
"xmlns:ns0='EasyForm'");
// Apply the bindings
BindingHandler.applyBindings(wordMLPackage.getMainDocumentPart());
File f = new File(outputfilepath);
wordMLPackage.save(f);
FileInputStream fis = new FileInputStream(f);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
try {
for (int readNum; (readNum = fis.read(buf)) != -1;) {
bos.write(buf, 0, readNum);
}
// System.out.println( buf.length);
} catch (IOException ex) {
}
byte[] bytes = bos.toByteArray();
FileOutputStream file = new FileOutputStream(outputfilepath1, true);
DataOutputStream out = new DataOutputStream(file);
out.write(bytes);
out.flush();
out.close();
System.out.println("..done");
}
public static void main(String[] args) {
utility u = new utility();
u.templetsubtitution("aditya",24,mohan);
}
提前致谢
答案 0 :(得分:3)
我不得不处理类似的事情,这就是我所做的事情(可能不是最有效的,但有效):
使用下面的函数将填充数据的doc附加到finalDoc:
public static void append(WordprocessingMLPackage docDest, WordprocessingMLPackage docSource) {
List<Object> objects = docSource.getMainDocumentPart().getContent();
for(Object o : objects){
docDest.getMainDocumentPart().getContent().add(o);
}
}
希望这有帮助。
答案 1 :(得分:2)
如果我理解正确,你基本上是在谈论合并文件。您可以使用两种非常简单的方法,它们的有效性实际上取决于数据的结构和向前使用:
PhilippeAuriach在他的回答中描述了一种方法
将MaindocumentPart
实例中的所有组件附加到
另一个。就最终的docx文件而言,这意味着内容
出现在document.xml
中 - 它不会考虑标题
和页脚(例如),但这对你来说可能没问题。
您可以通过插入多个文档将其插入到单个docx文件中
作为AltChunk
元素(请参阅docx4j文档)。这将
从一个Word文件到另一个,标题和所有文件。
这样做的缺点是你的最终文件不合适
流动Word文件,直到您打开它并将其保存在MS Word本身
(导入的组件仍作为docx中的独立文件
束)。如果要生成,这将导致问题
'合并'文件,然后像渲染PDF一样对它们做些什么 -
合并的内容将被忽略。
更完整(和复杂)的方法是执行“深度合并”。这将更新并维护文档中保留的所有引用。导入的内容成为文档主要“流”的一部分(即它不作为单独的引用存储),因此最终结果是一个正确合并的文件,可以呈现为PDF或其他任何内容。
这方面的缺点是你需要熟悉docx结构和API,并且你将编写相当数量的代码(我建议购买许可证到Plutext's MergeDocx)。