POI解析word\pdf中表格

2023-11-19

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>4.1.1</version>
        </dependency>

         <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.7</version>
        </dependency>

添加依赖

直接上代码:

// 解析word两种类型
private static List<List<EvaluationBaseInfo>> analysisWordTable(String filePath) {

        File file = new File(filePath);
        if (!file.exists()) {
            return null;
        }
        FileInputStream fileInputStream = null;
        FileInputStream fileInputStream2 = null;
        try {
            // 因OLE2无法解析Buffered的流数据,所以定义了两个
            fileInputStream = new FileInputStream(file);
            fileInputStream2 = new FileInputStream(file);
            BufferedInputStream bis = new BufferedInputStream(fileInputStream2);
            FileMagic fileMagic = FileMagic.valueOf(bis);

            if (fileMagic == FileMagic.OLE2) {
                return analysisOLE2(fileInputStream);
            } else if (fileMagic == FileMagic.OOXML) {
                return analysisOOXML(fileInputStream);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if (null != fileInputStream){
                    fileInputStream.close();
                }
                if (null != fileInputStream2){
                    fileInputStream2.close();
                }

            } catch (IOException e) {
                e.printStackTrace();
            }

        }
       return null;
    }


private static List<List<EvaluationBaseInfo>> analysisOLE2(FileInputStream fileInputStream) {

        // 获取word中的所有段落与表格
        POIFSFileSystem pfs = null;
        HWPFDocument hwpf = null;
        try {
            pfs = new POIFSFileSystem(fileInputStream);
            hwpf = new HWPFDocument(pfs);
            Range range = hwpf.getRange();// 得到文档的读取范围
            TableIterator it = new TableIterator(range);
            Map<String, String> map = new HashMap<>();
            List<List<EvaluationBaseInfo>> evaluationBaseInfoList = new ArrayList<>();
            while (it.hasNext()) {
                Table tb = it.next();
                // 迭代行,默认从0开始
                List<EvaluationBaseInfo> evaluationBaseInfos = new ArrayList<>();
                for (int i = 1; i < tb.numRows(); i++) {
                    TableRow tr = tb.getRow(i);
                    // 迭代列,默认从0开始

                    EvaluationBaseInfo evaluationBaseInfo = new EvaluationBaseInfo();
                    int index = 1;
                    for (int j = 1; j < tr.numCells(); j++) {
                        TableCell td = tr.getCell(j);// 取得单元格
                        for (int k = 0; k < td.numParagraphs(); k++) {
                            Paragraph para = td.getParagraph(k);// 获取第k个段落
                            String text = para.text();
                            EvaluationBaseInfo.covert(text,index,evaluationBaseInfo);
                            index++;
                        }
                    }
                    evaluationBaseInfos.add(evaluationBaseInfo);
                }
                evaluationBaseInfoList.add(evaluationBaseInfos);
            }
            return evaluationBaseInfoList;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != hwpf){
                    hwpf.close();
                }
                if (null != pfs){
                    pfs.close();
                }

            } catch (IOException e) {
                e.printStackTrace();
            }

        }

        return null;
    }


