欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > EasyExcel

EasyExcel

2024/10/24 4:46:24 来源:https://blog.csdn.net/qq_52102677/article/details/139308707  浏览:    关键词:EasyExcel

pom.xml

        <!-- 引入EasyExcel依赖,用于处理Excel读写操作 --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version></dependency><!-- 引入FastJSON依赖,用于处理JSON格式数据的序列化和反序列化 --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.21</version></dependency>

准备一个Excel文件

 字符串标题   日期标题          数字标题字符串0    2024/5/29 21:16     0.56字符串1    2024/5/30 21:16     1.56字符串2    2024/5/31 21:16     2.56字符串3    2024/6/1 21:16      3.56字符串4    2024/6/2 21:16      4.56字符串5    2024/6/3 21:16      5.56字符串6    2024/6/4 21:16      6.56字符串7    2024/6/5 21:16      7.56字符串8    2024/6/6 21:16      8.56

实体类

 @Data@HeadRowHeight(20)@ColumnWidth(20)public class DemoData {@ExcelProperty("字符串标题")private String string;@ExcelProperty("日期标题")private Date date;@ExcelProperty("数字标题")private Double doubleData;@ExcelIgnoreprivate String ignore;}

读文件

读文件的两种方法

JavaExcelApplicationTests

 /*** 读取Excel文件并将其内容转换为JSON格式的日志信息。* 该方法不接受参数且无返回值。* 主要步骤包括定位并读取Excel文件,将读取到的数据转换为DemoData对象的列表,* 然后将每个DemoData对象转换为JSON字符串,最后通过日志记录这些JSON字符串。** {"date":"2024-05-29 21:16:57","doubleData":0.56,"string":"字符串0"}* {"date":"2024-05-30 21:16:57","doubleData":1.56,"string":"字符串1"}**/@Testvoid readExcel() {// 读取指定路径的Excel文件,指定表头类型为DemoData,读取所有sheet,同步读取数据List<DemoData> list = EasyExcel.read("D:\\Users\\黑池\\Desktop\\test.xlsx").head(DemoData.class).sheet().doReadSync();​// 遍历读取到的数据列表,将每个DemoData对象转换为JSON字符串,并通过日志输出list.forEach(data ->{String string = JSON.toJSONString(data);log.info(string);});}​/*** 读取Excel文件内容并打印** 该方法没有参数。* 该方法没有返回值,但会读取指定路径的Excel文件,将每一行的内容转换为Map形式,并打印这些Map对象的信息。**  {0=字符串0, 1=2024-5-29 21:16, 2=0.56}*  {0=字符串1, 1=2024-5-30 21:16, 2=1.56}*/@Testvoid readExcel2() {// 读取Excel文件内容,同步执行List<Map<Integer,Object>> list = EasyExcel.read("D:\\Users\\黑池\\Desktop\\test.xlsx").sheet().doReadSync();// 遍历并打印读取到的每一行数据list.forEach(data ->{log.info(data.toString());});}

使用监听器读文件

 import com.alibaba.excel.context.AnalysisContext;import com.alibaba.excel.event.AnalysisEventListener;import com.alibaba.excel.util.ListUtils;import com.alibaba.fastjson2.JSON;import com.baize.entity.DemoData;import com.baize.service.DemoService;import lombok.RequiredArgsConstructor;import lombok.extern.slf4j.Slf4j;​import java.util.List;​@RequiredArgsConstructor@Slf4jpublic class DemoDataListener extends AnalysisEventListener<DemoData> {​​// 每次处理的数据批量大小private static final int BATCH_COUNT = 100;​// 用于存储DemoData对象的列表,预先分配大小以提高性能private List<DemoData> list = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);​// DemoService的实例,用于执行与DemoData相关的业务逻辑private  final DemoService demoService;​//      @RequiredArgsConstructor//    public DemoDataListener(DemoService demoService) {//        this.demoService = demoService;//    }​//    @Override//    public void doAfterALlAnalysed(AnalysisContext context){//        //这里也要保存数据,确保最后遗留的数据也存储到数据库//        saveData();//        log.info("所有数据解析完成!");//    }​/*** 保存数据到数据库。* 该方法不接受参数并且没有返回值。* 主要逻辑包括:* 1. 打印日志,记录待存储数据的数量。* 2. 调用demoService的saveData方法,将数据列表存储到数据库。* 3. 打印日志,表示数据存储成功。*/private void saveData(){// 记录开始存储数据时的数据量log.info("{}条数据,开始存储数据库!",list.size());demoService.saveData(list); // 将数据列表保存到数据库// 记录数据保存成功log.info("存储数据库成功!");}​​/*** 被调用以处理DemoData数据,并将其存储到数据库中。* 当积累到一定数量的数据时,会批量存储到数据库中,以减少内存占用。** @param demoData 待处理的数据对象,包含需要分析的数据。* @param analysisContext 分析上下文,提供额外的环境信息或配置。*/@Overridepublic void invoke(DemoData demoData, AnalysisContext analysisContext) {log.info("解析到一条数据:{}", JSON.toJSON(demoData));list.add(demoData);​// 检查数据积累是否达到批量存储的阈值if (list.size() >= BATCH_COUNT) {saveData(); // 执行数据库存储操作// 存储完成后清理内存,准备接收新的数据批次list =  ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);}}​​@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {//这里也要保存数据,确保最后遗留的数据也存储到数据库saveData();log.info("所有数据解析完成!");}}

service文件

 public interface DemoService {void saveData(List<DemoData> list);}

serviceimpl文件

 @Slf4j@Servicepublic class DemoServiceimpl implements DemoService {​public void saveData(){log.info("保存Excel数据到数据库中");}@Overridepublic void saveData(List<DemoData> list) {log.info("正在保存Excel数据到数据库中");}}

JavaExcelApplicationTests

     /*** 读取Excel文件的示例方法。* <p>* 此方法使用EasyExcel框架读取指定路径下的Excel文件("D:\\Users\\黑池\\Desktop\\test.xlsx"),* 并将数据映射到DemoData类中,然后通过DemoDataListener将数据进一步处理(这里依赖于demoService)。* <p>* 方法不接受任何参数,并且没有返回值。** 解析到一条数据:{"date":"2024-05-29 21:16:57","doubleData":0.56,"string":"字符串0"}* 解析到一条数据:{"date":"2024-05-30 21:16:57","doubleData":1.56,"string":"字符串1"}* ......* 解析到一条数据:{"date":"2024-06-06 21:16:57","doubleData":8.56,"string":"字符串8"}* 9条数据,开始存储数据库!* 存储数据库成功!* 所有数据解析完成!*/@Testvoid readExcel3() {​// 使用EasyExcel框架读取Excel文件并处理数据EasyExcel.read("D:\\Users\\黑池\\Desktop\\test.xlsx", DemoData.class, new DemoDataListener(demoService)).sheet().doReadSync();​}

写入文件

excel的写入

     //模拟20条数据private List<DemoData> data() {List<DemoData> list = new ArrayList<DemoData>();for (int i = 0; i < 10; i++) {DemoData data = new DemoData();data.setString("字符串" + i);data.setDate(new Date());data.setDoubleData(0.56);list.add(data);}return list;}​/*** 使用EasyExcel框架写入Excel文件的示例方法1。* 这个方法展示了两种不同的方式来写入Excel文件,均不需要手动关闭文件流。* 方法会根据调用方式的不同,演示了两种写入数据的方式。** @since 3.0.0-beta1*/@Testvoid writeExcel1(){// 写法1 JDK8+// 通过lambda表达式动态提供数据String fileName = "EasyExcelDemo" + System.currentTimeMillis() + ".xlsx";// 使用指定的类模型写入数据到第一个sheet,sheet名称为"模板"EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(() -> {// 动态查询或生成数据return data();});​// 写法2// 直接传入数据源fileName = "EasyExcelDemo" + System.currentTimeMillis() + ".xlsx";// 同上,但是直接传入数据列表,而不是通过lambda表达式EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data());}

上传下载

UploadDownController

 package com.baize.controller;​import com.alibaba.excel.EasyExcel;import com.alibaba.fastjson.JSON;import com.baize.config.DemoDataListener;import com.baize.entity.DemoData;import com.baize.service.DemoService;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.*;​@Controllerpublic class UploadDownController {​@Autowiredprivate DemoService demoService;​/*** 提供文件下载功能。特别注意,使用Swagger可能导致各种问题,建议使用浏览器或Postman进行测试。** @param response 用于配置响应的HttpServletResponse对象,通过它将文件提供给客户端下载。* @throws IOException 如果在写入响应流时发生IO错误。*/@GetMapping("download")public void download(HttpServletResponse response) throws IOException {// 设置响应内容类型为Excel文件response.setContentType("application/vnd.ms-excel");// 设置响应字符编码为UTF-8response.setCharacterEncoding("utf-8");// 对文件名进行URL编码,防止中文或其他特殊字符导致的乱码问题String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");// 设置响应头,指定文件下载的名称和方式response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");// 使用EasyExcel框架将数据写入响应输出流,以提供文件下载EasyExcel.write(response.getOutputStream(), DemoData.class).sheet("模板").doWrite(data());}​​/*** 文件下载接口。尝试下载一个Excel文件,如果失败,则返回一个包含错误信息的JSON。* 默认情况下,当下载失败时,会返回一个部分数据的Excel文件。** @param response 用于响应客户端请求的HttpServletResponse对象。* @throws IOException 如果发生I/O错误。* @since 2.1.1*/@GetMapping("api/download")public void downloadApi(HttpServletResponse response) throws IOException {try {// 设置响应类型为Excel文件,配置响应头以支持中文文件名response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");​// 使用EasyExcel框架写入Excel文件到响应输出流,不关闭流以保持连接EasyExcel.write(response.getOutputStream(), DemoData.class).autoCloseStream(Boolean.FALSE).sheet("模板").doWrite(data());} catch (Exception e) {// 下载失败时的处理:重置响应,返回JSON错误信息response.reset();response.setContentType("application/json");response.setCharacterEncoding("utf-8");Map<String, String> map = new HashMap<String, String>();map.put("code", "500");map.put("message", "下载文件失败" + e.getMessage());response.getWriter().println(JSON.toJSONString(map));}}​​/*** 文件上传接口。* 该方法接收一个文件,使用EasyExcel框架读取并处理文件内容。** @param file 用户上传的文件,类型为MultipartFile。* @return 返回一个字符串表示上传结果,成功则返回"success"。* @throws IOException 如果读取文件发生错误,则抛出IOException。*/@PostMapping("upload")@ResponseBodypublic String upload(MultipartFile file) throws IOException {// 使用EasyExcel框架读取上传文件的内容,并将其转换为DemoData对象,然后通过DemoDataListener处理这些对象EasyExcel.read(file.getInputStream(), DemoData.class, new DemoDataListener(demoService)).sheet().doRead();return "success";}​/*** 生成包含10个DemoData对象的列表。* <p>此方法不接受任何参数。</p>** @return 返回一个包含10个初始化的DemoData对象的列表。*/private List<DemoData> data() {// 创建一个空的DemoData对象列表List<DemoData> list = new ArrayList<>();// 循环创建10个DemoData对象并填充数据,然后添加到列表中for (int i = 0; i < 10; i++) {DemoData data = new DemoData();// 为每个DemoData对象设置字符串属性data.setString("字符串" + 0);// 为每个DemoData对象设置当前日期data.setDate(new Date());// 为每个DemoData对象设置双精度浮点数属性data.setDoubleData(0.56);list.add(data);}return list;}}
 ​

可以写工具类

 import com.alibaba.excel.EasyExcel;import com.alibaba.excel.read.builder.ExcelReaderBuilder;import com.alibaba.excel.read.builder.ExcelReaderSheetBuilder;import lombok.extern.slf4j.Slf4j;​import java.io.InputStream;import java.util.List;​@Slf4jpublic class ExcelUtils {​/*** 从Excel文件中读取数据并将其转换为指定模型的列表。* * @param inputStream Excel文件的输入流。* @param clazz 指定的模型类,用于将Excel单元格数据转换为该类型的对象。* @return 一个包含读取到的数据的列表,每个元素都是clazz指定的类型。* @throws NullPointerException 如果输入流为null,则抛出此异常。*/public static <T> List<T> getExcelModelData(final InputStream inputStream, Class<T> clazz) {// 检查输入流是否为nullif (null == inputStream) {throw new NullPointerException("the inputStream is null!");}// 使用EasyExcel框架初始化Excel读取构建器ExcelReaderBuilder result = EasyExcel.read(inputStream, clazz, null);// 获取默认工作表的构建器ExcelReaderSheetBuilder sheet1 = result.sheet();// 同步读取工作表数据并返回List<T> resultData = sheet1.doReadSync();return resultData;}}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com