excel导出图片---HSSFWorkbook--SXSSFWorkbook

news2024/9/27 12:15:03

1 概述

平时在工作中,excel导出图片经常会用到,但奈何HSSFWorkbook导出数据数量有限制问题,所以企业里大多都用SXSSFWorkbook格式,很少用HSSFWorkbook。所以今天以这两种格式分别记录下,图片的导出过程。

2 HSSFWorkbook

 @Test
    public void excelImageTestHSSFWorkbook1(){
 
        String[] heads = new String[]{"编号","姓名","年龄","地址","状态","照片"};
        List<Employee> employees = new ArrayList<>();
 
        Employee employee1 = new Employee(1,"张三",23,"郑州","合法");
        Employee employee2 = new Employee(2,"李四",25,"合肥","合法");
        Employee employee3 = new Employee(3,"王五",26,"青岛","合法");
        Employee employee4 = new Employee(4,"王二麻子",27,"上海","合法");
        Employee employee5 = new Employee(5,"赵子龙",28,"北京","合法");
        Employee employee6 = new Employee(5,"刘能",28,"东北","合法");
        employees.add(employee1);
        employees.add(employee2);
        employees.add(employee3);
        employees.add(employee4);
        employees.add(employee5);
        employees.add(employee6);
 
        List<List<String>>  lists = new ArrayList<>();
        employees.forEach(employee -> {
            List<String> list = new ArrayList<>();
            list.add(String.valueOf(employee.getId()));
            list.add(employee.getName());
            list.add(String.valueOf(employee.getAge()));
            list.add(employee.getAddress());
            list.add(employee.getStatus());
            lists.add(list);
        });
 
        FileOutputStream fileOut = null;
        BufferedImage bufferImg = null;
        //先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray
        try {
            HSSFWorkbook wb = new HSSFWorkbook();
            HSSFSheet sheet = wb.createSheet("test picture");
            //填充表头数据
            HSSFRow row = sheet.createRow(0);
            for (int i = 0; i < heads.length; i++) {
                HSSFCell cell = row.createCell(i);
                cell.setCellValue(heads[i]);
            }
            //画图的顶级管理器,一个sheet只能获取一个(一定要注意这点)
            HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
            //填充实际数据
            for (int i = 0; i < lists.size(); i++) {
                //因为第一行表头数据已经填充过,从第二行开始填充
                HSSFRow row2 = sheet.createRow(i + 1);
                List<String> stringList = lists.get(i);
                for (int j = 0; j < stringList.size() ; j++) {
                    HSSFCell cell = row2.createCell(j);
                    cell.setCellValue(stringList.get(j));
                }
                //设置图片列宽度
                sheet.setColumnWidth(5,30 * 256);
                ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
                bufferImg = ImageIO.read(new File("C:\\Users\\LiuBuJun\\Desktop\\timg .jpg"));
                ImageIO.write(bufferImg, "jpg", byteArrayOut);
                //原始宽度
                int width = bufferImg.getWidth();
                //原始高度
                int height = bufferImg.getHeight();
                //计算该列对应高度
                height = (int) Math.round((height * (30 * 13) * 1.0 / width));
                row2.setHeight((short) (height / 5 * 20));
                HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0,(short) 5, (i+1),(short) 6, (i+2));
                //插入图片
                patriarch.createPicture(anchor, wb.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));
            }
            fileOut = new FileOutputStream("D:/测试Excel.xls");
            // 写入excel文件
            wb.write(fileOut);
            System.out.println("----Excle文件已生成------");
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if(fileOut != null){
                try {
                    fileOut.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

导出结果:

2.1 导出要点

要点1:

//设置图片列宽度
sheet.setColumnWidth(5,30 * 256);
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
bufferImg = ImageIO.read(new File("C:\\Users\\LiuBuJun\\Desktop\\timg .jpg"));
ImageIO.write(bufferImg, "jpg", byteArrayOut);
//原始宽度
int width = bufferImg.getWidth();
//原始高度
int height = bufferImg.getHeight();
//计算该列对应高度
height = (int) Math.round((height * (30 * 13) * 1.0 / width));
row2.setHeight((short) (height / 5 * 20));

首先定义列的宽度,然后创建ByteArrayOutputStream,读取照片,并且根据照片的原本高度和宽度,计算导出到excel中的高度和宽度。

要点2:

/**
 * 该构造函数有8个参数
 * 前四个参数是控制图片在单元格的位置,分别是图片距离单元格left,top,right,bottom的像素距离
 * 后四个参数,前两个个表示图片左上角所在的cellNum1和 rowNum1,后两个参数对应的表示图片右下角所在的cellNum2和 rowNum2,其实cellNum2-cellNum1就是图片的宽度所占单元格,rowNum2-rowNum1就是图片高度所占单元格
 * excel中的cellNum和rowNum的index都是从0开始的
 */
HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0,(short) 5, (i+1),(short) 6, (i+2));

3 SXSSFWorkbook

以上只是部分内容,为了维护方便,本文已迁移到新地址:excel导出图片—HSSFWorkbook–SXSSFWorkbook – 编程屋

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【刷题3】找到字符串中所有字母异位词、串联所有单词的子串

目录 一、找到字符串中所有字母异位词二、串联所有单词的子串 一、找到字符串中所有字母异位词 题目&#xff1a; 思路&#xff1a; 用一个变量count来统计有效字符的个数。哈希表2统计字符串p的每个字符出现的个数&#xff0c;然后遍历字符串s&#xff0c;先进窗口&#xf…

怎么测试射频芯片质量的好坏?

无论是手机通信&#xff0c;还是卫星导航&#xff0c;射频芯片都是其核心组件之一。本文将探讨如何准确判断射频芯片的质量&#xff0c;以确保技术设备的稳定运行。 1. 外观检查 检查射频芯片是否有破损、引脚断裂、缺陷等。 2. 电气参数测试 对射频芯片的输入输出阻抗、功耗、…

DBAPI如何实现插入数据前先判断数据是否存在,存在就更新,不存在就插入

DBAPI实现数据不存在即插入、存在即更新 场景 往数据库插入数据的时候&#xff0c;需要先判断一下记录是否在数据库已经存在&#xff0c;如果已经存在就更新记录&#xff0c;如果不存在&#xff0c;才插入数据。 实现方案 采用存储过程实现&#xff0c;以mysql为例子 创建存储过…

【运维系列资料】运维系统建设方案(PPT源文件)

1.智慧运维系统建设背景 2.智慧运维系统建设目标 3.智慧运维系统建设内容 4.智慧运维系统建设技术 5.智慧运维系统建设流程 6.智慧运维系统建设收益 软件全套资料部分文档清单&#xff1a; 工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#xff0c;产品…

小阿轩yx-Ansible部署与应用基础

小阿轩yx-Ansible部署与应用基础 前言 由于互联网的快速发展导致产品更新换代速度逐步增长&#xff0c;运维人员每天都要进行大量的维护操作&#xff0c;按照传统方式进行维护使得工作效率低下。这时部署自动化运维就可以尽可能安全、高效的完成这些工作。 Ansible 概述 什…

编程遇到问题了?一个命令让 AI 解决你的困惑!

作为一名程序员&#xff0c;我们在开发过程中常常会遇到各种各样的问题&#xff0c;尤其是在开发新功能或使用新技术时。在这些时候&#xff0c;我们往往会寻求帮助并寻找最佳的解决方案。 去年的时候大家还是在使用百度或者谷歌来搜寻问题的答案&#xff0c;但是今年大家肯定…

MICS:PythonJail沙箱逃逸(持续更新中)

沙箱是一种防护机制&#xff0c;是用来运行不受信任的代码&#xff0c;通常是用户上传的代码&#xff0c;但这些代码可能是恶意代码&#xff0c;而沙箱就是防止恶意代码运行的机制。所谓沙箱逃逸&#xff0c;就是利用相关操作绕过沙箱防护&#xff0c;从而获得目标主机的文件信…

JVM(HotSpot):堆空间(Heap)以及常用相关工具介绍

文章目录 内存结构图二、堆的定义三、堆内存溢出四、堆内存排查工具 内存结构图 二、堆的定义 1、通过new关键字创建的对象&#xff0c;都会放到堆空间中。 2、它是线程共享的&#xff0c;堆中的对象都要考虑线程安全问题。 那有同学肯定会问&#xff0c;方法内通过new创建的…

JavaScript --数字Number的常用方法

toFixed(保留几位小数) <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthde…

python编程开发“人机猜拳”游戏

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

UIAutomation:Python 自动获取 QQ 群成员资料

出于兴趣&#xff0c;想要获取 “QQ 群”成员资料&#xff0c;于是乎找到了一个自动化的 Python 仓库&#xff1a;Python-UIAutomation-for-Windows。 目录 1. 简介 1.1 实际环境 1.2 安装/源码 1.2.1 pip安装 1.2.2 源码 2. 代码 2.1 全部代码 2.2 class QQGroupMemb…

16. C++ TinyWebServer项目总结(16. 服务器调制、调试和测试)

主要包括&#xff1a; 使用 tcpdump 抓包&#xff1b;使用 gdb 调试器&#xff1b;使用压力测试工具&#xff0c;模拟现实世界中的高并发请求&#xff0c;测试服务器在高压状态下的稳定性。 最大文件描述符数 Linux 对应用进程能打开的最大文件描述符数量有两个层次的限制&a…

升压站成套设备厂家

那么&#xff0c;本文呢&#xff0c;就是将围绕着升压站设备厂家这个关键词&#xff0c;来为您、为潜在的光伏升压站成套设备的采购们分享 一些干货&#xff0c;以及说说升压站设备生成厂家的情况。 我知道&#xff0c;很多人关注的所谓的升压站设备或许比较的多。比如包括了逆…

Flutter路由

路由作为一种页面切换的能力&#xff0c;非常重要。Flutter 中路由管理有几个重要的点。 Navigator 1.0&#xff1a;Flutter 早期路由系统&#xff0c;侧重于移动端 &#xff0c;命令式编程风格&#xff0c;使用 Navigator.push() 和 Navigator.pop() 等方法来管理路由栈。 N…

序列化流(对象操作输出流)反序列化流(对象操作输入流)

可以把Java中的对象写到本地文件中 序列化流&#xff08;对象操作输出流&#xff09; 构造方法 成员方法 使用对象输出流将对象保存到文件会出现NotSerializableException异常 解决方案&#xff1a;需要让Javabean类实现Serializable接口 Student package myio;import java.…

Claude 的上下文检索功能提升了 RAG 准确率,这会是人工智能革命?

前言 在人工智能领域不断进步的过程中&#xff0c;人们对更准确且具备上下文理解能力的响应的追求&#xff0c;催生了诸多突破性创新。 而 Claude 的上下文检索技术就是其中一项进步&#xff0c;有望显著提升检索增强生成 (RAG) 系统的表现。 可能有同学就要问了&#xff1a;…

DDL 超时,应该如何解决 | OceanBase 用户问题集萃

问题背景 在OceanBase的社区问答里常看到有用户发帖提出DDL超时的问题&#xff0c; 如“执行 DDL 超时&#xff0c;为何调大超时时间不生效&#xff1f;” 。但很多帖子的回答都没有完美解决。因此&#xff0c;这里把相关的解决思路在这里分享给大家。 帖子里对这类问题的描述…

2、 如何提高电脑运行速度 (改虚拟内存)?

改下电脑C磁盘的虚拟内存 方法如下&#xff1a; ① 按下电脑键盘上的 win E 键 &#xff0c; 然后鼠标移动到左边的【此电脑上】 然后&#xff0c;按下鼠标右键&#xff0c;选择【属性】 ② 然后&#xff0c;选择【高级系统设置】 4、选择【高级】&#xff0c;选择性能里面…

SPSS26统计分析笔记——5 卡法检验

1 卡方检验原理 卡方检验由卡尔皮尔逊&#xff08;Karl Pearson&#xff09;于1900年首次提出&#xff0c;是一种针对频数数据&#xff08;定类数据或计数数据&#xff09;的假设检验方法。它通过比较实际观测次数与理论期望次数之间的差异&#xff0c;构造出 χ 2 {\chi^2} χ…

seL4 Threads(四)

官网链接: Threads Threads 这篇教程主要是使用seL4中的threads。 TCB Thread Control Blocks seL4提供了线程代表执行的上下文以及管理处理器时间。seL4中的线程是通过线程控制块对象&#xff08;TCB&#xff09;实现的&#xff0c;每个内核线程都有一个线程控制块。 线程…