java使用POI操作XWPFDocument 生成Word实战(一)

注:我使用的word 2016
功能简介:
(1)使用jsoup解析html得到我用来生成word的文本(这个你们可以忽略)
(2)生成word、设置页边距、设置页脚(页码),设置页码(文本)

一、解析html

Document doc = Jsoup.parseBodyFragment(contents);
Element body = doc.body();
Elements es = body.getAllElements();

二、循环Elements获取我需要的html标签

boolean tag = false;
for (Element e : es) {
    //跳过第一个(默认会把整个对象当做第一个)
    if(!tag) {
        tag = true;
        continue;
    }
    //创建段落:生成word(核心)
    createXWPFParagraph(docxDocument,e);
}

三、生成段落

/**
 * 构建段落
 * @param docxDocument
 * @param e
 */
public static void createXWPFParagraph(XWPFDocument docxDocument, Element e){
    XWPFParagraph paragraph = docxDocument.createParagraph();
    XWPFRun run = paragraph.createRun();
    run.setText(e.text());
    run.setTextPosition(35);//设置行间距

    if(e.tagName().equals("titlename")){
        paragraph.setAlignment(ParagraphAlignment.CENTER);//对齐方式

        run.setBold(true);//加粗
        run.setColor("000000");//设置颜色--十六进制
        run.setFontFamily("宋体");//字体
        run.setFontSize(24);//字体大小

    }else if(e.tagName().equals("h1")){
        addCustomHeadingStyle(docxDocument, "标题 1", 1);
        paragraph.setStyle("标题 1");

        run.setBold(true);
        run.setColor("000000");
        run.setFontFamily("宋体");
        run.setFontSize(20);
    }else if(e.tagName().equals("h2")){
        addCustomHeadingStyle(docxDocument, "标题 2", 2);
        paragraph.setStyle("标题 2");

        run.setBold(true);
        run.setColor("000000");
        run.setFontFamily("宋体");
        run.setFontSize(18);
    }else if(e.tagName().equals("h3")){
        addCustomHeadingStyle(docxDocument, "标题 3", 3);
        paragraph.setStyle("标题 3");

        run.setBold(true);
        run.setColor("000000");
        run.setFontFamily("宋体");
        run.setFontSize(16);
    }else if(e.tagName().equals("p")){
        //内容
        paragraph.setAlignment(ParagraphAlignment.BOTH);//对齐方式
        paragraph.setIndentationFirstLine(WordUtil.ONE_UNIT);//首行缩进:567==1厘米

        run.setBold(false);
        run.setColor("001A35");
        run.setFontFamily("宋体");
        run.setFontSize(14);
        //run.addCarriageReturn();//回车键
    }else if(e.tagName().equals("break")){
        paragraph.setPageBreak(true);//段前分页(ctrl+enter)
    }
}

四、设置页边距

/**
* 设置页边距 (word中1厘米约等于567)
* @param document
* @param left
* @param top
* @param right
* @param bottom
*/
public static void setDocumentMargin(XWPFDocument document, String left,String top, String right, String bottom) {
CTSectPr sectPr = document.getDocument().getBody().addNewSectPr();
CTPageMar ctpagemar = sectPr.addNewPgMar();
if (StringUtils.isNotBlank(left)) {
  ctpagemar.setLeft(new BigInteger(left));
}
if (StringUtils.isNotBlank(top)) {
  ctpagemar.setTop(new BigInteger(top));
}
if (StringUtils.isNotBlank(right)) {
  ctpagemar.setRight(new BigInteger(right));
}
if (StringUtils.isNotBlank(bottom)) {
  ctpagemar.setBottom(new BigInteger(bottom));
}
}

五、创建页眉

/**
 * 创建默认页眉
 *
 * @param docx XWPFDocument文档对象
 * @param text 页眉文本
 * @return 返回文档帮助类对象,可用于方法链调用
 * @throws XmlException XML异常
 * @throws IOException IO异常
 * @throws InvalidFormatException 非法格式异常
 * @throws FileNotFoundException 找不到文件异常
 */
public static void createDefaultHeader(final XWPFDocument docx, final String text){
    CTP ctp = CTP.Factory.newInstance();
    XWPFParagraph paragraph = new XWPFParagraph(ctp, docx);
    ctp.addNewR().addNewT().setStringValue(text);
    ctp.addNewR().addNewT().setSpace(SpaceAttribute.Space.PRESERVE);
    CTSectPr sectPr = docx.getDocument().getBody().isSetSectPr() ? docx.getDocument().getBody().getSectPr() : docx.getDocument().getBody().addNewSectPr();
    XWPFHeaderFooterPolicy policy = new XWPFHeaderFooterPolicy(docx, sectPr);
    XWPFHeader header = policy.createHeader(STHdrFtr.DEFAULT, new XWPFParagraph[] { paragraph });
    header.setXWPFDocument(docx);
}}

