`

docx4j如何按照自己的模板写文件

阅读更多

如何让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支持配置文件,能否更简单实现,没有去研究。

分享到:
评论

相关推荐

    docx4j相关jar包

    在Java开发中,docx4j的使用极大地简化了与OOXML文件交互的过程。 在"docx4j运行需要的jar包,这里是整理好的所有必须的jar包"这一描述中,我们可以推断出这个压缩包包含了一系列docx4j运行所必需的依赖库。通常,...

    docx4j及其依赖包

    2. **内容替换**: 使用`Docx4j.replaceText()`方法,可以方便地替换文档中的指定文本,这在批量处理文档或者模板替换中非常有用。 3. **读取文档**: `docx4j`可以读取`.docx`文件,提取其中的文本、图片、表格等...

    docx4j操作word

    docx4j是一个功能强大的Java类库,用于创建和操作Microsoft Open XML文件,如Word docx、PowerPoint pptx和Excel xlsx。今天,我们将详细介绍如何使用docx4j操作Word文档。 1. Docx4j介绍 docx4j是一个开源的Java...

    docx4j全部jar包,包含docx4j-3.2.1.jar、poi-3.14.jar等60个jar包。.zip

    Apache POI的集成使docx4j具备了更广泛的文件兼容性,可以处理Excel表格和可能的PowerPoint演示文稿。这使得docx4j成为Java开发中处理Office文档的强大工具,尤其适用于企业级应用,如自动化报告生成、文档管理和...

    docx4j项目(javadoc文档、源码及示例)

    3. **模板引擎**:通过使用docx4j,开发者可以创建含有占位符的模板文档,并在运行时用动态数据填充这些占位符,实现批量生成个性化文档。 4. **读取和解析XML**:docx4j能够解析WordXML文档的内部XML结构,使...

    docx4j 动态生成表格 (一 )

    《docx4j 动态生成表格(一)》这篇博文主要探讨了如何使用docx4j库在Java环境中动态创建Word文档中的表格。docx4j是一个强大的开源Java库,它允许开发者对OpenXML格式(如.docx、.xlsx等)进行深度操作,包括创建、...

    docx4j-3.3.3.zip

    4. **模板处理**:docx4j支持基于模板的文档生成,通过变量绑定和数据填充,可以快速生成大量类似的文档。 5. **复杂格式支持**:对于复杂的排版和样式,docx4j提供了丰富的API,可以处理页边距、列宽、行高、段落...

    docx4j根据书签替换word中的内容

    在IT行业中,尤其是在文档处理领域,`docx4j`是一个非常重要的库,它允许开发者通过编程方式操作Microsoft Office Open XML(OOXML)格式的文件,如.docx、.xlsx和.pptx等。本篇将详细介绍如何使用`docx4j`根据书签...

    docx4j api

    7. **模板处理**:docx4j支持基于模板的文档生成,允许在模板文件中使用占位符,然后在运行时替换为实际值。这通常通过`org.docx4j.model.fields.merge.Field`和`org.docx4j.model.datastorage.mappings.Entry`来...

    docx4j 替换文本

    docx4j通过解析和操作这些XML文件,实现了对文档的编程访问。 docx4j提供了`ReplaceText`类,这是进行文本替换的核心工具。使用这个类,我们可以指定一个要查找的文本和一个替换后的文本,然后docx4j会遍历整个文档...

    docx4j-3.3.3 jar包及依赖jar包

    `resources`可能存储了docx4j运行时所需的静态资源,如模板或配置文件。最后,`documentation`可能包含了详细的API文档和用户指南,帮助开发者更有效地利用docx4j。 使用docx4j时,开发者首先需要了解如何设置项目...

    Docx4j入门指南

    Docx4j是一个用于Java语言中...在选择Docx4j时,用户需要评估自己是否需要这些功能,以及是否愿意使用Java语言进行文档处理。如果用户正在寻求一个能够提供丰富文档操作功能的开源类库,Docx4j可能会是一个不错的选择。

    docx4j相关资料

    此外,docx4j还提供了插件机制,开发者可以根据需求开发自己的扩展功能。 总的来说,docx4j是一款功能全面且易用的Java库,无论是在简单的文档生成,还是复杂的文档处理和转换任务中,都能发挥重要作用。通过深入...

    使用docx4j+docx4j-ImportXHTML实现将html转成word

    html模板填充生成pdf和word

    docx4j-community-8.1.5.zip

    docx4j-openxml-objects系列的jar文件是docx4j的重要组成部分,它们包含了处理OpenXML对象所需的模型类。例如,docx4j-openxml-objects-sml和docx4j-openxml-objects-pml分别对应WordprocessingML和PresentationML,...

    docx4j操作word2007

    在IT领域,docx4j是一个非常实用的Java库,专为处理Microsoft Office Open XML (OOXML) 文件格式,如.docx、.xlsx和.pptx而设计。它允许开发人员在Java应用程序中创建、修改和转换这些文档,极大地提高了工作效率。...

    Docx4j Getting Start中文版

    #### 四、Docx4j的使用方式 - **通过Maven集成**: Docx4j可以通过Maven来管理依赖,简化集成过程。 - **直接使用**: 如果不想使用构建工具,也可以直接下载Docx4j的JAR文件使用。 - **依赖管理**: Docx4j依赖于多个...

    docx4j word转pdf

    在文件列表中,"replace_text_PDF_templetate.docx"可能是一个示例模板文件,用于演示如何在转换过程中替换文本或者作为转换后的PDF输出的模板。这种模板可能包含占位符文本,转换时会被特定的值替换,以满足定制化...

    docx4j(jar,src,依赖JAR)

    **docx4j** 是一个Java库,专门用于处理Microsoft Office Open XML (OOXML)格式,尤其是.docx、.pptx和.xlsx文件。这个库提供了丰富的API,使得开发人员可以方便地创建、读取、修改和转换这些文档。本文将深入探讨...

Global site tag (gtag.js) - Google Analytics