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

1 概述

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

2 HSSFWorkbook

 @Testpublic 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中,以便产生ByteArraytry {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.mzph.cn/news/880247.shtml

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

相关文章

Reddit账号太多?一文教你轻松管理

想要在Reddit上扩大品牌影响力&#xff0c;但不知道如何管理多个账号&#xff1f;面对复杂的社区规则&#xff0c;你是否在担心账号安全&#xff1f;渴望提升参与度&#xff0c;却对内容策略一筹莫展&#xff1f;本文将为你揭秘如何高效管理你的Reddit账号&#xff0c;让你在这…

mysql update语句会加什么锁

在 MySQL 中&#xff0c;UPDATE 语句会根据不同的存储引擎和隔离级别&#xff0c;自动获取不同的锁。下面是一些常见情况&#xff1a; InnoDB 存储引擎和默认隔离级别&#xff08;REPEATABLE READ&#xff09; 在 InnoDB 存储引擎和默认的 REPEATABLE READ 隔离级别下&#x…

PR快速片段分割教程

方法一&#xff1a; 方法二yyds&#xff1a; ctrla全选&#xff0c;拽过来ME导出即可。

周文强:我感受到了海口经济学院创新创业的热情

日前&#xff0c;由中国志愿服务基金会、中国志愿服务基金会汇成百年专项基金以及共青团海口市委员会主办&#xff0c;共青团海口经济学院委员会承办的“2024 首届青领杯大学生创新创业大赛”海口站线下培训在海口经济学院开展。汇成百年专项基金发起人周文强作为本次大赛的创业…

ReadWriteLock读写锁

读写锁基本概念 ReadWriteLock是Java并发包中的一个接口&#xff0c;它定义了两种锁&#xff1a;读锁&#xff08;Read Lock&#xff09;和写锁&#xff08;Write Lock&#xff09;&#xff0c;真正的实现类是ReentrantReadWriteLock。读锁允许多个线程同时读取共享资源&#…

Spring MVC 拦截器总结

1.简介 Spring MVC提供了拦截器方便在接口调用前后进行一些通用处理。 2.步骤 1.实现一个拦截器类&#xff0c;共有三处拦截时机&#xff1a; public class Interceptor1 implements HandlerInterceptor {//实现HandlerInterceptor接口//执行handler之前调用//编码格式处理…

基于单片机的家用安防报警系统设计

本设计基于STM32F103单片机作为主控&#xff0c;通过DS18B20温度传感器和MQ烟雾传感器对家庭环境的温度和烟雾浓度进行检测实现火灾预警的设计要求&#xff0c;当检测数据异常时激发报警提示。系统采用红外传感器对家庭环境中是否有盗贼进入实现检测&#xff0c;当出现异常情况…

机器学习的应用领域

机器学习在许多领域有广泛的应用&#xff0c;下面列出了一些主要的应用领域及其典型应用&#xff1a; 1. 图像识别 人脸识别&#xff1a;用于解锁手机、自动标记照片、监控安全系统。物体识别&#xff1a;应用于自动驾驶汽车、机器人、医疗影像分析中&#xff0c;帮助机器理解…

【python】判断语句

前言 进行逻辑判断&#xff0c;是生活中常见的行为。同样&#xff0c;在程序中&#xff0c;进行逻辑判断也是最为基础的功能。 #mermaid-svg-BxDAgUkFvXJU7u3K {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-BxDAg…

面试经典 150 题:力扣88. 合并两个有序数组

每周一道算法题启动 题目 【题目链接】 【解法一】合并后排序 排序后的数组自动省略0的数字&#xff0c;又学到了 class Solution { public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {//合并两个数组后排序for(int i0; i<…

计算机网络详解:发展史、TCP/IP协议、网络通信与应用开发全流程

文章目录 1. 计算机网络的发展史1.1 初期阶段&#xff1a;网络的萌芽&#xff08;1960年代&#xff09;1.2 第二阶段&#xff1a;TCP/IP协议的引入&#xff08;1970-1980年代&#xff09;1.3 第三阶段&#xff1a;互联网的普及与商业化&#xff08;1990年代&#xff09;1.4 现代…

线性跟踪微分器TD详细测试(Simulink 算法框图+CODESYS ST+博途SCL完整源代码)

1、ADRC线性跟踪微分器 ADRC线性跟踪微分器(ST+SCL语言)_adrc算法在博途编程中scl语言-CSDN博客文章浏览阅读784次。本文介绍了ADRC线性跟踪微分器的算法和源代码,包括在SMART PLC和H5U平台上的实现。文章提供了ST和SCL语言的详细代码,并讨论了跟踪微分器在自动控制中的作用…

基于python+django+vue的电影数据分析及可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

【一句话点破】【C++重要题目】基类与派生类的成员变量值被对象调用的结果(二)

【一句话点破】基类/派生类的成员变量由哪个对象初始化的&#xff0c;哪个对象调用该成员变量时就用由它初始化的值 [尤其找准是基类对象or派生类对象的值] 【重要例题】15浙工大卷二读程序5题 可运行代码如下 #include "bits/stdc.h" #include<iostream> u…

DataGemma:谷歌大模型

诸神缄默不语-个人CSDN博文目录 DataGemma是谷歌出的大模型&#xff0c;是gemma 2的升级版&#xff0c;主要亮点是基于检索解决幻觉问题。 在huggingface和kaggle上均可下载模型权重。 检索数据源是Google’s Data Commons知识图谱。 官方博客&#xff1a;https://blog.googl…

个人计算机与网络的安全

关于 wifi 大家都知道 wifi 已经使用了 wpa3 非常安全 但很多人不知道 pin 和 wps 这两项有漏洞 我发现很多用户都简单设置了这两项 他们的设置 使他们的网络出现了漏洞 关于 国产的 linux 老实说全是漏洞 默认开启 很多服务 但初始化的设置都有漏洞 关于 系统安全 老…

通往AGI的皇冠:逻辑推理能力

文章来自新浪微博机器学习团队 AI Lab 负责人张俊林&#xff0c;OpenAI发布新模型o1之后的一些观点&#xff0c;很有启发&#xff1a; GPT 4o本质上是要探索不同模态相互融合的大一统模型应该怎么做的问题&#xff0c;对于提升大模型的智力水平估计帮助不大&#xff1b;而o1本…

learn C++ NO.18——多态

什么是多态&#xff1f; 多态是C面向对象编程中的一个核心概念&#xff0c;它允许程序在执行过程中&#xff0c;根据对象的实际类型来调用适当的函数。多态性主要通过继承和虚函数来实现&#xff0c;这使得代码更加灵活和可扩展。多态的条件如下&#xff1a;1、调用函数是重写…

[翟旭发射器]python-推导式-列表list表达式练习

# 简单的列表生成 numbers00[x for x in range(1,11)] print(numbers00) # 带条件的列表生成 numbers01[x for x in range(1,11) if x%20] print(numbers01) # 带表达式的列表生成 numbers10[x**2 for x in range(1,11)] print(numbers10) # 嵌套循环的列表生成 coordinates[(x…

LeetCode 210. 课程表 II

LeetCode 210. 课程表 II 现在你总共有 numCourses 门课需要选&#xff0c;记为 0 到 numCourses - 1。给你一个数组 prerequisites &#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表示在选修课程 ai 前 必须 先选修 bi 。 例如&#xff0c;想要学习课程 0 &#x…