基于Oracle数据库的DataTables导出Excel仅显示单条记录问题求助
问题排查与解决方案
核心原因分析
从你提供的代码来看,导出Excel只显示单条记录的主要问题出在表格结构渲染错误,同时还有实体类属性映射的潜在问题:
- 重复生成
<tbody>标签:你的JSP代码在while循环内部每次迭代都输出了一个新的<tbody>,而DataTables只会读取页面中第一个<tbody>的内容,因此只有第一条记录被识别,导出自然也只有这一条。 - 实体类属性与SQL别名不匹配:SQL查询中使用了
En_Proceso作为别名,但实体类的getter是getEN_PROCESO()(全大写),虽然Oracle默认会把列名转为大写,但如果实体类属性命名不规范,可能导致部分数据无法正确绑定;另外你没有展示Pendiente和total对应的getter/setter,这会导致这些列数据无法正常渲染,也可能干扰DataTables的数据识别。
分步解决方案
1. 修正JSP表格渲染结构
把<tbody>标签移到while循环外部,确保整个表格只有一个<tbody>,循环只生成表格行<tr>:
<table id="example" class="display" style="width:100%"> <thead> <tr> <th>Aplicación ID</th> <th>En Proceso</th> <th>Pendiente</th> <th>Total</th> </tr> </thead> <tbody> <% MostrarTablaDao tablaDao = new MostrarTablaDao(); List<Tabla> list = tablaDao.barCharData(); Iterator<Tabla> iter = list.iterator(); while (iter.hasNext()) { Tabla tabla = iter.next(); %> <tr> <td><%= tabla.getAPLICACION_ID() %></td> <td><%= tabla.getEN_PROCESO() %></td> <td><%= tabla.getPendiente() != null ? tabla.getPendiente() : "0" %></td> <td><%= tabla.getTotal() != null ? tabla.getTotal() : "0" %></td> </tr> <% } %> </tbody> </table>
注意:补充了<thead>表头,这是DataTables正常工作的必要结构,同时对可能为null的数值做了默认值处理,避免页面显示空值。
2. 完善实体类属性与映射
确保实体类的属性、getter/setter与SQL查询的列名(Oracle返回的是大写列名)完全匹配,补充缺失的属性方法:
public class Tabla { private String APLICACION_ID; private String PENDIENTE; private String EN_PROCESO; private String TOTAL; // APLICACION_ID的getter/setter public String getAPLICACION_ID() { return APLICACION_ID; } public void setAPLICACION_ID(String APLICACION_ID) { this.APLICACION_ID = APLICACION_ID; } // Pendiente的getter/setter public String getPendiente() { return PENDIENTE; } public void setPendiente(String PENDIENTE) { this.PENDIENTE = PENDIENTE; } // En_Proceso的getter/setter public String getEN_PROCESO() { return EN_PROCESO; } public void setEN_PROCESO(String EN_PROCESO) { this.EN_PROCESO = EN_PROCESO; } // Total的getter/setter public String getTotal() { return TOTAL; } public void setTotal(String TOTAL) { this.TOTAL = TOTAL; } }
3. 验证Dao层数据读取逻辑
确保Dao层正确遍历ResultSet并将所有数据添加到集合中,注意Oracle返回的列名是大写的,所以取值时要对应:
public List<Tabla> barCharData() { ArrayList<Tabla> list = new ArrayList<>(); String sql = "SELECT APLICACION_ID,\n" + "SUM(CASE WHEN ESTADO_CASO = '6' THEN 1 END) as Pendiente,\n" + "SUM(CASE WHEN ESTADO_CASO = '7' THEN 1 END) as En_Proceso,\n" + "SUM(CASE WHEN ESTADO_CASO IN ('6', '7') THEN 1 ELSE 0 END) as total\n" + "FROM SERV_CASO\n" + "GROUP BY GROUPING SETS ( (APLICACION_ID), () )"; try (Connection conn = getConnection(); // 假设你有获取连接的方法 PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery()) { while (rs.next()) { Tabla tabla = new Tabla(); tabla.setAPLICACION_ID(rs.getString("APLICACION_ID")); tabla.setPendiente(rs.getString("PENDIENTE")); // Oracle返回大写列名 tabla.setEN_PROCESO(rs.getString("EN_PROCESO")); tabla.setTotal(rs.getString("TOTAL")); list.add(tabla); } } catch (SQLException e) { e.printStackTrace(); // 这里可以添加异常处理逻辑 } return list; }
4. 确认DataTables配置无冲突
你的DataTables初始化代码基本没问题,不过要确保引入了必要的依赖(jQuery、DataTables核心库、导出按钮相关的JS/CSS):
<!-- 确保引入了这些依赖 --> <link rel="stylesheet" href="https://cdn.datatables.net/1.13.4/css/jquery.dataTables.min.css"> <link rel="stylesheet" href="https://cdn.datatables.net/buttons/2.3.6/css/buttons.dataTables.min.css"> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script src="https://cdn.datatables.net/1.13.4/js/jquery.dataTables.min.js"></script> <script src="https://cdn.datatables.net/buttons/2.3.6/js/dataTables.buttons.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.1.3/jszip.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.53/pdfmake.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.53/vfs_fonts.js"></script> <script src="https://cdn.datatables.net/buttons/2.3.6/js/buttons.html5.min.js"></script> <script> $(document).ready(function() { $('#example').DataTable({ dom: 'Bfrtip', "scrollY": "400px", "scrollCollapse": true, "paging": false, "searching": false, "ordering": false, buttons: [ 'excelHtml5', 'pdfHtml5' ] }); } ); </script>
内容的提问来源于stack exchange,提问作者Dani Urrego




