Springboot——使用poi实现excel动态图片导入解析

news/2024/10/12 17:05:15/

文章目录

  • 前言
  • 依赖引入
  • 导入实现
    • 方式一
    • 方式二
  • 导出参考

前言

最近要实现一个导入导出的功能点,需要能将带图片的列表数据导出到excel中,且可以导入带图片的excel列表数据。

考虑到低代码平台的表头与数据的不确定性,技术框架上暂定使用Apache-POI。

依赖引入

由于POI的包很多种,为了避免引入不全导致的运行报错问题,这里使用Springboot技术,引入主要依赖如下:

<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.1.3</version>
</dependency>

导入实现

经过查阅相关的资料、案例等,目前导入解析有两种方式。

本次自测使用的excel模板如下样式
在这里插入图片描述

方式一

该方式可以解析所有的数据,多张图片仅能解析出一张,但不能定位出图片的下标位置信息。仅用于参考。

import org.apache.commons.compress.utils.Lists;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFPictureData;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Base64;
import java.util.Iterator;
import java.util.List;@RestController
@RequestMapping("/poi")
public class TestController {/*** excel上传解析,能获取数据和图片* 但图片多张只能拿到一张,且无法获取位置点* @param file* @return* @throws IOException*/@PostMapping("/upload")public String upload(MultipartFile file) throws IOException {List<List<String>> data = Lists.newArrayList();Workbook workbook = new XSSFWorkbook(file.getInputStream());Sheet sheet = workbook.getSheetAt(0);Iterator<Row> rowIterator = sheet.iterator();while (rowIterator.hasNext()) {Row row = rowIterator.next();List<String> rowData = new ArrayList<>();Iterator<Cell> cellIterator = row.iterator();while (cellIterator.hasNext()) {Cell cell = cellIterator.next();rowData.add(getCellValueAsString(cell));}data.add(rowData);}// 处理图片List<String> imageList = new ArrayList<>();List<XSSFPictureData> allPictures = (List<XSSFPictureData>) workbook.getAllPictures();for (XSSFPictureData pictureData : allPictures) {byte[] bytes = pictureData.getData();String mimeType = pictureData.getMimeType();imageList.add(new String(bytes,"UTF-8"));}workbook.close();return "";}private String getCellValueAsString(Cell cell) {CellType cellType = cell.getCellType();switch (cellType) {case STRING:return cell.getStringCellValue();case NUMERIC:return String.valueOf(cell.getNumericCellValue());case BOOLEAN:return String.valueOf(cell.getBooleanCellValue());default:return "";}}
}

断点查看导入解析的信息结果,如下所示:
在这里插入图片描述

方式二

相比方式一的逻辑,采取一种新的解析方式,迭代 sheet.getDrawingPatriarch()的结果集进行判断。

但这样只能拿到图片,数据部分可以参考方式一去取。

/*** excel 上传解析图片* 多张都能获取,且能获取位置点* 行 row 与 列 col 从下标 0 开始计算* @param file* @return* @throws IOException*/
@PostMapping("/upload2")
public String upload2(MultipartFile file) throws IOException {// 多张图片,以一样的时间戳开头,行与列组成名称long timeMillis = System.currentTimeMillis();XSSFWorkbook tempWorkBook = new XSSFWorkbook(file.getInputStream());// 获取模板sheet页Sheet sheet = tempWorkBook.getSheetAt(0);Drawing<?> drawing = sheet.getDrawingPatriarch();for (Shape shape : drawing) {if (shape instanceof Picture) {System.out.println("  ");Picture picture = (Picture) shape;ClientAnchor anchor = picture.getClientAnchor();int row1 = anchor.getRow1();short col1 = anchor.getCol1();System.out.println("row:"+row1+" col:"+col1);PictureData pictureData = picture.getPictureData();byte[] data = pictureData.getData();System.out.println(Base64.getEncoder().encodeToString(data));String imgType = pictureData.suggestFileExtension();// 将图片保存到项目路径下OutputStream outputStream = new FileOutputStream(timeMillis+"__"+row1+"_"+col1+"_img."+imgType);outputStream.write(data);outputStream.close();}}tempWorkBook.close();return "";
}

运行后的效果如下所示:
在这里插入图片描述
通过控制台中的打印位置信息,对比excel文件,能够定位图片所在单元格。
在这里插入图片描述

导出参考

Li-Zzz 的 导出Excel实现一单元格导出多图片


http://www.ppmy.cn/news/1537944.html

相关文章

在线matlab环境

登陆https://ww2.mathworks.cn/ 在线文档https://ww2.mathworks.cn/help/index.html 在线环境[需要先登陆]

雷池社区版本SYSlog使用教程

雷池会对恶意攻击进行拦截&#xff0c;但是日志都在雷池机器上显示 如何把日志都同步到相关设备进行统一的管理和分析呢&#xff1f; 如需将雷池攻击日志实时同步到第三方服务器, 可使用雷池的 Syslog 外发 功能 启用 Syslog 外发 进入雷池 系统设置 页面, 配置 Syslog 设置…

拿到snp的rawdata后如何使用GATK进行筛选(GATK硬筛选文档翻译)

这篇文档旨在提供一些关于我们通常推荐的硬性过滤逻辑的见解&#xff0c;作为 VQSR&#xff08;我们通常推荐用于过滤生殖系短变异的方法&#xff09;的替代方法。希望这篇指南能够帮助您适应这些推荐&#xff0c;或者开发出适用于与我们常用数据集显著不同的数据集的新过滤方法…

XHTML 简介

XHTML 简介 XHTML,即“可扩展超文本标记语言”(eXtensible HyperText Markup Language),是一种基于XML的标记语言,旨在取代HTML作为网页内容的标准格式。XHTML由万维网联盟(W3C)开发,旨在实现HTML向XML的过渡,提供更严格、更清晰的语法规则。本文将详细介绍XHTML的历…

万字详解AI实践,零手写编码用AI完成开发 + 数据清洗 + 数据处理 的每日新闻推荐,带你快速成为AI大神

用AIdify完成前后端开发数据处理和数据清洗。 引言数据获取和数据处理dify构建workflow进行数据清洗前端页面构建和前后端交互总结 引言 AI时代对开发人员的加强是非常明显的&#xff0c;一个开发人员可以依靠AI横跨数个自己不熟悉的领域包括前后端、算法等。让我们来做个实践…

鸿蒙NEXT开发-面试题库(最新)

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

【Sceneform-EQR】(手势优化)通过手势事件实现在AR/VR等三维场景中的控制模型旋转、平移与缩放

在上一篇文档中&#xff0c;我们实现了通过手势控制模型节点的旋转、缩放和平移。现在本文将介绍如何优化上一篇做的手势控制器&#xff0c;从而实现更好的跟手效果。 相关链接&#xff1a;【Sceneform-EQR】&#xff08;手势控制器实现&#xff09;通过手势事件实现在AR/VR等…

【C++】——继承(下)

【C】——继承&#xff08;下&#xff09; 5 继承与友元6 继承与静态成员7 多继承7.1 继承模型7.2 菱形继承的问题7.3 虚继承7.4 多继承中的指针偏移问题 8 组合与继承 5 继承与友元 友元关系不能被继承。即一个函数是父类的友元函数&#xff0c;但不是子类的友元函数。也就是说…