不使用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:收集动态表头字段
首先我们需要把前端提交的所有要导出的表头字段收集起来,比如前端可能通过复选框提交了id、username、email这些参数,我们可以先把这些字段名(或显示名称)存到一个列表里:
// 收集动态表头字段(用显示名称更友好) 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要加
poi和poi-ooxml的依赖 - 尽量给
fetchAll方法指定泛型返回值List<User>,避免强制转换的警告 - 如果导出数据量很大,可以考虑用SXSSFWorkbook代替XSSFWorkbook,避免内存溢出
内容的提问来源于stack exchange,提问作者Veshraj Joshi




