poi 将图片写入到excel文件中
- 功能点说明
- 作用:将图片写入到指定的excel文件(或output流)
- 依赖
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version>
</dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.6.3</version>
</dependency>注意:这两个版本不一样的话可能会有版本对应的问题
- 用法代码解析
/**
row 行
col 列
data 图片数据byte数组
workbook 目标
patriarch 画图对象
**/public static void writeImg(Integer row, Integer col, byte[] data, Workbook workbook, Drawing<?> patriarch) {//构建定位器(即要写入的图片写哪个格子、占多少格之类的)XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 1023, 1023, col.shortValue(), row.shortValue(), col.shortValue() + 1, row.shortValue() + 1);anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);patriarch.createPicture(anchor, workbook.addPicture(data, XSSFWorkbook.PICTURE_TYPE_JPEG));}
- 实战
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.poi.excel.BigExcelWriter;
import cn.hutool.poi.excel.ExcelWriter;import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.StyleSet;
import lombok.Builder;
import lombok.Data;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;public class Test {public static void main(String[] args) {List<Person> objects = CollUtil.newArrayList();Person person = null;for (int i = 0; i < 10; i++) {File file = new File("/12.jpg");File file1 = new File("/房子.jpeg");person = Person.builder().age(10+i).name("张三" + i).url(i % 2 == 0 ? FileUtil.readBytes(file) : FileUtil.readBytes(file1)).build();objects.add(person);}getExcelByBean(objects);}private static void getExcelByBean(List<Person> list) {//excel大数据生成File file = new File("/目标.xlsx");BigExcelWriter writer = ExcelUtil.getBigWriter(file);Workbook workbook = writer.getWorkbook();Sheet sheet = writer.getSheet();//设置默认高度sheet.setDefaultRowHeight((short) 1000);writer.addHeaderAlias("name", "姓名");writer.addHeaderAlias("age", "年龄");writer.addHeaderAlias("url", "图片");//构建画图对象Drawing<?> patriarch = sheet.createDrawingPatriarch();int j = 1;for (int i = 0; i < list.size(); i++) {sheet.setColumnWidth(i, 20 * 256);Person person = list.get(i);byte[] url = person.getUrl();//这个要注意,2指的图片位置,从0开始writeImg(j++, 2, url, workbook, patriarch);person.setUrl(null);}StyleSet style = writer.getStyleSet();CellStyle cellStyle = style.getCellStyleForDate();cellStyle.setDataFormat(writer.getWorkbook().createDataFormat().getFormat("yyyy-MM-dd HH:mm:ss"));writer.write(list);writer.flush();writer.close();}public static void writeImg(Integer row, Integer col, byte[] data, Workbook workbook, Drawing<?> patriarch) {XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 1023, 1023, col.shortValue(), row.shortValue(), col.shortValue() + 1, row.shortValue() + 1);anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);patriarch.createPicture(anchor, workbook.addPicture(data, XSSFWorkbook.PICTURE_TYPE_JPEG));}@Builder@Datapublic static class Person {private String name;private int age;private byte[] url;}}
- 应用实战
private static void getExcelByBean(List<Person> list, HttpServletResponse response) {//excel大数据生成File file = new File("/目标.xlsx");BigExcelWriter writer = ExcelUtil.getBigWriter(file);Workbook workbook = writer.getWorkbook();Sheet sheet = writer.getSheet();//设置默认高度sheet.setDefaultRowHeight((short) 1000);writer.addHeaderAlias("name", "姓名");writer.addHeaderAlias("age", "年龄");writer.addHeaderAlias("url", "图片");//构建画图对象Drawing<?> patriarch = sheet.createDrawingPatriarch();int j = 1;for (int i = 0; i < list.size(); i++) {sheet.setColumnWidth(i, 20 * 256);Person person = list.get(i);byte[] url = person.getUrl();//这个要注意,2指的图片位置,从0开始writeImg(j++, 2, url, workbook, patriarch);person.setUrl(null);}StyleSet style = writer.getStyleSet();CellStyle cellStyle = style.getCellStyleForDate();cellStyle.setDataFormat(writer.getWorkbook().createDataFormat().getFormat("yyyy-MM-dd HH:mm:ss"));response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");response.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode("文件123.xlsx"),"utf-8"));ServletOutPutStream outputStream = response.getOutputSteam();writer.write(list);writer.flush(outputStream);writer.close();}public static void writeImg(Integer row, Integer col, byte[] data, Workbook workbook, Drawing<?> patriarch) {XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 1023, 1023, col.shortValue(), row.shortValue(), col.shortValue() + 1, row.shortValue() + 1);anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);patriarch.createPicture(anchor, workbook.addPicture(data, XSSFWorkbook.PICTURE_TYPE_JPEG));}public static class Person {private String name;private int age;private byte[] url;public Person() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public byte[] getUrl() {return url;}public void setUrl(byte[] url) {this.url = url;}}
图片并排填充可以参考文章(点此跳转)
单元格合并参考文章(点此跳转)
单元格合并代码样例
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.FileOutputStream;
import java.io.IOException;public class MergeRowsExample {public static void main(String[] args) {// 创建工作簿XSSFWorkbook workbook = new XSSFWorkbook();Sheet sheet = workbook.createSheet("Sheet1");// 创建行和单元格for (int i = 0; i < 10; i++) {Row row = sheet.createRow(i);Cell cell = row.createCell(0);cell.setCellValue("Value " + i);}// 合并行,从第 2 行到第 4 行sheet.addMergedRegion(new org.apache.poi.ss.util.CellRangeAddress(2, 4, 0, 0));try (FileOutputStream outputStream = new FileOutputStream("merged_rows.xlsx")) {workbook.write(outputStream);} catch (IOException e) {e.printStackTrace();}}
}
相关文章:
poi 将图片写入到excel文件中
功能点说明 作用:将图片写入到指定的excel文件(或output流) 依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version> </dependen…...
C++算法竞赛基础语法-9
快速排序是一种高效的排序算法,由C. A. R. Hoare在1960年提出,基本思想是分治法(Divide and Conquer)策略,通过递归将一个大问题分解为若干个较小的子问题,然后合并这些子问题的解来解决原始问题 快速排序…...
Mac安装JD-GUI
Mac安装反编译工具步骤如下: 打开官网https://java-decompiler.github.io/ 选择下载mac的安装包解压下载好的压缩包,点击JD-GUI安装 有可能会遇到如下错误。请先检查是否安装JDK,通过java -version命令查看是否是1.8版本的jdk如果jdk没问题&…...
Nginx--日志(介绍、配置、日志轮转)
前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、Nginx日志介绍 nginx 有一个非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志, 所需日志模块 ngx_http_log_module 的…...
QML 快捷键与Shortcut的使用
一、效果展示 二、源码分享 import QtQuick import QtQuick.Controls import Qt.labs.qmlmodels import QtQuick.Controls.Basic import QtQuick.Layouts import QtQuick.Effects import Qt.labs.platformApplicationWindow {id:rootwidth: 1000height: 730visible: truetitle…...
制造业物联网的十大用例
预计到 2026 年,物联网制造市场价值将达到 4000 亿美元。实时收集和分析来自联网物联网设备与传感器的数据,这一能力为制造商提供了对生产流程前所未有的深入洞察。物联网(IoT)有潜力彻底改变制造业,使工厂能够更高效地…...
无人机遥感图像拼接及处理教程
无人机遥感图像采集流程: 无人机遥感监测 无人机航线规划设计 无人机飞行软件操作 无人机航拍一般过程 无人机遥感图像拼接软件: Photoscan软件 软件基本操作 遥感图像拼接的一般流程 遥感图像分组拼接与点云分类 无人机遥感图像拼接: 基于无…...
考研操作系统----操作系统的概念定义功能和目标(仅仅作为王道哔站课程讲义作用)
目录 操作系统的概念定义功能和目标 操作系统的四个特征 操作系统的分类 编辑 操作系统的运行机制 系统调用 操作系统体系结构 操作系统引导 虚拟机 操作系统的概念定义功能和目标 什么是操作系统: 操作系统是指控制和管理整个计算机系统的软硬件资源&…...
【以无克有】排序之随机快速排序
分治就是:抽刀断水水更流,举杯消愁愁更愁 文章目录 快速排序原理(最常见的双端扫描思路)原理讲解代码实现分区(Partition)部分:递归排序部分: 复杂度简要分析例题随机快速排序模板快排应用之第k小数(不去重) 参考资料及推荐总结 快…...
React源码解读
配置React源码本地调试环境 本次环境构建采用了node版本为16、react-scripts 版本号为 3.4.4,源码下载地址 react源码调试: react源码调试环境 使用 create-react-app 脚手架创建项目 npx create-react-app react-test 进入刚刚下载的目录,弹射 crea…...
[极客大挑战 2019]Havefun1
[极客大挑战 2019]Havefun1 代码审计发现 根据代码逻辑,要求传入’cat’参数,值为’dog’时执行if的操作,所以构造参数: ?catdog获得flag...
Ai人工智能的未来:趋势、挑战与机遇
Ai人工智能的未来:趋势、挑战与机遇 引言 人工智能(AI)已经成为当代科技发展的核心驱动力,其影响力渗透到各个行业,并塑造了我们未来的社会结构。无论是在医疗、金融、制造业,还是在自动驾驶、智能客服、…...
MG协议转换器:破解暖通设备通讯壁垒的智能钥匙
在智能化楼宇管理中,暖通空调系统(HVAC)的高效运行直接影响建筑的能耗控制与用户体验。然而,暖通设备品牌众多、协议不统一的问题长期困扰着运维人员:不同厂商的冷水机组、风机盘管、传感器等设备因采用Modbus、BACnet…...
【赵渝强老师】Spark的容错机制:检查点
由于Spark的计算是在内存中完成,因此任务执行的生命周期lineage(血统)越长,执行出错的概念就会越大。Spark通过检查点Checkpoint的方式,将RDD的状态写入磁盘进行持久化的保存从而支持容错。如果在检查点之后有节点出现…...
算法兵法全略(译文)
目录 始计篇 谋攻篇 军形篇 兵势篇 虚实篇 军争篇 九变篇 行军篇 地形篇 九地篇 火攻篇 用间篇 始计篇 算法,在当今时代,犹如国家关键的战略武器,也是处理各类事务的核心枢纽。算法的世界神秘且变化万千,不够贤能聪慧…...
react传递函数与回调函数原理
为什么 React 允许直接传递函数? 回调函数核心逻辑 例子:父组件控制 Modal 的显示与隐藏 // 父组件 (ParentComponent.tsx) import React, { useState } from react; import { Modal, Button } from antd; import ModalContent from ./ModalContent;co…...
多媒体术语扫盲备忘录
DRM DRM: Digital Rights Management, 数字版权保护。 广义上讲,能够保护数字版权(不单单是音视频)都可以叫做DRM。 国外主要分为三大类, Google的Widevine, MicroSoft的 PlayReady, 以及 Apple的 FairPlay. 更多细节请参考此文章. Google Widevine: …...
Node.js 调用 DeepSeek API 完整指南
简介 本文将介绍如何使用 Node.js 调用 DeepSeek API,实现流式对话并保存对话记录。Node.js 版本使用现代异步编程方式实现,支持流式处理和错误处理。 1. 环境准备 1.1 系统要求 Node.js 14.0 或更高版本npm 包管理器 1.2 项目结构 deepseek-proje…...
盛铂科技 SMF106 低相位噪声贴片式频率综合器模块
在现代通信和电子设备领域,频率综合器作为关键组件,其性能优劣直接影响系统的整体表现。盛铂科技的 SMF106 低相位噪声贴片式频率综合器,以其卓越的性能和独特设计,成为众多高性能系统的选择。 一、频率覆盖范围广,步进…...
小米 R3G 路由器(Pandavan)实现网络打印机功能
小米 R3G 路由器(Pandavan)实现网络打印机功能 一、前言 家中有多台 PC 设备需要打印服务,但苦于家中的 Epson L380 打印机没有网络打印功能,并且配置 Windows 共享打印机实在是过于繁琐且需要共享机保持唤醒状态过于费电。想到…...
Okay, But Please Don’t Stop Talking
Okay, But Please Don’t Stop Talking 研发背景 现有问题:像ChatGPT的高级语音模式这类先进的语音对语音系统,容易被“我明白”“嗯哼”等在人类对话中常见的插入语打断。这表明现有语音交互系统在处理自然对话中的语音重叠情况时存在不足。 新的尝试&…...
Python的那些事第二十一篇:Python Web开发的“秘密武器”Flask
基于 Flask 框架的 Python Web 开发研究 摘要 在 Web 开发的江湖里,Python 是一位武林高手,而 Flask 则是它手中那把小巧却锋利的匕首。本文以 Flask 框架为核心,深入探讨了它在 Python Web 开发中的应用。通过幽默风趣的笔触,结合实例和表格,分析了 Flask 的特性、优势以…...
欧拉函数杂记
定义 φ ( n ) \varphi (n) φ(n)表示 [ 1 , n ] [1,n] [1,n]中与 n n n互质的数的个数。 性质 φ ( p ) p − 1 , p ∈ P \varphi (p)p-1,\ p\in \mathbb {P} φ(p)p−1, p∈P φ ( n ) n ∏ i 1 m p i − 1 p i \varphi (n)n\prod_{i1}^{m} \frac{p_i-1}{p_i} φ(n)ni1∏…...
基于IOS实现各种倒计时功能
ZJJTimeCountDown 效果图 特点: 1、已封装,支持自定义 2、支持文本各种对齐模式 3、各种效果都可以通过设置 ZJJTimeCountDownLabel 类属性来实现 4、支持背景图片设置 5、分文本显示时间时,支持设置文字大小,来动态设置每个文本…...
Linux(Centos 7.6)命令详解:head
1.命令作用 将每个文件的前10行打印到标准输出(Print the first 10 lines of each FILE to standard output) 2.命令语法 Usage: head [OPTION]... [FILE]... 3.参数详解 OPTION: -c, --bytes[-]K,打印每个文件的前K字节-n, --lines[-],打印前K行而…...
微软 Microsoft Windows Office Professional LTSC 2024 专业增强版
Office 链接:https://pan.xunlei.com/s/VOIyE3ALg0hDvQfj47cLf3MdA1?pwdvzuz#...
【愚公系列】《Python网络爬虫从入门到精通》009-使用match()进行匹配
标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…...
Spring Boot 3 集成Xxl-job 3.0.0 单机
下载Xxl-job项目 https://gitee.com/xuxueli0323/xxl-jobhttps://github.com/xuxueli/xxl-job 创建相关数据库 数据库文件再/xxl-job/doc/db/tables_xxl_job.sql直接在数据库中运行SQL文件即可创建相关数据库 配置调度中心 打开项目找到 xxl-job-admin模块找到/xxl-job/xx…...
DeepSeek自动批量写作的AI软件
DeepSeek作为一款专注于数据处理与分析的AI软件,凭借其强大的功能和精准的分析能力,正在帮助企业实现智能化升级。无论是数据分析、市场预测还是内容创作,DeepSeek都能提供高效的解决方案。 无法使用Deepseek批量创作文案的,可在1…...
NLLB 与 ChatGPT 双向优化:探索翻译模型与语言模型在小语种应用的融合策略
作者:来自 vivo 互联网算法团队- Huang Minghui 本文探讨了 NLLB 翻译模型与 ChatGPT 在小语种应用中的双向优化策略。首先介绍了 NLLB-200 的背景、数据、分词器和模型,以及其与 LLM(Large Language Model)的异同和协同关系。接着…...
