java使用POI操作XWPFDocument 生成Word实战(一)【比较详细的】

2023-05-16

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

注:我使用的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);
}  

 

九、效果展示

 

 

 

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

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

转载于:https://my.oschina.net/airship/blog/3021751

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java使用POI操作XWPFDocument 生成Word实战(一)【比较详细的】 的相关文章

随机推荐

  • ubuntu安装mysql报错_在Ubuntu上安装mysql数据库和遇到的问题

    如果上面没有成功 xff0c 而出现了这样的问题的话 xff1a Mysql ERROR 1045 28000 Access denied for user 39 root 39 64 39 localhost 39 using passw
  • debian wheezy 使用

    为什么80 的码农都做不了架构师 xff1f gt gt gt 准备 xff1a 1 启动盘制作 软件 xff1a windows下lililinuxusbcreator linux下unetbootin debian 7 0 iso mi
  • Debian 7 安装 Wireshark

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 1 安装Wireshark sudo apt get install wireshark 如果以非root权限运行wireshark xff0c 可能会出现 No inte
  • win7桌面仿linux桌面,windows10开启 linux子系统桌面,巨详细,值得一藏-win7桌面主题...

    题记 xff1a 安装完微软windows10的ubuntu子系统之后 xff0c 想打开这款子系统的桌面 xff0c 一直摸不着头脑 找了很多教程 xff0c 都有点凌乱 xff0c 在此整理一下 0 备份原 get源文件 sudo mv
  • 石器时代地图->魔力宝贝地图

  • proxmox集群节点崩溃处理

    问题描述 在现有集群加入一个物理节点 xff0c 接着再此节点创建ceph监视器 创建OSD 从宿主机系统执行ceph osd tree查看状态 xff0c 创建起来的几个OSD状态都正常 xff08 up xff09 xff0c 从pro
  • debian笔记本电源管理

    kde下面使用kpowersave工具 xff0c 实现suspend和hibernate还需要pm ultis包 此时可以通过root权限pm suspend和pm hibernate实现to ram和to disk 普通用户用kpowe
  • 发挥Squid优势,TCP_HIT变成TCP_MEM_HIT

    192 168 10 139 15 Dec 2011 16 49 37 43 0800 34 GET http www jian com p w picpaths shufa jpg HTTP 1 0 34 200 95900 34 34
  • linux默认有回收站吗,linux下默认删除文件到回收站(bash实现)

    fedora下总是会把文件不小心删除了 xff0c 所以下面的脚本把实现 xff1a 文件删除默认移动到自己的回收站里面 功能 xff1a 脚本实现删除文件或者目录到 waste 自己定义 脚本附带文件名或者目录名 xff0c 则默认代表
  • EXCEL复制死机的问题

    最近发现好几例excel复制死机的现象 xff0c 特总结了一下解决方法 基本上就是下面几种 xff1a 可以供大家参考 1 剪贴板的问题 xff0c 与迅雷等监视剪贴板的软件相关 打开 配置 监视 监视剪贴板 xff0c 取消这个勾选 x
  • Transport endpoint is not connected 报错

    在android中做在线升级程序 xff0c 在http请求数据时 xff0c 出现如下错误 xff1a java net SocketTimeoutException Transport endpoint is not connected
  • Ubuntu下Qt自动退出

    一直在使用Qt xff0c 真的被它强大的功能 漂亮的界面深深吸引了 不过最近遇到了一件非常让人不爽的事情 xff0c 就是在Qt下创建文件的时候会自动 xff0c 而且没有代码提示功能 想想吧 xff0c 这是多么令人头痛 xff0c 没
  • 洛谷 P1233 【木棍加工】题解

    算法 xff1a 排序 xff0c DP xff08 最长上升子序列 xff09 前言 xff1a 此题的数据非常水 xff0c 这里给予一组 hack 数据 xff1a 21 96 25 1 9 39 19 87 51 7 61 11 1
  • C# 修改电脑DNS和IP方法

    lt summary gt 将IP xff0c DNS设置为自动获取 lt summary gt private void setDHCP string doscmd 61 34 netsh interface ip set address
  • 使用Java实现串口通信(二)

    1 写在前面 距离上一篇文章 使用Java实现串口通信 已经过去快两年的时间了 xff0c 在此期间收到了很多读者的反馈 xff0c 很高兴可以帮助到这么多人 xff0c 根据收到的反馈 xff0c 我对代码逻辑进行了优化整理 xff0c
  • MSMG ToolKit v11.2 DL

    友情提醒一下 xff0c 建议使用原版 精简操作系统要是被后门 看不懂英文的可以百度翻译 xff0c 时间久了就明白嘛意思了 无非就那几个单词 如真要使用汉化版 xff0c 优化版的 看好你的核心bin文件夹 MSMG ToolKit By
  • Flutter之使用overlay显示悬浮控件

    Overlay与OverlayEntry Overlay是一个Stack的widget xff0c 可以将overlay entry插入到overlay中 xff0c 使独立的child窗口悬浮于其他widget之上 因为Overlay本身
  • 七夕快到了!表白小程序制作详解,撩翻你的女神!

    大家可能都会在抖音上刷过 xff0c 那种表白小程序 xff0c 但在我看来表白还是亲口说出来比较好 xff0c 这类小程序只适合在平常的一些小节日给对方一个惊喜 话不多说 xff0c 现在进入正题 xff1a 首先 xff0c 要在电脑上
  • Android Studio更改项目SDK的版本

    Elipse 中的安卓项目 xff0c 在Android Studio中可以通过File gt new gt Import Project的方法建立起来 但是有时候需要用到更改项目的API Level xff0c 下面的操作步骤为更改方法
  • java使用POI操作XWPFDocument 生成Word实战(一)【比较详细的】

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 注 xff1a 我使用的word 2016 功能简介 xff1a xff08 1 xff09 使用jsoup解析html得到我用来生成word的文本 xff08 这个你们可