Java导出excel带图片(希望能帮助你们节省时间)

第一天太慌张,下班逃跑,一夜没睡好,第二天决定搞出来。
查了好多博客,感觉都挺繁琐的,好多工具类、引入类找不到。经过一上午的琢磨,终于搞定。记录一下

借鉴了这个博主的文章

需求前端点击导出按钮,导出excel,并且带出图片

在这里插入图片描述

引入pom依赖

  <!-- poi处理 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.17</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17</version>
        </dependency>

        <dependency>
            <groupId>com.github.ulisesbocchio</groupId>
            <artifactId>jasypt-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.1.4</version>
        </dependency>

我使用了excel模板,放到了resources下
在这里插入图片描述

使用Get请求

//通过模板文件,导入模板数据,并在浏览器端下载 startTime endTime
    @GetMapping("/exportAddressLog")
    public void exportAddressLog(@RequestParam(value = "startTime") String startTime,@RequestParam(value = "endTime") String endTime,HttpServletResponse response) throws Exception {
        URL resource = getClass().getClassLoader().getResource("Address.xlsx");
        String path = resource.getPath();

        //文件输入流
        FileInputStream in = new FileInputStream(path);
        //创建excel流(从指定文件流)
        Workbook excel = WorkbookFactory.create(in);
        //定义数据
        List<AddressLogResource> excelDataList = logService.getAddressLogList(startTime, endTime);
        //获取第一页
        Sheet sheet = excel.getSheetAt(0);
        //填充数据
        for (int i = 0; i < excelDataList.size(); i++) {
            //模板文件从第三行开始填
            Row row = sheet.createRow(i+1);
            int columnIndex4 = 4; // 设置第4列的宽度
            int columnIndex3 = 4; // 设置第4列的宽度
            int width4 = 20; // 设置宽度值为20个字符
            int width3 = 40; // 设置宽度值为20个字符
            sheet.setColumnWidth(columnIndex3, width3 * 256);
            sheet.setColumnWidth(columnIndex4, width4 * 256);
            row.setHeight((short) (160*10));
            Cell cell = row.createCell(0);
            Cell cell1 = row.createCell(1);
            Cell cell2 = row.createCell(2);
            Cell cell3 = row.createCell(3);
            Cell cell4 = row.createCell(4);
            Cell cell5 = row.createCell(5);
            //第一个单元格填排名
            cell.setCellValue(i + 1);
            //第二个单元格填姓名
            cell1.setCellValue(excelDataList.get(i).getAddressCoordinate());
            //第三个单元格填分数
            cell2.setCellValue(excelDataList.get(i).getAddressName());
            cell3.setCellValue(excelDataList.get(i).getCameraSn());
            LocalDateTime logTime = excelDataList.get(i).getLogTime();
            String dateTimeStr = logTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
            System.out.println("当前字符串日期时间:" + dateTimeStr);
            cell4.setCellValue(dateTimeStr);
            //插入图片
            String img = excelDataList.get(i).getImagePath();
            imgxx(img,sheet,i,5,excel);
//            cell4.setCellValue(excelDataList.get(i).getImagePath());
        }
        //设置Content-Type为appl ication/vnd.openxmLformats -officedocument. spreadsheetmL. sheet
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        //设置Content-Dispositiontattachment;filename-excel.xLsx,表示将文件下载到本地,并指定文件名为excel.xLsx
        response.setHeader("Content-Disposition", "attachment;filename=excel.xlsx");
        // 通过输出流将Excel文件下载到客户端浏览器
        ServletOutputStream out = response.getOutputStream();
        excel.write(out);
        out.flush();
        //关闭资源
        out.close();
        excel.close();

    }

插入图片单独抽出的方法

//插入图片
    private String imgxx(String img, Sheet sheet,int i,int j,Workbook excel){
        URL photoFile = null;
        try {
            photoFile = new URL(img);

            // 先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray
            ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
            //将图片读入BufferedImage对象
            BufferedImage bufferImg = ImageIO.read(photoFile);
            // 将图片写入流中
            ImageIO.write(bufferImg, "jpg", byteArrayOut);
            // 利用HSSFPatriarch将图片写入EXCEL
            Drawing<?> patriarch = sheet.createDrawingPatriarch();
            // 图片一导出到单元格I3-5中 列开始:8 行开始:2 列结束:9 行结束:5
            XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, j, i + 1, j, i + 1);
            anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);
            // 插入图片内容
            Picture picture =  patriarch.createPicture(anchor, excel.addPicture(byteArrayOut
                    .toByteArray(), XSSFWorkbook.PICTURE_TYPE_JPEG));
            picture.resize(1,1);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

