Java poi之Excel文本图片内容提取

news2024/11/22 13:31:23

目录结构

    • 前言
    • 文档准备
    • 引入Maven依赖
    • 代码块
    • 提取结果验证
        • excel03.xls 提取结果
        • excel07.xlsx 提取结果

前言

应公司需求,需实现以下功能

  1. Excel文本内容的替换;
  2. Excel文本内容的提取;
  3. Excel中图片的提取存放

此文章将使用Apache POI实现Excel文件中文本内容及图片的提取;

Apache POI 是基于 Office Open XML 标准(OOXML)和 Microsoft 的 OLE 2 复合文档格式(OLE2)处理各种文件格式的开源项目。 简而言之,您可以使用 Java 读写 MS Excel 文件,可以使用 Java 读写 MS Word 和 MS PowerPoint 文件。

  • HSSF - 提供读写 Microsoft Excel XLS 格式 (Microsoft Excel 97 (-2003)) 档案的功能。
  • XSSF - 提供读写 Microsoft Excel OOXML XLSX 格式 (Microsoft Excel XML (2007+)) 档案的功能。
  • SXSSF - 提供低内存占用量读写 Microsoft Excel OOXML XLSX 格式档案的功能。
  • HWPF - 提供读写 Microsoft Word DOC97 格式 (Microsoft Word 97 (-2003)) 档案的功能。
  • XWPF - 提供读写 Microsoft Word DOC2003 格式 (WordprocessingML (2007+)) 档案的功能。
  • HSLF/XSLF - 提供读写 Microsoft PowerPoint 格式档案的功能。
  • HDGF/XDGF - 提供读 Microsoft Visio 格式档案的功能。
  • HPBF - 提供读 Microsoft Publisher 格式档案的功能。
  • HSMF - 提供读 Microsoft Outlook 格式档案的功能。

文档准备

小编准备了以下两个文件:《excel03.xls》《excel07.xlsx》,分别代表不同版本的Excel,里边记录了一些正常表格信息及合并后的单元格信息和图片,以便提取测试,如下图
在这里插入图片描述

引入Maven依赖

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.2</version>
</dependency>

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

代码块

package com.bjzaxk.utils;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ooxml.POIXMLDocumentPart;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.*;

import java.io.*;
import java.util.List;

public class Demo {
    public static void main(String[] args) {
        String filePath = "C:\\Users\\Administrator\\Desktop\\java_poi\\demo_file\\excel03.xls";
        String formart = "XLS";
//        String filePath = "C:\\Users\\Administrator\\Desktop\\java_poi\\demo_file\\excel07.xlsx";
//        String formart = "XLSX";
        // 文本提取后存放路径及文件名
        String extractFilePath = "C:\\Users\\Administrator\\Desktop\\java_poi\\demo_file\\excel03.txt";
//        String extractFilePath = "C:\\Users\\Administrator\\Desktop\\java_poi\\demo_file\\excel07.txt";
        // 图片提取后存放路径
        String imageFilePath = "C:\\Users\\Administrator\\Desktop\\java_poi\\demo_file\\";

        // 提取Excel中的文字
        excelTextExtract(filePath, formart, extractFilePath);
        // 提取Excel中的图片
        excelImageExtract(filePath, formart, imageFilePath);
    }

