Springboot 使用POI导出Excel文件

Springboot 使用POI导出Excel文件

  • Excel导出系列目录:
  • 引入依赖
  • 逻辑处理
    • controller
    • service
      • 数据查询
      • Excel文件内容处理
      • 样式封装
  • 导出效果
  • 思考

Excel导出系列目录:

【Springboot 使用EasyExcel导出Excel文件】
【Springboot 使用POI导出Excel文件】
【Springboot 导出Excel文件方式对比与注意事项】

本文使用POI导出xlsx后缀的Excel文件。

继上一次使用EasyExcel导出Excel文件实现功能后还有遗留问题,这次我试着用POI来重新实现,复刻EasyExcel导出文件的效果。

引入依赖

<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-ooxml</artifactId>
	<version>4.1.2</version>
</dependency>

逻辑处理

controller

@RestController
@Slf4j
@RequestMapping({"/v1/test"})
public class TestController {
    @Resource
    private TestService testService;

    @PostMapping("/export_record")
    public void exportRecord(HttpServletResponse response, @RequestBody GetRecordDto dto) {
        testService.exportRecord(response, dto);
        log.info("/export_record 导出记录完毕");
    }
}

service

数据查询

@Override
public void exportRecord(HttpServletResponse response, GetRecordDto dto) {
	OutputStream out = null;
	try {
		XSSFWorkbook XSSFWorkbook = new XSSFWorkbook();
		// 查询数据
		List<GetRecordVo> recordInfoList = ...;
		// excel内容准备
		XSSFWorkbook = dataPrepare(recordVoPageInfo.getRecords());
		// 响应信息设置
		String fileName = UUID.randomUUID().toString().replace("-", "") + "_抓拍记录.xlsx" ;
		response.setContentType("application/OCTET-STREAM;charset=UTF-8");
		String file = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
		response.setHeader("Content-disposition", "attachment;filename=" + file);
		out = response.getOutputStream();
		XSSFWorkbook.write(out);
	}catch (MixException e){
		throw e;
	}catch (Exception e){
		log.error("导出记录失败:", e);
	} finally {
		IOUtils.closeQuietly(out);
	}
}

Excel文件内容处理

