返回

EasyExcel: 轻松导出复杂Excel表头,本地保存和前端返回全搞定!

后端

使用 EasyExcel 导出复杂 Excel 表头:分步指南

在当今数据驱动的时代,能够高效地将数据导出为 Excel 格式至关重要。EasyExcel 是一个功能强大的 Java 库,可以简化这一任务,即使涉及复杂的表头结构。本文将通过一个分步指南,介绍如何使用 EasyExcel 轻松实现此操作。

简介

EasyExcel 是一个开源 Java 库,用于轻松处理 Excel 文件。它支持读写操作,并提供了一系列功能,例如大数据量处理、灵活的表头配置和多种文件格式支持。

步骤 1:项目依赖

首先,将 EasyExcel 依赖项添加到您的项目中:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.1.3</version>
</dependency>

步骤 2:Excel 服务类

创建一个 ExcelService 类,用于处理 Excel 导出操作:

import com.alibaba.excel.EasyExcel;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.util.List;

@Service
public class ExcelService {

    public void exportExcel(HttpServletResponse response, List<Data> dataList) throws Exception {
        // 将数据写入到响应流中
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 防止中文乱码
        response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode("数据导出.xlsx", "UTF-8"));
        EasyExcel.write(response.getOutputStream(), Data.class).sheet("数据").doWrite(dataList);
    }
}

步骤 3:导出 Excel

在控制器中调用 ExcelService 的 exportExcel 方法:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;

@RestController
public class ExcelController {

    @Autowired
    private ExcelService excelService;

    @GetMapping("/exportExcel")
    public void exportExcel(HttpServletResponse response) throws Exception {
        // 模拟一些数据
        List<Data> dataList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Data data = new Data();
            data.setName("姓名" + i);
            data.setAge(i + 1);
            dataList.add(data);
        }
        excelService.exportExcel(response, dataList);
    }
}

步骤 4:返回 Excel

如果需要将 Excel 直接返回给前端,可以修改如下代码:

@GetMapping("/exportExcel2")
public void exportExcel2(HttpServletResponse response) throws Exception {
    // 模拟一些数据
    List<Data> dataList = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
        Data data = new Data();
        data.setName("姓名" + i);
        data.setAge(i + 1);
        dataList.add(data);
    }
    ExcelUtil.writeExcel(response, dataList, "数据导出");
}

同时创建一个 ExcelUtil 工具类:

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.metadata.WriteSheet;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;

public class ExcelUtil {

    public static void writeExcel(HttpServletResponse response, List<?> dataList, String fileName) throws IOException {
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 防止中文乱码
        response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".xlsx", "UTF-8"));
        WriteSheet writeSheet = EasyExcel.writerSheet("数据").build();
        EasyExcel.write(response.getOutputStream(), dataList.getClass(), writeSheet).sheet(writeSheet).doWrite(dataList);
    }
}

结论

通过使用 EasyExcel,您可以轻松地将数据导出为具有复杂表头结构的 Excel 文件。本指南提供了分步说明,帮助您快速掌握这一过程。

常见问题解答

  • 如何处理大数据量?

    • EasyExcel 支持大数据量处理,您可以使用其流式 API 或批处理功能。
  • 我可以使用其他文件格式吗?

    • EasyExcel 支持多种文件格式,包括 Excel (.xlsx),CSV (.csv),和 XML (.xml)。
  • 我可以自定义表头样式吗?

    • 您可以使用 EasyExcel 的样式功能自定义表头样式,包括字体、颜色和边框。
  • 我可以导出带图片的 Excel 文件吗?

    • EasyExcel 支持导出带图片的 Excel 文件,您需要使用其图片类型扩展功能。
  • 如何解决乱码问题?

    • 确保正确设置响应的字符编码,并且在文件名中使用 URLEncoder.encode 来防止中文乱码。