解析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;
    }

总结

没有总结,歪比巴卜

相关推荐
猫头虎3 分钟前
如何实现在多跳UDP传输场景,保证单文件和多文件完整传输的成功率?
java·开发语言·网络·python·网络协议·golang·udp
SimonKing1 小时前
深入理解HanLP1.x,填平可能遇到的坑
java·后端·程序员
尘心不灭1 小时前
MyBatis 缓存与 Spring 事务相关笔记
java·spring·mybatis
Java中文社群1 小时前
说说内存泄漏的常见场景和排查方案?
java·后端·面试
C4程序员2 小时前
北京JAVA基础面试30天打卡08
java·开发语言·面试
战族狼魂2 小时前
Excel 连接阿里云 RDS MySQL
mysql·阿里云·云计算·excel
货拉拉技术2 小时前
XXL-JOB参数错乱根因剖析:InheritableThreadLocal在多线程下的隐藏危机
java·分布式·后端
God-Hrh2 小时前
JVM运维
java·开发语言·jvm
mjy_1113 小时前
Linux下的软件编程——文件IO
java·linux·运维
进阶的小名3 小时前
@RequestMapping接收文件格式的形参(方法参数)
java·spring boot·postman