四、EasyExcel实现Excel读写,封装工具类
在项目中,我们经常用到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读写,封装工具类相关推荐
- 基于POI的读写Excel文件的工具类
依赖的jar包: import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStrea ...
- 实现EasyExcel对Excel读写操作
实现EasyExcel对Excel读写操作 .pom中引入xml相关依赖 <dependencies><!-- https://mvnrepository.com/artifact/ ...
- 一个基于POI的通用excel导入导出工具类的简单实现及使用方法
前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...
- Java操作百万数据量Excel导入导出工具类(程序代码教程)
Java操作百万数据量Excel导入导出工具类(程序代码教程): # 功能实现1.自定义导入数据格式,支持配置时间.小数点类型(支持单/多sheet)(2种方式:本地文件路径导入(只支持xls.xls ...
- Spring Boot 整合 SpringDataNeo4j 并封装工具类解析PathValue
Spring Boot 整合 SpringDataNeo4j 并封装工具类解析PathValue 一.Neo4j 二.Neo4j客户端浏览器 三.maven依赖 四.节点/关系映射 1.NodePer ...
- JAVA——Okhttp封装工具类
基本概念 OKhttp:一个处理网络请求的开源项目,是安卓端最火热的轻量级框架. Maven <!--OK HTTP Client--><dependency><grou ...
- android文件读取工具类,Android 下读取Assets Properties操作封装工具类
Android 下读取Assets Properties操作封装工具类 发布时间:2018-06-03作者:laosun阅读(2081) 为了方便使用,首先创建BaseApplication类,如下所 ...
- 数据库MySQL基础---JDBC开发步骤--JDBC封装工具类--PreparedStatement实现CRUD操作
JDBC简介 1.JDBC定义Java数据库连接(Java Database Connectivity,简称JDBC):是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询 ...
- JAVA之旅(五)——this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块...
JAVA之旅(五)--this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块 周末收获颇多,继续学习 一.this关键字 用于区分局部变量和成员变量同名的情况 ...
最新文章
- python中的元类_python中的元类
- 【教程】简易CDQ分治教程学习笔记
- linux_tomcat
- js进阶 9-14 js如何实现下拉列表多选移除
- Vmware 虚拟机提示:无法打开磁盘***.vmdk 无法启动虚拟机 解决办法
- 【SPOJ】Power Modulo Inverted(拓展BSGS)
- 计算机为什么启动二次才能打开,为什么电脑要2次重启才能启动显示器那
- aws数据库同步区别_了解如何通过使用AWS AppSync构建具有实时数据同步的应用程序
- 蓝牙耳机芯片检测软件_安凯微推出TWS真无线蓝牙5.0耳机芯片
- android命令打包,android 命令打包
- 人工智能在fpga的具体应用_新基建“芯”机遇,国产FPGA厂商如何抓住机会?
- 【系统架构】VC 开发辅助工具大收集
- VS如何定制自己的模板信息
- EF中执行Sql语句
- 萤石云官方Demo下载并二次开发 QT5.12.10
- 微信公众号文章排版编辑器推荐
- 微信客服消息群发 php,利用客服消息和模板消息实现微信群发(突破群发接口的上限)...
- linux端口健康检查,linux – Systemd http健康检查
- 一政网给了我公考上岸的机会
- 微信小程序-开放标签