六、创建页脚

/**
 * 创建默认的页脚(该页脚主要只居中显示页码)
 *
 * @param docx
 *            XWPFDocument文档对象
 * @return 返回文档帮助类对象,可用于方法链调用
 * @throws XmlException
 *             XML异常
 * @throws IOException
 *             IO异常
 */
public static void createDefaultFooter(final XWPFDocument docx) {
    // TODO 设置页码起始值
    CTP pageNo = CTP.Factory.newInstance();
    XWPFParagraph footer = new XWPFParagraph(pageNo, docx);
    CTPPr begin = pageNo.addNewPPr();
    begin.addNewPStyle().setVal(STYLE_FOOTER);
    begin.addNewJc().setVal(STJc.CENTER);
    pageNo.addNewR().addNewFldChar().setFldCharType(STFldCharType.BEGIN);
    pageNo.addNewR().addNewInstrText().setStringValue("PAGE   \\* MERGEFORMAT");
    pageNo.addNewR().addNewFldChar().setFldCharType(STFldCharType.SEPARATE);
    CTR end = pageNo.addNewR();
    CTRPr endRPr = end.addNewRPr();
    endRPr.addNewNoProof();
    endRPr.addNewLang().setVal(LANG_ZH_CN);
    end.addNewFldChar().setFldCharType(STFldCharType.END);
    CTSectPr sectPr = docx.getDocument().getBody().isSetSectPr() ? docx.getDocument().getBody().getSectPr() : docx.getDocument().getBody().addNewSectPr();
    XWPFHeaderFooterPolicy policy = new XWPFHeaderFooterPolicy(docx, sectPr);
    policy.createFooter(STHdrFtr.DEFAULT, new XWPFParagraph[] { footer });
}

七、自定义标题样式(这个在我另一篇word基础中也有提及)

/**
 * 增加自定义标题样式。这里用的是stackoverflow的源码
 *
 * @param docxDocument 目标文档
 * @param strStyleId 样式名称
 * @param headingLevel 样式级别
 */
private static void addCustomHeadingStyle(XWPFDocument docxDocument, String strStyleId, int headingLevel) {

    CTStyle ctStyle = CTStyle.Factory.newInstance();
    ctStyle.setStyleId(strStyleId);

    CTString styleName = CTString.Factory.newInstance();
    styleName.setVal(strStyleId);
    ctStyle.setName(styleName);

    CTDecimalNumber indentNumber = CTDecimalNumber.Factory.newInstance();
    indentNumber.setVal(BigInteger.valueOf(headingLevel));

    // lower number > style is more prominent in the formats bar
    ctStyle.setUiPriority(indentNumber);

    CTOnOff onoffnull = CTOnOff.Factory.newInstance();
    ctStyle.setUnhideWhenUsed(onoffnull);

    // style shows up in the formats bar
    ctStyle.setQFormat(onoffnull);

    // style defines a heading of the given level
    CTPPr ppr = CTPPr.Factory.newInstance();
    ppr.setOutlineLvl(indentNumber);
    ctStyle.setPPr(ppr);

    XWPFStyle style = new XWPFStyle(ctStyle);

    // is a null op if already defined
    XWPFStyles styles = docxDocument.createStyles();

    style.setType(STStyleType.PARAGRAPH);
    styles.addStyle(style);

}

八、设置页码大小及纸张方向

/**
 * 设置页面大小及纸张方向 landscape横向
 * @param document
 * @param width
 * @param height
 * @param stValue
 */
public void setDocumentSize(XWPFDocument document, String width,String height, STPageOrientation.Enum stValue) {
    CTSectPr sectPr = document.getDocument().getBody().addNewSectPr();
    CTPageSz pgsz = sectPr.isSetPgSz() ? sectPr.getPgSz() : sectPr.addNewPgSz();
    pgsz.setH(new BigInteger(height));
    pgsz.setW(new BigInteger(width));
    pgsz.setOrient(stValue);
}

九、效果展示

java使用POI操作XWPFDocument 生成Word实战(一)

java使用POI操作XWPFDocument 生成Word实战(一)

java使用POI操作XWPFDocument 生成Word实战(一)

java使用POI操作XWPFDocument 生成Word实战(一)

十、demo源码及生成的word文件(相应的jar包大家可以去阿里的maven仓库下载)

demo:https://pan.baidu.com/s/1jHFLniI

java使用POI操作XWPFDocument 生成Word实战(一)

