解析excel中的图片

解析excel中的图片

前言

初始化数据是,需要将excel中的数据解析并插入数据库。

但是某几列存放的是图片,这时候怎么办呢。

主要解决的是:获取excel中指定行列的图片字节。


一、pom依赖

解析文件的依赖

java 复制代码
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
        </dependency>
        
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version>
        </dependency>

如果执行接口报错的话,可能是poi和log4j有冲突,log4j换成下面的依赖

java 复制代码
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.17.1</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.17.1</version>
</dependency>

二、使用步骤

1.示例数据

excel的M、N列是图片,对应index为:12、13

2.代码如下(示例):

java 复制代码
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Row;
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.XSSFWorkbook;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.multipart.MultipartFile;


@GetMapping(value = "/uploadPointFile")
    public List<String> uploadPointFile(@RequestParam(value = "file") MultipartFile file) throws Exception {
        LinkedList<String> insertSql = new LinkedList<>();
        String OG_POINT = "INSERT INTO `table_one`(`id`, `city`, `district`, `street`, `community`, `name`, `address`, `deleted`, `gaoDe_log`, `gaoDe_lat`, `label`, `contact_user`, `contact_mobile`,  `remark`,`link_path`, `create_community`, `created_time`, `updated_time`) VALUES ('%s',  '%s', '%s', '%s', '%s', '%s','%s', 0, '%s', '%s', '%s', '%s', '%s', '%s','%s', '510121',now(),now());";
        String OGP_PICTURE = "INSERT INTO `table_two`(`id`, `point_id`, `picture_url`, `deleted`, `created_time`, `updated_time`) VALUES ('%s', '%s', 'https://xxxxx/x/%s', 0,now(),now());";

        InputStream inputStream = file.getInputStream();
        Workbook workbook = new XSSFWorkbook(inputStream);
        // 获取第一个工作表
        Sheet sheet = workbook.getSheetAt(0);
        for (Row row : sheet) {
            if (row.getRowNum() == 0) {
                continue; // 跳过表头
            }
            String uuid = UUID.randomUUID().toString().replaceAll("-", "");
            // 获取前两列内容作为图片名
            String ogSql = String.format(OG_POINT, uuid, row.getCell(0).toString().substring(0, 4), row.getCell(0).toString(), row.getCell(1).toString(), row.getCell(2).toString(), row.getCell(3).toString(), row.getCell(4).toString(), row.getCell(5).toString(), row.getCell(6).toString(), row.getCell(7).toString(), row.getCell(8).toString(), row.getCell(9).toString(), row.getCell(10).toString(), row.getCell(11).toString());
            //打印point 的sql
            insertSql.add(ogSql);
            // 获取工作表中的绘图对象
            XSSFDrawing drawing = (XSSFDrawing) sheet.getDrawingPatriarch();
            if (drawing == null) {
                continue; // 如果没有绘图对象则跳过
            }
            // 获取所有形状
            List<XSSFShape> shapes = drawing.getShapes();
            for (XSSFShape shape : shapes) {
                if (shape instanceof XSSFPicture) {
                    XSSFPicture picture = (XSSFPicture) shape;
                    XSSFClientAnchor anchor = (XSSFClientAnchor) picture.getAnchor();
                    // 检查图片是否在目标单元格中
                    if (row.getRowNum() == anchor.getRow1() && (anchor.getCol1() == 12 || anchor.getCol1() == 13)) {
                        // 获取图片数据
                        XSSFPictureData pictureData = picture.getPictureData();
                        byte[] pictureBytes = pictureData.getData();
                        String fileExtension = pictureData.suggestFileExtension();
                        //调用文件上传接口
                        String pictureUrl = "xxxxxxx";
                        String pictureUuid = UUID.randomUUID().toString().replaceAll("-", "");
                        String pictureSql = String.format(OGP_PICTURE, pictureUuid, uuid, pictureUrl);
                        insertSql.add(pictureSql);
                    }
                }
            }
        }
        return insertSql;
    }

总结

没有总结,歪比巴卜

相关推荐
聂 可 以4 分钟前
调整IntelliJ IDEA当前文件所在目录(包路径)的显示位置
java·ide·intellij-idea
东阳马生架构11 分钟前
Sentinel源码—7.参数限流和注解的实现一
java·sentinel
李白的粉18 分钟前
基于springboot的在线教育系统
java·spring boot·毕业设计·课程设计·在线教育系统·源代码
码农10087号31 分钟前
Hot100方法及易错点总结2
java
iuyou️1 小时前
Spring Boot知识点详解
java·spring boot·后端
北辰浮光1 小时前
[Mybatis-plus]
java·开发语言·mybatis
一弓虽1 小时前
SpringBoot 学习
java·spring boot·后端·学习
南客先生1 小时前
互联网大厂Java面试:RocketMQ、RabbitMQ与Kafka的深度解析
java·面试·kafka·rabbitmq·rocketmq·消息中间件
ai大佬1 小时前
Java 开发玩转 MCP:从 Claude 自动化到 Spring AI Alibaba 生态整合
java·spring·自动化·api中转·apikey
Mr__Miss2 小时前
面试踩过的坑
java·开发语言