private static List<List<EvaluationBaseInfo>> analysisOOXML(FileInputStream fileInputStream) {
        List<List<EvaluationBaseInfo>> evaluationBaseInfoList = new ArrayList<>();
        XWPFDocument doc = null;
        try {
            doc = new XWPFDocument(fileInputStream);
            List<XWPFTable> tables = doc.getTables();

            for (XWPFTable table : tables){
                List<XWPFTableRow> rows = table.getRows();
                List<EvaluationBaseInfo> evaluationBaseInfos = new ArrayList<>();
                // 从下标1开始循环,跳过表头
                for (int i = 1;i < rows.size();i++){
                    XWPFTableRow xwpfTableRow = rows.get(i);
                    List<XWPFTableCell> tableCells = xwpfTableRow.getTableCells();
                    EvaluationBaseInfo evaluationBaseInfo = new EvaluationBaseInfo();
                    // 组装字段值
                    for (int j = 1;j < tableCells.size();j++){
                        XWPFTableCell cell = tableCells.get(j);
                        String text = cell.getText();
                        if (StringUtils.isBlank(text)){
                            continue;
                        }
                        EvaluationBaseInfo.covert(text,j,evaluationBaseInfo);

                    }
                    // 下标和字典值进行匹配,获取county_science表中data_type类型
                    CountyScienceDict countyScienceDict = CountyScienceDict.getOne(i);
                    if (null != countyScienceDict){
                        evaluationBaseInfo.setDataType(countyScienceDict.getType());
                    }
                    evaluationBaseInfos.add(evaluationBaseInfo);

                }
                evaluationBaseInfoList.add(evaluationBaseInfos);

            }
            return evaluationBaseInfoList;

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if(doc!=null) {
                    doc.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }



// 解析PDF
private static List<List<EvaluationBaseInfo>> analysisPdfTable(String filePath) {
        PDDocument pdDocument = null;
        //创建pdf文件解析器
        FileInputStream is = null;
        PDFParser parser = null;
        // 用来统一返回类型
        List<List<EvaluationBaseInfo>> evaluationBaseInfoList = new ArrayList<>();
        try {
            is = new FileInputStream(filePath);
            parser = new PDFParser(new RandomAccessBuffer(is));
            parser.parse();
            //获取解析后的pdf文档
            pdDocument = parser.getPDDocument();
            // 新建一个PDF文本剥离器
            PDFTextStripper stripper = new PDFTextStripper();
            stripper.setSortByPosition(false); //sort:设置为true 则按照行进行读取,默认是false
            String pageContent = "";
            Pattern pattern = Pattern.compile("XXXXXX");

            //获取pdf文件总页数
            int pageCount = pdDocument.getNumberOfPages();
            for (int i = 1; i <= pageCount; i++) {
                pageContent = "";
                stripper.setStartPage(i);
                stripper.setEndPage(i);
                pageContent = stripper.getText(pdDocument);
                Matcher matcher = pattern.matcher(pageContent);
                if (matcher.find()) {
                    break;
                }
            }

            String[] lines = pageContent.split("\n");
            pattern = Pattern.compile("^\\d+");
            AtomicInteger atomicInteger = new AtomicInteger(0);

            List<EvaluationBaseInfo> evaluationBaseInfos = new ArrayList<>();
            for (String line : lines  ) {
                if(pattern.matcher(line).find()){
                    String[] row = line.split(" ");

                    // 转换对象
                    EvaluationBaseInfo evaluationBaseInfo = new EvaluationBaseInfo();
                    int j = 1;
                    for (int i = 0; i < row.length; i++) {
                        j++;
                        EvaluationBaseInfo.covert(row[i],j,evaluationBaseInfo);
                    }

                    // 下标和字典值进行匹配,获取county_science表中data_type类型
                    CountyScienceDict countyScienceDict = CountyScienceDict.getOne(atomicInteger.incrementAndGet());
                    if (null != countyScienceDict){
                        evaluationBaseInfo.setDataType(countyScienceDict.getType());
                    }
                    evaluationBaseInfos.add(evaluationBaseInfo);
                }
            }
            evaluationBaseInfoList.add(evaluationBaseInfos);

        } catch (Exception e) {
            e.printStackTrace();
            System.err.println(filePath);
        }finally {
            if (pdDocument != null) {
                // 关闭PDF Document
                try {
                    is.close();
                    pdDocument.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return evaluationBaseInfoList;

    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

POI解析word\pdf中表格 的相关文章

随机推荐

  • SpringBoot 整合 ElasticSearch

    整合前先理解几个概念 与关键字 开始前给大家推荐一款很火的刷题 面试求职网站 https www nowcoder com link pc csdncpt xiaoying java 索引
  • Java编程练习题:Demo96 - Demo105(多维数组)

    目录 Demo96 代数方面 两个矩阵相乘 编写两个矩阵相乘的方法 Demo97 距离最近的两个点 程序清单8 3给出找到二维空间中距离最近的两个点的程序 修改该程序 让程序能够找出在三维空间上距离最近的两个点 Demo98 最大的行和列
  • flink-addSource和addSink分别是kafka、自定义数据、mysql、hbase的java实现

    flink主程序 public class FinkTest public static void main String args throws Exception StreamExecutionEnvironment env Strea
  • Python 和 A-frame实现从图像创建 3D 模型--附完整示例代码

    介绍 虚拟现实是指由计算机生成的模拟 允许用户使用特殊耳机进行交互 简而言之 它是由计算机创建的另类现实 而耳机可以让人们沉浸在该现实中 根据 Allied Market Research 的数据 到 2026 年 VR 内容创作市场将达到
  • 基于若依框架的微信小程序登录

    一 用户表结构 CREATE TABLE bus user user id varchar 32 COLLATE utf8mb4 bin NOT NULL COMMENT 用户id parent id varchar 32 CHARACTE
  • 秋招提前批已来,万字长文教你如何增加面试大厂的成功率

    本文是笔者在春季在 前端早早聊 手动笔芯 的面试专场分享的文字稿 主要针对前端社招 校招和实习的同学仅供参考 感兴趣的同学可以点击链接查看PPT和录屏 前端如何提高面试大厂的通过率 字节跳动秋季招聘提前批已经启动 欢迎投递幸福里业务线 内推
  • 嵌入式 ARM 汇编编程例题

    文章目录 用汇编语言实现 128 位数的减法 已知 32 位变量 X Y 存放在存储器的地址 0x90010 0x90014 中 要求实现 Z X Y 其中 Z 的值存放在 0x90018 中 已知 32 位有符号数 X 存放在存储器的地址
  • python request第三方库介绍

    python request第三方库介绍 快速上手 迫不及待了吗 本页内容为如何入门Requests提供了很好的指引 其假设你已经安装了Requests 如果还没有 去 安装 一节看看吧 首先 确认一下 Requests 已安装 Reque
  • mybatis查询mysql时间格式化 DATE_FORMAT

    在数据库中对应的是DateTime 查询参数为String类型 缺少时分秒的情况下使用 select from order where isDelete 0
  • 笔记 —— ByteArrayOutputStream

    内存输出流 ByteArrayOutputStream 此类实现了一个输出流 其中的数据被写入一个 byte 数组 缓冲区会随着数据的不断写入而自动增长 可使用 toByteArray 和 toString 获取数据 两个构造函数 1 By
  • Linux系统编程makefile制作动态库和静态库

    目录 制作动态库 制作静态库 首先准备简单的add c sub c main c head h 具体代码如下 head h文件 int Add int a int b int Sub int a int b add c文件 include
  • 山洪灾害监测预警系统解决方案

    一 方案概述 山洪灾害是指山丘地区由降雨引起的洪水 泥石流和滑坡灾害 近年来 我国突发性 局部性极端强降雨引发的山洪灾害导致大量人员伤亡 占洪涝灾害死亡总人数的比例趋上升趋势 群死群伤事件时有发生 山洪灾害严重制约山区和丘陵地区经济发展 人
  • SVM支持向量机学习——使用MATLAB实现基于SVM的数据二分类

    SVM支持向量机学习 使用MATLAB实现基于SVM的数据二分类 支持向量机 Support Vector Machine SVM 是一种广泛应用于分类 回归和异常检测等领域的算法 它的优点在于具有较高的准确性 鲁棒性和可扩展性 在本文中
  • Hyper-v 虚拟机挂载物理硬盘的方法-Windows Server 2022/2025

    起因 之前我写过一篇介绍在KVM虚拟机体系下 如何直接挂载物理硬盘和物理分区的方法 KVM虚拟机直接挂栽物理硬盘分区的方法 给libvirt虚机挂载磁盘 lggirls的博客 CSDN博客 近期帮助一个朋友搭建局域网 其中有OA系统要用到w
  • Get to know yosys & yosys-abc

    In this blog I m going to give some instructions about yosys yosys abc in Linux Environment yosys 0 7 gcc 5 4 0 ubuntu 1
  • verilog 基本语法 {}大括号的使用

    的基本使用是两个 一个是拼接 一个是复制 下面列举了几种常见用法 基本用法 表示拼接 第一位 第二位 表示复制 4 a 等同于 a a a a 所以 13 1 b1 就表示将13个1拼接起来 即13 b1111111111111 拼接语法详
  • 学习总结——按下按键灯亮,再次按下按键,灯灭

    按键控制灯的亮灭 1 主要实现按键控制灯的亮灭 按键按下 灯亮 再次按下 灯灭 主要对实现的逻辑进行控制 逻辑清晰 很简单 实现的方法有两种 方法1 将按键按下的值赋值给一个变量 变量除以2的值的是基数或者偶数来确定灯亮还是灯灭 程序中设置
  • 堆栈 对比

    https www cnblogs com guoxiaoyan p 8664150 html
  • STL — Set/Multiset容器

    1 1 Set容器基本概念 Set的特性是 所有元素都会根据元素的键值自动被排序 Set的元素不像map那样可以同时拥有实值和键值 set的元素即是键值又是实值 set不允许两个元素有相同的键值 我们可以通过set的迭代器改变set元素的值
  • POI解析word\pdf中表格