杰瑞科技汇

Java Excel导出下载失败怎么办?

Java Excel 导出下载实现指南

在Java应用中实现Excel导出下载功能,有多种方案可选,以下是几种常见方法的详细说明:

Java Excel导出下载失败怎么办?-图1
(图片来源网络,侵删)

使用Apache POI(推荐)

Apache POI是Java操作Office文档最常用的库。

Maven依赖

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.2.3</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.3</version>
</dependency>

基本实现示例

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
public class ExcelExportUtil {
    public static void exportToExcel(List<String[]> data, String fileName, HttpServletResponse response) throws IOException {
        // 创建工作簿
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("数据");
        // 创建标题行
        Row headerRow = sheet.createRow(0);
        String[] headers = {"ID", "姓名", "年龄", "邮箱"};
        for (int i = 0; i < headers.length; i++) {
            Cell cell = headerRow.createCell(i);
            cell.setCellValue(headers[i]);
        }
        // 填充数据
        int rowNum = 1;
        for (String[] rowData : data) {
            Row row = sheet.createRow(rowNum++);
            for (int i = 0; i < rowData.length; i++) {
                Cell cell = row.createCell(i);
                cell.setCellValue(rowData[i]);
            }
        }
        // 设置响应头
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".xlsx");
        // 写入输出流
        workbook.write(response.getOutputStream());
        workbook.close();
    }
}

控制器层示例(Spring Boot)

@GetMapping("/export")
public void exportExcel(HttpServletResponse response) throws IOException {
    // 模拟数据
    List<String[]> data = new ArrayList<>();
    data.add(new String[]{"1", "张三", "25", "zhangsan@example.com"});
    data.add(new String[]{"2", "李四", "30", "lisi@example.com"});
    ExcelExportUtil.exportToExcel(data, "用户数据", response);
}

使用EasyExcel(阿里开源)

EasyExcel是阿里巴巴开源的Excel处理库,性能更好,内存占用更少。

Maven依赖

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

基本实现示例

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.metadata.WriteSheet;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
public class EasyExcelExportUtil {
    public static void exportToExcel(List<User> data, String fileName, HttpServletResponse response) throws IOException {
        // 设置响应头
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".xlsx");
        // 使用EasyExcel写入
        EasyExcel.write(response.getOutputStream(), User.class).sheet("用户数据").doWrite(data);
    }
}
// User实体类
@HeadRowHeight(20)
@ColumnWidth(20)
public class User {
    @ExcelProperty("ID")
    private Integer id;
    @ExcelProperty("姓名")
    private String name;
    @ExcelProperty("年龄")
    private Integer age;
    @ExcelProperty("邮箱")
    private String email;
    // getters and setters
}

使用JXL(较老但简单)

JXL是一个较老的Java Excel操作库,简单易用但功能有限。

Maven依赖

<dependency>
    <groupId>net.sourceforge.jexcelapi</groupId>
    <artifactId>jxl</artifactId>
    <version>2.6.12</version>
</dependency>

基本实现示例

import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
public class JxlExportUtil {
    public static void exportToExcel(List<String[]> data, String fileName, HttpServletResponse response) throws IOException {
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".xls");
        WritableWorkbook workbook = Workbook.createWorkbook(response.getOutputStream());
        WritableSheet sheet = workbook.createSheet("数据", 0);
        // 写入标题
        String[] headers = {"ID", "姓名", "年龄", "邮箱"};
        for (int i = 0; i < headers.length; i++) {
            sheet.addCell(new Label(i, 0, headers[i]));
        }
        // 写入数据
        for (int i = 0; i < data.size(); i++) {
            String[] rowData = data.get(i);
            for (int j = 0; j < rowData.length; j++) {
                sheet.addCell(new Label(j, i + 1, rowData[j]));
            }
        }
        workbook.write();
        workbook.close();
    }
}

注意事项

  1. 大数据量处理:对于大数据量,建议使用EasyExcel或SXSSF(POI的流式API),避免内存溢出
  2. 文件名编码:文件名最好进行URL编码,避免中文乱码
  3. 异常处理:添加适当的异常处理
  4. 浏览器兼容性:确保响应头设置正确,兼容不同浏览器
  5. 样式设置:如需复杂样式,POI提供更丰富的样式设置选项

性能对比

内存占用 性能 功能丰富度 学习难度
POI 较高 中等 非常丰富 中等
EasyExcel 较丰富 简单
JXL 基础 简单

对于大多数应用场景,推荐使用EasyExcel或POI,根据项目需求选择。

Java Excel导出下载失败怎么办?-图2
(图片来源网络,侵删)
Java Excel导出下载失败怎么办?-图3
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