服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Java中Easyexcel 实现批量插入图片功能

Java中Easyexcel 实现批量插入图片功能

2022-11-23 11:04旭东怪 Java教程

这篇文章主要介绍了Easyexcel 实现批量插入图片,本文通过实例代码给大家介绍了easyexcel文档处理工具、自定义图片处理器的相关知识,需要的朋友可以参考下

各位今天给大家分享Easyexcel 实现批量插入图片的问题,代码如下所示:

1 Maven依赖

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!--hutool工具包-->
       <dependency>
           <groupId>cn.hutool</groupId>
           <artifactId>hutool-all</artifactId>
           <version>5.5.1</version>
       </dependency>
       <!--easyexcel文档处理工具-->
       <dependency>
           <groupId>com.alibaba</groupId>
           <artifactId>easyexcel</artifactId>
           <version>2.2.8</version>
       </dependency>
       <dependency>
           <groupId>org.projectlombok</groupId>
           <artifactId>lombok</artifactId>
           <optional>true</optional>
       </dependency>

2 PictureModel

图片信息。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.xudongbase.easyexcel.model;
import com.xudongbase.easyexcel.model.builder.PictureModelBuilder;
import com.xudongbase.easyexcel.model.common.SheetRangeModel;
import lombok.Getter;
/**
 * 图片信息
 *
 * @author xudongmaster
 */
