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

Springboot 使用EasyExcel导出Excel文件

Springboot 使用EasyExcel导出Excel文件

  • Excel导出系列目录:
  • 引入依赖
  • 创建导出模板类
    • 创建图片转化器
  • 逻辑处理
    • controller
    • service
  • 导出效果
  • 遗留问题

Excel导出系列目录:

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

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

引入依赖

<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>easyexcel</artifactId>
	<version>3.1.1</version>
</dependency>

创建导出模板类

导出模板类实质就是带有很多EasyExcel注解的实体类,以下类中以属性的形式列出所有excel列且对单元格样式以及字体样式都有设置。

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ContentRowHeight(120)
@AllArgsConstructor
@NoArgsConstructor
public class ExportRecord implements Serializable {

    @ExcelProperty(value = "序号", order = 1)
    @ContentFontStyle(fontName = "仿宋", fontHeightInPoints = 12)
    @ContentStyle(
            borderTop = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderLeft = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN,
            horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER, dataFormat = 49)
    @ColumnWidth(12)
    private Integer number;

    @ExcelProperty(value = "时间", order = 2)
    @ContentFontStyle(fontName = "仿宋", fontHeightInPoints = 12)
    @ContentStyle(
            borderTop = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderLeft = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN,
            horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER, dataFormat = 49)
    @ColumnWidth(20)
    private String alarmTime;

    @ExcelProperty(value = "照片",order = 3,converter = ImageConverter.class)
    @ContentStyle(
            borderTop = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderLeft = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN,
            dataFormat = 49)
    @ColumnWidth(17)
    private byte[] faceImageUrl;

    @ExcelProperty(value = "姓名", order = 4)
    @ContentFontStyle(fontName = "仿宋", fontHeightInPoints = 12)
    @ContentStyle(
            borderTop = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderLeft = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN,
            verticalAlignment = VerticalAlignmentEnum.CENTER, dataFormat = 49)
    @ColumnWidth(20)
    private String staffName;

    @ExcelProperty(value = "手机号码", order = 5)
    @ContentFontStyle(fontName = "仿宋", fontHeightInPoints = 12)
    @ContentStyle(
            borderTop = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderLeft = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN,
            horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER, dataFormat = 49)
    @ColumnWidth(20)
    private String staffPhone;

    @ExcelProperty(value = "备注信息", order = 6)
    @ContentFontStyle(fontName = "仿宋", fontHeightInPoints = 12)
    @ContentStyle(
            borderTop = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderLeft = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN,
            verticalAlignment = VerticalAlignmentEnum.CENTER, dataFormat = 49)
    @ColumnWidth(20)
    private String staffRemark;
}

注意:

  1. @ContentStyle注解参数一定要有dataFormat = 49,否则不生效。
  2. @ContentRowHeight指定行高的注解是修饰类的,不是修饰属性字段的。
  3. ImageConverter类是专门用于处理图片的,具体原理我不清楚,也没专门研究,有兴趣的可以自己研究研究。

创建图片转化器

@Slf4j
public class ImageConverter implements Converter<byte[]> {
    @Override
    public Class<?> supportJavaTypeKey() {
        return byte[].class;
    }
    @Override
    public WriteCellData<?> convertToExcelData(byte[] value,
    		ExcelContentProperty contentProperty,
    		GlobalConfiguration globalConfiguration)  {
        if(ObjectUtil.isNotEmpty(value)){
            try {
                return new WriteCellData<>(value);
            }catch (Exception e){
                log.info("图片获取异常",e);
            }
        }
        return new WriteCellData<>("");
    }
}

逻辑处理

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) {
	try {
		List<ExportRecord> result = new ArrayList<>();
		// 查询数据
		List<GetRecordVo> recordInfoList = ...;
		int index = 0;
		for (GetRecordVo item : recordInfoList) {
		    // 将图片转换成byte[]类型数据并为ExportRecord赋值
			byte[] faceImage = ...;
			result.add(new ExportRecord()
					.setNumber(++ index)
					.setAlarmTime(item.getAlarmTime())
					.setFaceImageUrl(faceImage)
					.setStaffName(item.getStaffName())
					.setStaffPhone(item.getStaffPhone())
					.setStaffRemark(item.getStaffRemark()));
		}
		// 设置文件名以及响应头,导出文件
		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);
		EasyExcel.write(response.getOutputStream(), ExportRecord.class).sheet("sheet1").doWrite(result);
	}catch (MixException e){
		throw e;
	}catch (Exception e){
		log.error("导出记录失败:", e);
	}
}

导出效果

在这里插入图片描述

遗留问题

实现导出之后,发现图片是铺满整个单元格的,每张图片会覆盖住单元格的上边框,所以,我想在放有图片的单元格中加入内边距,但是这个我查了一天始终没有实现,网上的方案有很多但是我用上一直没有生效,最终我放弃了

如果有大佬知道怎么实现,希望能交流一下,谢谢。。。。。。。


http://www.kler.cn/news/361677.html

相关文章:

  • k8s中如何将pod的标准输出日志输出到一个文件
  • 从0到1学习node.js(http模块)
  • 【图像分类 yolov11】使用YOLOv11进行图像分类任务:训练与预测
  • 磁编码器的工作原理和特点
  • 【人工智能-初级】第6章 决策树和随机森林:浅显易懂的介绍及Python实践
  • 【Wireshark笔记】如何在Wireshark中使用过滤器去除TCP Dup ACK
  • 英语写作中“有前景的”promising的用法
  • Python 第七节 魔法圆阵
  • PCL 最小点数约束的体素滤波(永久免费版)
  • 利用DeepFlow解决APISIX故障诊断中的方向偏差问题
  • 2024 “源鲁杯“ Round[1] web部分
  • 无线网卡知识的学习-- mac80211主要代码流程
  • Eclipse 软件:配置 JDBC、连接 MySQL 数据库、导入 jar 包
  • PDT 数据集:首个基于无人机的高精密度树木病虫害目标检测数据集
  • 大数据学习---快速了解clickhouse数据库
  • Python 网络爬虫教程
  • VScode远程开发之remote 远程开发(二)
  • 华为云桌面:构建灵活高效的数字化工作环境
  • Java项目实战II基于微信小程序UNIAPP+SSM+MySQL的电子点餐系统(开发文档+数据库+源码)
  • Python Q-learning 算法详解与应用案例
  • CTF(九)
  • 大范围实景三维智能调色 | 模方自动化匀色解决方案
  • 【贪心算法】(第十篇)
  • 转行AI产品经理,第二步怎么走
  • Spring Boot 实现 WebSocket(注解方式)
  • 中电金信:大模型时代 金融机构企业架构转型如何更智能化?