    /**
     * @description: 提取excel文件中的文字
     * @author: Mr.Jkx
     * @time: 2023/1/11 17:30
     */
    public static void excelTextExtract(String filePath, String formart, String extractFilePath) {
        StringBuffer stringBuffer = new StringBuffer();
        FileInputStream fileInputStream = null;
        try {
            // 1.获取工作薄
            fileInputStream = new FileInputStream(filePath);
            if (formart.equals("XLS")) {
                // 2.创建工作区workbook
                HSSFWorkbook workbook = new HSSFWorkbook(fileInputStream);
                // 3.获取表sheet,这里sheet0代表获取下表为0的excel表,也就是第一个表
                HSSFSheet sheet = workbook.getSheetAt(0);
                // 4.获取数据
                for (int i = 0; i <= sheet.getLastRowNum(); i++) {
                    // 获取第i行的数据
                    HSSFRow row = sheet.getRow(i);
                    for (int j = 0; j < row.getLastCellNum(); j++) {
                        // 获取第i行第j列的单元格数据
                        String cell = row.getCell(j).toString();
                        stringBuffer.append(cell).append(" | ");
                    }
                    // 拼接换行符
                    stringBuffer.append("\n");
                }
            } else if (formart.equals("XLSX")) {
                // 创建工作区workbook
                XSSFWorkbook workbook = new XSSFWorkbook(fileInputStream);
                // 3.获取表sheet,这里sheet0代表获取下表为0的excel表,也就是第一个表
                XSSFSheet sheet = workbook.getSheetAt(0);
                // 4.获取数据
                for (int i = 0; i <= sheet.getLastRowNum(); i++) {
                    // 获取第i行的数据
                    XSSFRow row = sheet.getRow(i);
                    for (int j = 0; j < row.getLastCellNum(); j++) {
                        // 获取第i行第j列的单元格数据
                        String cell = row.getCell(j).toString();
                        stringBuffer.append(cell).append(" | ");
                    }
                    // 拼接换行符
                    stringBuffer.append("\n");
                }
            }

            // 获取到的数据
            if (stringBuffer.length() > 0) {
                // 创建存放提取数据的文件
                FileWriter fw = new FileWriter(extractFilePath);
                BufferedWriter bw = new BufferedWriter(fw);
                // 将内容写入新文件中
                bw.write(stringBuffer.toString());
                bw.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fileInputStream != null) {
                try {
                    // 6.关闭资源
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                    System.out.println("读取Excel文件失败...");
                }
            }
        }
    }

