Java生成Excel文件并提供下载

在日常开发中,经常会遇到需要生成Excel文件并提供给用户下载的需求。Java提供了多种方法来实现这个功能,本文将介绍一种简单而常用的方法。

Apache POI库

Apache POI是一个用于操作Microsoft Office格式文件的开源Java库。它提供了一组API来创建、读取和修改Excel文件。我们可以使用它来生成Excel文件。

要使用POI库,首先需要将其添加到项目的依赖中。可以使用Maven来管理依赖,添加以下依赖项:

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

生成Excel文件

下面是一个简单的示例代码,演示如何使用POI库生成一个包含数据的Excel文件:

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

import java.io.FileOutputStream;
import java.io.IOException;

public class ExcelGenerator {
    public static void main(String[] args) {
        // 创建一个工作簿
        Workbook workbook = new XSSFWorkbook();

        // 创建一个工作表
        Sheet sheet = workbook.createSheet("Sheet1");

        // 创建行和单元格,并填充数据
        Row headerRow = sheet.createRow(0);
        headerRow.createCell(0).setCellValue("姓名");
        headerRow.createCell(1).setCellValue("年龄");
        
        Row dataRow = sheet.createRow(1);
        dataRow.createCell(0).setCellValue("张三");
        dataRow.createCell(1).setCellValue(25);

        // 设置列宽
        sheet.setColumnWidth(0, 5000);
        sheet.setColumnWidth(1, 3000);

        // 将工作簿写入文件
        try (FileOutputStream outputStream = new FileOutputStream("output.xlsx")) {
            workbook.write(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 关闭工作簿
        try {
            workbook.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

上述代码首先创建一个Workbook对象,代表整个Excel文件。然后创建一个Sheet对象,表示一个工作表。通过调用createRow()方法创建行对象,再通过调用createCell()方法创建单元格对象,并使用setCellValue()方法设置单元格的值。最后,通过调用setColumnWidth()方法设置列宽,将工作簿写入文件。

提供下载

一旦生成了Excel文件,我们需要将其提供给用户下载。可以使用Java的Servlet来实现这个功能。下面是一个简单的示例代码,演示如何使用Servlet来提供Excel文件的下载:

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;

public class DownloadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        resp.setHeader("Content-Disposition", "attachment; filename=output.xlsx");
    	
        File file = new File("output.xlsx");
        try (FileInputStream inputStream = new FileInputStream(file);
             OutputStream outputStream = resp.getOutputStream()) {
            byte[] buffer = new byte[4096];
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

上述代码使用doGet()方法来处理GET请求。首先设置响应的Content-Type为Excel文件的MIME类型,然后设置Content-Disposition头部,将文件名设置为"output.xlsx"并指定为附件。接下来,创建一个File对象,通过FileInputStream读取文件内容,并通过OutputStream将文件内容写入响应的输出流。

要将Servlet注册到Web应用程序中,需要在web.xml文件中添加相应的配置:

<servlet>
    <servlet-name>DownloadServlet</servlet-name>
    <servlet-class>com.example.DownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>DownloadServlet</servlet-name>
    <url-pattern>/download</url-pattern>
</servlet-mapping>
``