Original: https://www.cnblogs.com/unruly/p/7552998.html
Author: 福尔摩狼
Title: java使用POI操作XWPFDocument 生成Word实战(一)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/579640/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Spring整合Redis

    一、准备工作 首先创建一个空工程,然后在该空工程创建一个模块(选择Spring Initializal),选择Spring Data Redis依赖。 pomx.xml

    Java 2023年6月8日
    076
  • 面试官:@Autowired, @Resource, @Inject 三个注解的区别?一下懵了。。。

    作者:Richard_Yi来源:juejin.cn/post/6844904056230690824 前言 本章的内容主要是想探讨我们在进行Spring 开发过程当中,关于依赖注入…

    Java 2023年6月15日
    073
  • 掌握这些招数,你也能写出HR眼中的高分简历

    一、简历的定义 简历就是将自身的经历、工作成绩、个人能力、性格等信息简要地列举出来。根据使用简历的目的不同,可以将简历分为展示型简历和求职型简历。此处跟大家分享的是求职简历。 二、…

    Java 2023年6月7日
    075
  • 高斯模糊的Java实现

    1、http://jhlabs.com/ip/index.html java;gutter:true; public static byte[] blur(byte[] data)…

    Java 2023年5月29日
    074
  • Fizz网关入门教程-安装

    概述 Fizz网关是一个基于 Java开发的微服务聚合网关,能够实现热服务编排聚合、自动授权选择、线上服务脚本编码、在线测试、高性能路由、API审核管理、回调管理等目的,拥有强大的…

    Java 2023年6月9日
    077
  • Java Date 和 Calendar

    Java 语言的Date(日期),Calendar(日历),DateFormat(日期格式)组成了Java标准的一个基本但是非常重要的部分。日期是商业逻辑计算一个关键的部分,所有的…

    Java 2023年5月29日
    062
  • 从“把大象装进冰箱”来谈谈面向对象程序设计

    引子 把大象装进冰箱需要3步:打开冰箱门,把大象装入冰箱,关闭冰箱门。 扩展一下,我们考虑把动物装进冰箱的场景。比如,把猪🐷装进冰箱,把狗🐶装进冰箱,等等。 怎么利用面向对象的思想…

    Java 2023年6月15日
    069
  • JavaWeb重定向及实现

    JavaWeb重定向及实现 重定向,就是将浏览器发送过来的请求有一个server转由另一个server处理。有两种实现方式,一是服务器内部进行重定向。二是将另一个server的地址…

    Java 2023年6月8日
    0108
  • Sublime Text 编译 运行 Java 源代码 包 类文件

    Sublime Text 编译 Java 包 更新记录 2022/05/23 解决SublimeText控制台用户输入问题 前言 目前还存在很多问题,不过暂时能用,就先不折腾了,等…

    Java 2023年6月5日
    084
  • 多线程基础篇

    基本概念 (程序,进程,线程) 线程的创建和使用 线程的生命周期 线程的同步 线程的通信 JDK5.0新增线程创建方式 程序 (prog…

    Java 2023年6月6日
    089
  • ThreadLocal源码解析,内存泄露以及传递性

    我想ThreadLocal这东西,大家或多或少都了解过一点,我在接触ThreadLocal的时候,觉得这东西很神奇,在网上看了很多博客,也看了一些书,总觉得有一个坎跨不过去,所以对…

    Java 2023年6月5日
    0109
  • 系统调用跟踪——ls功能实现(二)

    在上篇文章中我们跟踪 ls命令看到了其所使用的这么几个系统调用: stat、openat、fstat、getdents、close、write等,这里再简单介绍下这几个系统调用的功…

    Java 2023年6月16日
    092
  • 树莓派修改分辨率

    树莓派屏幕分辨率设置 树莓派一般第一次开机会自动给显示屏分配一个最合适的分辨率,但是有时候可能有个别显示屏会不兼容,就需要通过以下方式修改分辨率。而当我们使用VNC远程桌面登录的时…

    Java 2023年5月30日
    0100
  • Spring动态代理的生成-如何判断是使用JDK动态代理还是CGlib代理

    前言 在上一篇文章中讲到了Spring是如何获取对应的Bean的增强,然后本次主要讲解一下Spring如何在获取到增强后创建Spring代理的。 在步入正题之前先给大家看一下Spr…

    Java 2023年6月7日
    099
  • SpringBoot+SpringCloud

    摘自《Java微服务分布式架构企业实战》 1 Spring Boot Spring Boot是用于构建微服务的基础框架,可以轻松地整合Spring Cloud实现系统服务化,在学习…

    Java 2023年5月30日
    064
  • java logAspect

    @Around("execution(* com.iotx.cep.biz.rpc.impl.*.*(..)) " + "&& !ex…

    Java 2023年5月29日
    095
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球