Excel表的导入与导出
- 根据excel表来建立所需的数据库表格
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>4.0.3</version>
</dependency>
导入easyexcel依赖项
阿里巴巴的 EasyExcel 库提供了一种高效、简单的方式来处理Excel文件。EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百兆的Excel。项目地址如下https://easyexcel.opensource.alibaba.com/。构建需要的实体类
在项目中添加easyexcel工具类
该工具类是网上通用化的方法,适用于任意文件,任意对象实体
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import jakarta.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
/**
* EasyExcel工具类
*
* @author CWW
* @date 2024/12/18 16:46
*/
public class EasyExcelUtil {
private static final String UTF_8 = "UTF-8";
/**
* 读取文件数据,并返回一个包含指定类型数据的列表。
*
* @param inputStream 文件对象输入流
* @param clazz 数据对象的类型
* @param <T> 泛型类型,表示数据对象的类型
* @return 包含解析后数据对象的列表
*/
public static <T> List<T> readMultipartFile(InputStream inputStream, Class<T> clazz) {
// 用于存储解析后的数据对象
final List<T> dataList = new ArrayList<>();
EasyExcel.read(inputStream, clazz, new AnalysisEventListener<T>() {
@Override
public void invoke(T data, AnalysisContext analysisContext) {
// 每一条数据解析都会调用此方法
// 将解析后的数据对象添加到 dataList中
dataList.add(data);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
// 读取完成后可以进行一些操作
}
}).sheet().doRead(); // 读取 Excel 文件中的第一个工作表
// 返回解析后数据对象的列表
return dataList;
}
/**
* 导出 Excel文件
*
* @param response HTTP 响应对象
* @param fileName 文件名,用于在客户端保存文件时显示
* @param sheetName 工作表名,Excel 文件中的工作表名称
* @param list 要导出的数据列表
* @param clazz 实体类的类对象,用于定义 Excel 文件的结构
* @param <T> 数据列表的元素类型
*/
public static <T> void export(HttpServletResponse response, String fileName, String sheetName, List<T> list, Class<T> clazz) {
try {
// 设置响应内容类型为 Excel 文件
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
// 设置响应字符编码
response.setCharacterEncoding(UTF_8);
// 使用 URLEncoder 编码文件名,防止中文乱码
// replaceAll("\\+", "%20") 用于将空格编码为 %20,而不是 + 号
String fileNameEncode = URLEncoder.encode(fileName, UTF_8).replaceAll("\\+", "%20");
// 设置响应头,告诉浏览器这是一个附件
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileNameEncode + ".xlsx");
// 使用 EasyExcel 写入数据到响应的输出流
// clazz 参数用于指定 Excel 文件的结构类
// sheetName 参数用于指定 Excel 文件中的工作表名称
EasyExcel.write(response.getOutputStream(), clazz)
.sheet(sheetName)
.doWrite(list);
} catch (Exception e) {
e.printStackTrace();
}
}
}
- 添加导入导出接口
以下代码并不完整,需要继续填充service层和dao层。
import com.example.demo.common.EasyExcelUtil;
import com.example.demo.entity.Book;
import com.example.demo.service.BookService;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
* 文件导入导出控制层
* @author CWW
* @date 2024/12/18 11:42
*/
@Validated
@RestController
public class BookController {
@Resource
private BookService bookService;
/**
* 文件导入
*
* @param file excel文件
* @return 执行结果
*/
@PostMapping("/upload")
public Boolean readFile1(MultipartFile file) throws Exception {
// 定义一个接收表格内容的集合
List<Book> list;
// 读取文件内容
try {
list = EasyExcelUtil.readMultipartFile(file.getInputStream(), Book.class);
} catch (Exception e) {
throw new Exception(e.getMessage());
}
//将book数据逐个插入到数据库中
return true;
}
/**
* 导出excel文件
*
* @param response 响应体
*/
@PostMapping("/download")
public void downFile1(HttpServletResponse response) {
// 获取用户信息列表
// 导出文件
EasyExcelUtil.export(response, "书籍列表", "书籍清单", , Book.class);
}
}