poi读取word中的目录大纲,导入

在做一个导入word的业务时,发现poi并不能很好的读取到文档中的目录和级别,这段代码做个记录

cpp 复制代码
 public ResponseResult importDirectory(MultipartFile file){
        try {
            InputStream inputStream = file.getInputStream();
            XWPFDocument xdoc = new XWPFDocument(inputStream);
            List<XWPFParagraph> paragraphs = xdoc.getParagraphs();
            List<ReadDto> readDtos = new ArrayList<>();
            for (XWPFParagraph paragraph : paragraphs) {
                String text = paragraph.getText();
                String titleLvl = getTitleLvl(xdoc, paragraph);
                if (StringUtil.isNotEmpty(titleLvl)) {
                    int level = Integer.valueOf(titleLvl);
//                System.out.println("text: " + text + ", titleLvl: " + titleLvl);
                    ReadDto readDto = new ReadDto();
                    readDto.setText(text);
                    readDto.setTitleLevel(level);
                    readDtos.add(readDto);
                }
            }
            int zeroCount = 0;//0出现的次数
            int oneCount = 0;//1出现的次数
            int twoCount = 0;//2出现的次数
            int threeCount = 0;//3出现的次数
            int curPoint = 0;//当前指针值
            for (int i = 0; i < readDtos.size(); i++) {
                int curLevel = readDtos.get(i).getTitleLevel();
                if (curLevel > 4) {
                    throw new BusinessException("暂不支持目录层级超过4层!!!");
                }
                if (curPoint == 0) {
                    zeroCount++;
                    curPoint = 1;
                    readDtos.get(i).setOne(zeroCount);
                } else if (curPoint == 1) {
                    if (curLevel == 0) {
                        zeroCount++;
                        oneCount = 0;
                        twoCount = 0;
                        threeCount = 0;
                        curPoint = 1;
                        readDtos.get(i).setOne(zeroCount);
                    }
                    if (curLevel == 1) {
                        curPoint++;
                        oneCount++;
                        readDtos.get(i).setOne(zeroCount);
                        readDtos.get(i).setTwo(oneCount);
                    }
                } else if (curPoint == 2) {
                    if (curLevel == 0) {
                        zeroCount++;
                        oneCount = 0;
                        twoCount = 0;
                        threeCount = 0;
                        curPoint = 1;
                        readDtos.get(i).setOne(zeroCount);
                    } else if (curLevel == 1) {
                        oneCount++;
                        twoCount = 0;
                        curPoint = 2;
                        readDtos.get(i).setOne(zeroCount);
                        readDtos.get(i).setTwo(oneCount);
                    } else if (curLevel == 2) {
                        curPoint = 3;
                        twoCount++;
                        threeCount = 0;
                        readDtos.get(i).setOne(zeroCount);
                        readDtos.get(i).setTwo(oneCount);
                        readDtos.get(i).setThr(twoCount);
                    }
                } else if (curPoint == 3) {
                    if (curLevel == 0) {
                        zeroCount++;
                        oneCount = 0;
                        twoCount = 0;
                        threeCount = 0;
                        curPoint = 1;
                        readDtos.get(i).setOne(zeroCount);
                    } else if (curLevel == 1) {
                        oneCount++;
                        curPoint = 2;
                        twoCount = 0;
                        readDtos.get(i).setOne(zeroCount);
                        readDtos.get(i).setTwo(oneCount);
                    } else if (curLevel == 2) {
                        curPoint = 3;
                        twoCount++;
                        threeCount = 0;
                        readDtos.get(i).setOne(zeroCount);
                        readDtos.get(i).setTwo(oneCount);
                        readDtos.get(i).setThr(twoCount);
                    } else if (curLevel == 3) {
                        threeCount++;
                        if (i < readDtos.size() - 1) {
                            int nextLevel = readDtos.get(i + 1).getTitleLevel();
                            if (nextLevel > 3) {
                                throw new BusinessException("暂不支持目录层级超过4层!!!");
                            }
                            if (nextLevel == 3) {
                                curPoint = 3;
                            } else if (nextLevel < 3) {
                                curPoint = nextLevel + 1;
                            }
                        }
                        readDtos.get(i).setOne(zeroCount);
                        readDtos.get(i).setTwo(oneCount);
                        readDtos.get(i).setThr(twoCount);
                        readDtos.get(i).setFou(threeCount);
                    }
                }
            }
            System.out.println(readDtos);//读取数据结果集合
            return status ? ResponseResult.success("操作成功") : ResponseResult.failure("操作失败");

        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
//        return ResponseResult.failure("操作失败");
    }

    private static String getTitleLvl(XWPFDocument doc, XWPFParagraph para) {
        String titleLvl = "";
        try {
            //判断该段落是否设置了大纲级别
            if (para.getCTP().getPPr().getOutlineLvl() != null) {
                return String.valueOf(para.getCTP().getPPr().getOutlineLvl().getVal());
            }
        } catch (Exception e) {
        }
        try {
            //判断该段落的样式是否设置了大纲级别
            if (doc.getStyles().getStyle(para.getStyle()).getCTStyle().getPPr().getOutlineLvl() != null) {
                return String.valueOf(doc.getStyles().getStyle(para.getStyle()).getCTStyle().getPPr().getOutlineLvl().getVal());
            }
        } catch (Exception e) {
        }
        try {
            //判断该段落的样式的基础样式是否设置了大纲级别
            if (doc.getStyles().getStyle(doc.getStyles().getStyle(para.getStyle()).getCTStyle().getBasedOn().getVal())
                    .getCTStyle().getPPr().getOutlineLvl() != null) {
                String styleName = doc.getStyles().getStyle(para.getStyle()).getCTStyle().getBasedOn().getVal();
                return String.valueOf(doc.getStyles().getStyle(styleName).getCTStyle().getPPr().getOutlineLvl().getVal());
            }
        } catch (Exception e) {

        }
        try {
            if (para.getStyleID() != null) {
                return para.getStyleID();
            }
        } catch (Exception e) {

        }

        return titleLvl;
    }
相关推荐
2601_949950635 小时前
练题簿在线免费刷题 从资料整理到考前自测
面试·职场和发展·pdf·word·刷题
鲲穹AI种草17 小时前
Word 文档批量处理工具怎么选,多款工具实际使用情况整理
word·文档批量处理
开开心心就好19 小时前
以图搜图找重复图片,本地工具离线就能用
javascript·智能手机·ffmpeg·c#·ocr·word·音视频
qq_369173632 天前
一句话将 Word、PPT、PDF 发布成链接
人工智能·pdf·word·powerpoint·效率工具·ai 办公
开开心心就好4 天前
超市定时播音软件,免费版支持循环播放
智能手机·ffmpeg·ocr·word·vim·音视频·visual studio
是枚小菜鸡儿吖4 天前
TraceBack:基于TextIn xParse,统一解析PDF/Word/Excel/扫描件/截图,自动交叉核验维修报告真伪,带原文出处,让造假无处遁形
pdf·word·excel
叶九灵不灵5 天前
WORD排版两三事
word
古少侠5 天前
多个 Markdown 文档怎么批量转 Word?DS随心转一次性收口
word·markdown·pandoc·批量转换·ds随心转
工具派7 天前
Word文档太大怎么拆分?段落结构与两种拆法的边界实测
开发语言·c#·word
Metaphor6927 天前
Python 实现 Word/TXT 互转:附完整代码
python·word·格式转换·txt