目录结构
- 前言
- 文档准备
- 引入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内容;