package wps;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.XML;
import org.apache.commons.io.IOUtils;
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.File;
import java.io.FileInputStream;
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, File 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(new FileInputStream(simpleFile));
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);
CellImages cellImages = com.alibaba.fastjson2.JSONObject.parseObject(js.toString(), CellImages.class);
for (CellImages.CellImagesDTO.CellImageDTO cellImageDTO : cellImages.getCellImages().getCellImage()) {
String name = cellImageDTO.getPic().getNvPicPr().getCNvPr().getName();
String embed = cellImageDTO.getPic().getBlipFill().getBlip().getEmbed();
WpsImg wpsImg = wpsImgList.stream().filter(i -> Objects.equals(i.getImgId(), name)).findFirst().orElse(null);
if (Objects.nonNull(wpsImg)) {
wpsImg.setRId(embed);
}
}
}
} finally {
zis.closeEntry();
}
}
} finally {
zis.close();
}
ZipInputStream fzis = new ZipInputStream(new FileInputStream(simpleFile));
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);
CellImageRels cellImageRels = com.alibaba.fastjson2.JSONObject.parseObject(js.toString(), CellImageRels.class);
for (CellImageRels.RelationshipsDTO.RelationshipDTO relationshipDTO : cellImageRels.getRelationships().getRelationship()) {
String id = relationshipDTO.getId();
String target = "/xl/" + relationshipDTO.getTarget();
WpsImg wpsImg = wpsImgList.stream().filter(i -> Objects.equals(i.getRId(), id)).findFirst().orElse(null);
if (Objects.nonNull(wpsImg)) {
wpsImg.setImgName(target);
}
}
}
} finally {
fzis.closeEntry();
}
}
} finally {
fzis.close();
}
Workbook workbook = WorkbookFactory.create(simpleFile);
List<XSSFPictureData> allPictures = (List<XSSFPictureData>) workbook.getAllPictures();
for (XSSFPictureData pictureData : allPictures) {
PackagePartName partName = pictureData.getPackagePart().getPartName();
URI uri = partName.getURI();
WpsImg wpsImg = wpsImgList.stream().filter(i -> Objects.equals(i.getImgName(), uri.toString())).findFirst().orElse(null);
if (Objects.nonNull(wpsImg)) {
wpsImg.setPictureData(pictureData);
}
}
Map<String, WpsImg> result = new HashMap<>();
for (WpsImg wpsImg : wpsImgList) {
result.put(wpsImg.getCellStr(), wpsImg);
}
XSSFSheet sheet = (XSSFSheet) workbook.getSheetAt(0);
Map<String, WpsImg> flotPictures = WpsImgUtil.getFlotPictures(sheet);
result.putAll(flotPictures);
return result;
}
/**
* 获取浮动形式的图片
* 以map方式返回
* 键为行列格式 x-y
*
* @param xssfSheet
* @return
*/
public static Map<String, WpsImg> getFlotPictures(XSSFSheet xssfSheet) {
Map<String, WpsImg> map = new HashMap<>();
XSSFDrawing drawingPatriarch = xssfSheet.getDrawingPatriarch();
if (Objects.isNull(drawingPatriarch)) {
return map;
}
List<XSSFShape> list = drawingPatriarch.getShapes();
for (XSSFShape shape : list) {
XSSFPicture picture = (XSSFPicture) shape;
XSSFClientAnchor xssfClientAnchor = (XSSFClientAnchor) picture.getAnchor();
XSSFPictureData pdata = picture.getPictureData();
// 行号-列号
String key = xssfClientAnchor.getRow1() + "-" + xssfClientAnchor.getCol1();
WpsImg wpsImg = new WpsImg();
wpsImg.setPictureData(pdata);
wpsImg.setType(1);
map.put(key, wpsImg);
}
return map;
}
}
excel含图片导入 包含wps嵌入图片 java
需积分: 5 197 浏览量
2023-08-16
20:49:28
上传
评论
收藏 157KB ZIP 举报
rosener
- 粉丝: 85
- 资源: 30
最新资源
- 基于matlab实现用有限元法计算电磁场的Matlab工具 .rar
- 基于matlab实现有限元算法 计算电磁场问题 边界条件包括第一类边界和第二类边界.rar
- 基于matlab实现用于计算不同车重下的电动汽车动力性和经济性.rar
- 基于matlab实现遗传算法求解多车场车辆路径问题 有多组算例可以用.rar
- 浏览器.apk
- 基于matlab实现是一个matlab中的power system 中搭建的一个模型
- 基于JSP毕业设计-教学管理系统(源代码+论文).zip
- 基于JSP毕业设计-家政管理系统-毕业设计.zip
- 基于Python实现淘宝商品评论采集(含逆向)源代码
- 基于matlab实现多目标进化算法NSGAⅡ&Matlab讲解.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