POI XWPFDocument 导出word目录详解

上方方是完整代码连接,代码为main方法直接运行,该代码实现了对目录样式,布局,标题,位置的修改,但是无法自动获取页码,只可以手动添加目录中对应的页码,或者设置为空。下方资源运行环境:

  1. Windows10
  2. JDK1.8
  3. org.apache.poi-3.14

通过XWPFDocument生成目录

正常情况下,通过XWPFDocument自带的createTOC(),可以生成目录,但是有一些缺点:

  1. 目录标题无法更改,只能显示英文
  2. 样式不够美观,无法布局
  3. 按照顺序,只能在word中写入所有内容后在掉createTOC()生成目录,导致目录在最下方

下面我们重写createTOC()来完成对目录样式,布局,标题,位置的修改

 /**
     * 生成目录
     * @param doc
     */
    public static void createTOC(XWPFDocument doc) {
        CTSdtBlock block = doc.getDocument().getBody().addNewSdt();
        ExportWord toc = new ExportWord(block);

        /*当前位置调用添加正文的方法,需要传参XWPFDocumen对象*/
        writeAllNews(doc);

        List<XWPFParagraph> paragraphs = doc.getParagraphs();
        for (XWPFParagraph par : paragraphs) {
            String parStyle = par.getStyle();
            if (parStyle != null && parStyle.startsWith("Heading")) {

                //获取书签,书签的对应关系很重要,关系到目录能否正常跳转
                List<CTBookmark> bookmarkList = par.getCTP().getBookmarkStartList();
                try {
                    int level = Integer.parseInt(parStyle.substring("Heading".length()));

                    //添加标题
                    toc.addRow(level, par.getText(), 1, bookmarkList.get(0).getName());
                } catch (NumberFormatException e) {
                    e.printStackTrace();
                }
            }
        }
    }

上方就是重写后的代码,首先将目录标题占位在最上方,接着进行内容的写入,最后进行目录的成。

你可能感兴趣的:(java)