java如何下载excel
使用 Apache POI 下载 Excel
Apache POI 是一个流行的 Java 库,用于处理 Microsoft Office 格式文件。以下是使用 POI 创建并下载 Excel 文件的示例代码:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public void downloadExcel(HttpServletResponse response) throws IOException {
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Sheet1");
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
cell.setCellValue("Hello, Excel!");
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setHeader("Content-Disposition", "attachment; filename=example.xlsx");
workbook.write(response.getOutputStream());
workbook.close();
}
使用 EasyExcel 下载 Excel
EasyExcel 是阿里巴巴开源的 Excel 操作工具,适合大数据量导出:

import com.alibaba.excel.EasyExcel;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public void downloadWithEasyExcel(HttpServletResponse response) throws IOException {
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setHeader("Content-Disposition", "attachment; filename=data.xlsx");
List<DemoData> dataList = new ArrayList<>();
// 填充数据...
EasyExcel.write(response.getOutputStream(), DemoData.class).sheet("数据").doWrite(dataList);
}
前端触发下载
在 Spring Boot 应用中,可以通过控制器返回 ResponseEntity 实现下载:

import org.springframework.core.io.ByteArrayResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
public ResponseEntity<ByteArrayResource> downloadExcel() throws IOException {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
Workbook workbook = new XSSFWorkbook();
// 填充Excel内容...
workbook.write(stream);
workbook.close();
byte[] bytes = stream.toByteArray();
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Disposition", "attachment; filename=report.xlsx");
return ResponseEntity.ok()
.headers(headers)
.contentLength(bytes.length)
.contentType(MediaType.parseMediaType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"))
.body(new ByteArrayResource(bytes));
}
处理大数据量
当数据量较大时,建议采用分批次写入和流式处理:
public void largeDataExport(HttpServletResponse response) throws IOException {
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setHeader("Content-Disposition", "attachment; filename=large_data.xlsx");
Workbook workbook = new SXSSFWorkbook(100); // 使用SXSSF实现流式导出
Sheet sheet = workbook.createSheet();
// 分批次写入数据
for (int i = 0; i < 100000; i++) {
Row row = sheet.createRow(i);
row.createCell(0).setCellValue("Data " + i);
}
workbook.write(response.getOutputStream());
((SXSSFWorkbook) workbook).dispose(); // 清理临时文件
workbook.close();
}
设置单元格样式
可以为 Excel 添加样式增强可读性:
CellStyle headerStyle = workbook.createCellStyle();
Font font = workbook.createFont();
font.setBold(true);
headerStyle.setFont(font);
Row headerRow = sheet.createRow(0);
Cell headerCell = headerRow.createCell(0);
headerCell.setCellValue("标题");
headerCell.setCellStyle(headerStyle);






