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

猜你喜欢

转载自bookone.iteye.com/blog/2149859