docx4j学习笔记(6)

文章的样式比较简单,只要在StyleDefinitionPart里设置一系列Style,然后在应用样式的元素属性中增加对应的StyleId就可以了。

Style分为四种:段落paragraph,文本character,表格table,列表numbering。在定义样式的时候应当指定清楚。

下面是一个段落和文本的样式设置的例子。

package me.test.docx4j;

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

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.openpackaging.parts.WordprocessingML.StyleDefinitionsPart;
import org.docx4j.wml.Body;
import org.docx4j.wml.DocDefaults;
import org.docx4j.wml.DocDefaults.PPrDefault;
import org.docx4j.wml.DocDefaults.RPrDefault;
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.Ind;
import org.docx4j.wml.PPrBase.PStyle;
import org.docx4j.wml.PPrBase.Spacing;
import org.docx4j.wml.R;
import org.docx4j.wml.RFonts;
import org.docx4j.wml.RPr;
import org.docx4j.wml.RStyle;
import org.docx4j.wml.STLineSpacingRule;
import org.docx4j.wml.Style;
import org.docx4j.wml.Style.Name;
import org.docx4j.wml.Style.UiPriority;
import org.docx4j.wml.Styles;
import org.docx4j.wml.Text;
import org.junit.Test;

public class DocumentsWithDefinedStyles {
	protected ObjectFactory factory = Context.getWmlObjectFactory();
	
	protected RFonts createRFonts(String ascii, String hAnsi, String eastAsia) {
		RFonts rfonts = factory.createRFonts();
		rfonts.setAscii(ascii);
		rfonts.setHAnsi(hAnsi);
		rfonts.setEastAsia(eastAsia);
		return rfonts;
	}
	
	protected HpsMeasure createHpsMeasure(int val) {
		HpsMeasure hm = factory.createHpsMeasure();
		hm.setVal(BigInteger.valueOf(val));
		return hm;
	}
	
	/**
	 * 字号11,新宋体/Times New Roman复合字体
	 * 1.5倍行距,段前段后各0.5行,首行缩进2字符
	 * @return
	 */
	public DocDefaults createDocDefaults() {
		DocDefaults defaults = factory.createDocDefaults();
		
		RPrDefault rprd = factory.createDocDefaultsRPrDefault();
		defaults.setRPrDefault(rprd);
		RPr rpr = factory.createRPr();
		rprd.setRPr(rpr);
		
		rpr.setRFonts(this.createRFonts("Times New Roman", "Times New Roman", "新宋体"));
		rpr.setSz(this.createHpsMeasure(22));
		
		PPrDefault pprd = factory.createDocDefaultsPPrDefault();
		defaults.setPPrDefault(pprd);
		PPr ppr = factory.createPPr();
		pprd.setPPr(ppr);
		
		Ind ind = factory.createPPrBaseInd();
		ind.setFirstLineChars(BigInteger.valueOf(200));
		ppr.setInd(ind);
		
		Spacing spacing = factory.createPPrBaseSpacing();
		spacing.setBeforeLines(BigInteger.valueOf(50));
		spacing.setAfterLines(BigInteger.valueOf(50));
		spacing.setLineRule(STLineSpacingRule.AUTO);
		spacing.setLine(BigInteger.valueOf(360));
		ppr.setSpacing(spacing);
		
		Jc jc = factory.createJc();
		jc.setVal(JcEnumeration.LEFT);
		ppr.setJc(jc);
		
		return defaults;
	}
	
