docx4j学习笔记(2)

本文介绍如何使用Java库Docx4j创建带有格式的Word文档,包括设置中文内容、字体、颜色、对齐方式及段落间距等。

第二个程序,首先向文件中写入点什么内容。写一个Hello World先。


package me.test.docx4j;

import java.io.File;

import javax.xml.bind.JAXBException;

import org.docx4j.jaxb.Context;
import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
import org.docx4j.wml.Body;
import org.docx4j.wml.Document;
import org.docx4j.wml.ObjectFactory;
import org.docx4j.wml.P;
import org.docx4j.wml.R;
import org.docx4j.wml.Text;
import org.junit.Test;

public class HelloWorld {
	@Test
	public void doTest() throws Docx4JException, JAXBException {
		WordprocessingMLPackage pkg = WordprocessingMLPackage.createPackage();
		
		//docx文件中的文档部分MainDocumentPart。
		MainDocumentPart main = pkg.getMainDocumentPart();
		//Document对象表示文档本身。
		Document doc = main.getContents();
		//Document中的Body对象表示前景内容,还有Background对象表示背景内容。
		Body body = doc.getBody();
		
		//各种元素的工厂对象
		ObjectFactory factory = Context.getWmlObjectFactory();
		
		//创建一个段落(Paragraph,P)
		P para = factory.createP();
		//为段落创建一个文本块(Run,R)
		R run = factory.createR();
		//为文本块创建一个文本(Text)
		Text text = factory.createText();
		text.setValue("Hello World");
		
		//文本加入文本块
		run.getContent().add(text);
		//文本块加入段落
		para.getContent().add(run);
		//段落加入文档
		body.getContent().add(para);
		//重复一遍
		body.getContent().add(para);
		pkg.save(new File(System.getProperty("user.dir"), "Simple Hello World.docx"));
	}
}

只有一个Hello World难免太单调了,加上中文设置个格式。内容顿时就丰富了起来。

其中最烦人的是长度单位五花八门,详细的解读请见http://startbigthinksmall.wordpress.com/2010/01/04/points-inches-and-emus-measuring-units-in-office-open-xml/

package me.test.docx4j;

import java.io.File;
import java.math.BigInteger;

import javax.xml.bind.JAXBException;

import org.docx4j.jaxb.Context;
import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
import org.docx4j.wml.Body;
import org.docx4j.wml.Color;
import org.docx4j.wml.Document;
import org.docx4j.wml.HpsMeasure;
import org.docx4j.wml.Jc;
import org.docx4j.wml.JcEnumeration;
import org.docx4j.wml.ObjectFactory;
import org.docx4j.wml.P;
import org.docx4j.wml.PPr;
import org.docx4j.wml.PPrBase;
import org.docx4j.wml.PPrBase.Ind;
import org.docx4j.wml.R;
import org.docx4j.wml.RFonts;
import org.docx4j.wml.RPr;
import org.docx4j.wml.Text;
import org.junit.Test;

public class HelloWorldWithFormats {
	@Test
	public void doTest() throws Docx4JException, JAXBException {
		WordprocessingMLPackage pkg = WordprocessingMLPackage.createPackage();
		
		//docx文件中的文档部分MainDocumentPart。
		MainDocumentPart main = pkg.getMainDocumentPart();
		//Document对象表示文档本身。
		Document doc = main.getContents();
		//Document中的Body对象表示前景内容,还有Background对象表示背景内容。
		Body body = doc.getBody();
		
		//各种元素的工厂对象
		ObjectFactory factory = Context.getWmlObjectFactory();
		
		//创建一个段落(Paragraph,P)
		P para = factory.createP();
		//为段落创建一个文本块(Run,R)
		R run = factory.createR();
		//为文本块创建一个文本(Text)
		Text text = factory.createText();
		text.setValue("Hello World! 你好,世界!");
		
		//创建段落格式
		PPr ppr = factory.createPPr();
		
		//设置居中对齐
		Jc jc = factory.createJc();
		jc.setVal(JcEnumeration.CENTER);
		ppr.setJc(jc);
		
		//设置缩进和间距
		//这里用的单位是Twentieths of a point (dxa),1/20点
		Ind ind = new Ind();
		ind.setFirstLine(BigInteger.valueOf(22 * 20));
		ppr.setInd(ind);
		
		PPrBase.Spacing spacing = new PPrBase.Spacing();
		spacing.setBefore(BigInteger.valueOf(0));
		spacing.setAfter(BigInteger.valueOf(0));
		spacing.setLine(BigInteger.valueOf(24 * 10));
		ppr.setSpacing(spacing);
				
		//设置段落格式
		para.setPPr(ppr);
		
		//创建文本格式
		RPr rpr = factory.createRPr();
		//设置文本颜色
		Color color = new Color();
		//红色
		//color.setVal("red")同样有效
		color.setVal("FF0000");
		rpr.setColor(color);
		
		//设置字体类型
		RFonts rf = factory.createRFonts();
		rf.setAscii("Times New Roman");
		rf.setHAnsi("Times New Roman");
		rf.setEastAsia("微软雅黑");
		rpr.setRFonts(rf);
		//设置字体大小
		//字体大小单位是HpsMeasure,即Half-points,半个点
		HpsMeasure size = new HpsMeasure();
		size.setVal(BigInteger.valueOf(24));
		rpr.setSz(size);
		rpr.setSzCs(size);		
		
		//设置文本格式
		run.setRPr(rpr);
		
		//文本加入文本块
		run.getContent().add(text);
		//文本块加入段落
		para.getContent().add(run);
		//段落加入文档
		body.getContent().add(para);
		//重复一遍
		body.getContent().add(para);
		pkg.save(new File(System.getProperty("user.dir"), "Hello World with Formats.docx"));
	}
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值