2

docx 操作 (プレースホルダーの検索/置換、チェックボックスのチェック/チェック解除) を行う必要があります。ColdFusion 10 は Java とうまく統合されるため、基本的に OpenXML SDK (.net プラットフォーム) を模倣した Java ライブラリ docx4j を試して使用することにしました。

カスタムフォルダー内に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 を操作するためのオプションはあまりありません。

4

3 に答える 3

1

大丈夫。私はすべてがうまくいったようです。検索/置換を行う方法と、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 の構造は実際には util.Vector であると思いますが、ハッシュマップは util.HashMap です。プレースホルダーでの検索/置換を示すDocx4jで見たすべての例は、これを使用しています:

HashMap<String, String> mappings = new HashMap<String, String>();
mappings.put("colour", "green");
mappings.put("icecream", "chocolate");
于 2012-05-31T23:13:44.207 に答える
0

true の代わりに loadColdFusionClassPath = false を設定してみましたか? おそらく、CF と共に出荷される一部の JAR と競合する可能性があります。

于 2012-05-31T11:55:44.560 に答える
0

(実際には新しい答えではありませんが、コメントするにはコードが多すぎます..)

docx4j VariableReplace.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>
于 2012-06-01T05:51:19.760 に答える