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

基于Oracle数据库的DataTables导出Excel仅显示单条记录问题求助

问题排查与解决方案

核心原因分析

从你提供的代码来看,导出Excel只显示单条记录的主要问题出在表格结构渲染错误,同时还有实体类属性映射的潜在问题:

  1. 重复生成<tbody>标签:你的JSP代码在while循环内部每次迭代都输出了一个新的<tbody>,而DataTables只会读取页面中第一个<tbody>的内容,因此只有第一条记录被识别,导出自然也只有这一条。
  2. 实体类属性与SQL别名不匹配:SQL查询中使用了En_Proceso作为别名,但实体类的getter是getEN_PROCESO()(全大写),虽然Oracle默认会把列名转为大写,但如果实体类属性命名不规范,可能导致部分数据无法正确绑定;另外你没有展示Pendientetotal对应的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

火山引擎 最新活动