在项目中,我们经常用到EasyExcel框架实现:对Excel文件的读写操作。为了方便后续其他项目中的使用,将对Excel文件的读写操作,封装成工具类。

一、EasyExcel实现Excel读写,封装工具类

1.1、后端代码

  • ExcelUtil工具类,完成读写操作
package com.deewin.aftermarket.admin.utils;import cn.hutool.core.convert.Convert;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.deewin.aftermarket.admin.excel.listener.ExcelListener;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;/*** Excel读写工具类* @Author bitaotao* @Description Excel读写工具类* @Date 2021-11-23*/
public class ExcelUtil {private static final String SUFFIX_XLSX = ".xlsx";private static final String SUFFIX_XLS=".xls";/*** 读取Excel(多个sheet可以用同一个实体类解析)* @param excelInputStream* @param fileName* @param clazz* @param <T>* @return*/public static <T> List<T> readExcel(InputStream excelInputStream, String fileName,Class<T> clazz) {ExcelListener excelListener = new ExcelListener();ExcelReader excelReader = getReader(excelInputStream, fileName,clazz, excelListener);if (excelReader == null) {return new ArrayList<>();}List<ReadSheet> readSheetList = excelReader.excelExecutor().sheetList();for (ReadSheet readSheet : readSheetList) {excelReader.read(readSheet);}excelReader.finish();return Convert.toList(clazz, excelListener.getDataList());}/*** 导出Excel(一个sheet)** @param response  HttpServletResponse* @param list      数据list* @param fileName  导出的文件名* @param sheetName 导入文件的sheet名* @param clazz     实体类*/public static <T> void writeExcel(HttpServletResponse response, List<T> list, String fileName, String sheetName, Class<T> clazz) {OutputStream outputStream = getOutputStream(response, fileName);ExcelWriter excelWriter = EasyExcel.write(outputStream, clazz).build();WriteSheet writeSheet = EasyExcel.writerSheet(sheetName).build();excelWriter.write(list, writeSheet);excelWriter.finish();}/*** 导出时生成OutputStream*/private static OutputStream getOutputStream(HttpServletResponse response, String fileName) {// 文件名String fileFullName = fileName.concat(SUFFIX_XLSX);try {// 防止中文乱码fileFullName = URLEncoder.encode(fileFullName, "UTF-8");response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + fileFullName);return response.getOutputStream();} catch (IOException e) {e.printStackTrace();}return null;}/*** 返回ExcelReader* @param inputStream 输入流* @param fileName 文件* @param clazz 实体类* @param excelListener*/private static <T> ExcelReader getReader(InputStream inputStream, String fileName, Class<T> clazz, ExcelListener excelListener) {try {if (fileName == null|| (!fileName.toLowerCase().endsWith(SUFFIX_XLS) && !fileName.toLowerCase().endsWith(SUFFIX_XLSX))) {return null;}ExcelReader excelReader = EasyExcel.read(inputStream, clazz, excelListener).build();inputStream.close();return excelReader;} catch (Exception e) {e.printStackTrace();}return null;}
}
  • 监听器,ExcelListener.java
package com.deewin.aftermarket.admin.excel.listener;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import lombok.extern.slf4j.Slf4j;import java.util.ArrayList;
import java.util.List;/*** Excel监听类* @Author bitaotao* @Description 监听类* @Date 2021-11-23*/
@Slf4j
public class ExcelListener extends AnalysisEventListener {/*** 可以通过实例获取该值*/private List<Object> dataList = new ArrayList<>();@Overridepublic void invoke(Object object, AnalysisContext context) {//数据存储到list,供批量处理,或后续自己业务逻辑处理。dataList.add(object);handleBusinessLogic();/*//如数据过大,可以进行定量分批处理if(dataList.size()>=200){handleBusinessLogic();dataList.clear();}*/}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {//非必要语句,查看导入的数据log.info("导入的数据条数为: " + dataList.size());}/*** 根据业务自行实现该方法,例如将解析好的dataList存储到数据库中*/private void handleBusinessLogic() {// TODO}public List<Object> getDataList() {return dataList;}public void setDataList(List<Object> dataList) {this.dataList = dataList;}
}
  • 转换器
    当读写的模板数据中有LocalDateTime类型的数据时,需要使用该转换器
package com.deewin.aftermarket.admin.excel.convert;import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.property.ExcelContentProperty;import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;/*** LocalDateTime 转换器* @Author bitaotao* @Date 2021-11-23*/
public class LocalDateTimeConverter implements Converter<LocalDateTime> {@Overridepublic Class<LocalDateTime> supportJavaTypeKey() {return LocalDateTime.class;}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.STRING;}@Overridepublic LocalDateTime convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) {return LocalDateTime.parse(cellData.getStringValue(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));}@Overridepublic CellData<String> convertToExcelData(LocalDateTime value, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) {return new CellData<>(value.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));}}
  • Excel读写模版实体
