POI生成Word多级标题格式

3 篇文章 0 订阅
该博客介绍了如何使用 Apache POI 库在 Java 中操作 Word 文档,包括通过模板文件创建标题样式和自定义标题样式的方法。详细步骤涉及创建模板文件、设置文档整体样式、定义标题级别和字体属性,并展示了生成标题后的效果。
摘要由CSDN通过智能技术生成

一、使用模板文件生成标题
1、创建模板文件

新建一个doc文件,如format.doc,创建标题,如标题1、标题2……
在这里插入图片描述

2、获得模板文档的整体样式
// 新建的word文档对象
XWPFDocument doc = new XWPFDocument();
// word整体样式
// 读取模板文档
XWPFDocument template = new XWPFDocument(new FileInputStream("D:\\test\\poi\\word\\format.docx"));
// 获得模板文档的整体样式
CTStyles wordStyles = template.getStyle();
// 获取新建文档对象的样式
XWPFStyles newStyles = doc.createStyles();
// 关键行// 修改设置文档样式为静态块中读取到的样式
newStyles.setStyles(wordStyles);
3、使用标题样式
// 标题1,1级大纲
XWPFParagraph para1 = doc.createParagraph();
// 关键行// 1级大纲
para1.setStyle("1");
XWPFRun run1 = para1.createRun();
// 标题内容
run1.setText("标题1");

// 标题2,2级大纲
XWPFParagraph para2 = doc.createParagraph();
// 关键行// 2级大纲
para2.setStyle("2");
XWPFRun run2 = para2.createRun();
// 标题内容
run2.setText("标题2");

// 正文
XWPFParagraph paraX = doc.createParagraph();
XWPFRun runX = paraX.createRun();
for(int i=0;i<100;i++) {
	// 正文内容
	runX.setText("正文\r\n");
}

// word写入到文件
FileOutputStream fos;
try {
	fos = new FileOutputStream("D:\\test\\poi\\word\\test.docx");
	doc.write(fos);
	fos.close();
} catch (Exception e) {
	// TODO 自动生成的 catch 块
	e.printStackTrace();
}
4、结果展示

在这里插入图片描述

二、自定义标题
1、生成标题方法
 /**
     * 
     * @param doc
     * @param styles
     * @param strStyleId	标题id
     * @param headingLevel	标题级别
     * @param pointSize	字体大小(/2)
     * @param hexColor	字体颜色
     * @param typefaceName	字体名称(默认宋体)
     */
    public void createHeadingStyle(XWPFDocument doc, XWPFStyles styles, String strStyleId, 
    		int headingLevel, int pointSize, String hexColor, String typefaceName) {
    	//创建样式
    	CTStyle ctStyle = CTStyle.Factory.newInstance();
    	//设置id
        ctStyle.setStyleId(strStyleId);
        
        CTString styleName = CTString.Factory.newInstance();
        styleName.setVal(strStyleId);
        ctStyle.setName(styleName);
        
        CTDecimalNumber indentNumber = CTDecimalNumber.Factory.newInstance();
        indentNumber.setVal(BigInteger.valueOf(headingLevel));
        
     // 数字越低在格式栏中越突出
        ctStyle.setUiPriority(indentNumber);
        
        CTOnOff onoffnull = CTOnOff.Factory.newInstance();
        ctStyle.setUnhideWhenUsed(onoffnull);
        
     // 样式将显示在“格式”栏中
        ctStyle.setQFormat(onoffnull);
        
     // 样式定义给定级别的标题
        CTPPr ppr = CTPPr.Factory.newInstance();
        ppr.setOutlineLvl(indentNumber);
        ctStyle.setPPr(ppr);
        
        XWPFStyle style = new XWPFStyle(ctStyle);

        CTHpsMeasure size = CTHpsMeasure.Factory.newInstance();
        size.setVal(new BigInteger(String.valueOf(pointSize)));
        CTHpsMeasure size2 = CTHpsMeasure.Factory.newInstance();
        size2.setVal(new BigInteger(String.valueOf(pointSize)));
        
        CTFonts fonts = CTFonts.Factory.newInstance();
        if(typefaceName == null || typefaceName.equals("")) typefaceName = "宋体";
        fonts.setAscii(typefaceName);	//字体

        CTRPr rpr = CTRPr.Factory.newInstance();
        rpr.setRFonts(fonts);
        rpr.setSz(size);
        rpr.setSzCs(size2);	//字体大小
        
        CTColor color=CTColor.Factory.newInstance();
        color.setVal(hexToBytes(hexColor));
        rpr.setColor(color);	//字体颜色
        style.getCTStyle().setRPr(rpr);
        // is a null op if already defined

        style.setType(STStyleType.PARAGRAPH);
        styles.addStyle(style);
    }
    
    public static byte[] hexToBytes(String hexString) {
        HexBinaryAdapter adapter = new HexBinaryAdapter();
        byte[] bytes = adapter.unmarshal(hexString);
        return bytes;
   }
2、调用生成标题方法
// 新建的word文档对象
XWPFDocument doc = new XWPFDocument();
// 获取新建文档对象的样式
XWPFStyles newStyles = doc.createStyles();
String heading1 = "My Heading 1";
docUtils.createHeadingStyle(doc, newStyles, heading1, 1, 45, "000000", "宋体");
XWPFParagraph para1 = doc.createParagraph();
para1.setStyle("My Heading 1");
XWPFRun run1 = para1.createRun();
run1.setText("My Heading 1");
// word写入到文件
FileOutputStream fos;
try {
	fos = new FileOutputStream("D:\\test\\poi\\word\\test.docx");
	doc.write(fos);
	fos.close();
} catch (Exception e) {
	// TODO 自动生成的 catch 块
	e.printStackTrace();
}
3、结果展示

在这里插入图片描述
参考文章:

  • 10
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值