	public Style createParagraphStyle() {
		Style style = factory.createStyle();
		style.setType("paragraph");
		Name name = new Name();
		name.setVal("段落样式示例");
		style.setName(name);
		UiPriority up = factory.createStyleUiPriority();
		up.setVal(BigInteger.valueOf(1));
		style.setUiPriority(up);
		style.setStyleId("paragraph_1");
		
		RPr rpr = factory.createRPr();
		style.setRPr(rpr);
		
		rpr.setRFonts(this.createRFonts("Arial", "Arial", "华文仿宋"));
		rpr.setSz(this.createHpsMeasure(18));
		
		PPr ppr = factory.createPPr();
		style.setPPr(ppr);
		
		Ind ind = factory.createPPrBaseInd();
		ind.setFirstLine(BigInteger.valueOf(0));
		ppr.setInd(ind);
		
		Spacing spacing = factory.createPPrBaseSpacing();
		spacing.setBeforeLines(BigInteger.valueOf(0));
		spacing.setAfterLines(BigInteger.valueOf(0));
		spacing.setLineRule(STLineSpacingRule.AUTO);
		spacing.setLine(BigInteger.valueOf(240));
		ppr.setSpacing(spacing);
		
		Jc jc = factory.createJc();
		jc.setVal(JcEnumeration.CENTER);
		ppr.setJc(jc);
		
		return style;
	}
	
	public Style createCharacterStyle() {
		Style style = factory.createStyle();
		style.setType("character");
		Name name = new Name();
		name.setVal("字体样式示例");
		style.setName(name);
		style.setStyleId("character_1");
		UiPriority up = factory.createStyleUiPriority();
		up.setVal(BigInteger.valueOf(2));
		style.setUiPriority(up);
		
		RPr rpr = factory.createRPr();
		style.setRPr(rpr);
		
		rpr.setRFonts(this.createRFonts("Arial Black", "Arial Black", "微软雅黑"));
		rpr.setSz(this.createHpsMeasure(24));	
		
		return style;
	}
	
	protected P createP(String str) {
		P para = factory.createP();
		R run = factory.createR();
		Text text = factory.createText();
		text.setValue(str);
		
		run.getContent().add(text);
		para.getContent().add(run);
		
		run.setRPr(factory.createRPr());
		para.setPPr(factory.createPPr());
		return para;
	}
	@Test
	public void doTest() throws Docx4JException {
		WordprocessingMLPackage pkg = WordprocessingMLPackage.createPackage();

		MainDocumentPart main = pkg.getMainDocumentPart();
		Document doc = main.getContents();
		Body body = doc.getBody();
		
		StyleDefinitionsPart sdp = main.getStyleDefinitionsPart(true);
		Styles styles = factory.createStyles();
		sdp.setJaxbElement(styles);
		
		styles.setDocDefaults(this.createDocDefaults());
		styles.getStyle().add(this.createParagraphStyle());
		styles.getStyle().add(this.createCharacterStyle());	
		
		

		//默认样式
		body.getContent().add(this.createP("The quick brown fox jumps over the lazy dog."));
		body.getContent().add(this.createP("关关雎鸠,在河之洲。窈窕淑女,君子好逑。"));
		
		//段落样式
		PStyle ps1 = factory.createPPrBasePStyle();
		ps1.setVal("paragraph_1");
		P p11 = this.createP("The quick brown fox jumps over the lazy dog.");
		p11.getPPr().setPStyle(ps1);
		body.getContent().add(p11);
		P p12 = this.createP("关关雎鸠,在河之洲。窈窕淑女,君子好逑。");
		p12.getPPr().setPStyle(ps1);
		body.getContent().add(p12);
		

		//字体样式
		RStyle rs1 = factory.createRStyle();
		rs1.setVal("character_1");
		P p21 = this.createP("The quick brown fox jumps over the lazy dog.");
		p21.getPPr().setPStyle(ps1);
		((R)p21.getContent().get(0)).getRPr().setRStyle(rs1);
		body.getContent().add(p21);
		P p22 = this.createP("关关雎鸠,在河之洲。窈窕淑女,君子好逑。");
		p22.getPPr().setPStyle(ps1);
		((R)p22.getContent().get(0)).getRPr().setRStyle(rs1);
		body.getContent().add(p22);
		

		pkg.save(new File(System.getProperty("user.dir"), "docx/Default Styles.docx"));
	}
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值