//读取word文件=(path);=(is);=();//获取所有元素(段落和表格)=0;=0;for(inti=0;();i++){IBodyElemente=elements.get(i);//判断元素类型:段落/表格if(BodyElementType.PARAGRAPH.equals(e.getElementType())){XWPFParagraphpa=e.getBody().getParagraphArray(pIndex);//获取段落ListXWPFRunruns=paragraph.getRuns();//获取段落文本for(XWPFRunrun:runs){...替换文本}}elseif(BodyElementType.TABLE.equals(e.getElementType())){//表格XWPFTableta=e.getBody().getTableArray(tIndex);ListXWPFTableRowrows=ta.getRows();//获取所有行for(XWPFTableRowrow:rows){遍历每行ListXWPFTableCellcells=row.getTableCells();//获取每行单元格for(XWPFTableCellcell:cells){//遍历单元格ListXWPFParagraphparagraphs=cell.getParagraphs();//获取单元格

段落for(XWPFParagraphparagraph:paragraphs){ListXWPFRunruns=paragraph.getRuns();//获取单元格文本for(XWPFRunrun:runs){...替换文本}}}}}}

操作word方面还是很方便,可以参考一些更详细的:

****/article/details/79678701

主要是介绍一下目录如何生成

2..Apachepoi生成word目录:需要了解ooxml(OfficeOpenXML)的大体结构,参考:http://www.datypic.com/sc/ooxml/s-wml.xsd.html,主要是通过xml标签进行识别分页。

之前在网上也查阅了很多,发现目录的页数问题始终没有一个好的解决方案,之前看的可以通过转成pdf计算页数,但是这个耗时太长,特别是对于我们项目word页数较多的时候转换再重写消耗的时间很长。所以选择再去研究一下word对应的xml文件是否有思路去解决这一问题。

我们选择的是xxx.docx文件,通过word另存为xml

获取到此word文件的xml文件,xml文件结构如下:

其实大体看一下可以大致理清xml的结构,而我们主要是关注这一个标签

这个标签就是分页之后产生的标签(经测试插入空白页不会产生这个标签,如果是遇到表格处于分页那么分页后的表格的第一个单元格必须有文本,不然也不会产生这个标签,而且文档必须有页码),而通过获取这个标签就可以计算出页数,可以看出这个标签位置是w:p下的w:r下,可以通过poi判断这个标签是否存在:

主要代码如下:

.//承接上面的获取的段落intnum=1;//页数XWPFParagraphpa=e.getBody().getParagraphArray(pIndex);//获取段落ListCTRctrlist=pa.getCTP().getRList();//获取w:p标签下的w:rlistfor(intj=0;jctrlist.size();j++){.//遍历rCTRr=ctrlist.get(j);ListCTEmptybreaklist=r.getLastRenderedPageBreakList();//判断是否存在此标签if(breaklist.size()0){num++;//页数添加}}

由此可以高效率的获取到页码,生成目录的代码可以参考:https://www.jianshu.com/p/0a32d8bd6878

所以大体功能实现思路如下: