读取excel中的url链接下载图片并生成新excel保存图片

2023-11-15

1.在实际使用问卷星对班级的学生的健康码、核算记录、行程码进行统计时,导出的excel里是链接而非图片,但是上级要求上交的excel必须是图片为解决该问题,通过以下的main方法解决了该问题。

package com.changshin;

import cn.hutool.core.img.ImgUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.Sheet;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.List;

public class ExcelExe {
    public static void main(String[] args) {
        ExcelWriter writer = null;
        try {
            File file = new File("C:\\Users\\64913\\Desktop\\180522852_0_五(7)班学生和家长健康码、行程码、核酸结果收集_54_54.xlsx");
            FileInputStream input = new FileInputStream(file);
            // 2.应用HUtool ExcelUtil获取ExcelReader指定输入流和sheet
            ExcelReader excelReader = ExcelUtil.getReader(input, "Sheet1");
            // 可以加上表头验证
            // 3.读取第二行到最后一行数据
            List<List<Object>> read = excelReader.read(1, excelReader.getRowCount());
            writer = ExcelUtil.getWriter("D:\\1.xlsx");
            for (int i = 0; i < read.size(); i++) {
                int num = 0;
                for (int j = 0; j < read.get(i).size(); j++) {
                    if (String.valueOf(read.get(i).get(j)).indexOf("http") == 0) {
                        BufferedImage bufferedImage = ImgUtil.read(URLUtil.url(String.valueOf(read.get(i).get(j))));
                        Image image = ImgUtil.scale(bufferedImage, 0.5f);
                        String prix = String.valueOf(read.get(i).get(j));
                        int end = prix.lastIndexOf("?");
                        String prixs = prix.substring(end - 4, end);
                        System.out.println(prixs);
                        byte[] pictureData = ImgUtil.toBytes(image, "jpg");
                        writer.setDefaultRowHeight(70);
                        writer.setColumnWidth(-1, 30);
                        //写入图片
                        writePic(writer, num, i, pictureData, HSSFWorkbook.PICTURE_TYPE_JPEG);

                        num++;
                    }

                }
                System.out.println("当前数据" + i);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            writer.close();
        }

    }


    /**
     * @param writer
     * @param x           单元格x轴坐标
     * @param y           单元格y轴坐标
     * @param pictureData 图片二进制数据
     * @param picType     图片格式
     */
    private static void writePic(ExcelWriter writer, int x, int y, byte[] pictureData, int picType) {
        Sheet sheet = writer.getSheet();
        Drawing drawingPatriarch = sheet.createDrawingPatriarch();
        //设置图片单元格位置
        ClientAnchor anchor = drawingPatriarch.createAnchor(0, 0, 0, 0, x, y, x + 1, y + 1);
        //随单元格改变位置和大小
        anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);
        //添加图片
        int pictureIndex = sheet.getWorkbook().addPicture(pictureData, picType);
        drawingPatriarch.createPicture(anchor, pictureIndex);
    }

}

使用的maven配置为

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.6.6</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>5.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.0.0</version>
        </dependency>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

读取excel中的url链接下载图片并生成新excel保存图片 的相关文章

  • Spring boot 2.0.5.RELEASE和mongo 4.0连接问题

    我正在关注使用 MongoDB 访问数据教程春季网站 https spring io guides gs accessing data mongodb 我将 Mongo DB 服务器版本 4 安装为服务当我使用客户端连接到它时 它的身份验证
  • 帮助我避免 JPA、Hibernate 和 MySQL 的连接超时

    我正在使用 JPA Hibernate 作为提供者 Glassfish 和 MySQL 开发中一切都运行良好 但是当我将应用程序部署到测试服务器并让它运行 大部分空闲 过夜时 我通常会在早上遇到这样的情况 2011 03 09T15 06
  • Java“空白最终字段可能尚未初始化”方法中抛出异常

    我有一些代码 例如 final int var1 if isSomethingTrue var1 123 else throwErrorMethod int var2 var1 throwErrorMethod 的定义如下 private
  • 初始堆大小无效。无法创建Java虚拟机

    我遇到了下一个问题 我尝试通过startup bat手动启动Tomcat 但似乎没有显示任何结果 然后我尝试运行shutdown bat 控制台显示如下 D apache tomcat 7 0 35 bin gt startup bat U
  • 如何为java注释处理器编写自动化单元测试?

    我正在尝试使用 java 注释处理器 我可以使用 JavaCompiler 编写集成测试 事实上我现在正在使用 hickory 我可以运行编译过程并分析输出 问题 即使我的注释处理器中没有任何代码 单个测试也会运行大约半秒 对于以 TDD
  • MediaPlayer.create() 始终返回 null

    我以前用过媒体播放器 从来没有遇到过这个问题 每当我尝试使用 MediaPlayer create 时 该方法都会给我 null 并且我无法播放声音 我有什么遗漏的吗 public class Game extends Activity p
  • c和java语言中的换行符

    现在行分隔符取决于系统 但在 C 程序中我使用 n 作为行分隔符 无论我在 Windows 还是 Linux 中运行它都可以正常工作 为什么 在java中 我们必须使用 n 因为它与系统相关 那么为什么我们在c中使用 n 作为新行 而不管我
  • 按文件名过滤 eclipse 中的警告

    我们使用 Eclipse 进行 Java 开发 并使用 Maven 将 JSP 编译成 servlet 以便在嵌入式 Jetty 实例中使用 这意味着要从 Eclipse 运行该项目 我必须包含 target jsp source 作为源文
  • spring mvc 跟踪引用页面

    在基于注释的弹簧控制器中 如果用户正在url com first page并点击一个链接或提交一份表格指出url com second page 如何制作second page知道url of first page所以这样second pa
  • SwingWorker 在另一个 SwingWorker 的 did 方法中

    首先 我需要通知您 我正在尽最大努力学习如何用 Java 编写代码 虽然有点困难 但我相信我能做到 我过去提交了几个有关 SwingWorkers 等的问题 每一个我都以为我已经做到了 但后来发现我仍然需要学习 希望这一次不是那样的一次 话
  • vm 参数中的 -D 是什么,它表示为什么我们必须在 vm 参数中始终指定 -D

    vm 参数中的 D 是什么 它表示为什么我们必须在 vm 参数中始终指定 D 有什么标准吗 如果是 那是什么以及指定的位置 D 设置当前运行的 java 程序可以访问的属性值 它允许程序员设置程序运行所需的值 但程序不知道这些值是什么 因此
  • 无法自动装配 org.springframework.mail.javamail.JavaMailSender

    尝试运行我的应用程序时遇到以下问题 所有的东西都调试过了 还是一无所获 IDE 毫无问题地找到了 bean 所以我对这里发生的情况感到非常困惑 SEVERE Exception sending context initialized eve
  • 使用 Box2d(适用于 Android)进行碰撞检测?

    有人可以解释一下使用 box2d for android 进行碰撞检测的工作原理吗 我无法理解 BBContactListener 以什么方式工作 BBContactListener listener new BBContactListen
  • JFrame Glasspane 也优于 JDialog,但不应该

    我有一个带有 Glasspane 的 JFrame 未装饰 该框架打开一个 JDialog 也未装饰 也有一个 glassPane 并隐藏自身 setVisible false Glasspanes 通过 setGlassPane 设置 对
  • Java字符串查找和替换的最佳方法?

    我正在寻找 Java 中字符串查找和替换的最佳方法 这是一句话 我的名字叫米兰 人们都知道我叫米兰瓦西奇 我想用 Milan Vasic 替换 Milan 弦 但在我已经有 Milan Vasic 的地方 情况不应该是这样 搜索 替换后的结
  • VirtualHost 在 Ubuntu 14.04 上始终返回 Apache 的默认主机

    我尝试设置默认虚拟主机之外的虚拟主机localhost 每当我尝试呼叫我的虚拟主机时http test我得到了位于目录中的默认 Apache2 索引文件http localhost 此外 apache 在禁用后仍然返回此页面 a2dissi
  • 在 REST Web 服务中接受逗号分隔值

    我正在尝试接收 REST URI 中以逗号分隔值形式的字符串列表 示例 http localhost 8080 com vogella jersey first rest todo test 1 abc test 其中 abc 和 test
  • Struts2中的变量声明

    Struts2中如何声明变量并为该变量赋值 使用设置标签
  • 如何在 Log4j2 - JSON 布局中自定义或删除默认属性

    In Spring Boot 2我已配置的应用程序Log4j2 with JsonLayout像下面这样
  • 使用正则表达式匹配阿拉伯文文本

    我试图使用正则表达式仅匹配阿拉伯语文本 但出现异常 这是我的代码 txt matches P Arabic 这是例外情况 线程 main 中的异常 java util regex PatternSyntaxException 索引 9 附近

随机推荐

  • requests库get方法

    例 r requests get url r 一个包含服务器资源的Response对象 requests get url 构造一个想服务器请求资源的Request对象 Response 包含爬虫返回的全部内容 requests get ur
  • Java8 新特性——流式操作

    流式操作 流 Stream Java8新增 用来处理我们集合的数据 与IO包里的流是完全不同的概念 倒是和Spark Streaming很像 反正是抄的 如何处理集合中的数据呢 为什么引入流 声明式处理数据 元素的内部迭代 不需要做外部迭代
  • 宝塔安装的ftp服务完整URL的形式访问

    宝塔安装的ftp服务完整URL的形式访问 宝塔安装命令 yum install y wget wget O install sh http download bt cn install install 6 0 sh sh install s
  • STM32按键控制LED灯

    因为是按键输入 所以创立两个文件 bsp key c和bsp key h文件 一 bsp key c中需要对按键进行初始化 这个和LED的类似 GPIOA G均是挂在APB2上的 1 时钟 故时钟均为RCC APB2PeriphClockC
  • 保姆式详细过程Ubuntu上传代码至Gitee、Github

    Gitee的用法基本与Github一致 将用Gitee为例 毕竟加载速度快 创建仓库 在Gitee网站右上角点击加号 以下是我一般用的创建格式 可以自行选择 点击创建即可完成 Ubuntu连接Gitee 在终端输入sudo apt get
  • C#笔记(2)---基本语法 [流程控制语句]

    一 条件语句 1 if 语句 语法 if else 可以单独使用if部分 也可以具有else if Example int i 2 if i 0 label4 Text 0 else if i 1 label4 Text 1 else la
  • MySQL必知必会 学习笔记 第十二章 汇总数据

    聚集函数是运行在行组上 计算和返回单个值的函数 对表中数据而非实际数据本身进行汇总 如获取行数 获取某列最值等 除上述函数外 MySQL还支持标准偏差聚集函数 返回某列平均值 SELECT AVG columnName AS avgVal
  • js 文件与文件流之间互换

    直接看代码
  • 梯度优化_神经网络中的梯度优化算法(三)

    Nadam Nadam Nesterov accelerated Adaptive Moment Estimation 结合了Adam和NAG的梯度优化方法 为了将NAG方法融入Adam 需要修改下Adam的momentum项 回顾mome
  • 五子棋小游戏 java版(代码+详细注释)

    游戏展示 这周闲来无事 再来写个五子棋小游戏 基本功能都实现了 包括人人对战 人机对战 界面布局和功能都写的还行 没做到很优秀 但也不算差 如有需要 做个java初学者的课程设计或者自己写着玩玩也都是不错的 非常简单 小白照着就能写出来 完
  • 【JS基础】Number、布尔值、Null和Undefined

    Number 在JS中所有的数值都是Number类型 包括整数和浮点数 小数 区分Number和String typeof console log typeof a 使用Number MAX VALUE 表示数字的最大值 如果超过最大值 则
  • 存储过程相关

    在sybase数据库中检查存储过程是否存在 如存在就删除表记录 如不存在就创建 if exists select 1 from sysobjects where id object id K FY P EncodeQqTitle name
  • QT中的线程与事件循环理解(1)

    1 需要使用多线程管理的例子 一个进程可以有一个或更多线程同时运行 线程可以看做是 轻量级进程 进程完全由操作系统管理 线程即可以由操作系统管理 也可以由应用程序管理 Qt 使用QThread 来管理线程 QWidget widget ne
  • 【Linux常见指令1】

    目录 前言 常用指令 ls指令 whoami pwd cd touch 触摸 mkdir make directory rmdir rm remove mv move 移动 cp copy 拷贝 stat 统计 nano echo gcc
  • 创建计划行确认数量为0的销售订单

    需求 通过BAPI函数创建销售订单 并且计划行里的确认的数量为0 解决方法 使用BAPI BAPI SALESORDER CREATEFROMDAT2创建SO后 再使用函数 SD BACKORDER UPDATE 对确认的数量进行修改 ti
  • 正割函数(sec)

    1 定义 正割与余弦互为倒数 余割与正弦互为倒数 即 sec
  • js获取数组中最大最小值及对应索引值(下标)

    1 使用原生Js实现该功能 主要是通过循环实现 getMaxMin data key gt if data return false let maxIndex 0 let minIndex 0 let maxNum data 0 key 0
  • 蓝桥杯每日一题——填空题·顺子日期

    本题为填空题 只需要算出结果后 在代码中使用输出语句将所填结果输出即可 小明特别喜欢顺子 顺子指的就是连续的三个数字 123 456 等 顺子日期指的就是在日期的 yyyymmdd 表示法中 存在任意连续的三位数是一个顺子的日期 例如 20
  • 惊:FastThreadLocal吞吐量居然是ThreadLocal的3倍!!!

    说明 接着上次手撕面试题ThreadLocal 面试官一听 哎呦不错哦 本文将继续上文的话题 来聊聊FastThreadLocal 目前关于FastThreadLocal的很多文章都有点老有点过时了 本文将澄清几个误区 很多文章关于Fast
  • 读取excel中的url链接下载图片并生成新excel保存图片

    1 在实际使用问卷星对班级的学生的健康码 核算记录 行程码进行统计时 导出的excel里是链接而非图片 但是上级要求上交的excel必须是图片为解决该问题 通过以下的main方法解决了该问题 package com changshin im