导出的图片
在这里插入图片描述
前端不能使用ajax访问,直接使用 location.href= url
在这里插入图片描述
在这里插入图片描述
OK…收工

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/662871.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HackTheBox-Machines--Lazy

Lazy测试过程 1 信息收集 1.端口扫描 发现 SSH&#xff08;22&#xff09;、HTTP&#xff08;80&#xff09;端口 nmap -sC -sV 10.129.159.512.访问 80 端口 1.页面中存在注册功能&#xff0c;测试注册功能 页面返回登录页面及用户名 使用burpsuite观察注册请求 /register.p…

骑车不戴头盔监测摄像机

骑行是一种健康的出行方式&#xff0c;但是在骑行途中不戴头盔存在安全隐患&#xff0c;容易造成头部受伤。为了规范骑行行为&#xff0c;保障骑行安全&#xff0c;可以考虑使用骑车不戴头盔监测摄像机进行监测和识别。这种摄像机可以通过智能识别技术&#xff0c;实时监测骑自…

Centos7时区设置及手动修改时间

一、修改系统时区 1、查看时区命令 timedatectl 2、设置时区命令 #下面将时区设置为上海时区 timedatectl set-timezone Asia/Shanghai 3、查看时区看一下新时区有没有生效 timedatectl 二、手动修改系统时间 修改系统时间 date -s "2023-12-25 16:05:10" 查…

串口调试助手中文乱码 解决方案

输出乱码 一般&#xff0c;当串口调试助手输出乱码时&#xff0c;可能有以下几个原因&#xff1a; 波特率设置错误&#xff1a;串口通信需要保证发送和接收的设备使用相同的波特率。请检查串口调试助手和目标设备的波特率设置是否一致。 数据位、停止位或校验位设置错误&…

自建视频托管平台:MediaCMS

目录 1 MediaCMS简介1.1 介绍1.2 特性1.3 应用场景 2 安装配置2.1 安装1、安装2、汉化 2.2 一些常见配置 3 简单使用3.1 上传3.2 下载3.3 添加标题或者字幕3.4 通过Tag/Category实现视频/文件分类添加 Tag给任一资源分类 1 MediaCMS简介 1.1 介绍 MediaCMS是一个现代的&#…

Vue项目运行页面禁止缩放【移动端和PC端都禁止缩放】解决方案

Vue项目运行页面禁止缩放【移动端和PC端都禁止缩放】解决方案&#xff0c;有的人手很J,总喜欢放大缩小&#xff0c;从而会导致页面错乱&#xff0c;以下是解决方案&#xff0c;简单有效 效果图PC&#xff1a;滚轮缩放和其他缩放都会禁止 移动端效果图&#xff1a;各种手机平板…

活动会议邀请函制作易企秀源码系统 清爽的画面轻轻滑动自动翻页 带完整的前后端搭建教程

系统概述 在当今数字化时代&#xff0c;活动会议的组织和宣传变得至关重要。为了满足这一需求&#xff0c;活动会议邀请函制作易企秀源码系统应运而生。它不仅为用户提供了一个便捷、高效的工具&#xff0c;还具备一系列令人瞩目的特色功能&#xff0c;为活动会议的成功举办提…

Redis篇 哈希表在redis中的命令

哈希命令 一.哈希表的基本认识二. 哈希表在redis中的命令1.hset,hget2.hdel3.hkeys,hvals4.hexists5.hgetall6.hmget7.hlen8.hincrby和hincrbyfloat 一.哈希表的基本认识 在JAVA数据结构中&#xff0c;我们就已经接触到了哈希表&#xff0c; 在当时&#xff0c;我们主要用到的哈…

香港Web3媒体:Techub News

Techub News&#xff1a;香港领先&#xff0c;世界一流的科技媒体平台 在数字化时代&#xff0c;Web3技术的崛起为媒体行业注入了新的活力。作为香港领先的Web3媒体平台&#xff0c;Techub News凭借其专业的团队、丰富的资源和创新的业务模式&#xff0c;成为了行业内的佼佼者。…

Go开发Prometheus客户端实战步骤

