4

Docx4J を使用して docx テンプレートを変更し、事前定義されたテンプレートのプレースホルダーの代わりに値を配置しています。

これまでのところ、段落やテキスト、表、画像などを見つけて置き換えることに成功していましたが、ドキュメントのヘッダーおよび/またはフッター要素を見つけることにはまだ成功していません。

私は使っている

WordprocessingMLPackage wordMLPackage =
WordprocessingMLPackage.load(new java.io.File(inputfilepath));
wordMLPackage.getMainDocumentPart(); 

テンプレート内の要素を検索します。

4

3 に答える 3

5

アプリケーションでは、 https://github.com/plutext/docx4j/blob/master/src/main/java/org/docx4j/model/datastorage/BindingHandler.javaの 145 行目のコードを模倣できます。

https://github.com/plutext/docx4j/blob/master/src/main/java/org/docx4j/model/fields/merge/MailMerger.javaの 124 行目でも同様のアプローチが取られています。

于 2013-07-01T22:24:35.697 に答える
3

これは、フッターのキーホルダーを置き換える方法です(Javaでは、XMLはありません)。私が行方不明だった作品は次のとおりです。

JaxbXmlPart part = (JaxbXmlPart) relationshipPart.getPart(r);

JasonPlutextが言及したソースコードMailMerger.javaから、410行目に記載されています。JasonPlutextに感謝します。

public static void replaceElementFromFooter(WordprocessingMLPackage template, String nameplace, String placeholder, String newValue) throws Docx4JException {
    List<Object> result = new ArrayList<Object>();

    RelationshipsPart relationshipPart = template.getMainDocumentPart().getRelationshipsPart();

    List<Relationship> relationships = relationshipPart.getRelationships().getRelationship()

    for (Relationship r : relationships) {

        if (r.getType().equals(nameplace)) {

            JaxbXmlPart part = (JaxbXmlPart) relationshipPart.getPart(r);

            List<Object> texts = getAllElementsFromObject(part.getContents(), Text.class);

            replaceTextElement(texts, placeholder, newValue);
        }

    }

    return result;
}

private static List<Object> getAllElementsFromObject(Object obj, Class<?> toSearch) {
    List<Object> result = new ArrayList<Object>();

    if (obj instanceof JAXBElement) {
        obj = ((JAXBElement<?>) obj).getValue();
    }

    if (obj.getClass().equals(toSearch)) {
        result.add(obj);
    } else if (obj instanceof ContentAccessor) {
        List<?> children = ((ContentAccessor) obj).getContent();
        for (Object child : children) {
            result.addAll(getAllElementFromObject(child, toSearch));
        }
    }
    return result;
}

private static void replaceTextElement(List<Object> texts, String placeholder, String newValue) {
    for (Object element : texts) {
        Text textElement = (Text) element;

        if (textElement.getValue().contains(placeholder)) {
            String replacedValue = textElement.getValue().replaceAll(placeholder, newValue);
            textElement.setValue(replacedValue);
        }

    }
}
于 2017-01-06T21:54:39.703 に答える