网站建设怎么,帝国做的网站根目录,广州市软件开发有限公司,wordpress 仿论坛主题一、Easyexcel 简介
EasyExcel是一个基于Java的Excel处理工具库#xff0c;它的核心设计理念是快速、简洁#xff0c;并且能够有效解决处理大文件时的内存溢出问题。使用EasyExcel#xff0c;开发者可以在几乎不需要考虑性能和内存消耗的情况下#xff0c;轻松实现Excel文…一、Easyexcel 简介
EasyExcel是一个基于Java的Excel处理工具库它的核心设计理念是快速、简洁并且能够有效解决处理大文件时的内存溢出问题。使用EasyExcel开发者可以在几乎不需要考虑性能和内存消耗的情况下轻松实现Excel文件的读写操作。
Easyexcel 官方文档https://easyexcel.opensource.alibaba.com/docs/current/github地址https://github.com/alibaba/easyexcelgitee地址https://gitee.com/easyexcel/easyexcel
二、为何选择 Easyexcel
1. 现有框架的问题
Apache POI 和 jxl: 这两个Java框架用于解析和生成Excel文件但它们的主要问题是内存消耗大。内存溢出问题: 处理大型Excel文件时这些框架可能会消耗大量内存导致内存溢出。
2. Apache POI 的局限性
SAX模式: Apache POI 提供了SAX模式的API来部分解决内存问题但仍然存在不足。内存消耗: 即使使用SAX模式Apache POI 在处理Excel 2007版.xlsx文件时由于解压缩和存储过程在内存中进行内存消耗依然很大。
3. EasyExcel 的优势
重写解析: EasyExcel 重写了Apache POI对Excel 2007版的解析方式显著降低了内存消耗。内存优化: 一个3MB的Excel文件在使用Apache POI的SAX模式解析时可能需要约100MB内存而EasyExcel可以将内存需求降低到几MB。大文件处理: 使用EasyExcel即使更大的Excel文件也不会导致内存溢出。03版Excel处理: 对于Excel 2003版.xlsEasyExcel依赖于Apache POI的SAX模式并在此基础上进行了模型转换封装使得使用更加简单和方便。
三、Springboot 项目集成 EasyExcel
1. pom 文件引入依赖
dependency groupIdcom.alibaba/groupId artifactIdeasyexcel/artifactId version3.1.0/version !-- 请检查并使用最新版本 --
/dependency2. 实体类例如 UserData
import com.alibaba.excel.annotation.ExcelProperty; public class UserData { ExcelProperty(value ID, index 0) private Integer id; ExcelProperty(value 姓名, index 1) private String name; ExcelProperty(value 年龄, index 2) private Integer age; // 省略 getter 和 setter 方法 // ...
}3. EasyExcel 操作帮助类
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.read.builder.ExcelReaderBuilder;
import com.alibaba.excel.read.builder.ExcelReaderSheetBuilder;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;
import com.alibaba.excel.write.metadata.WriteSheet; import org.springframework.web.multipart.MultipartFile; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List; public class EasyExcelUtils { // 导出 Excel public static byte[] exportExcel(List? data, String sheetName, Class? head) { try (ByteArrayOutputStream out new ByteArrayOutputStream()) { ExcelWriterBuilder writerBuilder EasyExcel.write(out, head); ExcelWriterSheetBuilder sheetBuilder writerBuilder.sheet(sheetName); WriteSheet writeSheet sheetBuilder.build(); EasyExcel.write(out, data, writeSheet).finish(); return out.toByteArray(); } catch (IOException e) { throw new RuntimeException(导出 Excel 失败, e); } } // 导入 Excel public static T ListT importExcel(MultipartFile file, ClassT clazz) { try (InputStream inputStream file.getInputStream()) { ExcelReaderBuilder readerBuilder EasyExcel.read(inputStream, clazz, new AnalysisEventListenerT() { private ListT list new ArrayList(); Override public void invoke(T data, AnalysisContext context) { list.add(data); } Override public void doAfterAllAnalysed(AnalysisContext context) { // 数据解析完成后可以在这里处理解析结果 } }); ExcelReaderSheetBuilder sheetBuilder readerBuilder.sheet(); sheetBuilder.doRead(); return list; } catch (IOException e) { throw new RuntimeException(导入 Excel 失败, e); } } // 其他可能需要的帮助方法...
}4. 在 Controller 中使用
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile; import java.util.Arrays;
import java.util.List; RestController
public class ExcelController { PostMapping(/exportExcel) public ResponseEntitybyte[] exportExcel() { ListUserData data Arrays.asList( new UserData(1, Alice, 25), new UserData(2, Bob, 30), new UserData(3, Charlie, 35)String fileName users.xlsx; byte[] excelBytes EasyExcelUtils.exportExcel(data, fileName, UserData.class); HttpHeaders headers new HttpHeaders(); headers.setContentDispositionFormData(attachment, fileName); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); return ResponseEntity.ok() .headers(headers) .body(excelBytes); } PostMapping(/importExcel) public ResponseEntity? importExcel(RequestParam(file) MultipartFile file) { ListUserData userDataList EasyExcelUtils.importExcel(file, UserData.class); // 假设你需要在这里处理导入的数据比如保存到数据库等 // ... return ResponseEntity.ok(Excel 导入成功共导入 userDataList.size() 条数据);
}四、前端 vue 页面调用示例
script
import axios from axios; export default { // ... 其他选项和数据 ... methods: { exportExcel() { // 假设你有一个要发送到服务器的对象如果需要的话 const params { // 例如: filter: someValue }; axios({ method: post, url: /api/exportExcel, // 修改为你的实际API地址 data: params, // 如果需要的话 responseType: blob, // 告诉axios我们期望返回一个blob }) .then((response) { // 创建一个Blob对象来表示二进制数据 const blob new Blob([response.data], { type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet }); // 创建一个指向该Blob对象的URL const url window.URL.createObjectURL(blob); // 创建一个a标签并模拟点击来下载文件 const link document.createElement(a); link.href url; link.setAttribute(download, users.xlsx); // 设置下载文件名 document.body.appendChild(link); link.click(); // 清理 window.URL.revokeObjectURL(url); document.body.removeChild(link); }) .catch((error) { console.error(导出Excel失败:, error); this.message 导出Excel失败; }); }, // ... 其他方法 ... },
};
/script