package com.deewin.aftermarket.admin.excel.model;import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.deewin.aftermarket.admin.excel.convert.LocalDateTimeConverter;
import lombok.*;import java.math.BigDecimal;
import java.time.LocalDateTime;/*** <p>* 采销订单* Excel导出模型* </p>** @author bitaotao* @since 2021-11-24*/
@Data
@EqualsAndHashCode(callSuper = false)
public class PurchaseSalesOrderExcelModel {@TableId(value = "id", type = IdType.AUTO)@ExcelProperty(value = "序号")private Long id;@ExcelProperty(value = "采购单号")@ColumnWidth(20)private String orderNo;@ExcelProperty(value = "申请时间",converter = LocalDateTimeConverter.class)@ColumnWidth(20)private LocalDateTime createTime;@ExcelProperty(value = "采购方")@ColumnWidth(40)private String createDeptName;@ExcelProperty(value = "产品品类")@ColumnWidth(20)private String productKindName;@ExcelProperty(value = "品牌")@ColumnWidth(20)private String brandName;@ExcelProperty(value = "产品总数量")@ColumnWidth(20)private Integer productTotalNumber;@ExcelProperty(value = "采购总金额")@ColumnWidth(20)private BigDecimal orderTotalAmount;@ExcelProperty(value = "付款方式")@ColumnWidth(20)private String paymentMethodName;@ExcelProperty(value = "合同号")@ColumnWidth(20)private String contractNo;}
  • 控制层代码
    控制层方法exportPurchaseOrder,接受的参数是前端通过封装form表单发起的POST请求。
   /*** 采销订单导出* @param productKindId 产品品类* @param productModel 产品品类* @param paymentMethod 收/付款方式* @param contractNo 合同号* @param orderNo 采购单号* @param brandName 采购单号* @param response*/@RequestMapping("export")@ResponseBodypublic void exportPurchaseOrder(Long productKindId, String productModel, String paymentMethod, String contractNo,String orderNo, String brandName, HttpServletResponse response) {purchaseSalesOrderService.exportPurchaseOrder(productKindId, productModel, paymentMethod, contractNo, orderNo, brandName, response);}

1.2、前端代码

用Ajax 以post 请求进行文件下载,通过封装form表单,提交post请求。
https://blog.csdn.net/qq_33378853/article/details/86507094

function exportPurchaseOrder() {var productKindId = $("#productKindId").val();  //产品品类var productModel = $("#productModel").val();  //产品型号var paymentMethod = $("#paymentMethod").val();  //收/付款方式var contractNo = $("#contractNo").val();//合同号var orderNo = $("#orderNo").val();//采购单号var brandName = $("#brandName").val();//采购单号var form = $('<form method="POST" action="/purchaseSalesOrder/export">');form.append($('<input type="hidden" name="productKindId" value="' + productKindId + '">'));form.append($('<input type="hidden" name="productModel" value="' + productModel + '">'));form.append($('<input type="hidden" name="paymentMethod" value="' + paymentMethod + '">'));form.append($('<input type="hidden" name="contractNo" value="' + contractNo + '">'));form.append($('<input type="hidden" name="orderNo" value="' + orderNo + '">'));form.append($('<input type="hidden" name="brandName" value="' + brandName + '">'));$('body').append(form);form.submit();
}

