You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

不使用Maven,如何在Java Servlet中导出Excel表格?

嘿,我看你正在用Apache POI实现数据导出到Excel的功能,处理动态表头的代码写到一半啦,我来帮你把这段代码补全并梳理清楚,让它能完整跑起来~

首先先把你现有的代码整理成规范的代码块:

// 初始化空白工作簿
XSSFWorkbook workbook = new XSSFWorkbook();
// 创建空白工作表
XSSFSheet sheet = workbook.createSheet("User Data");

User user = new User();
// 获取要导出的用户数据列表
ArrayList<User> objects = (ArrayList<User>) user.fetchAll(request);

// 表头行(这里你原来从rowNum=1开始,其实表头一般放在第0行更符合习惯,后面我会调整)
int rowNum = 1;
Row row = sheet.createRow(rowNum++);
int cellNum = 0;

// 从表单提交的动态表头
if(request.getParameter("id")!=null && !request.getParameter("id").isEmpty()){
    // 这里应该是处理每个表头字段的逻辑
}

接下来我给你补全完整的实现逻辑,重点处理动态表头和数据填充:

步骤1:收集动态表头字段

首先我们需要把前端提交的所有要导出的表头字段收集起来,比如前端可能通过复选框提交了idusernameemail这些参数,我们可以先把这些字段名(或显示名称)存到一个列表里:

// 收集动态表头字段(用显示名称更友好)
List<String> headerFields = new ArrayList<>();
if (request.getParameter("id") != null && !request.getParameter("id").isEmpty()) {
    headerFields.add("用户ID");
}
if (request.getParameter("username") != null && !request.getParameter("username").isEmpty()) {
    headerFields.add("用户名");
}
if (request.getParameter("email") != null && !request.getParameter("email").isEmpty()) {
    headerFields.add("绑定邮箱");
}
// 可以继续添加其他可能的字段,比如手机号、创建时间等

步骤2:创建表头行并设置样式

建议把表头放在第0行,这样更符合Excel的常规排版,还可以给表头加个加粗样式,让它更醒目:

// 创建表头行(调整为第0行)
Row headerRow = sheet.createRow(0);
// 给表头设置加粗样式
XSSFCellStyle headerStyle = workbook.createCellStyle();
XSSFFont font = workbook.createFont();
font.setBold(true);
headerStyle.setFont(font);

// 循环填充表头单元格
for (int i = 0; i < headerFields.size(); i++) {
    Cell cell = headerRow.createCell(i);
    cell.setCellValue(headerFields.get(i));
    cell.setCellStyle(headerStyle);
}

步骤3:循环填充数据行

接下来遍历你的用户数据列表,根据表头的顺序,对应取出用户的属性值填充到单元格里:

// 填充数据行(从第1行开始)
int dataRowNum = 1;
for (User userData : objects) {
    Row dataRow = sheet.createRow(dataRowNum++);
    int cellIndex = 0;
    
    // 按表头顺序匹配数据
    if (headerFields.contains("用户ID")) {
        dataRow.createCell(cellIndex++).setCellValue(userData.getId());
    }
    if (headerFields.contains("用户名")) {
        dataRow.createCell(cellIndex++).setCellValue(userData.getUsername());
    }
    if (headerFields.contains("绑定邮箱")) {
        dataRow.createCell(cellIndex++).setCellValue(userData.getEmail());
    }
    // 继续对应其他需要导出的字段
}

步骤4:优化表格样式并输出Excel

最后设置自动列宽让表格更美观,再通过输出流把Excel文件写给前端(Web场景下):

// 设置自动列宽,适配内容长度
for (int i = 0; i < headerFields.size(); i++) {
    sheet.autoSizeColumn(i);
}

// 输出Excel到前端
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setHeader("Content-Disposition", "attachment; filename=\"user_data.xlsx\"");

// 用try-with-resources自动关闭资源,避免内存泄漏
try (OutputStream outputStream = response.getOutputStream()) {
    workbook.write(outputStream);
} finally {
    workbook.close();
}

一些小提醒

  • 记得引入Apache POI的依赖,比如Maven要加poipoi-ooxml的依赖
  • 尽量给fetchAll方法指定泛型返回值List<User>,避免强制转换的警告
  • 如果导出数据量很大,可以考虑用SXSSFWorkbook代替XSSFWorkbook,避免内存溢出

内容的提问来源于stack exchange,提问作者Veshraj Joshi

火山引擎 最新活动