个人餐饮网站模板,刷推广链接,上海网站建设报价单子现说,上海高端网站建设服EasyExcel01 - 核心api 本文整理自掘金大佬 - 竹子爱熊猫 https://juejin.cn/post/7405158045662576640 文章目录 EasyExcel01 - 核心api一#xff1a;初相识EasyExcel1#xff1a;写入excel入门2#xff1a;读取Excel入门 二#xff1a;数据模型注解1#xff1a;读写通用…EasyExcel01 - 核心api 本文整理自掘金大佬 - 竹子爱熊猫 https://juejin.cn/post/7405158045662576640 文章目录 EasyExcel01 - 核心api一初相识EasyExcel1写入excel入门2读取Excel入门 二数据模型注解1读写通用注解1.1ExcelProperty注解1.2ExcelIgnore注解1.3ExcelIgnoreUnannotated注解1.4DateTimeFormat注解1.5NumberFormat注解 2生成注解2.1ColumnWidth注解2.2ContentFontStyle注解2.3其他注解 三核心API全解1EasyExcel入口类2读对象2.1ExcelReaderBuilder2.2ExcelReaderSheetBuilder2.3ReadListener 3写对象3.1ExcelWriterBuilder3.2ExcelWriterSheetBuilder3.3ExcelWriterTableBuilder3.4WriteHandler 4导入导出接口 一初相识EasyExcel
EasyExcel是一个高效、低内存占用的Excel处理框架提供了简洁易用的API接口使得我们能更加高效、灵活的处理Excel文件
当然EasyExcel并非一个完全从零构建的开源项目而是阿里巴巴在POI的基础上做了进一步封装 下面内容来自easyExcel官网 POI也好JXL也罢它们都存在一个严重的问题就是非常的耗内存尽管POI提供了一套SAX模型能在一定程度上解决OOM问题但它仍然存在一些缺陷对内存消耗依旧较大。 因此EasyExcel重写了POI对07版Excel文件的解析一个3MB的文件用原生的POI-SAX去解析需要消耗100MB左右的内存改用EasyExcel可以降低到几MB并且再大的文件也不会出现内存溢出03版依赖POI-SAX模式也在上层做了模型转换的封装让使用者更加简单方便。 一个75MB的Excel文件每行数据二十五列总计46W条数据能够在23秒解析、读取完成并且仅消耗了16MB内存这个结果无疑是惊人的
同时如果内存足够充裕还可以开启急速模式换取更快的处理性能。
当然这个数据来源于实验环境在硬件配置较差、或读取数据后还需要清洗、落库等情况下性能上会有所差异。但是不管怎么说在资源占用、性能方面都完胜POI原生的处理方式
对EasyExcel有了基本认知后下面来一起快速上手实操一下首先咱们需要导入下相关依赖
dependencygroupIdcom.alibaba/groupIdartifactIdeasyexcel/artifactIdversion4.0.2/version
/dependency这里我们可以使用最新的4.0.2版本也可以选择之前的稳定版本3.1.x以后的版本API大致相同新的版本也会向前兼容3.1.x之前的版本部分API可能在高版本被废弃
关于POI、JDK版本适配问题 1写入excel入门
package com.example.bootrocketmq.study.wheel.easyexcel;import lombok.*;import java.util.Date;/*** author cui haida* 2024/12/21*/
Data
NoArgsConstructor
AllArgsConstructor
public class Person {private Long id; // 主键idprivate String name; // 姓名private String sex; // 性别private String hobby; // 爱好private Date birthday; // 生日
}假设有一个Person集合目前想把其中的数据生成并写入到Excel文件该怎么做十分简单
package com.example.bootrocketmq.study.wheel.easyexcel;import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;import java.util.ArrayList;
import java.util.Date;
import java.util.List;/*** author cui haida* 2024/12/21*/
public class SimpleWriteDemo {private static void writeDemo() {ListPerson personList new ArrayList();Person person new Person(1L, cuihaida, 男, 打游戏, new Date());Person person2 new Person(2L, cuihaida2, 女, 打游戏2, new Date());personList.add(person);personList.add(person2);// 可以写绝对路径String fileName person数据- System.currentTimeMillis() .xlsx;// 创建ExcelWriterBuilder, 默认创建内存模式通过write方式指定文件名和实体类。ExcelWriterBuilder write EasyExcel.write(fileName, Person.class);// 创建ExcelWriterSheetBuilder默认创建第一个sheet通过sheet方式指定sheet名ExcelWriterSheetBuilder sheet write.sheet(person列表);// 通过dowrite(list)的方式写入到excel中sheet.doWrite(personList);write.autoCloseStream(true);System.out.println(写入成功);}public static void main(String[] args) {writeDemo();}
}2读取Excel入门
看完写入操作后下面来看看如何读取Excel文件里的数据咱们就以前面生成的文件作为解析目标首先需要定义一个监听器
package com.example.bootrocketmq.study.wheel.easyexcel;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;import java.util.ArrayList;
import java.util.List;/*** author cui haida* 2024/12/22*/
public class PersonListener extends AnalysisEventListenerPerson {// 一会读出来的数据都放在这里private final ListPerson data new ArrayList();/*** 读excel一行一行的读, 每次都会调用这个invoke方法* param person person实体数据* param analysisContext 上下文对象*/Overridepublic void invoke(Person person, AnalysisContext analysisContext) {System.out.println(每读取到一行都会触发这个函数读取到的内容是: person.toString());// 加入到结果中data.add(person);}/*** 读取完所有数据后调用这个方法* param analysisContext 上下文对象*/Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {System.out.println(读取完毕一共读取了 analysisContext.readSheetHolder().getTotal() 行);}/*** 获取读取的数据* return 数据*/public ListPerson getData() {return data;}
}这个监听器很简单无非就是将每条读取到的数据添加到data集合里然后对外提供了一个获取数据的方法
其实这个监听器不定义也可以因为EasyExcel有默认的监听器
package com.example.bootrocketmq.study.wheel.easyexcel;import com.alibaba.excel.EasyExcel;import java.util.List;/*** author cui haida* 2024/12/22*/
public class SimpleReadDemo {public static void main(String[] args) {String fileName person数据-1734779595717.xlsx;PersonListener listener new PersonListener();// 读取excel的内容要转化成的对象(Person.class), 监听器(PersonListener)EasyExcel.read(fileName, Person.class, listener).sheet().doRead();ListPerson data listener.getData();System.out.println(data);}
}二数据模型注解
从上面可以发现不管是读取文件还是写入文件都需要传递一个具体的class
这个类叫做数据模型类主要是用来映射Java对象和excel列的匹配关系的。【java对象 - excel列】
为了更好的满足各种报表需求easyExcel提供了各种注解进行辅助主要有两大类
1读写通用注解 通用注解是指在类、字段上添加后对于读写场景都会生效的注解而这些通用注解也是最常用的 1.1ExcelProperty注解 ExcelProperty注解在读取用于映射excel表头在写入时用于控制生成的excel表头 作用范围数据实体类的字段上
注解释义用于映射excel列和实体字段的匹配关系
可选参数注意优先级 - index order value)
参数说明value以列名形式匹配excel列多行头会匹配最后一行order以权重形式匹配excel列值越小越靠前优先级高于valueindex以索引形式匹配excel列优先级高于order valueconverter数据格式转换器解析时会根据指定的转换器处理对应数据
该注解是EasyExcel中最重要的注解它提供了列名、权重、索引三种列匹配模式
不过在解析excel文件时官方只建议同时使用一种因为就算指定了多种它们也会有优先级关系大可不必多此一举。
在写入的场景中确实常常将indexvalue一起使用 - value用于控制列名称index用于控制列的顺序。
ExcelProperty(value姓名, index1)
private String name;这代表name字段在excel文件的列名为“姓名”位于表格的第二列B列
1.2ExcelIgnore注解
作用范围数据实体类的字段上
注解释义当前字段不参与excel的匹配即处理时候忽略这个字段。
ExcelIgnore
private String name; // name字段不参与excel列的映射匹配1.3ExcelIgnoreUnannotated注解
作用范围数据模型类上
注解释义匹配列时忽略所有未使用ExcelProperty注解的字段
如果类中许多字段都不想参与excel读写而你又嫌挨个加ExcelIgnore注解麻烦这时就可以直接在类上加一个ExcelIgnoreUnannotated注解以此来忽略所有未添加ExcelProperty注解的字段
1.4DateTimeFormat注解
作用范围数据实体类的字段上
注解释义用String接收日期数据时会根据指定格式转换日期
可选参数
参数说明value日期数据转换为字符串的目标格式use1904windowingexcel日期数据默认从1900年开始但有些会从1904开始
在解析excel文件时如果使用String字段接收日期数据就会根据指定的格式转换数据格式可以参考java.text.SimpleDateFormat的写法例如yyyy-MM-dd HH:mm:ss。
而在往excel写数据时如果Java中的字段类型为Date、LocalDate、LocalDateTime等日期类型则会将日期数据转换为指定的格式写入对应列
1.5NumberFormat注解
作用范围数据实体类的字段上
注解释义用String接受数据类型时会根据指定格式转换数值
可选参数
参数说明value数值转成字符串的目标格式roundingMode数值格式化时的舍入模式如四舍五入、向上取整等
这个注解和前一个注解类似只不过是用于将非整数类型的数值数据转换成给定格式格式可以参考java.text.DecimalFormat的写法如#.##。
除了可以指定格式外还可以指定舍入模式枚举可参考java.math.RoundingMode类
2生成注解
2.1ColumnWidth注解
作用范围数据模型类上、字段上
注解释义设置列的宽度
这个注解如果加在类上则会对所有字段生效如果单独加在某个字段上则只对特定的列有效单位是px
2.2ContentFontStyle注解
作用范围数据模型类上、字段上
注解释义用于设置单元格内容字体格式的注解
可选参数
参数说明fontName字体名称如“黑体、宋体、Arial”等fontHeightInPoints字体高度以磅为单位italic是否设置斜体字体倾斜strikeout是否设置删除线color字体的颜色通过RGB值来设置typeOffset偏移量用于调整字体的位置underline是否添加下划线bold是否对字体加粗charset设置编码格式只能对全局生效字段上设置无效
这个注解用于设置主体内容的字体样式不包含表头与上个注解同理加在类上对整个excel文件生效加在字段上只对单列有效可以通过该注解来设置字体风格、高度、是否斜体等属性
2.3其他注解
HeadFontStyle注解 - 用于定制标题字体格式HeadRowHeight注解 - 用于设置标题行的行高HeadStyle注解 - 用于设置标题样式OnceAbsoluteMerge注解 - 用于合并指定的单元格ContentLoopMerge注解 - 用于合并单元格
三核心API全解
1EasyExcel入口类
基于一开始的简单读写案例会发现所有excel相关的动作都始于EasyExcel这个类而这个类也被称为入口类主要用来构建各种excel操作的实例如读、写。
public class EasyExcel extends EasyExcelFactory {public EasyExcel() {}
}可以发现这是一个空的实现EasyExcel类直接继承了EasyExcelFactory拥有的所有API底层也由EasyExcelFactory提供所以我们直接分析EasyExcelFactory即可
// 基于给定的文件、数据模型类构建一个Excel写入对象
public static ExcelWriterBuilder write(File file, Class head)// 基于给定的流、数据模型类构建一个Excel写入对象
public static ExcelWriterBuilder write(OutputStream outputStream, Class head)// 基于给定的sheet号、sheet名称构建一个Sheet写入对象
public static ExcelWriterSheetBuilder writerSheet(Integer sheetNo, String sheetName)// 基于给定的表格号构建一个Table写入对象
public static ExcelWriterTableBuilder writerTable(Integer tableNo)// 基于给定的文件、数据模型类构建一个Excel读取对象
public static ExcelReaderBuilder read(File file, ReadListener readListener)// 基于给定的文件、数据模型类构建一个Excel读取对象
public static ExcelReaderBuilder read(InputStream inputStream, ReadListener readListener)// 基于给定的sheet号、sheet名称构建一个Sheet读取对象
public static ExcelReaderSheetBuilder readSheet(Integer sheetNo, String sheetName)对于重复的方法不在说明上面列出的是EasyExcelFactory类中的核心方法其作用主要是构建读、写excel文件的对象以便于后续读取、写入excel数据
简单了解这个入口类后下面来看看这些构建出的读写对象
2读对象
EasyExcel中与读取数据相关的核心类主要有三个ExcelReaderBuilder、ExcelReaderSheetBuilder、ReadListener
2.1ExcelReaderBuilder
ExcelReaderBuilder只是为了满足链式调用封装出的Builder类其内部会构建一个读取工作簿的ReadWorkbook对象这就相当于你在实体类上加了个Builder注解
所谓的工作簿可以简单理解成一个Excel文件下面看看它的API
API参数说明converter数据转换器默认内置了很多如果读取的数据需要特定转换则可以按需添加registerReadListener注册监听器读取数据时会触发已注册的监听器headRowNumber文件中头的行数默认为1文件的列头是多行时设置headexcel数据的表头列表以字符串列表形式指定官方建议使用模型类的方式clazz与excel数据映射的模型类与head二选一都未指定时会用Map读取所有数据use1904windowing日期格式是否以1904年开始兼容特殊的excel文件useScuentificFormat数字转文本的时候在较大的数值的是否是否采用科学计数法autoTrim是否开启自动去除前后空格开启后会对读到的头信息、数据去空格
上述这些参数也是ExcelReaderSheetBuilder对象具备的通用属性
下面是独特参数
excelType指定要读取的excel文件类型支持XLS、XLSX、CSVinputStream指定读取数据的文件流底层会创建临时文件来转换数据file要读取数据的目标文件与inputStream二选一mandatoryUseInputStream强制从流中读数据不会创建临时文件性能会变差charset设置文件内容编码格式读取CSV文件时有效默认UTF-8autoCloseStream读取完毕后是否自动关闭读取的流默认开启readCache设置读取数据的缓存配置默认5M内使用内存其余使用EhCachereadCacheSelector设置什么时候使用内存、什么时候使用磁盘来存储缓存数据ignoreEmptyRow读取数据行时是否忽略所有字段为空的行默认开启password读取excel文件的密码文件加密时使用xlsxSAXParserFactoryName指定POI-SAX模式读取使用的实现类useDefaultListener是否使用默认监听器来将excel数据行转换为Java对象extraReadSet接收额外需要读取内容的set如评论、超链接、合并单元的内容readDefaultReturn对于excel中不点击单元格看不到的内容数据、接收时的格式
了解这些参数后我们在读取Excel文件时如何设置呢先来看看最开始读取文件的代码
EasyExcel.read(fileName, ZhuZi.class, zhuZiListener).sheet().doRead();这行代码中EasyExcel.read()方法执行后会返回一个ExcelReaderBuilder对象
执行sheet()方法后会返回一个ExcelReaderSheetBuilder对象
而最后的doRead()方法则是触发真正解析excel、读取数据的步骤
既然如此那么我们在调用EasyExcel.read()方法后、sheet()方法前就可以继续调用上面提到的一系列方法设置参数例如
EasyExcel.read(fileName, ZhuZi.class, zhuZiListener).excelType(ExcelTypeEnum.CSV) // 通过excelType()将读取目标的格式切换成了.csv文件.sheet().doRead();2.2ExcelReaderSheetBuilder
与ExcelReaderBuilder对象一样ExcelReaderSheetBuilder内部维护着一个ReadSheet对象Builder类单纯用于满足链式调用的编程风格。
接触过Excel的小伙伴应该都知道一点一个Excel文件内部可以维护多个Sheet工作表单而ReadSheet就是专门用来读取表单数据的类前面在聊ExcelReaderBuilder类时提到的公用参数ReadSheet也同样具备那么相同的参数作用在不同的对象上区别是什么
很简单如果针对整个工作簿设置的参数会对所有Sheet生效单独针对ReadSheet设置的参数则只针对特定的表单有效。
如果一个文件的不同Sheet数据格式不一样就可以基于这种特性来实现不同的解析逻辑。那么下面来看看ReadSheet独有的参数
sheetNo指定需要读取数据的目标Sheet编码默认为0表示读第一个sheetName根据表单名字去匹配要读取数据的目标Sheet。
是的你没有看错ReadSheet的独立参数就这两个如果你在创建表单读取对象时就已经指定了编号、名称那么这两个参数甚至也用不到。好了那如何针对不同Sheet设置参数呢
大家还记得ReadSheet对象是在何时创建的吗当调用.sheet()方法后创建的所以为Sheet设置参数很简单
EasyExcel.read(fileName, ZhuZi.class, zhuZiListener).sheet(1).headRowNumber(2) // 表示从第二个Sheet中读取数据而这个表单里的表头是两行即从第三行才正式开始读取数据.doRead();2.3ReadListener
读取监听器EasyExcel框架中的监听器体系结构如下 Listener内部为空实现仅抽象为顶层接口用于维护体系结构及拓展性ReadListener读取监听器的顶层接口读取excel文件时会被触发IgnoreExceptionReadListener读取时发生异常会触发的监听器可以在这里处理异常确保读取不会终止AnalysisEventListener解析事件监听器每当读取到一行数据都会触发该类或子类的invoke()方法PageReadListener分页读取监听器当读取的数据量达到指定的数量会被触发处理完一页后才会读下页数据ModelBuildEventListener默认装载的监听器用于在解析到excel数据行时将数据转换为指定类对象SyncReadListener解析事件监听器的子类默认会将所有数据行添加到一个Object集合使用小数据场景ZhuZiListener自定义的监听器继承自解析事件监听器内部带有自定义的业务逻辑
在调用EasyExcel.read()方法时传递的第三个入参就是监听器
或者可以通过registerReadListener()来注册不过有一点要注意同一个工作簿或表单读取对象可以同时注册多个监听器。
这就有点类似于Filter过滤器链一样而EasyExcel存在多个监听器时会根据添加的顺序来触发。
上面列出的一堆监听器重点关注AnalysisEventListener即可因为在实现导入的业务时通常会继承它来自定义处理业务数据的逻辑比如可以在invoke()方法里实现数据校验、落库等逻辑。
3写对象
关于Excel数据写入的核心类主要ExcelWriterBuilder、ExcelWriterSheetBuilder、ExcelWriterTableBuilder、WriterHandler这四个
3.1ExcelWriterBuilder
ExcelWriterBuilder代表一个写入工作簿对象也就是调用EasyExcel.writer()方法返回的对象内部维护着一个WriteWorkbook对象它支持设置的参数列表如下
converter数据转换器如果读取的数据需要特定转换则可以按需添加headexcel数据的表头列表以字符串列表形式指定clazz与excel数据映射的模型类与head二选一autoTrim是否开启自动去除前后空格开启后写入数据前会对数据去空格use1904windowing日期格式是否以1904年开始兼容特殊的excel文件useScientificFormat数字转文本的时候在较大的数值的是否是否采用科学计数法
上面这些是ExcelReaderBuilder类中也存在通用参数甚至作用都是一模一样的
registerWriteHandler注册写入处理器总共有工作簿、表单、数据行、单元格四个级别relativeHeadRowIndex写入到excel时和顶部间隔几行默认为0needHead是否需要生成数据表头列头默认开启useDefaultStyle是否使用默认的样式即简单写入案例中那个样式automaticMergeHead是否开启自动合并头头中相同的字段名上下左右都会尝试合并excludeColumnIndexes写入数据时数据模型类中要忽略的字段下标excludeColumnFieldNames写入数据时数据模型类中要忽略的字段名称includeColumnIndexes写入数据时只需要导出的字段下标includeColumnFieldNames写入数据时只需要导出的字段名称orderByIncludeColumn是否开启字段排序默认不开启根据类字段或指定head排序filedCacheLocation数据模型的字段缓存模式默认为ThreadLocal可以改为纯内存或不缓存。
上述参数是当前对象、WriterSheet、WriterTable三者皆备的通用参数
再来看看ExcelWriterBuilder的专属参数
excelType写出的excel文件类型charset写出的数据编码格式仅CSV支持password为生成的文件设置查看密码autoCloseStream写入完成后是否自动关闭流默认开启file数据要写入的目标文件outputStream数据要写入的目标流templateFile模板文件填充场景使用templateInputStream模板文件流填充场景使用inMemory是否基于内存生成文件默认不开启会生成临时文件writeExcelOnException写入过程抛出异常时是否尝试把已有数据写入excel默认关闭。
这些参数在写入excel时怎么设置呢同样先来看最开始的写入案例
EasyExcel.write(fileName, ZhuZi.class).sheet(竹子数据).doWrite(zhuZis);调用EasyExcel.write()方法后会得到一个ExcelWriterBuilder对象而执行sheet()后会返回一个ExcelWriterSheetBuilder对象最后的doWrite()方法代表真正触发数据写入逻辑。
为此想要设置这些参数只要在.write()方法之后、.sheet()方法之前调用对应方法即可
3.2ExcelWriterSheetBuilder
ExcelWriterSheetBuilder内部维护着一个WriteSheet对象代表表单写入对象和表单读取对象类似
与上一个对象的唯一区别就在于可以针对某一个具体sheet去设置参数而WriteSheet具备的独立参数也就俩
sheetNo将数据写入指定编码的Sheet表单默认为0sheetName将数据写入到指定名字的表单中。
如果要为单独某一个表单设置参数则只需要在调用了sheet()方法之后、调用doWrite()方法之前设置即可
3.3ExcelWriterTableBuilder
与读取Excel时不同写入时多了一个WriterTable类
这个类的作用是按表格形式写入数据到Excel文件中即可以向一个表单里面写入多个数据表格
而表格的专属参数只有一个即
tableNo需要写入的表格编码默认值为0
如果只往sheet写入一个表格这时就算把tableNo设置成999都没用。
只有当一个sheet里写入多个表格时就可以通过这个编号来控制先后顺序
而表格之间可以通过relativeHeadRowIndex这个通用参数来控制间隔。
3.4WriteHandler
写入处理器WriteHandler是EasyExcel框架在生成excel时非常重要的组件它可以在写入过程中执行各种自定义的操作比如自定义单元格样式、自定义合并单元格、数据行等。
因为框架内部实现了非常多的子类所以整个WriteHandler体系比读取监听器大上很多光WriteHandler就有二十多个子类但其中很多我们用不到因此就不一一做分析了这里介绍几个较为重要的子类
CellWriteHandler单元格写入处理器每写入一个单元格时会被触发RowWriteHandler数据行写入处理器每写入一行数据时会被触发SheetWriteHandler表单写入处理器每写入一个表单时会被触发WorkbookWriteHandler工作簿写入处理器写入一个excel文件时被触发......
其实上面列出的四个类依旧是接口大家可以根据具体的需求选择性实现你可以在实现类里精准控制每个单元格的样式、更改内容、合并等最后将其注册到对应的工作簿、表单写入对象上就能生效
4导入导出接口
想要实现导入导出接口关键点就在于如何从网络请求中读取Excel数据以及如何将生成的excel文件返回
其实这个很简单回想下前面读写核心类的参数是不是支持通过流来指定要读取/写入的目标
因此我们可以基于输入/输出流来实现
RestController
RequestMapping(/excel)
public class SimpleExcelController {/** Excel导入接口要解析的目标文件传入file字段* */PostMapping(/import)public void excelImport(MultipartFile file) {if (null file) {throw new RuntimeException(哎呀网络出小差啦……);}ZhuZiListener listener new ZhuZiListener();try {// 从上传的文件中获取流并基于流读取excel文件的数据EasyExcel.read(file.getInputStream(), ZhuZi.class, listener).sheet().doRead();} catch (IOException e) {throw new RuntimeException(Excel文件解析失败请稍后重试~);}// 这里会获取到excel里的所有数据行可以基于该数据进行校验、落库等业务操作ListZhuZi excelData listener.getData();}/** Excel导出接口需要将response作为参数注入* */GetMapping(/export)public void excelExport(HttpServletResponse response) {// 内容类型也可以设置成application/vnd.openxmlformats-officedocument.spreadsheetml.sheetresponse.setContentType(application/vnd.ms-excel);response.setCharacterEncoding(utf-8);String fileName 竹子数据- System.currentTimeMillis() .xlsx;try {// 防止中文乱码使用URLEncoder重新编码fileName URLEncoder.encode(fileName, UTF-8).replaceAll(\\, %20);} catch (UnsupportedEncodingException e) {throw new RuntimeException(Excel导出失败请稍后重试);}response.setHeader(Content-disposition, attachment;filename*utf-8 fileName);// 这里模拟从库里读取的集合数据ListZhuZi zhuZis new ArrayList();ZhuZi zhuZi new ZhuZi(1L, 竹子, 男, 熊猫, new Date());zhuZis.add(zhuZi);try {// 这里指定excel数据的输出目标为响应流EasyExcel.write(response.getOutputStream(), ZhuZi.class).sheet().doWrite(zhuZis);} catch (IOException e) {throw new RuntimeException(Excel导出失败请稍后重试);}}
}基于EasyExcel来实现导入、导出格外简单导入时只需要通过MultipartFile对象来接收excel文件然后从它的流中读取数据解析即可。
当然如果你想对excel表里的数据进行业务处理可以选择在数据导入完成后也可以直接在自定义的Listener监听器类中读到一条数据就处理一次。
再来看导出接口这里会基于response对象来实现首先会将响应的数据声明为Excel文件等待EasyExcel生成数据后就会通过的OutputStream输出流返回给调用方。
只不过要注意如果文件名是中文则需要在内部先做UTF-8编码否则调用方得到的文件名称就会乱码。 文章转载自: http://www.morning.mmtjk.cn.gov.cn.mmtjk.cn http://www.morning.ggnrt.cn.gov.cn.ggnrt.cn http://www.morning.pngdc.cn.gov.cn.pngdc.cn http://www.morning.skcmt.cn.gov.cn.skcmt.cn http://www.morning.jkfyt.cn.gov.cn.jkfyt.cn http://www.morning.lmxzw.cn.gov.cn.lmxzw.cn http://www.morning.hsflq.cn.gov.cn.hsflq.cn http://www.morning.nkyqh.cn.gov.cn.nkyqh.cn http://www.morning.rongxiaoman.com.gov.cn.rongxiaoman.com http://www.morning.gxqpm.cn.gov.cn.gxqpm.cn http://www.morning.ylpwc.cn.gov.cn.ylpwc.cn http://www.morning.dhyqg.cn.gov.cn.dhyqg.cn http://www.morning.muniubangcaishui.cn.gov.cn.muniubangcaishui.cn http://www.morning.qzsmz.cn.gov.cn.qzsmz.cn http://www.morning.jqjnx.cn.gov.cn.jqjnx.cn http://www.morning.yskhj.cn.gov.cn.yskhj.cn http://www.morning.lqljj.cn.gov.cn.lqljj.cn http://www.morning.pgfkl.cn.gov.cn.pgfkl.cn http://www.morning.mcfjq.cn.gov.cn.mcfjq.cn http://www.morning.pamdeer.com.gov.cn.pamdeer.com http://www.morning.xppj.cn.gov.cn.xppj.cn http://www.morning.gbfuy28.cn.gov.cn.gbfuy28.cn http://www.morning.ctqlq.cn.gov.cn.ctqlq.cn http://www.morning.nfbkz.cn.gov.cn.nfbkz.cn http://www.morning.fsfz.cn.gov.cn.fsfz.cn http://www.morning.nzfyx.cn.gov.cn.nzfyx.cn http://www.morning.gyqnp.cn.gov.cn.gyqnp.cn http://www.morning.gghhmi.cn.gov.cn.gghhmi.cn http://www.morning.rwnx.cn.gov.cn.rwnx.cn http://www.morning.btwrj.cn.gov.cn.btwrj.cn http://www.morning.zkqjz.cn.gov.cn.zkqjz.cn http://www.morning.nrrzw.cn.gov.cn.nrrzw.cn http://www.morning.hnhsym.cn.gov.cn.hnhsym.cn http://www.morning.gczqt.cn.gov.cn.gczqt.cn http://www.morning.gtkyr.cn.gov.cn.gtkyr.cn http://www.morning.mfbcs.cn.gov.cn.mfbcs.cn http://www.morning.mxnhq.cn.gov.cn.mxnhq.cn http://www.morning.wgdnd.cn.gov.cn.wgdnd.cn http://www.morning.nzqqd.cn.gov.cn.nzqqd.cn http://www.morning.xkbdx.cn.gov.cn.xkbdx.cn http://www.morning.juju8.cn.gov.cn.juju8.cn http://www.morning.spxk.cn.gov.cn.spxk.cn http://www.morning.cykqb.cn.gov.cn.cykqb.cn http://www.morning.gwhjy.cn.gov.cn.gwhjy.cn http://www.morning.blbys.cn.gov.cn.blbys.cn http://www.morning.srrzb.cn.gov.cn.srrzb.cn http://www.morning.xrwbc.cn.gov.cn.xrwbc.cn http://www.morning.nzdks.cn.gov.cn.nzdks.cn http://www.morning.bjjrtcsl.com.gov.cn.bjjrtcsl.com http://www.morning.zlxkp.cn.gov.cn.zlxkp.cn http://www.morning.gbwfx.cn.gov.cn.gbwfx.cn http://www.morning.qrwjb.cn.gov.cn.qrwjb.cn http://www.morning.qynnw.cn.gov.cn.qynnw.cn http://www.morning.nrzkg.cn.gov.cn.nrzkg.cn http://www.morning.hgcz.cn.gov.cn.hgcz.cn http://www.morning.jprrh.cn.gov.cn.jprrh.cn http://www.morning.mhnd.cn.gov.cn.mhnd.cn http://www.morning.rtlg.cn.gov.cn.rtlg.cn http://www.morning.nrpp.cn.gov.cn.nrpp.cn http://www.morning.rkrcd.cn.gov.cn.rkrcd.cn http://www.morning.jmwrj.cn.gov.cn.jmwrj.cn http://www.morning.hmmtx.cn.gov.cn.hmmtx.cn http://www.morning.bzqnp.cn.gov.cn.bzqnp.cn http://www.morning.cldgh.cn.gov.cn.cldgh.cn http://www.morning.bftqc.cn.gov.cn.bftqc.cn http://www.morning.bmssj.cn.gov.cn.bmssj.cn http://www.morning.mhmcr.cn.gov.cn.mhmcr.cn http://www.morning.dmwjl.cn.gov.cn.dmwjl.cn http://www.morning.hwcln.cn.gov.cn.hwcln.cn http://www.morning.mqnbm.cn.gov.cn.mqnbm.cn http://www.morning.kaakyy.com.gov.cn.kaakyy.com http://www.morning.pwgzh.cn.gov.cn.pwgzh.cn http://www.morning.znnsk.cn.gov.cn.znnsk.cn http://www.morning.rbkl.cn.gov.cn.rbkl.cn http://www.morning.fpzpb.cn.gov.cn.fpzpb.cn http://www.morning.jjzjn.cn.gov.cn.jjzjn.cn http://www.morning.mkrjf.cn.gov.cn.mkrjf.cn http://www.morning.hqsnt.cn.gov.cn.hqsnt.cn http://www.morning.mhlsx.cn.gov.cn.mhlsx.cn http://www.morning.bktzr.cn.gov.cn.bktzr.cn