xwpfdocument 保存修改_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);

}

九、效果展示

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Java中的POI库读取Word文档并将其存储到数据库中,可以按照以下步骤进行操作: 1. 添加POI库的依赖 在Maven项目中,可以在pom.xml文件中添加如下依赖: ```xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> ``` 2. 读取Word文档 可以使用POI库中的XWPFDocument类读取Word文档。下面是一个简单的示例代码: ```java File file = new File("path/to/word/document.docx"); FileInputStream fis = new FileInputStream(file); XWPFDocument document = new XWPFDocument(fis); ``` 3. 解析Word文档并获取需要存储的数据 可以使用POI库提供的API来解析Word文档中的内容,如获取段落、表格、图片等。根据需要存储的数据类型,可以选择不同的API进行解析。下面是一个示例代码,用于获取Word文档中的所有段落: ```java List<String> paragraphs = new ArrayList<>(); List<XWPFParagraph> paragraphList = document.getParagraphs(); for (XWPFParagraph paragraph : paragraphList) { String text = paragraph.getText(); paragraphs.add(text); } ``` 4. 将数据存储到数据库中 根据需要存储的数据类型,可以选择不同的数据库操作API进行存储。以下是一个示例代码,用于将获取到的段落存储到MySQL数据库中: ```java String url = "jdbc:mysql://localhost:3306/mydatabase"; String user = "root"; String password = "mypassword"; Connection conn = DriverManager.getConnection(url, user, password); PreparedStatement pstmt = conn.prepareStatement("INSERT INTO paragraphs (text) VALUES (?)"); for (String paragraph : paragraphs) { pstmt.setString(1, paragraph); pstmt.executeUpdate(); } ``` 注意:以上代码只是一个示例,实际应用中需要根据具体需求进行修改。同时,为了保证程序的健壮性,需要添加异常处理代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值