type
status
date
Jul 24, 2024 06:29 AM
slug
summary
category
tags
password
icon
背景EasyExcel介绍EasyExcel中的注解@ExcelProperty@ExcelIgnore@ExcelIgnoreUnannotated@DateTimeFormat@NumberFormat@ColumnWith@ContentRowHeight@ContentFontStyle@ContentStyle数据导出(写Excel)controller使用UserRespVO实现数据导出ExcelUtils数据导入(读Excel)controller使用UserImportExcelVO实现数据导入ExcelUtils字段转换器
背景
在SpringBoot项目中,数据导入导出是非常常见的需求。无论是从数据库导出数据到Excel文件,还是从Excel文件导入数据到系统中,都会涉及到数据的格式转换、校验以及异常处理等多个方面。优雅地实现这些功能,能够提高系统的可靠性和用户体验。
EasyExcel
介绍
- EasyExcel 是阿里开源的 Excel 工具库,具有简单易用、低内存、高性能的特点。
- 在尽可用节约内存的情况下,支持百万行的 Excel 读写操作。例如说,仅使用 64M 内存,20 秒完成 75M(46 万行 25 列)Excel 的读取。并且,还有极速模式能更快,但是内存占用会在100M 多一点。
EasyExcel中的注解
@
ExcelProperty
用于匹配excel和实体类的匹配,参数如下:
名称 | 默认值 | 描述 |
value | 空 | 列名,用于匹配excel中的头,必须全匹配,如果有多行头,会匹配最后一行头 |
order | Integer.MAX_VALUE | 列序号,优先级高于 value ,会根据order 的顺序来匹配实体和excel中数据的顺序 |
index | -1 | 优先级高于 value 和order ,会根据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 接口,用于实现字段的转换。它有两个核心方法:
convertToJavaData(...)
方法:将 Excel Row 对应表格的值,转换成 Java 内存中的值。例如说,Excel 的“状态”列,将“状态”列转换成status = 1
,”禁用”列转换成status = 0
。
convertToExcelData(...)
方法:恰好相反,将 Java 内存中的值,转换成 Excel Row 对应表格的值。例如说,Excel 的“状态”列,将status = 1
转换成“开启”列,status = 0
转换成”禁用”列
- 作者:Frank
- 链接:https://blog.franksteven.me//article/export_excel_data
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。