easyexcel 设置标题_EasyExcel,让 excel 导入导出更加简单
做积极的人,而不是积极废人!
来源:jianshu.com/p/8f3defdc76d4EasyExcelGitHub上的官方说明快速开始maven仓库地址导入导出总结
EasyExcel
在做excel导入导出的时候,发现项目中封装的工具类及其难用,于是去gitHub上找了一些相关的框架,最终选定了EasyExcel。之前早有听闻该框架,但是一直没有去了解,这次借此学习一波,提高以后的工作效率。
实际使用中,发现是真的很easy,大部分api通过名称就能知道大致意思,这点做的很nice。参考文档,大部分场景的需求基本都能够满足。
GitHub上的官方说明图片
快速开始
maven仓库地址
com.alibaba
easyexcel
2.1.2
导入
如下图excel表格:
建立导入对应实体类@Data
publicclassReqCustomerDailyImport{
/**
*客户名称
*/
@ExcelProperty(index=0)
privateStringcustomerName;
/**
*MIS编码
*/
@ExcelProperty(index=1)
privateStringmisCode;
/**
*月度滚动额
*/
@ExcelProperty(index=3)
privateBigDecimalmonthlyQuota;
/**
*最新应收账款余额
*/
@ExcelProperty(index=4)
privateBigDecimalaccountReceivableQuota;
/**
*本月利率(年化)
*/
@ExcelProperty(index=5)
privateBigDecimaldailyInterestRate;
}
Controller代码
@PostMapping('/import')
publicvoidimportCustomerDaily(@RequestParamMultipartFilefile)throwsIOException{
InputStreaminputStream=file.getInputStream();
ListreqCustomerDailyImports=EasyExcel.read(inputStream)
.head(ReqCustomerDailyImport.class)
//设置sheet,默认读取第一个
.sheet()
//设置标题所在行数
.headRowNumber(2)
.doReadSync();
}
运行结果图片
可以看出只需要在实体对象使用@ExcelProperty注解,读取时指定该class,即可读取,并且自动过滤了空行,对于excel的读取及其简单。不过此时发现一个问题,这样我如果要校验字段该怎么办?要将字段类型转换成另外一个类型呢?
不必担心,我们可以想到的问题,作者肯定也考虑到了,下面来一个Demo
代码如下ListreqCustomerDailyImports=EasyExcel.read(inputStream)
//这个转换是成全局的,所有java为string,excel为string的都会用这个转换器。
//如果就想单个字段使用请使用@ExcelProperty指定converter
.registerConverter(newStringConverter())
//注册监听器,可以在这里校验字段
.registerReadListener(newCustomerDailyImportListener())
.head(ReqCustomerDailyImport.class)
.sheet()
.headRowNumber(2)
.doReadSync();
}
监听器
publicclassCustomerDailyImportListenerextendsAnalysisEventListener{
ListmisCodes=Lists.newArrayList();
/**
*每解析一行,回调该方法
*@paramdata
*@paramcontext
*/
@Override
publicvoidinvoke(Objectdata,AnalysisContextcontext){
StringmisCode=((ReqCustomerDailyImport)data).getMisCode();
if(StringUtils.isEmpty(misCode)){
thrownewRuntimeException(String.format('第%s行MIS编码为空,请核实',context.readRowHolder().getRowIndex()+1));
}
if(misCodes.contains(misCodes)){
thrownewRuntimeException(String.format('第%s行MIS编码已重复,请核实',context.readRowHolder().getRowIndex()+1));
}else{
misCodes.add(misCode);
}
}
/**
*出现异常回调
*@paramexception
*@paramcontext
*@throwsException
*/
@Override
publicvoidonException(Exceptionexception,AnalysisContextcontext)throwsException{
//ExcelDataConvertException:当数据转换异常的时候,会抛出该异常,此处可以得知第几行,第几列的数据
if(exceptioninstanceofExcelDataConvertException){
IntegercolumnIndex=((ExcelDataConvertException)exception).getColumnIndex()+1;
IntegerrowIndex=((ExcelDataConvertException)exception).getRowIndex()+1;
Stringmessage='第'+rowIndex+'行,第'+columnIndex+'列'+'数据格式有误,请核实';
thrownewRuntimeException(message);
}elseif(exceptioninstanceofRuntimeException){
throwexception;
}else{
super.onException(exception,context);
}
}
/**
*解析完全部回调
*@paramcontext
*/
@Override
publicvoiddoAfterAllAnalysed(AnalysisContextcontext){
misCodes.clear();
}
}
转换器publicclassStringConverterimplementsConverter{
@Override
publicClasssupportJavaTypeKey(){
returnString.class;
}
@Override
publicCellDataTypeEnumsupportExcelTypeKey(){
returnCellDataTypeEnum.STRING;
}
/**
*将excel对象转成Java对象,这里读的时候会调用
*
*@paramcellDataNotNull
*@paramcontentPropertyNullable
*@paramglobalConfigurationNotNull
*@return
*/
@Override
publicStringconvertToJavaData(CellDatacellData,ExcelContentPropertycontentProperty,
GlobalConfigurationglobalConfiguration){
return'自定义:'+cellData.getStringValue();
}
/**
*将Java对象转成String对象,写出的时候调用
*
*@paramvalue
*@paramcontentProperty
*@paramglobalConfiguration
*@return
*/
@Override
publicCellDataconvertToExcelData(Stringvalue,ExcelContentPropertycontentProperty,
GlobalConfigurationglobalConfiguration){
returnnewCellData(value);
}
}
可以看出注册了一个监听器:CustomerDailyImportListener,还注册了一个转换器:StringConverter。流程为:框架读取一行数据,先执行转换器,当一行数据转换完成,执行监听器的回调方法,如果转换的过程中,出现转换异常,也会回调监听器中的onException方法。因此,可以在监听器中校验数据,在转换器中转换数据类型或者格式。
运行结果图片
修改一下表格,测试校验是否生效图片
再次导入,查看运行结果图片
导入相关常用API
注解ExcelProperty 指定当前字段对应excel中的那一列。可以根据名字或者Index去匹配。当然也可以不写,默认第一个字段就是index=0,以此类推。千万注意,要么全部不写,要么全部用index,要么全部用名字去匹配。千万别三个混着用,除非你非常了解源代码中三个混着用怎么去排序的。ExcelIgnore 默认所有字段都会和excel去匹配,加了这个注解会忽略该字段。DateTimeFormat 日期转换,用String去接收excel日期格式的数据会调用这个注解。里面的value参照java.text.SimpleDateFormat。NumberFormat 数字转换,用String去接收excel数字格式的数据会调用这个注解。里面的value参照java.text.DecimalFormat。
EasyExcel相关参数readListener 监听器,在读取数据的过程中会不断的调用监听器。converter 转换器,默认加载了很多转换器。也可以自定义,如果使用的是registerConverter,那么该转换器是全局的,如果要对单个字段生效,可以在ExcelProperty注解的converter指定转换器。headRowNumber 需要读的表格有几行头数据。默认有一行头,也就是认为第二行开始起为数据。head 与clazz二选一。读取文件头对应的列表,会根据列表匹配数据,建议使用class。autoTrim 字符串、表头等数据自动trim。sheetNo 需要读取Sheet的编码,建议使用这个来指定读取哪个Sheet。sheetName 根据名字去匹配Sheet,excel 2003不支持根据名字去匹配。
导出
建立导出对应实体类
@Data
@Builder
publicclassRespCustomerDailyImport{
@ExcelProperty('客户编码')
privateStringcustomerName;
@ExcelProperty('MIS编码')
privateStringmisCode;
@ExcelProperty('月度滚动额')
privateBigDecimalmonthlyQuota;
@ExcelProperty('最新应收账款余额')
privateBigDecimalaccountReceivableQuota;
@NumberFormat('#.##%')
@ExcelProperty('本月利率(年化)')
privateBigDecimaldailyInterestRate;
}
Controller代码@GetMapping('/export')
publicvoidexport(HttpServletResponseresponse)throwsIOException{
//生成数据
ListrespCustomerDailyImports=Lists.newArrayList();
for(inti=0;i<50;i++){
RespCustomerDailyImportrespCustomerDailyImport=RespCustomerDailyImport.builder()
.misCode(String.valueOf(i))
.customerName('customerName'+i)
.monthlyQuota(newBigDecimal(String.valueOf(i)))
.accountReceivableQuota(newBigDecimal(String.valueOf(i)))
.dailyInterestRate(newBigDecimal(String.valueOf(i))).build();
respCustomerDailyImports.add(respCustomerDailyImport);
}
response.setContentType('application/vnd.ms-excel');
response.setCharacterEncoding('utf-8');
//这里URLEncoder.encode可以防止中文乱码当然和easyexcel没有关系
StringfileName=URLEncoder.encode('导出','UTF-8');
response.setHeader('Content-disposition','attachment;filename='+fileName+'.xlsx');
EasyExcel.write(response.getOutputStream(),RespCustomerDailyImport.class)
.sheet('sheet0')
//设置字段宽度为自动调整,不太精确
.registerWriteHandler(newLongestMatchColumnWidthStyleStrategy())
.doWrite(respCustomerDailyImports);
}
导出效果图片
导出相关常用API
注解ExcelProperty 指定写到第几列,默认根据成员变量排序。value指定写入的名称,默认成员变量的名字。ExcelIgnore 默认所有字段都会写入excel,这个注解会忽略这个字段。DateTimeFormat 日期转换,将Date写到excel会调用这个注解。里面的value参照java.text.SimpleDateFormat。NumberFormat 数字转换,用Number写excel会调用这个注解。里面的value参照java.text.DecimalFormat。
EasyExcel相关参数needHead 监听器是否导出头。useDefaultStyle 写的时候是否是使用默认头。head 与clazz二选一。写入文件的头列表,建议使用class。autoTrim 字符串、表头等数据自动trim。sheetNo 需要写入的编码。默认0。sheetName 需要些的Sheet名称,默认同sheetNo。
总结
可以看出不管是excel的读取还是写入,都是一个注解加上一行代码完成,可以让我们少些很多解析的代码,极大减少了重复的工作量。当然这两个例子使用了最简单的方式,EasyExcel还支持更多场景,例如读,可以读多个sheet,也可以解析一行数据或者多行数据做一次入库操作;写的话,支持复杂头,指定列写入,重复多次写入,多个sheet写入,根据模板写入等等。更多的例子可以去参考EasyExcel官方文档https://www.yuque.com/easyexcel/doc/easyexcel
easyexcel 设置标题_EasyExcel,让 excel 导入导出更加简单相关推荐
- easyexcel 在 设置标题_EasyExcel,让excel导入导出更加简单
EasyExcel 在做excel导入导出的时候,发现项目中封装的工具类及其难用,于是去gitHub上找了一些相关的框架,最终选定了EasyExcel.之前早有听闻该框架,但是一直没有去了解,这次借此 ...
- easyexcel 设置标题_easyexcel设置单元格格式为文本
导出时注册registerWriteHandler(new RowWriteHandlerImpl()) /** * @author jamin * @date 2020/7/29 15:18 */ ...
- SpringBoot中使用Easyexcel实现Excel导入导出功能(三)
导出的数据包含有图片 导出excel表格的数据包含有图片,这种场景比较少.通Easyexcel实现这样的需求,我认为最简便的方法就是使用前面提到的自定义转换器(com.alibaba.excel.co ...
- SpringBoot中使用Easyexcel实现Excel导入导出功能(一)
目录 前言 1.常规导入 2.读取到指定的列 3.读取全部的sheet页 4.日期.数字及其他自定义格式的转换 5.表头有多行的表格读取 6.表头数据的读取 7.单元格内的备注内容读取 前言 exce ...
- 注解+反射优雅的实现Excel导入导出(通用版)
以下文章来源方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/youzi1394046585/ article/details/86670203 日常在做后 ...
- 一个基于POI的通用excel导入导出工具类的简单实现及使用方法
前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...
- excel 导入导出使用poi自定义注解
excel导入导出使用poi自定义注解 最近在做一个数据导入导出的模块 在网上找了一些例子 在这里整理一下 这里就不再贴原作者的地址 (以下代码来自网上非原创 稍作简单修改) 首先引入pom.xm ...
- java Excel导入导出工具类 及使用demo
java Excel导入导出工具类 及使用demo 前言:相信进来的都是想尽快解决问题的,话不多说,按照以下步骤来,可以操作导出excel到本地,导入同理,自行学习.步骤一:直接复制以下excel工具 ...
- 优雅的实现 Excel 导入导出
日常在做后台系统的时候会很频繁的遇到Excel导入导出的问题,正好这次在做一个后台系统,就想着写一个公用工具来进行Excel的导入导出. 一般我们在导出的时候都是导出的前端表格,而前端表格同时也会对应 ...
最新文章
- python可视化来分析全国疫情
- 简明 Vim 练级攻略(转)
- Java多线程:类ThreadPoolExecutor详解
- SpringMVC Controller单例和多例
- CVPR 2017 《Object Detection in Videos with Tubelet Proposal Networks》论文笔记
- hadoop常见错误即解决方法
- (3)Python3笔记之变量与运算符
- Python爬虫利器一Requests库的用法
- git commit --amend修改git commit提交的message
- Nodejs之view中的视图模板之——EJS模板语言,快速入门
- cf卡序列号修改工具_王者荣耀无需Root修改荣耀战区软件和方法分享 全国地区可任意修改...
- 摩根大通分析:随着灰度资金流动缓慢,比特币能否重回4万美元仍存疑问
- slitaz c语言开发环境,makefile和cmake的简单使用
- [笔记二]Essential JavaScript Design Patterns For Beginners
- WinSCP 提示:你的Shell可能与本程序不兼容(推荐使用Bash)。
- 【源码】手把手教你用Python实现Vivado和ModelSim仿真自动化
- 如何巧妙应对压力面试
- 存储器容量计算及相关概念
- SE91 SAP消息类型
- FineReport中cjk编码转换