private XSSFWorkbook dataPrepare(List<GetRecordVo> recordVoList) {
	XSSFWorkbook wb = new XSSFWorkbook();
	// 创建sheet
	XSSFSheet sheet1 = wb.createSheet("sheet1");
	// 设置表头行高
	short headHeight = 400;
	// 设置内容行高
	short contentHeight = 140;
	// 设置内容单元格居中样式
	CellStyle contentCenterStyle = getContentCenterStyle(wb);
	// 设置内容单元格左靠样式
	CellStyle contentLeftStyle = getContentLeftStyle(wb);
	// 设置标题单元格样式
	CellStyle headStyle = getHeadStyle(wb);
	// 创建表头
	XSSFRow row = sheet1.createRow(0);
	row.setHeight(headHeight);
	Cell cell = null;
	// 标题内容
	String[] headStr = {"序号", "时间", "照片", "姓名", "手机号码", "备注信息"};
	for(int i = 0; i < headStr.length; i++){
		cell = row.createCell(i);
		cell.setCellValue(headStr[i]);
		cell.setCellStyle(headStyle);
	}
	for (int i = 1; i < recordVoList.size() + 1; i++) {
		try {
			row = sheet1.createRow(i);
			row.setHeight((short) (100 * 70));
			row.setHeightInPoints(contentHeight);

			// 写入数据
			sheet1.setColumnWidth(0, 100 * 30);
			cell = row.createCell(0);
			cell.setCellValue(i);
			cell.setCellStyle(contentCenterStyle);

			sheet1.setColumnWidth(1, 100 * 70);
			cell = row.createCell(1);
			cell.setCellValue(recordVoList.get(i - 1).getAlarmTime());
			cell.setCellStyle(contentCenterStyle);

			sheet1.setColumnWidth(2, 100 * 50);
			cell = row.createCell(2);
			cell.setCellStyle(contentCenterStyle);

			byte[] faceImage = null;
			//画图的顶级管理器
			XSSFDrawing patriarch = sheet1.createDrawingPatriarch();
			//anchor主要用于设置图片的属性
			XSSFClientAnchor anchor = new XSSFClientAnchor(100000, 100000, -100000, -100000, (short) 3, i, (short) 3 + 1, i + 1);
			anchor.setAnchorType(ClientAnchor.AnchorType.byId(3));
			try {
				// 将图片转换成byte[]类型数据
				faceImage = ...;
				//插入图片
				if(ObjectUtils.isNotEmpty(faceImage)) {
					patriarch.createPicture(anchor, wb.addPicture(faceImage, Workbook.PICTURE_TYPE_JPEG));
				}
			} catch (Exception e) {
				log.error("=== log: getbyteArray timeout url: {} error:", recordVoList.get(i - 1).getFaceImageUrl(), e);
			}

			sheet1.setColumnWidth(3, 100 * 70);
			cell = row.createCell(3);
			cell.setCellValue(recordVoList.get(i - 1).getStaffName());
			cell.setCellStyle(contentLeftStyle);

			sheet1.setColumnWidth(4, 100 * 70);
			cell = row.createCell(4);
			cell.setCellValue(recordVoList.get(i - 1).getStaffPhone());
			cell.setCellStyle(contentCenterStyle);

			sheet1.setColumnWidth(5, 100 * 70);
			cell = row.createCell(5);
			cell.setCellValue(recordVoList.get(i - 1).getStaffRemark());
			cell.setCellStyle(contentLeftStyle);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	// 写入excel文件
	log.info("-------------------导出文件已经准备完毕---------------");
	return wb;
}

样式封装

/**
 * 内容居中样式
 * @param wb
 * @return
 */
private CellStyle getContentCenterStyle(XSSFWorkbook wb){
	CellStyle contentCenterStyle = wb.createCellStyle();
	contentCenterStyle.setBorderBottom(BorderStyle.THIN);
	contentCenterStyle.setBorderLeft(BorderStyle.THIN);
	contentCenterStyle.setBorderRight(BorderStyle.THIN);
	contentCenterStyle.setBorderTop(BorderStyle.THIN);
	contentCenterStyle.setAlignment(HorizontalAlignment.CENTER);
	contentCenterStyle.setVerticalAlignment(VerticalAlignment.CENTER);
	contentCenterStyle.setFont(getFontStyle(wb));
	return contentCenterStyle;
}

/**
 * 内容左靠样式
 * @param wb
 * @return
 */
private CellStyle getContentLeftStyle(XSSFWorkbook wb){
	CellStyle contentCenterStyle = wb.createCellStyle();
	contentCenterStyle.setBorderBottom(BorderStyle.THIN);
	contentCenterStyle.setBorderLeft(BorderStyle.THIN);
	contentCenterStyle.setBorderRight(BorderStyle.THIN);
	contentCenterStyle.setBorderTop(BorderStyle.THIN);
	contentCenterStyle.setVerticalAlignment(VerticalAlignment.CENTER);
	contentCenterStyle.setFont(getFontStyle(wb));
	return contentCenterStyle;
}

/**
 * 标题居中样式
 * @param wb
 * @return
 */
private CellStyle getHeadStyle(XSSFWorkbook wb){
	CellStyle headStyle = wb.createCellStyle();
	headStyle.setBorderBottom(BorderStyle.THIN);
	headStyle.setBorderLeft(BorderStyle.THIN);
	headStyle.setBorderRight(BorderStyle.THIN);
	headStyle.setBorderTop(BorderStyle.THIN);
	headStyle.setAlignment(HorizontalAlignment.CENTER);
	headStyle.setVerticalAlignment(VerticalAlignment.CENTER);
	headStyle.setFont(getBoldFontStyle(wb));
	headStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
	headStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
	return headStyle;
}

/**
 * 普通文字样式
 * @param wb
 * @return
 */
private Font getFontStyle(XSSFWorkbook wb){
	Font contentFont = wb.createFont();
	contentFont.setFontName("仿宋");
	contentFont.setFontHeightInPoints((short) 12);
	return contentFont;
}

/**
 * 加粗文字样式
 * @param wb
 * @return
 */
private Font getBoldFontStyle(XSSFWorkbook wb){
	Font contentFont = wb.createFont();
	contentFont.setFontName("仿宋");
	contentFont.setFontHeightInPoints((short) 12);
	contentFont.setBold(true);
	return contentFont;
}

导出效果

在这里插入图片描述

  1. 【照片】列中的照片内边距已经设置成功
  2. 成功复刻上一篇使用EasyExcel导出的Excel文件

思考

  1. 为什么不导出.xls后缀的文件?
  2. POI导出与EasyExcel导出相比哪种方式最优呢?
  3. POI导出与EasyExcel导出两种方式有没有需要注意的坑呢?

这些问题我会在下一篇来详细解答。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VScode远程开发之remote 远程开发(二)

VScode远程开发之remote 远程开发&#xff08;二&#xff09; 使用vscode进行远程开发很简单&#xff0c;在拓展里搜索 Remote Development&#xff0c;就可以搜索到微软提供的远程开发大礼包&#xff0c;里面包含了 通过 SSH 远程服务器 远程容器 远程 WSL&#xff08;Win…

演示:基于WPF的DrawingVisual开发的高刷新率示波器

一、目的&#xff1a;分享一个基于WPF的DrawingVisual开发的高刷新率示波器 二、效果演示 特此说明&#xff1a;由于Gif录制工具帧率不够&#xff0c;渲染60帧用了4.6秒&#xff0c;平均帧率在12Hz左右&#xff0c;所以展示效果不好&#xff0c;想要看好些的效果可以看文章下面…

安科瑞智慧能源管理系统EMS3.0在浙江某能源集团有限公司的应用

安科瑞戴婷 Acrel-Fanny 一、项目背景 浙江某能源集团有限公司位于浙江省宁波前湾新区&#xff0c;主营业务范围包括了储能技术服务&#xff0c;光伏风力发电技术服务&#xff0c;充电桩技术服务&#xff0c;新能源项目的施工以及为企业提供配电房运维服务。 随着新能源的兴…

[ComfyUI]Flux:爆火禅语小和尚素材!禅意人生,享受自在

在快节奏的现代生活中&#xff0c;人们越来越渴望一种宁静和放松的状态。而禅意小和尚素材正是这样一种能够带给我们内心宁静和智慧的存在。ComfyUI的Flux框架结合了禅意小和尚素材&#xff0c;为我们提供了一个探索禅意人生的独特方式。 禅意小和尚素材源于佛教文化&#xff…

DORA 机器人中间件学习教程(5)——3D激光雷达数据可视化

DORA中3D激光雷达数据可视化 1 总体思路2 DORA数据接收节点3 编写yml文件4 启动节点参考资料 截止目前 DORA还没有类似于ROS2中RVIZ这样的可视化工具&#xff0c;而在调试算法时我们又需要将数据进行可视化以验证代码的正确性。目前的解决方法是将DORA中的数据发送到ROS2中&…

ubuntu查看系统版本命令

查看系统版本指令 在 Ubuntu 操作系统中&#xff0c;您可以使用多个命令来查看系统版本。以下是一些常用的命令&#xff1a; lsb_release -a 这个命令会显示详细的 Ubuntu 版本信息&#xff0c;包括发行版名称、版本号、代号等。lsb_release -acat /etc/os-release 这个命令会显…

实用好助手

在现代职场中&#xff0c;拥有高效且适用的工具能够显著提升我们的工作效率与质量。除了常见的办公软件&#xff0c;还有许多小众但非常实用的工具可以大幅度优化工作流程。以下是另外五个推荐的工作软件&#xff0c;它们各自具备独特的功能与优势&#xff0c;值得一试。 1 …

MongoDB未授权访问

mongodb未授权访问漏洞 复现 MongoDB[//]: # (忙够DB)是一种流行的开源文档数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;基于分布式文件存储的数据库属于NoSQL数据库的一种。 开启MongoDB服务时不添加任何参数时,默认是没有权限验证的 登录的用户可以通过默认端口…

双十一适合买什么东西?2024年双十一收藏榜单必买好物分享!

随着双十一的脚步日益临近&#xff0c;各大电商平台已经开始了激烈的促销竞争。作为每年最盛大的购物节&#xff0c;双十一不仅吸引了无数消费者的积极参与&#xff0c;也成为品牌和产品质量的一次大检阅。那么&#xff0c;在2024年的双十一&#xff0c;哪些商品是值得购买的呢…

智能手表核心芯片~手表心率监测芯片AFE4900浅析(附一篇智能手表专利推荐)

智能手表核心芯片~手表心率监测芯片AFE4900浅析(附一篇智能手表专利推荐) 本期是平台君和您分享的第89期内容 2024年8月,安徽华米信息技术及美国的智能手表品牌ZEPP公司在美国对深圳思佰特公司提起诉讼,涉及专利、商标和不正当竞争。 起诉书(来源:RPX网站) 看到这则新闻…

linux 离线安装redis

1.官网下载 https://redis.io/download 或者去github下载 2.安装 Redis 解压 unzip redis-6.2.16.zip安装gcc #由于 redis 是用 C 语言开发&#xff0c;安装之前必先确认是否安装 gcc 环境&#xff08;gcc -v&#xff09; gcc -v若无安装gcc&#xff0c;参考我的文章 Lin…

三维可视化生产线,是工业4.0最直接的落地应用

工业 4.0 强调智能化、数字化和网络化的生产模式&#xff0c;而三维可视化生产线完美地契合了这些要求。通过三维可视化技术&#xff0c;生产线的各个环节可以以逼真的三维模型形式呈现在人们眼前。 从设计阶段开始&#xff0c;工程师们可以利用三维可视化工具进行生产线的规划…

模拟芯片 ADI 亚德诺半导体常用芯片分享(一)

在电子领域&#xff0c;ADI&#xff08;亚德诺半导体&#xff09;以其卓越的技术和可靠的品质&#xff0c;成为众多工程师和企业的首选。亿配芯城 &#xff08;ICgoodFind &#xff09;为您带来一系列 ADI 的常用模拟芯片。 ADI 的模拟芯片广泛应用于各个领域&#xff0c;无论…

在海外留学/工作,如何报考微软mos认证?

重点首先得强调的是&#xff0c;即使在海外也可以顺利地在国内获取微软MOS认证&#xff01; 01 微软mos认证简介 Microsoft Office Specialist 简称MOS。是微软公司和第三方国际认证机构、全球三大IT测验与教学中心之一的思递波/Certiport公司于1997年联合推出的&#xff0c;…

英语语法学习框架(考研)

一、简单句 英语都是由简单句构成&#xff0c;简单句共有五种基本句型&#xff1a;①主谓&#xff1b;②主谓宾&#xff1b;③主谓宾宾补&#xff1b;④主谓宾间宾&#xff08;间接宾语&#xff09;&#xff1b;⑤主系表&#xff1b; 其中谓语是句子最重要的部分&#xff0c;谓…

Linux之实战命令45:swapon应用实例(七十九)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

AI 网关:助力企业将探索快速转化为生产应用

**概括&#xff1a;**AI网关是将企业的实验探索转化为生产的关键工具。AI网关通过有效管理API流量、控制成本、提升可靠性和安全性&#xff0c;支持企业在AI技术快速发展的环境中持续创新&#xff0c;能够确保可扩展性和灵活性&#xff0c;使企业能应对不断增长的业务需求和复杂…

线性代数 向量

一、定义 几何定义&#xff1a;向量是一个有方向和大小的量&#xff0c;通常用箭头表示。向量的起点称为原点&#xff0c;终点称为向量的端点。 代数定义&#xff1a;向量是一个有序的数组&#xff0c;通常表示为列向量或行向量。 行向量就是 1*n的形式&#xff08;行展开&…

计算机毕业设计 基于Python的社交音乐分享平台的设计与实现 Python毕业设计 Python毕业设计选题【附源码+安装调试】

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

重磅发布,Wireshark 4.4.1 修复多个漏洞,性能新升级

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 中午好&#xff0c;我的网工朋友 Wireshark 一直以其强大的数据包捕获和分析功能而闻名。作为网络工程师、安全分析师和开发者的重要工具&#x…