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

EasyExcel Converter实现java对象和excel单元格转换

在EasyExcel中,Converter接口用于定义如何在Java对象和Excel单元格之间进行转换。

也就是说EasyExcel可以根据数据库中的值来填充Excel中对应的文本内容。

比如数据库1,2,3可以填充到excel中:男,女,其他

使用easyExcel的之前,请导入相关pom依赖以及创建一个表实体的映射类

		<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.2.1</version></dependency>
@Data
public class UserData {  // ... 其他字段 ...  @ExcelProperty(value = "性别", converter = GenderConverter.class)  private Integer gender;  

在上面的代码中,GenderConverter是一个自定义转换器

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;public class GenderConverter implements Converter<Integer> {@Overridepublic Class<Integer> supportJavaTypeKey() {return Integer.class;}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.STRING;}@Overridepublic Integer convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {if(cellData.getStringValue().equals("男")){return 1;}else if(cellData.getStringValue().equals("女")){return 2;}else {return 3;}}@Overridepublic WriteCellData<?> convertToExcelData(Integer value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {if(value == 1){return new WriteCellData<>("男");}else if(value == 2){return new WriteCellData<>("女");}else {return new WriteCellData<>("其他");}}
}
  1. supportJavaTypeKey()
    这个方法用于指定转换器支持的Java类型。在这个例子中,GenderConverter转换器支持Integer类型的Java对象。当EasyExcel在处理Excel文件并遇到需要转换为Integer类型的字段时,它会查找是否有对应的转换器可以处理这种转换。

  2. supportExcelTypeKey()
    这个方法用于指定转换器支持的Excel数据类型。CellDataTypeEnum.STRING表示这个转换器可以将Java对象转换为Excel中的字符串类型。这意味着,即使你的Java对象是一个整数(在这个例子中是性别代码),转换器也会将其转换为Excel单元格中的文本形式。

    这两个方法一起帮助EasyExcel确定在读取或写入Excel文件时应该使用哪个转换器来处理特定类型的字段。当你使用注解(如@ExcelProperty)来指定字段的转换器时,EasyExcel会根据这些注解和转换器中的supportJavaTypeKey()supportExcelTypeKey()方法来确定正确的转换逻辑。

    在我的例子中,GenderConverter的作用是将整数类型的性别代码(如1、2、3)转换为Excel单元格中的文本表示(如“男”、“女”、“其他”)。因此,supportJavaTypeKey()返回Integer.class,而supportExcelTypeKey()返回CellDataTypeEnum.STRING,以确保EasyExcel在导出时使用这个转换器来将性别代码转换为文本。

  3. convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration):

    这个方法用于将Excel单元格中的数据转换为Java对象。在这个例子中,它根据Excel单元格中的字符串值来返回相应的整数。如果单元格的值是"男",则返回整数1。如果单元格的值是"女",则返回整数2。如果单元格的值不是"男"也不是"女",则返回整数3。这个方法通常用于数据导入场景,当你从Excel文件中读取数据时,EasyExcel会使用这个方法来将Excel中的文本转换为Java对象中的相应字段值。

  4. convertToExcelData(Integer value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration):
    这个方法用于将Java对象中的数据转换为Excel单元格数据。在这个例子中,它根据Java对象中的整数值来返回相应的字符串,这些字符串将被写入Excel单元格中。如果Java对象的值是1,则返回字符串"男"。如果Java对象的值是2,则返回字符串"女"。如果Java对象的值既不是1也不是2,则返回字符串“其他”。

这个方法通常用于数据导出场景,当你将数据写入Excel文件时,EasyExcel会使用这个方法来将Java对象中的字段值转换为Excel单元格中的文本。

通过实现这两个方法,你可以自定义Java对象和Excel单元格数据之间的转换逻辑,以满足特定的业务需求。

然后就没什么好说的了,就直接导出,写好查询方法,在接口调用exportExcel的方法就行

List<UserData> userDataList = userService.findAll(); // 假设你有一个userService用于查询数据
import com.alibaba.excel.EasyExcel;  
import java.io.OutputStream;  
import javax.servlet.http.HttpServletResponse;  public void exportExcel(List<UserData> userDataList, HttpServletResponse response) {  // 设置响应头信息  response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");  response.setCharacterEncoding("utf-8");  String fileName = "用户数据.xlsx";  response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));  try (OutputStream outputStream = response.getOutputStream()) {  // 导出Excel文件  EasyExcel.write(outputStream, UserData.class).sheet("用户数据").doWrite(userDataList);  } catch (IOException e) {  e.printStackTrace();  }  
}

相关文章:

  • postgres12.4安装pg_rman-1.3.16
  • Kafka系列之:Exactly-once support
  • Python操作Sqlite的简单封装
  • JAVA------基础篇
  • 2024年03月CCF-GESP编程能力等级认证C++编程五级真题解析
  • 在存在代理的主机上,为docker容器配置代理
  • 浏览器导出excel
  • 17.注释和关键字
  • Lombok 简单讲解
  • YOLOV8逐步分解(2)_DetectionTrainer类初始化过程
  • 线程安全问题及解决
  • mysql--事务四大特性与隔离级别
  • Neo4j桌面版导入CVS文件
  • 利用瑞士军刀netcat建立连接并实现文件上传
  • 从姿态估计到3D动画
  • [译] React v16.8: 含有Hooks的版本
  • 2017 年终总结 —— 在路上
  • ES6之路之模块详解
  • JAVA之继承和多态
  • markdown编辑器简评
  • MySQL主从复制读写分离及奇怪的问题
  • React-生命周期杂记
  • 来,膜拜下android roadmap,强大的执行力
  • 每天10道Java面试题,跟我走,offer有!
  • 前端代码风格自动化系列(二)之Commitlint
  • 如何利用MongoDB打造TOP榜小程序
  • 微信小程序填坑清单
  • 写给高年级小学生看的《Bash 指南》
  • 一份游戏开发学习路线
  • 一个JAVA程序员成长之路分享
  • Mac 上flink的安装与启动
  • 回归生活:清理微信公众号
  • ​configparser --- 配置文件解析器​
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • # 安徽锐锋科技IDMS系统简介
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #100天计划# 2013年9月29日
  • #在 README.md 中生成项目目录结构
  • $$$$GB2312-80区位编码表$$$$
  • (C语言)二分查找 超详细
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (七)Java对象在Hibernate持久化层的状态
  • (转)ORM
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • (转)使用VMware vSphere标准交换机设置网络连接
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .net程序集学习心得
  • /etc/fstab 只读无法修改的解决办法
  • [2017][note]基于空间交叉相位调制的两个连续波在few layer铋Bi中的全光switch——
  • [AndroidStudio]_[初级]_[修改虚拟设备镜像文件的存放位置]
  • [C#基础知识系列]专题十七:深入理解动态类型