当前位置:   article > 正文

EasyExcel_easyexcel需要哪些包

easyexcel需要哪些包

 

1.EasyExcel简介

  • easyExcel是阿里巴巴开源poi插件之一,当前最新版本2.1.3,poi版本3.17

  • 主要解决了poi框架使用复杂,sax解析模式不容易操作,数据量大起来容易OOM,解决了POI并发造成的报错

  • 2.EasyExcel优势

  • 注解式自定义操作。

  • 输入输出简单,提供输入输出过程的接口

  • 支持一定程度的单元格合并等灵活化操作

3.EasyExcel开发示例

3.1 导入依赖包

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>easyexcel</artifactId>
  4. <version>2.1.3</version>
  5. </dependency>

3.2 创建实体类

实体类对需要导出或者导入的字段增加@ExcelProperty注解,index值为对应excel中的列,value为表头,format为日期格式化

  1. public class PersonDto{
  2. /** id */
  3. @ExcelProperty(index = 0 , value = "id")
  4. private String id;
  5. /** 姓名 **/
  6. @ExcelProperty(index = 1 , value = "姓名")
  7. private String name;
  8. /** 生日 **/
  9. @ExcelProperty(index = 2 , value = "生日" , format = "yyyy-MM-dd")
  10. //新版本提供了一个@com.alibaba.excel.annotation.format.DateTimeFormatDateTimeFormat替代format属性
  11. private String birth;
  12. public String getId() {
  13. return id;
  14. }
  15. public void setId(String id) {
  16. this.id = id;
  17. }
  18. public String getName() {
  19. return name;
  20. }
  21. public void setName(String name) {
  22. this.name = name;
  23. }
  24. public String getBirth() {
  25. return birth;
  26. }
  27. public void setBirth(String birth) {
  28. this.birth = birth;
  29. }
  30. }

 

3.3 写excel

 

  1. public class TestExcel {
  2. private List<PersonDto> createModelList() {
  3. List<PersonDto> PersonDtos = new ArrayList<>();
  4. for (int i = 0; i < 100; i++) {
  5. PersonDto personDto = new PersonDto();
  6. personDto.setName("学Java"+i);
  7. personDto.setId(""+i);
  8. personDto.setBirth(new Date().toString());
  9. PersonDtos.add(personDto);
  10. }
  11. return PersonDtos;
  12. }
  13. /**
  14. * 最简单的写
  15. * <p>1. 创建excel对应的实体对象 参照{@link DemoData}
  16. * <p>2. 直接写即可
  17. */
  18. @Test
  19. public void simpleWrite() {
  20. // 写法1
  21. String fileName = "D:\\person.xlsx";
  22. // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
  23. // 如果这里想使用03 则 传入excelType参数即可
  24. EasyExcel.write(fileName, PersonDto.class).sheet("模板").doWrite(createModelList());
  25. // 写法2
  26. fileName = "D:\\person.xlsx";
  27. // 这里 需要指定写用哪个class去写
  28. ExcelWriter excelWriter = EasyExcel.write(fileName, PersonDto.class).build();
  29. WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
  30. excelWriter.write(createModelList(), writeSheet);
  31. /// 千万别忘记finish 会帮忙关闭流
  32. excelWriter.finish();
  33. }
  34. }

3.4读excel

  1. AnalysisEventListener<PersonDto>:
  2. 读取excel必须提供一个监听类继承该抽象类
  3. public void invoke(PersonDto data, AnalysisContext context)
  4. 在读取excel的每一行,都会去调用该监听器的invoke方法,自动传入解析好的java对象
  5. public void doAfterAllAnalysed(AnalysisContext context)
  6. 在读取excel结束的时候,会调用该方法

