当前位置: 首页 > wzjs >正文

软件开发与网站开发手机最新产品新闻

软件开发与网站开发,手机最新产品新闻,中国互联网协会是什么单位,汉口网站建设公司背景 工作中肯定会有导入excel还附带图片附件的下面是我解析的excel,支持图片、pdf、压缩文件实现 依次去解析excel,看看也没有附件,返回的格式是Map,key是第几行,value是附件list附件格式都被解析成pdf格式Reader.jav…

背景

工作中肯定会有导入excel还附带图片附件的下面是我解析的excel,支持图片、pdf、压缩文件

实现

依次去解析excel,看看也没有附件,返回的格式是Map,key是第几行,value是附件list附件格式都被解析成pdf格式

Reader.java


package com.ruoyi.srm.service;import java.util.List;import org.apache.poi.ss.usermodel.Workbook;import com.ruoyi.srm.domain.req.CapacityReceivingReq.FileListBean;public interface Reader {/*** @param workbook* @param targetRow 目标行索引(例如第3行,索引从0开始)* @return*/List<FileListBean> read(Workbook workbook, int targetCol);}

ReaderComposite.java


package com.ruoyi.srm.service.impl;import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import com.ruoyi.srm.domain.req.CapacityReceivingReq.FileListBean;
import com.ruoyi.srm.service.Reader;@Component
public class ReaderComposite {@Autowiredprivate List<Reader> readerList;/*** @param workbook* @param targetRow 目标行索引(例如第3行,索引从0开始)* @return*/public Map<String, List<FileListBean>> read(Workbook workbook, int targetCol) {return readerList.stream().map(reader -> reader.read(workbook, targetCol)).flatMap(Collection::stream).collect(Collectors.groupingBy(t -> t.getLine() + ""));}}

ImageReader.java


