当前位置: 首页 > news >正文

poi 将图片写入到excel文件中

  • 功能点说明
  1. 作用:将图片写入到指定的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();}}
}

http://www.mrgr.cn/news/90676.html

相关文章:

  • 华为云+硅基流动使用Chatbox接入DeepSeek-R1满血版671B
  • Linux初始化 配置yum源
  • Windows远程桌面实现之十六:在web页面上实现超级终端
  • 泰勒公式推导以及常用展开式与近似计算
  • Dockerfiles 的 Top 10 常见 DevOps/SRE 面试问题及答案
  • leetcode 3271.哈希表分割字符串
  • vue开发06:前端通过webpack配置代理处理跨域问题
  • NumPy中生成和堆叠数组、生成切片的特殊对象:np.r_ np.c_ np.s_
  • 欧盟《人工智能法案》
  • SolidWorks C# How
  • 大模型WebUI:Gradio全解12——使用Agents和Tools智能代理工具构建UI(1)
  • 系统URL整合系列【不改hosts文件版】-- 代码1(springcloud-gateway动态路由)
  • 教程 | Proxmox VE(PVE)安装全流程指南(末尾附镜像及快速配置脚本)
  • 250213-异常exception
  • 【鸿蒙】ArkUI-X跨平台问题集锦
  • Elasticvue使用总结
  • Navicat导入海量Excel数据到数据库(简易介绍)
  • Linux——stdio
  • CentOS 7操作系统部署KVM软件和创建虚拟机
  • JavaScript 发起网络请求
  • DeepSeek教unity------MessagePack-01
  • 【2025深度学习系列专栏大纲:深入探索与实践深度学习】
  • PostgreSQL 备库的延迟问题
  • AcWing 795. 前缀和理解
  • 微服务SpringCloud Alibaba组件nacos教程(一)【详解naocs基础使用、服务中心配置、集群配置,附有案例+示例代码】
  • 【OpenCV】双目相机计算深度图和点云