3.4.1 PersonDtoListener

  1. import com.alibaba.excel.context.AnalysisContext;
  2. import com.alibaba.excel.event.AnalysisEventListener;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. public class PersonDtoListener extends AnalysisEventListener<PersonDto> {
  6. /**
  7. * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
  8. */
  9. private static final int BATCH_COUNT = 5;
  10. List<PersonDto> list = new ArrayList<PersonDto>();
  11. /**
  12. * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
  13. */
  14. private PersonDao personDao;
  15. public PersonDtoListener() {
  16. }
  17. /**
  18. * 官方问题提到不能用spring管理该监听器对象,所以不能直接用依赖注入注解注入
  19. * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
  20. *
  21. * @param personDAO
  22. */
  23. public PersonDtoListener(PersonDao personDAO) {
  24. this.personDao = personDAO;
  25. }
  26. /**
  27. * 这个每一条数据解析都会来调用
  28. *
  29. * @param data
  30. * one row value. Is is same as {@link AnalysisContext#readRowHolder()}
  31. * @param context
  32. */
  33. public void invoke(PersonDto data, AnalysisContext context) {
  34. list.add(data);
  35. // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
  36. if (list.size() >= BATCH_COUNT) {
  37. saveData();
  38. // 存储完成清理 list
  39. list.clear();
  40. }
  41. }
  42. /**
  43. * 所有数据解析完成了 都会来调用
  44. *
  45. * @param context
  46. */
  47. public void doAfterAllAnalysed(AnalysisContext context) {
  48. // 这里也要保存数据,确保最后遗留的数据也存储到数据库
  49. saveData();
  50. }
  51. /**
  52. * 加上存储数据库
  53. */
  54. private void saveData() {
  55. System.out.println(list);
  56. personDao.save(list);
  57. }
  58. }

3.4.2 测试类

  1. /**
  2. * 最简单的读
  3. * <p>1. 创建excel对应的实体对象 参照{@link cn.nyse.entity.PersonDto}
  4. * <p>2. 由于默认异步读取excel,所以需要创建excel一行一行的回调监听器,参照{@link cn.nyse.entity.PersonDtoListener}
  5. * <p>3. 直接读即可
  6. */
  7. @Test
  8. public void simpleRead() {
  9. // 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
  10. // 写法1
  11. String fileName = "F:\\dfbz\\课件2.0\\guguanjia2.0\\some.xlsx";
  12. // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
  13. EasyExcel.read(fileName, PersonDto.class, new PersonDtoListener()).sheet().doRead();
  14. // 写法2
  15. fileName = "F:\\dfbz\\课件2.0\\guguanjia2.0\\some.xlsx";
  16. ExcelReader excelReader = EasyExcel.read(fileName, PersonDto.class, new PersonDtoListener()).build();
  17. ReadSheet readSheet = EasyExcel.readSheet(0).build();
  18. excelReader.read(readSheet);
  19. // 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
  20. excelReader.finish();
  21. }

 

二、vue的文件上传

 

1.步骤

a.在input组件中添加点击事件@click="upload"

b.在事件处理函数中传入事件对象,通过事件对象获取文件对象e.target.files[0]

c.创建表单对象let formData = new FormData();

d.放入文件对象 formData.append("file",e.target.files[0]);

d.通过axios设置请求头headers:{'content-type':'multipart/form-data'}和提交方式post

e.后台通过上传对象MultipartFile file接受

页面:

  1. <div id="div1">
  2. <input type="file" accept=".xls,.xsls" @change="upload"/>
  3. </div>
  4. <script>
  5. var vm = new Vue({
  6. el:'#app',
  7. /*
  8. 由于vue的响应式原理 data 如果是一个对象,对象中使用this不会自动绑定为vue对象,需要通过回调函数方式,vue才会在调用该函数的时候,进行双向绑定,并且自动传入
  9. 当前vue对象到函数中
  10. */
  11. data:function(){
  12. console.log(this);
  13. return {
  14. file:''
  15. }
  16. },
  17. methods:{
  18. upload:function(e){
  19. this.file = e.target.files[0];
  20. console.log(this.file);
  21. let formData = new FormData();
  22. formData.append("file",this.file);
  23. axios({
  24. method:'post',
  25. headers:{'content-type':'multipart/form-data'},
  26. url:'/guguanjia/manager/area/importExcel',
  27. data:formData
  28. }).then(response =>{
  29. console.log(response.data);
  30. }).catche(function(error){
  31. });
  32. }
  33. }
  34. });
  35. </script>

 

后台

  1. @RequestMapping("importExcel")
  2. public void importExcel(@RequestParam("file")MultipartFile file){
  3. System.out.println((file.getOriginalFilename()));
  4. 。。。
  5. }

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/数据可视化灵魂/article/detail/61075
推荐阅读
相关标签
  

闽ICP备14008679号