如何让docx4j按照自己的模板写文件?(How to write docx documents using the custom docx tempate file by open source docx4j?).
介绍:docx4j是读写docx开源框架,使用Java实现。
docx4j可以支持读入文件,支持写入文件。目前做MOOC,考虑实际考试系统的流程,需要把MOOC的试卷导出docx文件进行打印(中国特色)。
流程:
1)读取自己定义的一个空docx文档。
2)按照样式写内容,如下:
import org.docx4j.XmlUtils; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart; import org.docx4j.samples.AbstractSample; class CreateWordprocessingMLDocument extends AbstractSample { public static void main(String[] args) throws Exception { boolean save = true; WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new java.io.File("f://template.docx")); MainDocumentPart mdp = wordMLPackage.getMainDocumentPart(); // Example 1: add text in Title style mdp.addStyledParagraphOfText("heading1", "Heading1"); mdp.addStyledParagraphOfText("heading2", "Heading2"); mdp.addStyledParagraphOfText("heading3", "Heading3"); // Pretty print the main document part System.out.println( XmlUtils.marshaltoString(mdp.getJaxbElement(), true, true) ); // Optionally save it if (save) { String filename = System.getProperty("user.dir") + "/OUT.docx"; wordMLPackage.save(new java.io.File(filename) ); System.out.println("Saved " + filename); } } }
遇到的问题是:docx4j写文档,格式默认非常奇怪,没有按照我的模板写出段落风格。
通过分析读取流程,发现docx4j根本没有使用我定义的风格,doc4j读取的风格来自自己的配置文件,位置在jar内:
docx4j-3.2.1.jar\org\docx4j\openpackaging\parts\WordprocessingML\KnownStyles.xml
插入文本风格都来自这里。
3)修改方法。
(1) 把自己做的模板文件template.docx用rar工具解压开(docx是 open package file和epub类似)
(2) 把\word\styles.xml复制并且重定名为KnownStyles.xml。
(3) 覆盖docx4j-3.2.1.jar里面的KnownStyles.xml文件。
(4) 特别注意:addStyledParagraphOfText("heading1", "Heading1");通过sytleid进行查找风格。docx4j的KnownStyles.xml风格ID同我们自己从\word\styles.xml的ID不一致。可以修改styles.xml保持一致,也可以不修改,使用自己的ID,如下是使用自己的ID。
(5) 从模板中解压后的id是w:styleId="2":
- <w:style w:type="paragraph" w:styleId="2"> <w:name w:val="heading 1" /> <w:basedOn w:val="1" /> <w:next w:val="1" /> <w:qFormat /> <w:uiPriority w:val="9" /> - <w:pPr> <w:keepNext /> <w:keepLines /> - <w:numPr> <w:ilvl w:val="0" /> <w:numId w:val="1" /> </w:numPr> <w:spacing w:before="340" w:beforeAutospacing="0" w:after="330" w:afterAutospacing="0" w:line="576" w:lineRule="auto" /> <w:ind w:left="432" w:hanging="432" /> <w:outlineLvl w:val="0" /> </w:pPr> - <w:rPr> <w:b /> <w:kern w:val="44" /> <w:sz w:val="44" /> </w:rPr> </w:style>
以后所有Heading1的风格,调用改为2.修改后的代码如下:
import org.docx4j.XmlUtils; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart; import org.docx4j.samples.AbstractSample; class CreateWordprocessingMLDocument extends AbstractSample { public static void main(String[] args) throws Exception { boolean save = true; WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new java.io.File("f://template.docx")); MainDocumentPart mdp = wordMLPackage.getMainDocumentPart(); // Example 1: add text in Title style mdp.addStyledParagraphOfText("2", "Heading1"); mdp.addStyledParagraphOfText("3", "Heading2"); mdp.addStyledParagraphOfText("4", "Heading3"); // Pretty print the main document part System.out.println( XmlUtils.marshaltoString(mdp.getJaxbElement(), true, true) ); // Optionally save it if (save) { String filename = System.getProperty("user.dir") + "/OUT.docx"; wordMLPackage.save(new java.io.File(filename) ); System.out.println("Saved " + filename); } } }
这样就可以使用自己的模板插入文本了,模板可以定义项目符号、页眉、页码等丰富格式等。
疑问:doc4j既然支持读取docx文件,应该支持从docx中获取style信息;另外docx4j支持配置文件,能否更简单实现,没有去研究。
相关推荐
在Java开发中,docx4j的使用极大地简化了与OOXML文件交互的过程。 在"docx4j运行需要的jar包,这里是整理好的所有必须的jar包"这一描述中,我们可以推断出这个压缩包包含了一系列docx4j运行所必需的依赖库。通常,...
2. **内容替换**: 使用`Docx4j.replaceText()`方法,可以方便地替换文档中的指定文本,这在批量处理文档或者模板替换中非常有用。 3. **读取文档**: `docx4j`可以读取`.docx`文件,提取其中的文本、图片、表格等...
docx4j是一个功能强大的Java类库,用于创建和操作Microsoft Open XML文件,如Word docx、PowerPoint pptx和Excel xlsx。今天,我们将详细介绍如何使用docx4j操作Word文档。 1. Docx4j介绍 docx4j是一个开源的Java...
3. **模板引擎**:通过使用docx4j,开发者可以创建含有占位符的模板文档,并在运行时用动态数据填充这些占位符,实现批量生成个性化文档。 4. **读取和解析XML**:docx4j能够解析WordXML文档的内部XML结构,使...
Apache POI的集成使docx4j具备了更广泛的文件兼容性,可以处理Excel表格和可能的PowerPoint演示文稿。这使得docx4j成为Java开发中处理Office文档的强大工具,尤其适用于企业级应用,如自动化报告生成、文档管理和...
《docx4j 动态生成表格(一)》这篇博文主要探讨了如何使用docx4j库在Java环境中动态创建Word文档中的表格。docx4j是一个强大的开源Java库,它允许开发者对OpenXML格式(如.docx、.xlsx等)进行深度操作,包括创建、...
4. **模板处理**:docx4j支持基于模板的文档生成,通过变量绑定和数据填充,可以快速生成大量类似的文档。 5. **复杂格式支持**:对于复杂的排版和样式,docx4j提供了丰富的API,可以处理页边距、列宽、行高、段落...
在IT行业中,尤其是在文档处理领域,`docx4j`是一个非常重要的库,它允许开发者通过编程方式操作Microsoft Office Open XML(OOXML)格式的文件,如.docx、.xlsx和.pptx等。本篇将详细介绍如何使用`docx4j`根据书签...
7. **模板处理**:docx4j支持基于模板的文档生成,允许在模板文件中使用占位符,然后在运行时替换为实际值。这通常通过`org.docx4j.model.fields.merge.Field`和`org.docx4j.model.datastorage.mappings.Entry`来...
docx4j通过解析和操作这些XML文件,实现了对文档的编程访问。 docx4j提供了`ReplaceText`类,这是进行文本替换的核心工具。使用这个类,我们可以指定一个要查找的文本和一个替换后的文本,然后docx4j会遍历整个文档...
`resources`可能存储了docx4j运行时所需的静态资源,如模板或配置文件。最后,`documentation`可能包含了详细的API文档和用户指南,帮助开发者更有效地利用docx4j。 使用docx4j时,开发者首先需要了解如何设置项目...
Docx4j是一个用于Java语言中...在选择Docx4j时,用户需要评估自己是否需要这些功能,以及是否愿意使用Java语言进行文档处理。如果用户正在寻求一个能够提供丰富文档操作功能的开源类库,Docx4j可能会是一个不错的选择。
此外,docx4j还提供了插件机制,开发者可以根据需求开发自己的扩展功能。 总的来说,docx4j是一款功能全面且易用的Java库,无论是在简单的文档生成,还是复杂的文档处理和转换任务中,都能发挥重要作用。通过深入...
docx4j-openxml-objects系列的jar文件是docx4j的重要组成部分,它们包含了处理OpenXML对象所需的模型类。例如,docx4j-openxml-objects-sml和docx4j-openxml-objects-pml分别对应WordprocessingML和PresentationML,...
在IT领域,docx4j是一个非常实用的Java库,专为处理Microsoft Office Open XML (OOXML) 文件格式,如.docx、.xlsx和.pptx而设计。它允许开发人员在Java应用程序中创建、修改和转换这些文档,极大地提高了工作效率。...
#### 四、Docx4j的使用方式 - **通过Maven集成**: Docx4j可以通过Maven来管理依赖,简化集成过程。 - **直接使用**: 如果不想使用构建工具,也可以直接下载Docx4j的JAR文件使用。 - **依赖管理**: Docx4j依赖于多个...
在文件列表中,"replace_text_PDF_templetate.docx"可能是一个示例模板文件,用于演示如何在转换过程中替换文本或者作为转换后的PDF输出的模板。这种模板可能包含占位符文本,转换时会被特定的值替换,以满足定制化...
**docx4j** 是一个Java库,专门用于处理Microsoft Office Open XML (OOXML)格式,尤其是.docx、.pptx和.xlsx文件。这个库提供了丰富的API,使得开发人员可以方便地创建、读取、修改和转换这些文档。本文将深入探讨...
docx4j是一款基于Java的开源库,专门用于处理Microsoft Office Open XML (OOXML) 文件格式,如.docx、.pptx和.xlsx等。其6.0.1版本是官方发布的原版,包含了完整的文档和所有必需的依赖,使得开发者能够方便地在Java...