package wps;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.XML;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.openxml4j.opc.PackagePartName;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.*;
import java.io.IOException;
import java.net.URI;
import java.util.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class WpsImgUtil {
/**
* 获取wps中的图片
* 包括嵌入形式图片和浮动形式图片
* <p>
* 嵌入形式图片返回方式:
* 以map方式返回
* 键为行列格式 =DISPIMG("ID",1) 字符串
* <p>
* 浮动形式图片返回方式:
* 以map方式返回
* 键为行列格式 x-y 字符串
*
* @param dispStrList
* @param simpleFile
* @return
* @throws IOException
*/
public static Map<String, WpsImg> getWpsImgs(List<String> dispStrList, MultipartFile simpleFile) throws IOException {
List<WpsImg> wpsImgList = new ArrayList<>();
for (String dispStr : dispStrList) {
if (Objects.nonNull(dispStr) && dispStr.startsWith("=DISPIMG")) {
int start = dispStr.indexOf("\"");
int end = dispStr.lastIndexOf("\"");
if (start != -1 && end != -1) {
String imgId = dispStr.substring(start + 1, end);
WpsImg wpsImg = new WpsImg();
wpsImg.setType(0);
wpsImg.setImgId(imgId);
wpsImg.setCellStr(dispStr);
wpsImgList.add(wpsImg);
}
}
}
ZipInputStream zis = new ZipInputStream(simpleFile.getInputStream());
try {
ZipEntry entry;
while ((entry = zis.getNextEntry()) != null) {
try {
final String fileName = entry.getName();
if (Objects.equals(fileName, "xl/cellimages.xml")) {
String content = IOUtils.toString(zis, CharsetUtil.UTF_8);
JSONObject js = XML.toJSONObject(content);
if (Objects.isNull(js)) {
continue;
}
JSONObject cellImages = js.getJSONObject("etc:cellImages");
if (Objects.isNull(cellImages)) {
continue;
}
JSONArray cellImage = null;
try {
cellImage = cellImages.getJSONArray("etc:cellImage");
} catch (Exception e) {
}
if (Objects.isNull(cellImage)) {
JSONObject cellImageObj = null;
try {
cellImageObj = cellImages.getJSONObject("etc:cellImage");
} catch (Exception e) {
}
if (Objects.nonNull(cellImageObj)) {
cellImage = new JSONArray();
cellImage.add(cellImageObj);
}
}
if (Objects.isNull(cellImage)) {
continue;
}
for (int i = 0; i < cellImage.size(); i++) {
JSONObject imageItem = cellImage.getJSONObject(i);
if (Objects.isNull(imageItem)) {
continue;
}
JSONObject pic = imageItem.getJSONObject("xdr:pic");
if (Objects.isNull(pic)) {
continue;
}
JSONObject nvPicPr = pic.getJSONObject("xdr:nvPicPr");
if (Objects.isNull(nvPicPr)) {
continue;
}
JSONObject cNvPr = nvPicPr.getJSONObject("xdr:cNvPr");
if (Objects.isNull(cNvPr)) {
continue;
}
String name = cNvPr.getStr("name");
if (StringUtils.isNotEmpty(name)) {
WpsImg wpsImg = wpsImgList.stream().filter(item -> Objects.equals(item.getImgId(), name)).findFirst().orElse(null);
if (Objects.nonNull(wpsImg)) {
JSONObject blipFill = pic.getJSONObject("xdr:blipFill");
if (Objects.isNull(blipFill)) {
continue;
}
JSONObject blip = blipFill.getJSONObject("a:blip");
if (Objects.isNull(blip)) {
continue;
}
String embed = blip.getStr("r:embed");
wpsImg.setRId(embed);
}
}
}
}
} finally {
zis.closeEntry();
}
}
} finally {
zis.close();
}
ZipInputStream fzis = new ZipInputStream(simpleFile.getInputStream());
try {
ZipEntry entry;
while ((entry = fzis.getNextEntry()) != null) {
try {
final String fileName = entry.getName();
if (Objects.equals(fileName, "xl/_rels/cellimages.xml.rels")) {
String content = IOUtils.toString(fzis, CharsetUtil.UTF_8);
JSONObject js = XML.toJSONObject(content);
JSONObject relationships = js.getJSONObject("Relationships");
if (Objects.isNull(relationships)) {
continue;
}
JSONArray relationship = null;
try {
relationship = relationships.getJSONArray("Relationship");
} catch (Exception e) {
}
if (Objects.isNull(relationship)) {
try {
JSONObject relationshipObj = relationships.getJSONObject("Relationship");
if (Objects.nonNull(relationshipObj)) {
relationship = new JSONArray();
relationship.add(relationshipObj);
}
} catch (Exception e) {
}
}
if (Objects.isNull(relationship)) {
continue;
}
for (int i = 0; i < relationship.size(); i++) {
JSONObject relaItem = relationship.getJSONObject(i);
if (Objects.isNull(relaItem)) {
continue;
}
String id = relaItem.getStr("Id");
String target = "/xl/" + relaItem.getStr("Target");
if (StringUtils.isNotEmpty(id)) {
java poi 获取excel中的图片(包含wps中嵌入单元格图片)
需积分: 0 62 浏览量
更新于2023-09-27
收藏 3KB ZIP 举报
在Java编程中,Apache POI库是一个非常流行的API,用于读写Microsoft Office格式的文件,包括Excel。在处理Excel文件时,有时我们需要从工作表中提取图像数据,这可能包括图表、图片等。特别是,当涉及到与WPS Office兼容时,POI还需要处理一些额外的情况,比如WPS中嵌入在单元格中的图片。本篇文章将详细讲解如何使用Java POI库获取Excel文件(包括WPS创建的文件)中的图片,以及如何处理单元格内嵌图片。
让我们了解POI中处理图片的基本概念。POI中的`XSSFWorkbook`和`HSSFWorkbook`类提供了`getAllPictures()`方法,用于获取工作簿中所有的图片。这些图片是以`Picture`对象的形式存在的,每个`Picture`对象都包含图片的数据和类型信息。
1. **读取Excel文件**:
使用`WorkbookFactory`的`create()`方法读取Excel文件,无论是`.xls`还是`.xlsx`格式。例如:
```java
Workbook workbook = WorkbookFactory.create(new File("path_to_your_file.xlsx"));
```
2. **获取所有图片**:
调用`Workbook`对象的`getAllPictures()`方法:
```java
List<PictureData> pictures = workbook.getAllPictures();
```
3. **处理单元格内的图片**:
对于WPS中单元格内的图片,POI并不直接提供获取方法。你需要遍历工作表的每个`Row`和`Cell`,检查是否有嵌入的对象。如果一个单元格是`CELL_TYPE_INLINE_DRAWING`,则表示它可能含有图片。你可以通过以下方式检查:
```java
for (Row row : sheet) {
for (Cell cell : row) {
if (cell.getCellType() == CellType.INLINE_STRING) {
InlineDrawings inlineDrawings = cell.getRichStringCellValue().getInlineDrawing();
if (inlineDrawings != null) {
// 处理单元格内的图片
}
}
}
}
```
注意,这里涉及的`InlineDrawings`和`RichStringCellValue`是假设WPS的内部结构与POI兼容。实际操作中,可能需要使用反射或第三方库来解析这部分数据。
4. **获取图片数据**:
一旦找到了`PictureData`对象,你可以通过`getData()`方法获取图片的原始字节数组,然后可以将其保存到文件或进行其他处理:
```java
byte[] imageData = picture.getData();
FileOutputStream out = new FileOutputStream("image.png");
out.write(imageData);
out.close();
```
5. **识别图片类型**:
`PictureData`对象的`getMimeType()`方法返回了图片的MIME类型,如`image/jpeg`或`image/png`,帮助你确定如何处理图片数据。
在给定的代码文件`WpsImgUtil.java`和`WpsImg.java`中,可能已经实现了上述步骤,并可能针对WPS的特性进行了特定的适配。你可以通过阅读和理解这些代码,了解如何在实际项目中应用这些知识。
Java POI库为处理Excel文件中的图片提供了强大的支持,但处理WPS中的单元格内图片可能需要额外的逻辑。通过理解上述概念,你可以构建或扩展自己的工具,以满足对各种Excel和WPS文件的图片提取需求。
rosener
- 粉丝: 88
- 资源: 30
最新资源
- 1Cr18Ni9Ti钢板焊接接头冷弯开裂的试验研究.pdf
- 1Cr18Ni9Ti钎焊接头组织和性能影响研究 - .pdf
- 2.25 Cr-1 Mo钢制加氢反应器的焊接裂纹(二)-对焊接裂纹性质的试验研究.pdf
- 1Crl8Ni9Ti不锈钢复合管系的焊接 - .pdf
- 2.25Cr-1Mo-0.25V低合金钢用焊接材料的检验 - .pdf
- 2.25-1Mo钢焊后产生焊接裂纹的原因分析及其返修措施.pdf
- 2.25 Cr-1 Mo钢制加氢反应器的焊接裂纹(一)-在制过程中出现的焊接裂纹.pdf
- 2.25Cr-1Mo-0.25V钢焊接材料的再热裂纹敏感性试验方法探讨.pdf
- 2A12厚板铝合金搅拌摩擦焊接头组织性能研究 - .pdf
- 2万立立式液氢高压容器的焊接研制.pdf
- 2A14铝合金法兰焊接裂纹修复.pdf
- 3.5%Ni钢焊接接头的低温韧性研究三──熔敷金属碳含量等因素的影响.pdf
- 3.5%Ni钢焊接技术的最近进展.pdf
- 3.5%Ni钢焊接接头低温韧性的研究二──焊后热处理母材及焊材的影响.pdf
- 3.5%Ni钢焊接接头低温韧性的研究一──线能量层间温度的影响.pdf
- 3.5Ni钢低温设备的制造和焊接.pdf