@Getter
public class PictureModel extends SheetRangeModel {
    /**
     * 图片数据
     */
    private byte[] pictureBytes;
     * 图片类型
    private Integer pictureType;
    public PictureModel(PictureModelBuilder builder) {
        this.sheetName = builder.getSheetName();
        this.startRowIndex = builder.getStartRowIndex();
        this.endRowIndex = builder.getEndRowIndex();
        this.startColumnIndex = builder.getStartColumnIndex();
        this.endColumnIndex = builder.getEndColumnIndex();
        this.pictureBytes = builder.getPictureBytes();
        this.pictureType = builder.getPictureType();
    }
     * 生成图片信息
     *
     * @param sheetName        sheet页名称
     * @param startRowIndex    开始行号
     * @param endRowIndex      结束行号
     * @param startColumnIndex 开始列号
     * @param endColumnIndex   结束列号
     * @param pictureBytes     图片数据
     * @return
    public static PictureModel createPictureModel(String sheetName, int startRowIndex, int endRowIndex, int startColumnIndex, int endColumnIndex
            , byte[] pictureBytes) {
        return createPictureModel(sheetName, startRowIndex, endRowIndex, startColumnIndex, endColumnIndex, pictureBytes, null);
     * @param pictureType      图片类型
            , byte[] pictureBytes, Integer pictureType) {
        return new PictureModelBuilder(sheetName, startRowIndex, endRowIndex, startColumnIndex, endColumnIndex, pictureBytes)
                //图片类型
                .pictureType(pictureType)
                .build();
}

3CustomPictureHandler

自定义图片处理器。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package com.xudongbase.easyexcel.handler;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import com.xudongbase.common.poi.util.POIExcelUtil;
import com.xudongbase.easyexcel.model.PictureModel;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
 * 自定义图片处理器
 *
 * @author xudongmaster
 */
public class CustomPictureHandler implements SheetWriteHandler {
    /**
     * sheet页名称列表
     */
    private List<String> sheetNameList;
     * 图片信息
    private List<PictureModel> pictureList = new ArrayList<>();
    public CustomPictureHandler(List<PictureModel> pictureList) {
        if (CollUtil.isEmpty(pictureList)) {
            return;
        }
        this.pictureList = pictureList.stream().filter(x ->
                StrUtil.isNotBlank(x.getSheetName()) && x.getPictureBytes() != null && x.getPictureBytes().length > 0)
                .collect(Collectors.toList());
        sheetNameList = this.pictureList.stream().map(x -> x.getSheetName()).distinct().collect(Collectors.toList());
    }
    @Override
    public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
     * sheet页创建之后调用
     *
     * @param writeWorkbookHolder
     * @param writeSheetHolder
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        Sheet sheet = writeSheetHolder.getSheet();
        //不需要添加图片,或者当前sheet页不需要添加图片
        if (CollUtil.isEmpty(pictureList) || sheetNameList.contains(sheet.getSheetName()) == false) {
        //获取当前sheet的图片
        List<PictureModel> sheetPictureList = pictureList.stream().filter(x ->
                StrUtil.equals(x.getSheetName(), sheet.getSheetName())
        ).collect(Collectors.toList());
        //当前sheet页不需要图片
        if (CollUtil.isEmpty(sheetPictureList)) {
        for (PictureModel pictureModel : sheetPictureList) {
            //图片数据
            byte[] pictureBytes = pictureModel.getPictureBytes();
            //插入图片
            POIExcelUtil.insertImg(writeWorkbookHolder.getWorkbook(), sheet, pictureBytes, pictureModel.getStartRowIndex()
                    , pictureModel.getEndRowIndex(), pictureModel.getStartColumnIndex(), pictureModel.getEndColumnIndex()
                    , (pictureModel.getPictureType() == null ? Workbook.PICTURE_TYPE_JPEG : pictureModel.getPictureType()));
        //删除图片信息
        pictureList.removeAll(sheetPictureList);
        sheetNameList = pictureList.stream().map(x -> x.getSheetName()).distinct().collect(Collectors.toList());
}

4 调试代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
     * 测试设置图片
     */
    @Test
    public void testPicture() {
        try {
            File file = new File("D:/easyexcel/testPicture.xlsx");
            FileUtil.createNewFile(file);
            //生成表格数据
            List<List<Object>> dataList = new ArrayList<>();
            dataList.add(new ArrayList<>(Arrays.asList(new Object[]{"表头11", "表头2", "表头3", "表头4"})));
            dataList.add(new ArrayList<>(Arrays.asList(new Object[]{"表头17777777777", "表头2", "表头3", "表头4444"})));
            dataList.add(new ArrayList<>(Arrays.asList(new Object[]{"表头31", "表头2", "表头3", "表头4"})));
            dataList.add(new ArrayList<>(Arrays.asList(new Object[]{11.111, 11.111, "11.111", "表头4"})));
            //导出文件
            List<PictureModel> pictureModelList = new ArrayList<>();
            String imgUrl = "https://profile.csdnimg.cn/9/5/B/1_qq_38974638";
            byte[] bytes = HttpUtil.downloadBytes(imgUrl);
            String sheetName="模板";
            pictureModelList.add(PictureModel.createPictureModel(sheetName,0,10,0,4,bytes));
            pictureModelList.add(PictureModel.createPictureModel(sheetName,11,22,0,4,bytes));
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            ExcelWriter excelWriter = EasyExcel.write(fileOutputStream)
                    .inMemory(Boolean.TRUE).registerWriteHandler(new CustomPictureHandler(pictureModelList)).build();
            WriteSheet writeSheet = EasyExcel.writerSheet(sheetName).build();
            excelWriter.write(dataList, writeSheet);
            //千万别忘记finish 会帮忙关闭流
            excelWriter.finish();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

5 调试结果

Java中Easyexcel 实现批量插入图片功能

注:

1、 注册自定义处理器之前必须调用inMemory(Boolean.TRUE)方法。

2、觉得这篇博客写的不错的可以前往Gitee点个Star,源码请查看Gitee的xudongbase项目easyexcel分支。

xudongbase: 主要是项目中可以用到的共通方法,现有easyexcel分支在持续更新中。欢迎大家Star和提交Issues。easyexcel分支:批量设置样式,批量添加批注,批量合并单元格,设置冻结行和列,设置行高列宽,隐藏行和列,绑定下拉框数据,设置水印 - Gitee.com

补充:下面给大家分享基于python语言写的日常小工具向excel中批量添加图片和图片名称

需求:现有一个200张图片的文件夹,向 excel 中 A列,写入图片的名称,向ecxel 中的 E 列插入对应的图片。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
from openpyxl import  load_workbook
from openpyxl.drawing.image import Image
import os
import re
def insert_img_to_excel(filname, by_col,to_col,img_folder):
 
    '''
    filename : 表格文件路径
    by_col : 依靠哪一列
    to_col : 插入到哪一列
    img_folder : 图片路径
    wb = load_workbook(filname)
    ws = wb.active
    # 获取图片名称
    img_fnn = os.listdir(str(img_folder))
    index = 1
     # 将图片名称写入到 excel 中 A 列
    for img_fp in img_fnn:
        s= img_fp.replace(".jpg",'')
        index += 1
        i = 'A' + str(index)
        ws[i].value = s
        wb.save(filname)
    wb.close()
    for ind , c in enumerate(ws[by_col],start=1):
        # 图片文件的绝对路径
        img_lujin = os.path.join(img_folder,c.value + '.jpg')
        try:
            # 设置图片大小
            img_size = Image(img_lujin)
            newsize = (150, 200)
            img_size.width, img_size.height = newsize
            # 将图片写入 excel
            ws.add_image(
                img_size,
                anchor=to_col + str(ind)
            )
        except:
            print(c.value,'匹配不到图片')
    wb.save(filname)
if __name__ == '__main__':
    insert_img_to_excel(
        filname = r'C:\Users\Administrator\Desktop\act_test\mod.xlsx',
        by_col = 'A',
        to_col = 'E',
        img_folder=r"C:\Users\Administrator\Desktop\act_test\Act_img"
    )

到此这篇关于Easyexcel 实现批量插入图片的文章就介绍到这了,更多相关Easyexcel插入图片内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_38974638/article/details/124411365

延伸 · 阅读

精彩推荐
  • Java教程关于远程调用RestTemplate的使用避坑指南

    关于远程调用RestTemplate的使用避坑指南

    这篇文章主要介绍了关于远程调用RestTemplate的使用避坑指南,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...

    河边放牛娃8462022-03-03
  • Java教程Java中数组在内存中存放原理的讲解

    Java中数组在内存中存放原理的讲解

    今天小编就为大家分享一篇关于Java中数组在内存中存放原理的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随...

    yangyongUestc11282021-07-30
  • Java教程IDEA添加Java类注释模版的方法

    IDEA添加Java类注释模版的方法

    本篇文章主要介绍了IDEA添加Java类注释模版的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    shengpli5422021-03-01
  • Java教程Java正则表达式基础语法详解

    Java正则表达式基础语法详解

    这篇文章主要介绍了Java正则表达式语法,包括常用正则表达式、匹配验证-验证Email是否正确以及字符串中查询字符或者字符串,感兴趣的小伙伴们可以参考...

    开机发呆小菜鸟4802022-01-25
  • Java教程Spring 使用Validation 验证框架的问题详解

    Spring 使用Validation 验证框架的问题详解

    Spring Boot在内部通过集成hibernate-validation已经实现了JSR-349验证规范接口,在Spring Boot项目中只要直接使用就行了。 一般用在Controller中用于验证前端传来的参...

    小毕超5272021-10-29
  • Java教程Java判断2个List集合是否相等(不考虑元素的顺序)

    Java判断2个List集合是否相等(不考虑元素的顺序)

    今天小编就为大家分享一篇关于Java判断2个List集合是否相等(不考虑元素的顺序)的文章,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,...

    李学凯4172021-06-06
  • Java教程Spring-Boot框架初步搭建

    Spring-Boot框架初步搭建

    本篇文章主要介绍了Spring-Boot框架初步搭建,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Ryan.Miao5452020-08-28
  • Java教程解决mybatis竟然报Invalid value for getInt()的问题

    解决mybatis竟然报Invalid value for getInt()的问题

    使用mybatis遇到一个非常奇葩的问题,总是报Invalid value for getInt()的问题,怎么解决呢?下面小编通过场景分析给大家代来了mybatis报Invalid value for getInt()的解...

    It''''''''s my code life.5542022-03-07