Excel表的导入与导出

Excel表的导入与导出

  1. 根据excel表来建立所需的数据库表格
bash 复制代码
       <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>4.0.3</version>
        </dependency>
  1. 导入easyexcel依赖项

    阿里巴巴的 EasyExcel 库提供了一种高效、简单的方式来处理Excel文件。EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百兆的Excel。项目地址如下https://easyexcel.opensource.alibaba.com/

  2. 构建需要的实体类

  3. 在项目中添加easyexcel工具类

    该工具类是网上通用化的方法,适用于任意文件,任意对象实体

java 复制代码
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();
        }
    }
}
  1. 添加导入导出接口
    以下代码并不完整,需要继续填充service层和dao层。
java 复制代码
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);
    }

}
相关推荐
未来之窗软件服务20 小时前
Excel物业台帐租金合同资产—万象EXCEL应用(28) —东方仙盟
excel·仙盟创梦ide·东方仙盟·万象excel
AI刀刀1 天前
豆包智能体 7 月 15 日全面下线:技术解读、数据迁移与自动化备份方案
运维·人工智能·自动化·word·excel·ai导出鸭
xurime1 天前
Excelize 开源十周年,发布 2.11.0 版本
golang·开源·github·excel·导出·导入·excelize·基础库
littleBoy7772 天前
Excel 文件合并工具
excel
wtsolutions2 天前
Excel-to-JSON本地化Excel插件发布 - 在Excel中安全离线转换数据
安全·json·excel
用户298698530142 天前
Python 实现 Excel 与 TXT 文本的高效转换与导出
后端·python·excel
程序员小郭832 天前
Java + POI 实现高性能Excel导出(支持普通List、MyBatis Cursor流式导出、VO适配)
spring boot·后端·excel
AI导出鸭PC端4 天前
告别导出难题:AI 导出鸭助力 Claude 输出 excel 一站式实现
人工智能·ai·excel·豆包·ai导出鸭
Am-Chestnuts4 天前
DeepSeek 表格如何导出 Word/Excel:Markdown 表格、CSV 与 DS随心转方案对比
word·excel
城数派4 天前
2000-2026年我国省市县三级逐月NDVI数据(Shp/Excel格式)
excel