1、项目背景 在当前的IT运维环境中&#xff0c;我们的业务系统日益复杂&#xff0c;特别是针对特定的业务逻辑和定制化需求&#xff0c;传统的通用监控工具往往难以覆盖所有的监控场景。例如&#xff0c;考虑到一个复杂的电商平台&#xff0c;除了基础的服务器性能、网络状况等…

Python+Playwright自动化测试-playwright操作iframe(三)

1.简介 iframe 是web自动化里面一个比较头疼的测试场景&#xff0c;在Selenium中处理 iframe 需要切换来切换去非常麻烦。但是在playwright中&#xff0c;让其变得非常简单&#xff0c;我们在使用中无需切换iframe&#xff0c;直接定位元素即可。 2.iframe是什么 iframe就是我…

异步编程的魔力:如何显著提升系统性能

异步编程的魔力:如何显著提升系统性能 今天我们来聊聊一个对开发者非常重要的话题——异步编程。异步编程是提升系统性能的一种强大手段,尤其在需要高吞吐量和低时延的场景中,异步设计能够显著减少线程等待时间,从而提升整体性能。 异步设计如何提升系统性能? 我们通过…

文心智能体平台丨创建你的四六级学习小助手

引言 在人工智能飞速发展的今天&#xff0c;我们迎来了文心智能体平台。该平台集成了最先进的人工智能技术&#xff0c;旨在为用户提供个性化、高效的学习辅助服务。今天&#xff0c;我们将向大家介绍如何利用文心智能体平台&#xff0c;创建一个专属于你的四六级学习小助手。…

EthernetiP转modbusTCP网关在加氢催化中的应用

在现代工业控制系统中&#xff0c;Ethernet/IP和ModbusTCP是两种常见的通信协议。它们在各种设备和系统间传输数据&#xff0c;实现设备的监控和控制&#xff0c;尤其在催化加氢装置这类关键工业过程中发挥着不可或缺的作用。本文将深入探讨开疆智能KJ-EIP-206型Ethernet/IP转M…

博物馆三维实景vr展示

VR技术应用到地产行业的优势不言而喻&#xff0c;随着购房政策的进一步放宽&#xff0c;购房刚需者借助VR商铺样板间展示系统看房&#xff0c;远比之前跑楼盘更便捷高效。那么VR商铺全景展示具体有哪些好处呢? VR技术与商铺的结合&#xff0c;为客户带来了前所未有的购房体验。…

相对位姿估计

相对位姿估计 示意图 理论推导 离线数据库&#xff1a; P的位置 P [ X , Y , Z ] T P[X,Y,Z]^{T} P[X,Y,Z]T 相机内参 k 1 k_{1} k1​ 安卓手机&#xff1a; 相机内参 k 2 k_{2} k2​ 两个像素点位置 &#xff1a; p 1 和 p 2 p_1和p_2 p1​和p2​ 公式一&#xff1a;…

中断向量码

中断请求引脚 INTR-可屏蔽中断请求信号输入引脚 NMI-不可屏蔽中断请求信号输入引脚 #INTA-可屏蔽中断请求信号应答引脚 IF-中断允许标志位 TF-陷阱标志位 中断向量表 由中断向量码确定中断源的类型 存储结构 中断向量地址 中断程序入口地址 示例 中断类型 内存中结构 5个…

C语言 宏

目录 一、宏定义 1.1 预定义符号 1.2 预处理指令 #define 1.3 带有副作用宏定义 1.4 宏和函数的一个对比 ​编辑 1.5 #undef 二、条件编译 2.1 #if、#else、#elif、#endif 2.2 #ifdef和#ifndef 2.3 C语言中如何通过条件编译来预防头文件的重复包含&#xff1f; 一、宏定义 在C语…

cobaltstrike启动teamserver报错Picked up _JAVA_OPTIONS:

1.报错如下图所示&#xff1a; 解决方法&#xff1a; 这是因为系统环境变量里多了一个变量&#xff1a; _JAVA_OPTIONS 只需要删掉它就行了&#xff01; 1、windows下在环境变量里找到、然后删除就行了 2、linux下、在/etc/profile文件中添加以下命令&#xff08;可添加至第一行…

uniapp或微信小程序一些问题解决

1.按钮边框如何去除&#xff1f; 参考博主&#xff1a;微信小程序按钮去不掉边框_微信小程序button去掉边框-CSDN博客文章浏览阅读1k次。最近在学uni-app&#xff0c;顺便自己写个小程序。左上角放了个button&#xff0c;可边框怎么也去不掉…原来微信小程序的按钮要去掉边框要…