package com.ruoyi.srm.service.impl;import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Base64;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFPicture;
import org.apache.poi.xssf.usermodel.XSSFPictureData;
import org.apache.poi.xssf.usermodel.XSSFShape;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.springframework.boot.system.ApplicationHome;
import org.springframework.stereotype.Component;import com.ruoyi.srm.domain.req.CapacityReceivingReq.FileListBean;
import com.ruoyi.srm.service.Reader;import cn.hutool.core.io.FileUtil;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;@Slf4j
@Component
public class ImageReader implements Reader {/*** @param workbook* @param targetRow 目标行索引(例如第3行,索引从0开始)* @return*/@Override@SneakyThrowspublic List<FileListBean> read(Workbook workbook, int targetCol) {ApplicationHome home = new ApplicationHome();String rootPath = home.getDir().getAbsolutePath() + File.separator + "extract" + File.separator;List<FileListBean> result = new ArrayList<>();Map<String, AtomicInteger> counter = new HashMap<>();// 指定要读取图片的工作表和单元格位置Sheet sheet = workbook.getSheetAt(0); // 第一个工作表// 遍历所有绘图对象(包含图片)if (sheet instanceof XSSFSheet) {XSSFSheet xssfSheet = (XSSFSheet) sheet;XSSFDrawing drawing = xssfSheet.getDrawingPatriarch();if (drawing != null) {// 遍历所有形状(包括图片)String dir = rootPath + "_" + System.currentTimeMillis();for (XSSFShape shape : drawing.getShapes()) {if (shape instanceof XSSFPicture) {XSSFPicture picture = (XSSFPicture) shape;XSSFClientAnchor anchor = (XSSFClientAnchor) picture.getAnchor();// 检查图片的左上角是否在目标单元格int targetRow = anchor.getRow1();if (anchor.getCol1() == targetCol) {AtomicInteger integer = counter.computeIfAbsent(targetRow + "_" + targetCol, k -> new AtomicInteger());// 提取图片数据XSSFPictureData pictureData = picture.getPictureData();byte[] imageBytes = pictureData.getData();// 保存图片到本地new File(dir).mkdirs();String filePath = dir + File.separator + "image_" + (targetRow + 1) + "_" + targetCol + "_" + integer.incrementAndGet() + "." + pictureData.suggestFileExtension();try (FileOutputStream out = new FileOutputStream(filePath)) {out.write(imageBytes);log.info("第{}行图片已保存到: {}", targetRow + 1, filePath);String encodeToString = Base64.getEncoder().encodeToString(FileUtil.readBytes(filePath));String mimeType = FileUtil.getMimeType(filePath);if ("image/jpeg".equals(mimeType)) {encodeToString = "data:image/png;base64," + encodeToString;}result.add(new FileListBean().setFileName(new File(filePath).getName()).setContent(encodeToString).setLine(targetRow));}}}}}}return result;}
}

AttachmentReader.java


package com.ruoyi.srm.service.impl;import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Base64;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
import org.apache.commons.io.IOUtils;
import org.apache.poi.ooxml.POIXMLDocumentPart;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFObjectData;
import org.apache.poi.xssf.usermodel.XSSFShape;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.tika.Tika;
import org.springframework.boot.system.ApplicationHome;
import org.springframework.stereotype.Component;import com.ruoyi.srm.domain.req.CapacityReceivingReq.FileListBean;
import com.ruoyi.srm.service.Reader;import cn.hutool.core.io.FileUtil;
import lombok.Cleanup;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;@Slf4j
@Component
public class AttachmentReader implements Reader {/*** @param workbook* @param targetRow 目标行索引(例如第3行,索引从0开始)* @return*/@Override@SneakyThrowspublic List<FileListBean> read(Workbook workbook, int targetCol) {ApplicationHome home = new ApplicationHome();String rootPath = home.getDir().getAbsolutePath() + File.separator + "extract" + File.separator;List<FileListBean> result = new ArrayList<>();Map<String, AtomicInteger> counter = new HashMap<>();// 1. 获取所有嵌入对象Sheet sheet = workbook.getSheetAt(0); // 第一个工作表// 1. 获取所有嵌入对象XSSFSheet xssfSheet = (XSSFSheet) sheet;List<POIXMLDocumentPart> relationList = xssfSheet.getRelations();// 在遍历嵌入对象时,检查锚点位置for (POIXMLDocumentPart part : relationList) {if (part instanceof XSSFDrawing) {XSSFDrawing drawing = (XSSFDrawing) part;for (XSSFShape shape : drawing.getShapes()) {if (shape instanceof XSSFObjectData) {XSSFObjectData objData = (XSSFObjectData) shape;XSSFClientAnchor anchor = (XSSFClientAnchor) objData.getAnchor();// 检查锚点是否在目标位置(例如第3行第2列,即B3)int targetRow = anchor.getRow1(); // 行索引从0开始if (anchor.getCol1() == targetCol) {AtomicInteger integer = counter.computeIfAbsent(targetRow + "_" + targetCol, k -> new AtomicInteger());// 提取并保存文件byte[] objectData = objData.getObjectData();@CleanupPOIFSFileSystem poifs = new POIFSFileSystem(new ByteArrayInputStream(objectData));String symbol = "\u0001Ole10Native";if (poifs.getRoot().getEntryNames().contains(symbol)) {InputStream contentStream = poifs.createDocumentInputStream(symbol);String dir = rootPath + "_" + System.currentTimeMillis();new File(dir).mkdirs();String name = "";byte[] byteArray = IOUtils.toByteArray(contentStream);Tika tika = new Tika();String detect = tika.detect(byteArray);System.err.println(detect);if ("application/pdf".equals(detect)) {name = dir + File.separator + "pdf_" + (targetRow + 1) + "_" + targetCol + "_" + integer.incrementAndGet() + ".pdf";} else if ("application/octet-stream".equals(detect)) {
//                                    name = dir + ".zip"; 注释
//                                    @Cleanup
//                                    ZipArchiveInputStream seek = new ZipArchiveInputStream(new ByteArrayInputStream(byteArray));
//                                    try {
//                                        seek.getNextEntry();
//                                    } catch (Exception e) {
//                                        log.debug("解析zip失败.尝试解析成图片");
//                                        name = dir + File.separator + "image_" + (targetRow + 1) + "_" + targetCol + "_" + integer.incrementAndGet() + ".jpg";
//                                    }}@CleanupFileOutputStream out = new FileOutputStream(name);out.write(byteArray);log.info("第{}行{}文件保存成功: {}", targetRow + 1, detect, name);if (name.endsWith(".zip")) {@CleanupZipArchiveInputStream zis = new ZipArchiveInputStream(new FileInputStream(name));ZipArchiveEntry entry;while ((entry = zis.getNextEntry()) != null) {if (entry.isDirectory()) {log.warn("是目录");} else {// 如果是文件,则解压文件File file = new File(dir, entry.getName());try (FileOutputStream out2 = new FileOutputStream(file)) {byte[] buffer2 = new byte[1024];int len;while ((len = zis.read(buffer2)) > 0) {out2.write(buffer2, 0, len);}}log.info("第{}提取{}已保存到: {}", targetRow + 1, entry.getName(), file.getAbsolutePath());}}}// 转base64Arrays.stream(FileUtil.ls(dir)).forEach(item -> {// System.err.println(item.getName());extracted(result, targetRow, item);});}}}}}}return result;}private static void extracted(List<FileListBean> result, int targetRow, File item) {String path = item.getPath();String encodeToString = Base64.getEncoder().encodeToString(FileUtil.readBytes(path));String mimeType = FileUtil.getMimeType(path);// System.err.println(mimeType);if ("image/jpeg".equals(mimeType)) {encodeToString = "data:image/png;base64," + encodeToString;} else {// System.err.println(encodeToString);}result.add(new FileListBean().setFileName(item.getName()).setContent(encodeToString).setLine(targetRow));}
}
http://www.dtcms.com/wzjs/161975.html

相关文章:

