如何优雅地导入导出数据?
00 分钟
2024-7-21
2024-7-24
type
status
date
Jul 24, 2024 06:29 AM
slug
summary
category
tags
password
icon

背景

在SpringBoot项目中,数据导入导出是非常常见的需求。无论是从数据库导出数据到Excel文件,还是从Excel文件导入数据到系统中,都会涉及到数据的格式转换、校验以及异常处理等多个方面。优雅地实现这些功能,能够提高系统的可靠性和用户体验。

EasyExcel

介绍

  • EasyExcel 是阿里开源的 Excel 工具库,具有简单易用、低内存、高性能的特点。
  • 在尽可用节约内存的情况下,支持百万行的 Excel 读写操作。例如说,仅使用 64M 内存,20 秒完成 75M(46 万行 25 列)Excel 的读取。并且,还有极速模式能更快,但是内存占用会在100M 多一点。
notion image

EasyExcel中的注解

@ExcelProperty

用于匹配excel和实体类的匹配,参数如下:
名称
默认值
描述
value
列名,用于匹配excel中的头,必须全匹配,如果有多行头,会匹配最后一行头
order
Integer.MAX_VALUE
列序号,优先级高于value,会根据order的顺序来匹配实体和excel中数据的顺序
index
-1
优先级高于valueorder,会根据index直接指定到excel中具体的哪一列
converter
自动选择
指定当前字段用什么转换器,默认会自动选择。写的情况下只要实现com.alibaba.excel.converters.Converter#convertToExcelData(com.alibaba.excel.converters.WriteConverterContext<T>) 方法即可

@ExcelIgnore

默认所有字段都会和excel去匹配,加了这个注解会忽略该字段

@ExcelIgnoreUnannotated

默认不管加不加ExcelProperty的注解的所有字段都会参与读写,加了ExcelIgnoreUnannotated注解以后,不加ExcelProperty注解的字段就不会参与

@DateTimeFormat

日期转换,用String去接收excel日期格式的数据会调用这个注解,参数如下:
名称
默认值
描述
value
参照java.text.SimpleDateFormat书写即可
use1904windowing
自动选择
excel中时间是存储1900年起的一个双精度浮点数,但是有时候默认开始日期是1904,所以设置这个值改成默认1904年开始

@NumberFormat

数字转换,用String去接收excel数字格式的数据会调用这个注解。
名称
默认值
描述
value
参照java.text.DecimalFormat书写即可
roundingMode
RoundingMode.HALF_UP
格式化的时候设置舍入模式

@ColumnWith

用于设置列宽度的注解,注解中只有一个参数value,value的单位是字符长度,最大可以设置255个字符,因为一个excel单元格最大可以写入的字符个数就是255个字符。

@ContentRowHeight

用于设置行高,参数:value行高,-1代表自动行高

@ContentFontStyle

用于设置单元格内容字体格式的注解
参数
含义
fontName
字体名称
fontHeightInPoints
字体高度
italic
是否斜体
strikeout
是否设置删除水平线
color
字体颜色
typeOffset
偏移量
underline
下划线
bold
是否加粗
charset
编码格式

@ContentStyle

设置内容格式注解
参数
含义
dataFormat
日期格式
hidden
设置单元格使用此样式隐藏
locked
设置单元格使用此样式锁定
quotePrefix
在单元格前面增加`符号,数字或公式将以字符串形式展示
horizontalAlignment
设置是否水平居中
wrapped
设置文本是否应换行。将此标志设置为true通过在多行上显示使单元格中的所有内容可见
verticalAlignment
设置是否垂直居中
rotation
设置单元格中文本旋转角度。03版本的Excel旋转角度区间为-90°~90°,07版本的Excel旋转角度区间为0°~180°
indent
设置单元格中缩进文本的空格数
borderLeft
设置左边框的样式
borderRight
设置右边框样式
borderTop
设置上边框样式
borderBottom
设置下边框样式
leftBorderColor
设置左边框颜色
rightBorderColor
设置右边框颜色
topBorderColor
设置上边框颜色
bottomBorderColor
设置下边框颜色
fillPatternType
设置填充类型
fillBackgroundColor
设置背景色
fillForegroundColor
设置前景色
shrinkToFit
设置自动单元格自动大小

数据导出(写Excel)

controller

  • 将从数据库中查询出来的列表,一般可以复用分页接口,需要设置 .setPageSize(PageParam.PAGE_SIZE_NONE) 不过滤分页
  • 将 PostDO 列表,转换成 PostRespVO 列表,之后通过 ExcelUtils 转换成 Excel 文件,返回给前端。

使用UserRespVO实现数据导出

ExcelUtils

数据导入(读Excel)

controller

使用UserImportExcelVO实现数据导入

ExcelUtils

字段转换器

如果字段的的注解 converter 属性是 DictConvert 转换器,用于字典的转换。例如说,通过 status 字段,将 status = 1 转换成“开启”列,status = 0 转换成”禁用”列。
EasyExcel定义了 Convert 接口,用于实现字段的转换。它有两个核心方法:
  1. convertToJavaData(...) 方法:将 Excel Row 对应表格的值,转换成 Java 内存中的值。例如说,Excel 的“状态”列,将“状态”列转换成 status = 1,”禁用”列转换成 status = 0
  1. convertToExcelData(...) 方法:恰好相反,将 Java 内存中的值,转换成 Excel Row 对应表格的值。例如说,Excel 的“状态”列,将 status = 1 转换成“开启”列,status = 0 转换成”禁用”列
 

评论
Loading...