注:我使用的word
功能简介:
(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);
}
三、生成段落
/*** 构建段落
*@paramdocxDocument
*@parame*/
public static voidcreateXWPFParagraph(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)
*@paramdocument
*@paramleft
*@paramtop
*@paramright
*@parambottom*/
public static voidsetDocumentMargin(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(newBigInteger(left));
}if(StringUtils.isNotBlank(top)) {
ctpagemar.setTop(newBigInteger(top));
}if(StringUtils.isNotBlank(right)) {
ctpagemar.setRight(newBigInteger(right));
}if(StringUtils.isNotBlank(bottom)) {
ctpagemar.setBottom(newBigInteger(bottom));
}
}
五、创建页眉
/*** 创建默认页眉
*
*@paramdocx XWPFDocument文档对象
*@paramtext 页眉文本
*@return返回文档帮助类对象,可用于方法链调用
*@throwsXmlException XML异常
*@throwsIOException IO异常
*@throwsInvalidFormatException 非法格式异常
*@throwsFileNotFoundException 找不到文件异常*/
public static void createDefaultHeader(final XWPFDocument docx, finalString text){
CTP ctp=CTP.Factory.newInstance();
XWPFParagraph paragraph= newXWPFParagraph(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= newXWPFHeaderFooterPolicy(docx, sectPr);
XWPFHeader header= policy.createHeader(STHdrFtr.DEFAULT, newXWPFParagraph[] { paragraph });
header.setXWPFDocument(docx);
}}
六、创建页脚
/*** 创建默认的页脚(该页脚主要只居中显示页码)
*
*@paramdocx
* XWPFDocument文档对象
*@return返回文档帮助类对象,可用于方法链调用
*@throwsXmlException
* XML异常
*@throwsIOException
* IO异常*/
public static void createDefaultFooter(finalXWPFDocument docx) {//TODO 设置页码起始值
CTP pageNo =CTP.Factory.newInstance();
XWPFParagraph footer= newXWPFParagraph(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= newXWPFHeaderFooterPolicy(docx, sectPr);
policy.createFooter(STHdrFtr.DEFAULT,newXWPFParagraph[] { footer });
}
七、自定义标题样式(这个在我另一篇word基础中也有提及)
/*** 增加自定义标题样式。这里用的是stackoverflow的源码
*
*@paramdocxDocument 目标文档
*@paramstrStyleId 样式名称
*@paramheadingLevel 样式级别*/
private static void addCustomHeadingStyle(XWPFDocument docxDocument, String strStyleId, intheadingLevel) {
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= newXWPFStyle(ctStyle);//is a null op if already defined
XWPFStyles styles =docxDocument.createStyles();
style.setType(STStyleType.PARAGRAPH);
styles.addStyle(style);
}
八、设置页码大小及纸张方向
/*** 设置页面大小及纸张方向 landscape横向
*@paramdocument
*@paramwidth
*@paramheight
*@paramstValue*/
public voidsetDocumentSize(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(newBigInteger(height));
pgsz.setW(newBigInteger(width));
pgsz.setOrient(stValue);
}
九、效果展示
十、demo源码及生成的word文件(相应的jar包大家可以去阿里的maven仓库下载)
demo:/s/1jHFLniI