  • 上海 餐饮网站建设微平台推广
  • 跨境电商代运营公司十强网站关键词优化排名外包
  • java做网站建设后台b站推广入口2023mmm
  • 通过模版做网站搜索引擎推广的关键词
  • 深圳做手机商城网站建设2021拉新推广佣金排行榜
  • 初学php者网站首页怎么做品牌推广与传播
  • 长沙企业建站系统百度网页
  • 在线ppt制作网站有哪些站长推荐产品
  • 南京网站建设知识做任务赚佣金的正规平台
  • 做网站被骗去哪投诉百度竞价推广培训
  • 衡水网站建设公司联系电话seo技术培训海南
  • 义乌购物网站建设多少钱网站快速建站
  • 网站客服弹窗代码马鞍山seo
  • 建设网站材料可以下载吗石家庄自动seo
  • 百度公司做网站可靠吗樱花bt引擎
  • 临沂网站制作网站近两年成功的网络营销案例
  • 和人妖做的视频网站长沙市云网站建设
  • 做外围什么网站有客户2023年6月份疫情严重吗
  • 成功网站建设案例网络营销师课程
  • 深圳市建设工程交易中心网站如何免费推广网站
  • 凡科网站是什么做的2022年五月份热点事件
  • 佛山专业英文网站建设学生个人网页设计模板
  • 福建住房和城乡建设部网站百度推广深圳分公司
  • 拨付网站建设费用的报告360开户推广
  • jsp动态网站开发环境搭配郑州网站建设专业乐云seo
  • 闵行网站建设苏州seo关键词排名
  • dramwaver做网站太原百度seo排名软件
  • 视频网站建设工具标题优化怎样选关键词
  • 魅影看b站直播可以吗手机竞价托管 微竞价
  • 手机网站建设经验百度推广费用一天多少钱