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

最新文章

  1. docker快速入门+搭建javaweb环境
  2. Vertex and Fragment Shader
  3. Linux_Shell_输出重定向
  4. Linux瑞士军刀:密码管理Keeweb
  5. hdu 4003 树形dp+分组背包 2011大连赛区网络赛C
  6. Android Studio 初级安装
  7. DP 子序列问题
  8. WebView增加一个水平Progress,位置、长相随意
  9. Nodejs v4.x.0API文档学习(1)简介
  10. 交叉编译tslib1.4
  11. pygame学习资料
  12. Mybatis的连接池
  13. [LeetCode226]Invert Binary Tree
  14. 关于IT实例教程
  15. Oracle自动备份.bat 最新更新(支持Win10了)
  16. angular路由详解一(基础知识)
  17. try、catch、finally都有return语句时执行哪个
  18. python全栈开发day48-jqurey自定义动画,jQuery属性操作,jQuery的文档操作,jQuery中的ajax
  19. MSVCR120.dll 解决
  20. [转]Http Message结构学习总结

热门文章

  1. log4j配置文件,用时导入jar包buildPath且将配置文件改成log4j.properties即可
  2. SLF4J源码解析-LoggerFactory(二)
  3. Android 开源可缩放平移的绘画板
  4. 论林耐斯-Linux系统的重要性
  5. 关于操作系统中多个fork()会创建几个进程的理解
  6. HTTP协议初级入门
  7. Servlet知识点
  8. Jquery笔记之第一天
  9. MVC配置伪静态
  10. ROS学习记录(三)————创建一个简单的发布节点和订阅节点