使用Apache POI处理Excel中的OLE对象
核心代码解析
ini
import org.apache.poi.poifs.filesystem.Ole10Native;
import org.apache.poi.poifs.filesystem.Ole10NativeException;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
try (XSSFWorkbook workbook = new XSSFWorkbook(file.getInputStream())) {
// 获取所有嵌入式文件
List<PackagePart> partList = workbook.getAllEmbeddedParts();
for (PackagePart part : partList) {
InputStream emb = part.getInputStream();
if (emb != null) {
// 解析ole文件
POIFSFileSystem fs = new POIFSFileSystem(emb);
Ole10Native ole = Ole10Native.createFromEmbeddedOleObject(fs.getRoot());
// 获取并处理原始文件名
String originalName = ole.getLabel();
// 获取文件内容
byte[] fileContent = ole.getDataBuffer();
// 这里可以添加业务处理逻辑
}
}
} catch (RuntimeException e) {
throw new RuntimeException(e);
}
1. 获取文件流
- 从文件系统:
new FileInputStream("path/to/file.xlsx")
- 从上传的MultipartFile:
file.getInputStream()
2. 加载Excel工作簿
使用XSSFWorkbook
类加载XLSX格式的Excel文件:
java
try (XSSFWorkbook workbook = new XSSFWorkbook(file.getInputStream())) {
}
try-with-resources
语句确保工作簿在使用后自动关闭。
3. 获取所有嵌入式对象
getAllEmbeddedParts()
方法返回工作簿中所有嵌入式对象的列表:
ini
List<PackagePart> partList = workbook.getAllEmbeddedParts();
4. 处理每个嵌入式对象
遍历所有嵌入式对象:
scss
for (PackagePart part : partList) {
InputStream emb = part.getInputStream();
if (emb != null) {
// 处理输入流
}
}
5. 解析OLE对象
使用POIFSFileSystem
解析OLE对象:
ini
POIFSFileSystem fs = new POIFSFileSystem(emb);
Ole10Native ole = Ole10Native.createFromEmbeddedOleObject(fs.getRoot());
6. 获取OLE对象信息
从OLE对象中提取有用信息:
ini
String originalName = ole.getLabel(); // 原始文件名
byte[] fileContent = ole.getDataBuffer(); // 文件内容
实际应用场景
- 文件提取:将嵌入的OLE对象提取并保存到文件系统
- 内容分析:检查嵌入文件的内容是否符合安全要求
- 数据迁移:将嵌入对象转换为其他格式
- 文档审计:记录文档中所有嵌入对象的信息