Java 导出 Excel 文件流

1. 简介

在日常的开发工作中,我们经常需要将数据导出为 Excel 文件,方便用户查看和分析数据。在 Java 中,我们可以使用一些开源库来实现 Excel 文件的导出功能,例如 Apache POI。

本文将介绍如何使用 Java 导出 Excel 文件流,并提供相应的代码示例。

2. 准备工作

在开始之前,我们需要准备以下工具和环境:

  • JDK:确保已经安装了 Java 开发工具包。
  • IDE:推荐使用 IntelliJ IDEA 或 Eclipse 等 Java 开发工具。
  • 依赖库:需要引入 Apache POI 的相关依赖库。

3. 导出 Excel 文件流的步骤

3.1. 创建工作簿和工作表

在使用 Apache POI 进行 Excel 文件操作之前,我们需要先创建一个工作簿(Workbook)和一个工作表(Sheet)。工作簿表示整个 Excel 文件,而工作表则是文件中的一个表格。

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

// 创建工作簿和工作表
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Sheet1");

3.2. 添加表头

接下来,我们可以为工作表添加表头信息,表头通常是数据的标题或字段名称。

// 创建表头样式
CellStyle headerCellStyle = workbook.createCellStyle();
headerCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
headerCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);

// 创建表头行
Row headerRow = sheet.createRow(0);

// 添加表头数据
Cell headerCell = headerRow.createCell(0);
headerCell.setCellValue("字段1");
headerCell.setCellStyle(headerCellStyle);

headerCell = headerRow.createCell(1);
headerCell.setCellValue("字段2");
headerCell.setCellStyle(headerCellStyle);

// ...

3.3. 添加数据行

接下来,我们可以逐行添加数据到工作表中。

// 创建数据行样式
CellStyle dataCellStyle = workbook.createCellStyle();
dataCellStyle.setBorderBottom(BorderStyle.THIN);
dataCellStyle.setBorderTop(BorderStyle.THIN);
dataCellStyle.setBorderLeft(BorderStyle.THIN);
dataCellStyle.setBorderRight(BorderStyle.THIN);

// 添加数据到工作表
int rowNum = 1;
for (DataObject data : dataList) {
    Row dataRow = sheet.createRow(rowNum++);

    Cell dataCell = dataRow.createCell(0);
    dataCell.setCellValue(data.getField1());
    dataCell.setCellStyle(dataCellStyle);

    dataCell = dataRow.createCell(1);
    dataCell.setCellValue(data.getField2());
    dataCell.setCellStyle(dataCellStyle);

    // ...
}

3.4. 导出文件流

最后,我们可以将工作簿中的数据导出为文件流,供用户下载。

// 导出文件流
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
workbook.write(outputStream);
byte[] bytes = outputStream.toByteArray();

4. 完整示例代码

下面是一个完整的示例代码,演示了如何使用 Java 导出 Excel 文件流:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class ExcelExporter {

    public static void main(String[] args) {
        List<DataObject> dataList = new ArrayList<>();
        dataList.add(new DataObject("Value1", "Value2"));
        dataList.add(new DataObject("Value3", "Value4"));

        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("Sheet1");

        CellStyle headerCellStyle = workbook.createCellStyle();
        headerCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
        headerCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);

        Row headerRow = sheet.createRow(0);

        Cell headerCell = headerRow.createCell(0);
        headerCell.setCellValue("字段1");
        headerCell.setCellStyle(headerCellStyle);

        headerCell = headerRow.createCell(1);
        headerCell.setCellValue("字段2");
        headerCell.setCellStyle(headerCellStyle);

        CellStyle dataCellStyle = workbook.createCellStyle();
        dataCellStyle.setBorderBottom(BorderStyle.THIN);
        dataCellStyle.setBorderTop(BorderStyle.THIN);
        dataCellStyle.setBorderLeft(BorderStyle.THIN);
        dataCellStyle.setBorderRight(BorderStyle.THIN);

        int rowNum = 1;
        for (DataObject data : dataList) {
            Row dataRow = sheet.createRow(rowNum++);

            Cell dataCell = dataRow.createCell(0);
            dataCell.setCellValue(data.getField1());
            dataCell.setCellStyle(dataCellStyle);

            data