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中表格 的相关文章

  • 如何克服原语按值传递的事实

    我有一段很长的代码来计算两个值 doubles 对我来说 我在几个地方使用了这段代码 为了坚持 DRY 原则 我应该将这段代码重构为一个很好的单元测试方法 但是我不能让它返回两个双精度数 而双精度数是原始的 因此不能按值传递和操作 我能想到
  • 如何使用 Java 中的 Web 服务(例如 Axis2)发送复杂对象的数组或集合?

    我对 SOAP Web 服务还比较陌生 虽然我完成了一些较小的 Web 服务项目 但我偶然从来不需要返回 或用作参数 复杂 对象的数组或集合 当我尝试这样做时 根据我的 SOAP 绑定风格 我会得到不同的奇怪行为 当我使用RPC 文字 我可
  • Hibernate注解放置问题

    我有一个我认为很简单的问题 我见过两种方式的例子 问题是 为什么我不能将注释放在字段上 让我举一个例子 Entity Table name widget public class Widget private Integer id Id G
  • 在文本文件中写入多行(java)

    下面的代码是运行命令cmd并使用命令行的输出生成一个文本文件 下面的代码在 Eclipse 的输出窗口中显示了正确的信息 但在文本文件中只打印了最后一行 谁能帮我这个 import java io public class TextFile
  • 使用 JPA Criteria API 进行分页的总行数

    我正在系统中为实体实现 高级搜索 功能 以便用户可以使用该实体的属性上的多个条件 eq ne gt lt 等 来搜索该实体 我正在使用 JPA 的 Criteria API 动态生成 Criteria 查询 然后使用setFirstResu
  • org.apache.sling.api.resource,version=[2.3,3) -- 无法解析

    您好 我无法访问我的项目内容 我已经上传了从 CQ 访问内容所需的所有包 我唯一能看到的是 org apache sling api resource version 2 3 3 无法解析 这是否是异常的原因 如果是 请告诉我如何解决 中Q
  • OSGi:如果不取消服务会发生什么

    这是我获取 OSGi 服务的方式 ServiceReference reference bundleContext getServiceReference Foo class getName Foo foo Foo bundleContex
  • Java AES 128 加密方式与 openssl 不同

    我们遇到了一种奇怪的情况 即我们在 Java 中使用的加密方法会向 openssl 生成不同的输出 尽管它们在配置上看起来相同 使用相同的键和 IV 文本 敏捷的棕色狐狸跳过了懒狗 加密为 Base64 字符串 openssl A8cMRI
  • java中如何连接字符串

    这是我的字符串连接代码 StringSecret java public class StringSecret public static void main String args String s new String abc s co
  • 按第一列排序二维数组,然后按第二列排序

    int arrs 1 100 11 22 1 11 2 12 Arrays sort arrs a b gt a 0 b 0 上面的数组已排序为 1 100 1 11 2 12 11 22 我希望它们按以下方式排序a 0 b 0 首先 如果
  • 如何在不超过最大值的情况下增加变量?

    我正在为学校开发一个简单的视频游戏程序 我创建了一个方法 如果调用该方法 玩家将获得 15 点生命值 我必须将生命值保持在最大值 100 并且由于我目前的编程能力有限 我正在做这样的事情 public void getHealed if h
  • 我需要什么库才能在 Java 中访问这个 com.sun.image.codec.jpeg?

    我正在用java创建一个图像水印程序 并导入了以下内容 import com sun image codec jpeg JPEGCodec import com sun image codec jpeg JPEGEncodeParam im
  • Java 文件上传速度非常慢

    我构建了一个小型服务 它从 Android 设备接收图像并将其保存到 Amazon S3 存储桶中 代码非常简单 但是速度非常慢 事情是这样的 public synchronized static Response postCommentP
  • Javafx过滤表视图

    我正在尝试使用文本字段来过滤表视图 我想要一个文本字段 txtSearch 来搜索 nhs 号码 名字 姓氏 和 分类类别 我尝试过在线实施各种解决方案 但没有运气 我对这一切仍然很陌生 所以如果问得不好 我深表歉意 任何帮助将不胜感激 我
  • Struts 2 + Sitemesh 3 集成 - FreemarkerDecoratorServlet 中的 NPE

    我将 Struts 2 版本 2 3 14 3 与 Sitemesh 3 版本 3 0 alpha 2 一起使用 并且在某些情况下遇到 NullPointerException 首先 这是我的 web xml 中的 struts2 site
  • 如何在JSTL中调​​用java方法? [复制]

    这个问题在这里已经有答案了 这可能是重复的问题 我只想调用不是 getter 或 setter 方法的方法例如 xyz 类的 makeCall someObj stringvalue Java类 Class XYZ public Strin
  • 我可以创建自定义 java.* 包吗?

    我可以创建一个与预定义包同名的自己的包吗在Java中 比如java lang 如果是这样 结果会怎样 这难道不能让我访问该包的受保护的成员 如果不是 是什么阻止我这样做 No java lang被禁止 安全管理器不允许 自定义 类java
  • Eclipse 中 Spring MVC 模型对象的 (jsp /jstl) 视图中的代码辅助

    在 Spring MVC 中 当将对象放置在视图模型中时 如下所示 public String getUser Model model fetch user model addAttribute user user return viewN
  • Trie 数据结构 - Java [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 是否有任何库或文档 链接提供了在 java 中实现 Trie 数据结构的更多信息 任何帮助都会很棒 Thanks 你可以阅读Java特里树
  • 如何在 JFreeChart 中设置多个系列的线条粗细?

    我创建了很多图表 在他们每个人中我都需要打电话 renderer setSeriesStroke i new BasicStroke 2 0f 对于每个系列 renderer is chart getXYPlot getRenderer 我

随机推荐

  • 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中表格