    /**
     * @description: 提取execl文件中的图片
     * @author: Mr.Jkx
     * @time: 2023/1/11 17:31
     */
    public static void excelImageExtract(String filePath, String formart, String imageFilePath) {
        try {
            InputStream inp = new FileInputStream(filePath);
            if (formart.equals("XLS")) {
                HSSFWorkbook workbook = (HSSFWorkbook) WorkbookFactory.create(inp);
                List pictures = workbook.getAllPictures();
                HSSFSheet sheet = workbook.getSheetAt(0);
                for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) {
                    if (shape instanceof HSSFPicture) {
                        HSSFPicture pic = (HSSFPicture) shape;
                        int pictureIndex = pic.getPictureIndex() - 1;
                        HSSFPictureData picData = (HSSFPictureData) pictures.get(pictureIndex);
                        // 保存图片到指定路径
                        byte[] data = picData.getData();
                        FileOutputStream out = new FileOutputStream(imageFilePath + "excel03_" + System.currentTimeMillis() + ".jpg");
                        out.write(data);
                        out.close();
                    }
                }
            } else if (formart.equals("XLSX")) {
                XSSFWorkbook workbook = (XSSFWorkbook) WorkbookFactory.create(inp);
                XSSFSheet sheet = workbook.getSheetAt(0);
                for (POIXMLDocumentPart part : sheet.getRelations()) {
                    if (part instanceof XSSFDrawing) {
                        XSSFDrawing pic = (XSSFDrawing) part;
                        List<XSSFShape> shapes = pic.getShapes();
                        for (XSSFShape shape : shapes) {
                            XSSFPicture picture = (XSSFPicture) shape;
                            byte[] data = picture.getPictureData().getData();
                            FileOutputStream out = new FileOutputStream(imageFilePath + "excel07_" + System.currentTimeMillis() + ".jpg");
                            out.write(data);
                            out.close();
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

提取结果验证

  • 提取文本会存放于一个txt文件中(小编工作需求,其他类型文件未尝试!);
  • 提取的图片会存放于“imageFilePath ”路径中,准备的文档中只有一张图片,多张图片的情况下,提取完成会在存放路径中有多张图片(在此不再展示);
  • 提取过程中不会改变原本Excel内容;

excel03.xls 提取结果

在这里插入图片描述

excel07.xlsx 提取结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/196257.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

我问 ChatGPT:怎样成为优秀的架构师?看它怎么回答的……

要成为一名优秀的架构师,需要以下几个方面的努力: 1. 系统的学习计算机科学和工程相关的知识,如计算机网络,数据结构,算法,操作系统等。 2. 实践和经验积累。参与许多实际的项目,不断积累经验,提高解决问题的能力。 3. 持续学习和追求卓越。保持对新技术和趋势的敏锐观…

Docker容器 01

前言 1.1 从环境配置说起 环境配置是软件开发的一大难题。开发、测试及运维人员需要相同的代码运行环境&#xff0c;如此一来就需要多次搭建环境&#xff0c;想想就觉得麻烦&#xff0c;实际上&#xff0c;在不了解docker等容器技术以前&#xff0c;还真就是这么干的&#xff…

IDEA 中动态web 工程的操作

目录a)IDEA 中如何创建动态web 工程1、创建一个新工程exer&#xff1a;2、在exer下创建module&#xff1a;test3、动态web工程创建成功 如下图b)Web 工程的目录介绍c)如何给动态 web 工程添加额外jar 包1 添加lib目录2 将jar包复制到lib目录中3 将jar包添加到工程4 可以打开项目…

西湖论剑2022部分misc

文章目录签到题喵take_the_zip_easymp3机你太美签到题喵 把文件尾的16进制复制出来&#xff0c;再转换字符串 私信后台即可获得flag take_the_zip_easy 明文攻击 echo -n “dasflow.pcapng” > 1.txt time ./bkcrack -C zipeasy.zip -c dasflow.zip -p 1.txt -o 30 -x 0…

六类网线为啥那么受欢迎,网络工程师必知

目前&#xff0c;国内千兆网络已大规模普及&#xff0c;从前的“销冠”百兆超五类网线已经渐渐淡出了人们的视野&#xff0c;已然被千兆的六类网线取代成为现代布线入门级主力军。万兆超六类网线也同时是城市智能化5G、万物互联时代入门首选&#xff0c;各自顺应时代成为不同领…

APP在Google Play上架被拒的原因

即便了解了Google Play商店的相关政策和应用指南&#xff0c;我们也不能避免应用在上架时或者是应用在更新时被拒的情况发生。那今天我们就展开讲讲Google Play商店被拒的原因及解决方案。 出现不当言论或内容&#xff08;比如&#xff0c;色情内容&#xff0c;带有种族歧视和…

基于Springboot搭建java项目(三十五)—— Ngnix配置的使用

Ngnix配置的使用 一、Nginx配置文件(nginx.conf) 1、配置文件的层级 配置文件目前分为三大部分&#xff0c;全局块、event块和http块&#xff0c;下面是具体的结构 2、配置文件概览 # 全局快 ---------------------------------------------------------------------------…

Bean实例化的基本流程

Bean实例化的基本流程 Bean实例化的基本流程-BeanDefinition Spring容器在进行初始化时&#xff0c;会将xml配置的的信息封装成一个BeanDefinition对象&#xff0c;所有的BeanDefinition存储到一个名为beanDefinitionMap的Map集合中去&#xff0c;Spring框架在对该Map进行遍历…

[NeurIPS 2018] Hyperbolic neural networks

ContentsIntroductionThe Geometry of the Poincar BallHyperbolic space: the Poincar ballGyrovector spaces (陀螺矢量空间)Mbius additionMbius scalar multiplicationDistanceHyperbolic trigonometryConnecting Gyrovector spaces and Riemannian geometry of the Poinca…

如何用提取网页内容的工具快速提取网站内容

随着社会的不断的进步&#xff0c;我们已经进入一个效率时代&#xff0c;相信每个人在互联网上下载或者复制粘贴过内容。特别是整理行业的数据&#xff0c;以及收集资料。今天小编就教大家如何用提取网页内容的工具快速提取到你想要的信息&#xff0c;只需要点几下鼠标就能提取…

GitHub2022年十大热门编程语言榜单

全球知名代码托管平台 GitHub发布的2022年GitHub Octoverse年度报告公布了全球最流行的十大编程语言&#xff0c;其中JavaScript蝉联第一&#xff0c;Python位列次席。 编程是技术革新的核心&#xff0c;对于所有的编程开发人员来说&#xff0c;对世界范围内编程语言发展和趋势…

磨金石教育摄影技能干货分享|人物系列摄影作品欣赏

人间烟火气&#xff0c;最能抚人心。生活中一些平平静静的瞬间&#xff0c;聊天、走路、欢笑&#xff0c;构成了人生当中闪闪的光。今天我们来欣赏一组充满烟火气的人物摄影。没有刻意的姿势&#xff0c;没有华丽的造景&#xff0c;有的就是真实与自然。《放学路上》小时候最欢…

linux 中的压缩和解压操作

1、压缩/解压操作 在开发中&#xff0c;很多时候会遇到某些文件要进行压缩的操作&#xff0c;比如文件较大不方便传输的时候&#xff0c;可能会考虑对文件进行压缩&#xff0c;以减少文件传输的时间。 比如在网络中传输文件的时候&#xff0c;就会考虑先将文件进行压缩&#xf…

微服务 过滤器 集成Sentinel实现网关限流

微服务 过滤器 集成Sentinel实现网关限流Gateway - -> 过滤器Filter局部路由过滤器使用局部过滤器全局过滤器使用全局过滤器集成Sentinel实现网关限流网关限流API分组限流Gateway - -> 过滤器Filter 过滤器就是在请求的传递过程中,对请求和响应做一些手脚. 在Gateway中, …

0xScope x Footprint | 真实的 NFT 市场是什么样?

2023 年 1 月数据源&#xff1a;NFT 真实交易分析面板前言NFT 作为一个2017年才出现的概念&#xff0c;在2018年至2020年一直处于生态发展的酝酿期&#xff0c;在2021年初开始迎来真正的爆发&#xff0c;一系列如CryptoPunk&#xff0c;The Sandbox&#xff0c;BAYC等知名NFT开…

Vue组件间通信的方式

目录 常用的父子组件通讯方式&#xff1a;props,emit 2.$parent,$children 3.$ref 4.provide/inject 5.EventBus 事件总线 &#xff08;任意两个组件通讯&#xff09; 6.$attrs、$listener 7.Vuex 状态管理器 8.localStorage/sessionStorage 在开发中&#xff0c;组…

相见恨晚,这6个适合安卓用户的浏览器,你用过吗

每个人手机里面有一款浏览器&#xff0c;当我们遇到问题的时候&#xff0c;可以打开浏览器搜索自己想要的答案。如果选用的手机浏览器不好&#xff0c;那么手机上可能会被安装很多垃圾软件。下面&#xff0c;和大家聊聊几款好用、适合安卓用户的浏览器&#xff0c;个人觉得这些…

【逐步剖C】第四章-操作符

​ 一、算术操作符 即基本的、-、*、/ 和 %。但也有几个需要注意的地方&#xff1a; 除了 ‘%’ 取模操作符只能作用整数&#xff0c;其他可以作用于整数和浮点数 对于除法&#xff0c;只要有操作数为浮点数就执行浮点数除法。如果两个操作数都为整数&#xff0c;执行整数除…

python多进程、多线程(详细)

多任务概念同一时间执行多个任务多任务优势最大的好处是充分利用CPU资源&#xff0c;提高程序的执行效率GIL锁&#xff08;全局解释锁&#xff09;让一个进程中同一个时刻只有一个线程可以被CPU调用&#xff0c;可以解决线程安全问题&#xff0c;有线程锁也有进程锁Rlock&#…

「自控元件及线路」1.3 直流电动机的特性与控制方法

本节介绍电机的基本物理量和基本关系 本节介绍直流电机的静态特性以及动态特性 本节介绍直流电机的控制方法、启动方法、稳定运行条件 本节介绍直流电动机的四种工作状态 本节介绍控制系统中应用的直流电动机的类型 文章目录基础知识基本物理量&#xff1a;电磁转矩与电枢反电势…