java后端Excel导出工具

本文介绍了如何使用Hutool库结合POI技术,快速创建Excel文件并导出数据,包括定义Sheet实体类、创建工具类进行批量操作和导出到响应流或文件。适合处理大规模数据的Excel数据处理任务。

借助hutool工具包快速导出数据到Excel文件中。官方文档

1、依赖

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.16</version>
</dependency>

2、保存sheet相关信息的实体类

import lombok.Data;

import java.io.Serializable;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * SheetDTO
 *
 * @author ygr
 * @date 2021/12/1 12:00
 */
@Data
public class SheetDTO implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * sheet页名称
     */
    private String sheetName;
    /**
     * 字段和别名
     */
    private LinkedHashMap<String, String> columns;
    /**
     * 列宽
     */
    private Map<String, Integer> widths;
    /**
     * 数据集
     */
    private Collection<?> dataList;
}

3、工具类

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.example.datacollector.dto.SheetDTO;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * excel导出工具
 *
 * @author ygr
 * @date 2021/12/1 12:01
 */
public class ExcelExportUtil {

    /**
     * 导出数据到流
     * <p>
     * 适合数据量较大的场景
     *
     * @param sheetList    sheetList
     * @param outputStream outputStream
     */
    public static void exportExcel(List<SheetDTO> sheetList, OutputStream outputStream) {
        ExcelWriter bigWriter = ExcelUtil.getBigWriter();
        // 重命名第一个Sheet的名称,不然会默认多出一个Sheet1的页
        bigWriter.renameSheet(sheetList.get(0).getSheetName());
        doExport(bigWriter, sheetList, outputStream);
    }

    /**
     * 将sheet追加到文件中,如果文件不存在,则创建新的文件
     *
     * @param sheetList sheetList
     * @param destFile  destFile
     */
    public static void appendSheet(List<SheetDTO> sheetList, File destFile) {
        assert CollectionUtil.isNotEmpty(sheetList);
        ExcelWriter excelWriter = ExcelUtil.getWriter(destFile);
        excelWriter.renameSheet(sheetList.get(0).getSheetName());
        doExport(excelWriter, sheetList, null);
    }

    private static void doExport(ExcelWriter excelWriter, List<SheetDTO> sheetList, OutputStream outputStream) {
        for (SheetDTO sheet : sheetList) {
            // 指定要写出的 Sheet 页
            excelWriter.setSheet(sheet.getSheetName());
            Map<String, Integer> widths = sheet.getWidths();
            LinkedHashMap<String, String> columns = sheet.getColumns();
            if (MapUtil.isNotEmpty(widths)) {
                int index = 0;
                for (Map.Entry<String, String> entry : columns.entrySet()) {
                    Integer wid = widths.get(entry.getKey());
                    excelWriter.setColumnWidth(index++, wid != null ? wid : 25);
                }
            } else {
                for (int i = 0; i < columns.size(); i++) {
                    excelWriter.setColumnWidth(i, 25);
                }
            }

            // 设置字段和别名
            excelWriter.setHeaderAlias(sheet.getColumns());
            // 设置只导出有别名的字段
            excelWriter.setOnlyAlias(true);
            // 设置默认行高
            excelWriter.setDefaultRowHeight(18);
            // 设置冻结行
            excelWriter.setFreezePane(1);
            // 一次性写出内容,使用默认样式,强制输出标题
            excelWriter.write(sheet.getDataList(), true);
        }
        if (outputStream != null) {
            excelWriter.flush(outputStream, true);
        }
        excelWriter.close();
    }

    /**
     * 导出Excel文件到浏览器
     *
     * @param sheetList sheetList
     * @param fileName  fileName
     * @param response  response
     * @throws IOException IOException
     */
    public static void exportExcel(List<SheetDTO> sheetList, String fileName, HttpServletResponse response) throws IOException {
        assert CollectionUtil.isNotEmpty(sheetList);
        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        response.setHeader("Content-Disposition",
                "attachment;filename=" +
                        URLEncoder.encode(fileName + DateUtil.today() + ".xlsx", "UTF-8"));
        exportExcel(sheetList, response.getOutputStream());
    }

}

### Java 后端导出 Excel 功能的方法 #### 使用 Apache POI 实现 Excel 文件的导出 Apache POI 是一个强大的工具包,支持操作 Microsoft Office 文档,特别是 Excel 文件。下面展示如何使用 Apache POI 创建并导出 Excel 文件。 ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.streaming.SXSSFWorkbook; import javax.servlet.http.HttpServletResponse; import java.io.OutputStream; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; public class ExcelExporter { public static void exportExcel(HttpServletResponse response, List<String[]> data) throws Exception { // 设置响应头信息 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("UTF-8"); String fileName = URLEncoder.encode("example", "UTF-8").replaceAll("\\+", "%20"); response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx"); try (OutputStream os = response.getOutputStream(); Workbook workbook = new SXSSFWorkbook()) { // 使用SXSSFWorkbook处理大文件 Sheet sheet = workbook.createSheet("Data"); int rowNum = 0; 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]); } } workbook.write(os); // 将工作簿写入输出流 } } public static void main(String[] args) throws Exception { HttpServletResponse mockResponse = null; // 假设这是Servlet环境下的HttpServletResponse实例 List<String[]> dataList = new ArrayList<>(); dataList.add(new String[]{"Name", "Age"}); dataList.add(new String[]{"John Doe", "30"}); dataList.add(new String[]{"Jane Smith", "25"}); exportExcel(mockResponse, dataList); } } ``` 上述代码展示了如何创建一个简单的 Excel 表格,并将其作为 HTTP 响应返回给客户端[^1]。`SXSSFWorkbook` 被用来优化内存占用,适合大规模数据场景[^3]。 --- #### 使用 EasyExcel 实现 Excel 文件的导出 EasyExcel 是阿里巴巴开源的一个轻量级 Excel 处理库,在性能上有显著优势,尤其适用于大数据量场景。下面是基于 EasyExcel 的简单示例: ```java import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.metadata.WriteSheet; import javax.servlet.http.HttpServletResponse; import java.io.OutputStream; import java.net.URLEncoder; public class EasyExcelExporter { public static void exportExcel(HttpServletResponse response, List<Object> data) throws Exception { response.setContentType("application/vnd.ms-excel;charset=utf-8"); String fileName = URLEncoder.encode("example", "UTF-8").replaceAll("\\+", "%20"); response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx"); OutputStream outputStream = response.getOutputStream(); WriteSheet writeSheet = EasyExcel.writerSheet("Data").build(); // 定义工作表名称 EasyExcel.write(outputStream).sheet("Data").doWrite(data); outputStream.flush(); outputStream.close(); } public static void main(String[] args) throws Exception { HttpServletResponse mockResponse = null; // 假设这是Servlet环境下的HttpServletResponse实例 List<List<String>> dataList = new ArrayList<>(); dataList.add(List.of("Name", "Age")); dataList.add(List.of("John Doe", "30")); dataList.add(List.of("Jane Smith", "25")); exportExcel(mockResponse, dataList); } } ``` 此代码片段利用 `EasyExcel` 提供的简洁 API 来完成相同的目标——将数据导出Excel 并发送到浏览器[^4]。 --- #### 性能对比与适用场景分析 当涉及大量数据时,`Apache POI` 和 `EasyExcel` 都提供了各自的解决方案。对于常规大小的数据集,两者都可以胜任;但对于百万级别的记录,则建议优先考虑 `EasyExcel` 或者结合 `Apache POI` 中的 `SXSSFWorkbook` 类型以减少内存消耗[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值