四、EasyExcel实现Excel读写,封装工具类相关推荐

  1. 基于POI的读写Excel文件的工具类

    依赖的jar包: import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStrea ...

  2. 实现EasyExcel对Excel读写操作

    实现EasyExcel对Excel读写操作 .pom中引入xml相关依赖 <dependencies><!-- https://mvnrepository.com/artifact/ ...

  3. 一个基于POI的通用excel导入导出工具类的简单实现及使用方法

    前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...

  4. Java操作百万数据量Excel导入导出工具类(程序代码教程)

    Java操作百万数据量Excel导入导出工具类(程序代码教程): # 功能实现1.自定义导入数据格式,支持配置时间.小数点类型(支持单/多sheet)(2种方式:本地文件路径导入(只支持xls.xls ...

  5. Spring Boot 整合 SpringDataNeo4j 并封装工具类解析PathValue

    Spring Boot 整合 SpringDataNeo4j 并封装工具类解析PathValue 一.Neo4j 二.Neo4j客户端浏览器 三.maven依赖 四.节点/关系映射 1.NodePer ...

  6. JAVA——Okhttp封装工具类

    基本概念 OKhttp:一个处理网络请求的开源项目,是安卓端最火热的轻量级框架. Maven <!--OK HTTP Client--><dependency><grou ...

  7. android文件读取工具类,Android 下读取Assets Properties操作封装工具类

    Android 下读取Assets Properties操作封装工具类 发布时间:2018-06-03作者:laosun阅读(2081) 为了方便使用,首先创建BaseApplication类,如下所 ...

  8. 数据库MySQL基础---JDBC开发步骤--JDBC封装工具类--PreparedStatement实现CRUD操作

    JDBC简介 1.JDBC定义Java数据库连接(Java Database Connectivity,简称JDBC):是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询 ...

  9. JAVA之旅(五)——this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块...

    JAVA之旅(五)--this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块 周末收获颇多,继续学习 一.this关键字 用于区分局部变量和成员变量同名的情况 ...

最新文章

  1. python中的元类_python中的元类
  2. 【教程】简易CDQ分治教程学习笔记
  3. linux_tomcat
  4. js进阶 9-14 js如何实现下拉列表多选移除
  5. Vmware 虚拟机提示:无法打开磁盘***.vmdk 无法启动虚拟机 解决办法
  6. 【SPOJ】Power Modulo Inverted(拓展BSGS)
  7. 计算机为什么启动二次才能打开,为什么电脑要2次重启才能启动显示器那
  8. aws数据库同步区别_了解如何通过使用AWS AppSync构建具有实时数据同步的应用程序
  9. 蓝牙耳机芯片检测软件_安凯微推出TWS真无线蓝牙5.0耳机芯片
  10. android命令打包,android 命令打包
  11. 人工智能在fpga的具体应用_新基建“芯”机遇,国产FPGA厂商如何抓住机会?
  12. 【系统架构】VC 开发辅助工具大收集
  13. VS如何定制自己的模板信息
  14. EF中执行Sql语句
  15. 萤石云官方Demo下载并二次开发 QT5.12.10
  16. 微信公众号文章排版编辑器推荐
  17. 微信客服消息群发 php,利用客服消息和模板消息实现微信群发(突破群发接口的上限)...
  18. linux端口健康检查,linux – Systemd http健康检查
  19. 一政网给了我公考上岸的机会
  20. 微信小程序-开放标签

热门文章

  1. AI/机器学习/深度学习三者的区别是什么?
  2. 用C#打造自己的播放器
  3. Cisco公司招聘详细资料
  4. logisim、quartus分别实现数字秒表
  5. Linux指令入门学习
  6. Linux(一)操作系统基础知识
  7. HDU 4506 小明系列故事——师兄帮帮忙
  8. zero tier+NAS实现zotero的webdav同步
  9. 用Python实现超级玛丽游戏【示例代码】
  10. 代理记账公司可以学到有用的吗?