1.概述

EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。 github地址:GitHub - alibaba/easyexcel: 快速、简洁、解决大文件内存溢出的java处理Excel工具

通过java代码完成对Excel的读写操作,所谓的读写理解为上传和下载

官网:关于Easyexcel | Easy Excel (alibaba.com)

2. easyexcel写操作

所谓的写操作就是把java中的类对象写入到excel表格中。

实现步骤:

1.引入相关依赖

     <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version></dependency>

2.封装响应的对象

package com.wzh.excel;import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;import java.util.Date;@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class DemoData {@ExcelProperty("字符串标题")private String string;@ExcelProperty("日期标题")private Date date;@ExcelProperty("数字标题")private Double doubleData;/*** 忽略这个字段*/@ExcelIgnoreprivate String ignore;
}

3.通过easyexcel完成写操作

package com.wzh.excel;import com.alibaba.excel.EasyExcel;import java.util.ArrayList;
import java.util.Date;
import java.util.List;/*** @ProjectName: computer* @Package: com.wzh.excel* @ClassName: TestWriterDemo* @Author: 王振华* @Description:* @Date: 2022/10/24 20:37* @Version: 1.0*/
public class TestWriterDemo {public static void main(String[] args) {//fileName:表示excel文件所在路径以及名称String fileName = "D:\\java_idea_2020\\dev\\自己代码\\computer\\easyexcel.xlsx";// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭// 如果这里想使用03 则 传入excelType参数即可//模拟要写入excel的数据List<DemoData> list = new ArrayList<>();list.add(new DemoData("aaa",new Date(),3.1,"aaaaaa"));list.add(new DemoData("bbb",new Date(),3.1,"bbbbbb"));EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(list);}
}

3.easyexcel写操作--web模式

写Excel | Easy Excel (alibaba.com)

package com.wzh.controller;import com.alibaba.excel.EasyExcel;
import com.wzh.excel.DemoData;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;@Controller
public class ExcelController {/*** 文件下载(失败了会返回一个有部分数据的Excel)* <p>* 1. 创建excel对应的实体对象 参照{@link DownloadData}* <p>* 2. 设置返回的 参数* <p>* 3. 直接写,这里注意,finish的时候会自动关闭OutputStream,当然你外面再关闭流问题不大*/@GetMapping("download")public void download(HttpServletResponse response) throws IOException {// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postmanresponse.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");//模拟要写入excel的数据List<DemoData> list = new ArrayList<>();list.add(new DemoData("aaa",new Date(),3.1,"aaaaaa"));list.add(new DemoData("bbb",new Date(),3.1,"bbbbbb"));EasyExcel.write(response.getOutputStream(), DemoData.class).sheet("模板").doWrite(list);}
}

这个是我之前的一个工具类:

package com.wzh.utils;import com.alibaba.excel.EasyExcel;import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @ProjectName: computer* @packageName: com.wzh.utils* @author: xmhz45* @create: 2022/7/6 19:31*/
public class ExcelUtil {public void print(String filename, List objects, HttpServletResponse response) {try {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");//防止中文乱码//String fileName = URLEncoder.encode("测试","utf-8");response.setHeader("Content-Disposition","attachment;filename=UTF-8''"+fileName+".xlsx");ServletOutputStream outputStream = response.getOutputStream();//工作簿对象ExcelWriterBuilder writerWork = EasyExcel.write(outputStream,objects.get(0).getClass());//工作表对象ExcelWriterSheetBuilder sheet = writerWork.sheet(filename);sheet.doWrite(objects);outputStream.flush();outputStream.close();} catch (Exception e) {// 重置responseresponse.reset();response.setContentType("application/json");response.setCharacterEncoding("utf-8");Map<String, String> map = new HashMap<String, String>();map.put("status", "failure");map.put("message", "下载文件失败" + e.getMessage());e.printStackTrace();}}}

4.easyexcel完成读操作

读Excel | Easy Excel (alibaba.com)

1.需要一个监听器

package com.wzh.excel;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;import java.util.List;// 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
@Slf4j
public class DemoDataListener implements ReadListener<DemoData> {/*** 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收*/private static final int BATCH_COUNT = 100;/*** 缓存的数据*/private List<DemoData> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);/*** 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。*/private DemoDAO demoDAO;public DemoDataListener() {// 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数demoDAO = new DemoDAO();}/*** 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来** @param demoDAO*/public DemoDataListener(DemoDAO demoDAO) {this.demoDAO = demoDAO;}/*** 这个每一条数据解析都会来调用   excel数据 07版没有限制** @param data    one row value. Is is same as {@link AnalysisContext#readRowHolder()}* @param context*/@Overridepublic void invoke(DemoData data, AnalysisContext context) {log.info("解析到一条数据:{}", JSON.toJSONString(data));cachedDataList.add(data);// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM//如果excel数据够100条执行if语句  不够的话执行doAfterAllAnalysed方法if (cachedDataList.size() >= BATCH_COUNT) {System.out.println("100条保存");saveData();// 存储完成清理 listcachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);}}/*** 所有数据解析完成了 都会来调用** @param context   最后需要执行的代码*/@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 这里也要保存数据,确保最后遗留的数据也存储到数据库saveData();System.out.println("不足100条最后调用");log.info("所有数据解析完成!");}/*** 加上存储数据库*/private void saveData() {log.info("{}条数据,开始存储数据库!", cachedDataList.size());demoDAO.save(cachedDataList);log.info("存储数据库成功!");}
}

2.dao层  之后只需要操作这个  存入数据库即可

package com.wzh.excel;import java.util.List;/*** 假设这个是你的DAO存储。当然还要这个类让spring管理,当然你不用需要存储,也不需要这个类。**/
@Component
public class DemoDAO {public void save(List<DemoData> list) {// 如果是mybatis,尽量别直接调用多次insert,自己写一个mapper里面新增一个方法batchInsert,所有数据一次性插入}
}

3.测试

package com.wzh.excel;import com.alibaba.excel.EasyExcel;import java.io.File;public class TestReadDemo {public static void main(String[] args) {//要读的文件路劲及文件名String fileName = "D:\\java_idea_2020\\dev\\自己代码\\computer\\easyexcel.xlsx";// 这里 需要指定读用哪个class去读,然后读取第一个sheet//DemoData.class:实体类//new DemoDataListener() 监听器EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();}
}

5.easyexcel读操作--web

ssm框架:

1.依赖--文件上传的依赖

    <!--文件上传的依赖--><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency>

2.文件上传解析器

<!--id的名称必须叫multipartResolver--><!--文件解析器--><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!--这里的单位为字节10M*1024K*1024--><property name="maxUploadSize" value="10485760"/></bean>
    /*** 文件上传* <p>* 1. 创建excel对应的实体对象 参照{@link UploadData}* <p>* 2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link UploadDataListener}* <p>* 3. 直接读即可*/@PostMapping("upload")@ResponseBodypublic String upload(MultipartFile file) throws IOException {EasyExcel.read(file.getInputStream(), UploadData.class, new UploadDataListener(uploadDAO)).sheet().doRead();return "success";}
package com.wzh.controller;import com.alibaba.excel.EasyExcel;
import com.wzh.excel.DemoDAO;
import com.wzh.excel.DemoData;
import com.wzh.excel.DemoDataListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;@Controller
public class ExcelController {/*** 文件下载(失败了会返回一个有部分数据的Excel)* <p>* 1. 创建excel对应的实体对象 参照{@link DownloadData}* <p>* 2. 设置返回的 参数* <p>* 3. 直接写,这里注意,finish的时候会自动关闭OutputStream,当然你外面再关闭流问题不大*/@GetMapping("download")public void download(HttpServletResponse response) throws IOException {// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postmanresponse.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");//模拟要写入excel的数据List<DemoData> list = new ArrayList<>();list.add(new DemoData("aaa",new Date(),3.1,"aaaaaa"));list.add(new DemoData("bbb",new Date(),3.1,"bbbbbb"));EasyExcel.write(response.getOutputStream(), DemoData.class).sheet("模板").doWrite(list);}@Autowiredprivate DemoDAO demoDAO;/*** 文件上传* <p>* 1. 创建excel对应的实体对象 参照{@link UploadData}* <p>* 2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link UploadDataListener}* <p>* 3. 直接读即可*/@PostMapping("upload")@ResponseBodypublic String upload(MultipartFile file) throws IOException {EasyExcel.read(file.getInputStream(), DemoData.class, new DemoDataListener(demoDAO)).sheet().doRead();return "success";}
}

测试用postman传参文件:

测试的时候会出现一个问题DemoDao没有注入成功,那是因为没有被包扫描到。

springboot:

一个普通类如何被spring所管理,spring boot整合EasyExcel_calf小小牛的博客-CSDN博客

前端需要注意的是  要设置类型  blob

//导出printC(){if(this.multipleSelection.length!=0){var that = this;axios.post("/outlibrarytransfer/printC?filename=平调入库", this.multipleSelection,{responseType: 'blob'}).then(function (res){var blob = new Blob([res.data])var downloadElement = document.createElement('a');var href = window.URL.createObjectURL(blob); //创建下载的链接downloadElement.href = href;downloadElement.download = '平调入库.xlsx'; //下载后文件名document.body.appendChild(downloadElement);downloadElement.click(); //点击下载document.body.removeChild(downloadElement); //下载完成移除元素window.URL.revokeObjectURL(href); //释放掉blob对象console.log(res);that.initTable();});}else{this.$message.error("请选择要到导出的数据!");}},

2.poi导出excel

(8条消息) postman 导出excel_天狼1222的博客-CSDN博客_postman 导出excel

(8条消息) poi excel操作汇总_天狼1222的博客-CSDN博客

使用Easyexcel对Excel进行读写操作相关推荐

  1. python写表格_使用Python对Excel进行读写操作

    学习Python的过程中,我们会遇到Excel的读写问题.这时,我们可以使用xlwt模块将数据写入Excel表格中,使用xlrd模块从Excel中读取数据.下面我们介绍如何实现使用Python对Exc ...

  2. excel调用python编程-使用Python对Excel进行读写操作

    学习Python的过程中,我们会遇到Excel的读写问题.这时,我们可以使用xlwt模块将数据写入Excel表格中,使用xlrd模块从Excel中读取数据.下面我们介绍如何实现使用Python对Exc ...

  3. python对excel进行读写操作

    python对excel进行读写操作 欢迎使用Markdown编辑器 一.安装库 1.安装xlrd模块 2.安装xlwt模块 2.安装openpyxl模块 补充(多个python版本) 二.使用介绍 ...

  4. 利用python对Excel进行读写操作

    最近在写论文做实验的过程中,利用python自带的matplotlib库进行绘画,但是尝尝会出现在程序跑完后发现图片里面有一些小细节没有注意到,导致整个代码重新跑.代码重新跑短则几小时,长则就不好说了 ...

  5. EasyExcel java实现excel简单读写操作(快速上手,复制粘贴即可)

    EasyExcel是一个基于Java的简单.省内存的读写Excel的开源项目. https://github.com/alibaba/easyexcel 一.导入maven坐标 Lombok可选,不导 ...

  6. POI和 EasyExcel对Excel的简单操作

    目录 POI 结构 应用 Excel excel2003版和excel2007版的区别 关于WorkBook POI的写入操作 1.HSSFWorkbook的写入操作 2.XSSFWorkbook的写 ...

  7. pythonexcel操作总结_python中常见关于Excel表格读写操作

    最近在写项目,刚好要运用到excel表格的一些读写,顺便总结一下我以前学过的几个关于表格的操作.在写项目中,经常会见到页面中数据导出到表格中,同时,也会有经常在表格中填写测试用例,然后获取数据来做自动 ...

  8. mfc创建excel如何另存为_MFC实现excel的读写操作

    这个是使用ODBC来完成的 第一步:建立基于对话框的MFC工程,命名为MfctoExc: 第二步:添加两个头文件到stdafx.h, #include #include 第三步:添加两个按钮控件和一个 ...

  9. easyExcel 实现简单的读写操作

    EadyExcel:写操作: 第一步: <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --><depen ...

最新文章

  1. input(position 1) must be Tensor, not NoneType
  2. 图像低频高频区域分离
  3. Lesson 13.1 深度学习建模目标与性能评估理论
  4. php能调用easyui窗口,关于jQuery EasyUI window窗口使用实例详解
  5. svn教程----eclipse的SVN插件使用
  6. C# 值类型与引用类型的详解
  7. android 手势事件 重写,Android实现通过手势控制图片大小缩放的方法
  8. go设计模式思维导图
  9. 分享:TreeFrog 1.1 发布,C++ Web 应用开发框架
  10. 郝斌老师C语言视频观感
  11. java俄罗斯方块论文,java俄罗斯方块论文
  12. Unable to run mksdcard SDK tool
  13. 联想服务器没有安装iis组件,win10没有iis怎么安装_手把手教你安装iis的详细步骤...
  14. python 100days github_GitHub - 2668599092/Python-100-Days: Python - 100天从新手到大师
  15. 公众号如何涨粉?做微信seo疯狂涨粉技巧
  16. java中decrement,Java LongAdder decrement()用法及代码示例
  17. Microsoft Teams Rooms Content Camera 革命性更新
  18. java happen-before_java 内存模型中的happen-before 是什么?
  19. eigen坐标变换_Eigen实现坐标转换
  20. 十大经典三维动画制作软件

热门文章

  1. 微信爬取过程中参数分析
  2. 华为鸿蒙系统让国产手机用,鸿蒙系统不支持华为手机 系统还是国产手机的命门...
  3. 【word 2016】保存太慢解决办法
  4. 特斯拉如何驱动顶级客户体验
  5. Verilog 中signed和$signed()的用法
  6. NVDIMM原理与应用之一:基本原理
  7. VUE组件日时分秒倒计时
  8. java在线运行工具,终于搞明白了
  9. 看历史杂志看历史杂志社看历史编辑部2022年第5期目录查阅
  10. 获取指定日期的月份的第几个星期几是几号