目录结构
- 前言
- 文档准备
- 引入Maven依赖
- 代码块
- 提取结果验证
- excel03.xls 提取结果
- excel07.xlsx 提取结果
 
 
 
前言
应公司需求,需实现以下功能
- Excel文本内容的替换;
- Excel文本内容的提取;
- 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 提取结果









![[NeurIPS 2018] Hyperbolic neural networks](https://img-blog.csdnimg.cn/8027b3fc89a242449675127ee2f7fe99.png#pic_center)










