我需要做docx操作(查找/替换占位符并选中/取消选中复选框)。由于ColdFusion 10与Java集成良好,我决定尝试使用Java库docx4j,它基本上模仿OpenXML SDK(.net平台)。
我将docx4j JAR放在一个自定义文件夹中,我已经通过JavaSettings在我的Application.cfc中设置了该文件夹(CF10中的新功能,我尝试了其他JARS并且它可以工作):
<cfcomponent output="false">
<cfset this.javaSettings =
{LoadPaths = ["/myJava/lib"], loadColdFusionClassPath = true, reloadOnChange= true,
watchInterval = 100, watchExtensions = "jar,class,xml"} />
</cfcomponent>
现在,我正在尝试使用此示例:https://github.com/plutext/docx4j/blob/master/src/main/java/org/docx4j/samples/VariableReplace.java
但是尝试调用 WordprocessingMLPackage 失败,函数 CreateObject() 表示特定类不存在:
<cfset docObj = createObject("java","org.docx4j.openpackaging.packages.WordprocessingMLPackage") />
有什么想法吗?我不是真正的Java人,但是docx操作的选择并不多。
好吧。似乎我一切都在工作。我只需要弄清楚如何进行查找/替换,以及我想在docx文档中执行的其他所有操作。这是我到目前为止的代码,向你们展示它看起来正在工作(如果你在CF10上,请确保你的Application.cfc看起来像原始帖子):
<cfscript>
docPackageObj = createObject("java","org.docx4j.openpackaging.packages.WordprocessingMLPackage").init();
docObj = createObject("java","org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart").init();
xmlUtilObj = createObject("java","org.docx4j.XmlUtils").init();
wmlDocObj = createObject("java","org.docx4j.wml.Document").init();
saveToZipFile = createObject("java","org.docx4j.openpackaging.io.SaveToZipFile").init(docPackageObj);
strFilePath = getDirectoryFromPath(getCurrentTemplatePath()) & "testDoc.docx";
wordMLPackage =
docPackageObj.load(createObject("java","java.io.File").init(javaCast("string",strFilePath)));
documentPart = wordMLPackage.getMainDocumentPart();
// unmarshallFromTemplate requires string input
strXml = xmlUtilObj.marshaltoString(documentPart.getJaxbElement(),true);
writeDump(var="#strXml#");
</cfscript>
现在,有没有人知道如何将ColdFusion中的结构转换为哈希图(或一般的集合)?我认为 CF 中的结构实际上是实用的。向量,而哈希图是有用的。哈希图。我在 Docx4j 中看到的所有演示在占位符中查找/替换的示例都使用以下内容:
HashMap<String, String> mappings = new HashMap<String, String>();
mappings.put("colour", "green");
mappings.put("icecream", "chocolate");
您是否尝试过设置 loadColdFusionClassPath = false 而不是 true? 也许与一些带有 CF 的 JAR 存在冲突。
(不是真正的新答案,但它的代码太多了,无法注释..)
以下是 docx4j 变量替换的完整代码.java示例
<cfscript>
saveToDisk = true;
inputFilePath = ExpandPath("./docx4j/sample-docs/word/unmarshallFromTemplateExample.docx");
outputFilePath = ExpandPath("./OUT_VariableReplace.docx");
inputFile = createObject("java", "java.io.File").init(inputFilePath);
wordMLPackage = createObject("java","org.docx4j.openpackaging.packages.WordprocessingMLPackage").load(inputFile);
documentPart = wordMLPackage.getMainDocumentPart();
XmlUtils = createObject("java","org.docx4j.XmlUtils");
xmlString = XmlUtils.marshaltoString(documentPart.getJaxbElement(),true);
mappings = createObject("java", "java.util.HashMap").init();
mappings["colour"] = "green";
mappings["icecream"] = "chocolate";
obj = XmlUtils.unmarshallFromTemplate(xmlString , mappings);
documentPart.setJaxbElement(obj);
if (saveToDisk) {
saveToZipFile = createObject("java","org.docx4j.openpackaging.io.SaveToZipFile").init(wordMLPackage);
SaveToZipFile.save( outputFilePath );
}
else {
WriteDump(XmlUtils.marshaltoString(documentPart.getJaxbElement(), true, true));
}
</cfscript>