小阿七Eason 2023-05-26 08:28 采纳率: 70%
浏览 24
已结题

关于datagrid 复杂报表

现在想用 easyui 的datagrid实现 类似这样的报表 可以实现吗?有没有参考的例子 感谢大家

img

  • 写回答

2条回答 默认 最新

  • 27-1994 2023-05-26 09:39
    关注

    img

    <!DOCTYPE html>
    <html>
    
    <head>
      <meta charset="UTF-8">
      <title>EasyUI Datagrid Mergerows Demo</title>
      <link rel="stylesheet" type="text/css" href="https://www.jeasyui.net/Public/js/easyui/themes/default/easyui.css">
      <link rel="stylesheet" type="text/css" href="https://www.jeasyui.net/Public/js/easyui/themes/icon.css">
      <script type="text/javascript" src="https://cdn.bootcdn.net/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
      <script type="text/javascript" src="https://www.jeasyui.net/Public/js/easyui/jquery.easyui.min.js"></script>
      <style type="text/css">
        #myDatagrid {
          height: 500px;
        }
      
        .merged-row {
          height: 30px;
          line-height: 30px;
          font-weight: bold;
          background-color: #f0f0f0;
        }
      </style>
    </head>
    
    <body>
      <table id="myDatagrid">
        <thead>
          <tr>
            <th rowspan="2">ID</th>
            <th colspan="2">Name</th>
            <th rowspan="2">Age</th>
            <th rowspan="2">Gender</th>
            <th colspan="4">Address</th>
          </tr>
          <tr>
            <th>First Name</th>
            <th>Last Name</th>
            <th>Street</th>
            <th>City</th>
            <th>State</th>
            <th>Zip</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td rowspan="2">1</td>
            <td>Alice</td>
            <td>Smith</td>
            <td>20</td>
            <td>Female</td>
            <td rowspan="2">123 Main St., Anytown USA</td>
            <td rowspan="2">Anytown</td>
            <td rowspan="2">CA</td>
            <td rowspan="2">90210</td>
          </tr>
          <tr>
            <td>Bob</td>
            <td>Johnson</td>
            <td>22</td>
            <td>Male</td>
          </tr>
          <tr>
            <td rowspan="3">2</td>
            <td>Carol</td>
            <td>Williams</td>
            <td>25</td>
            <td>Female</td>
            <td>456 Maple Rd., Othertown USA</td>
            <td>Othertown</td>
            <td>NY</td>
            <td>11235</td>
          </tr>
          <tr>
            <td>David</td>
            <td>Davis</td>
            <td>27</td>
            <td>Male</td>
            <td rowspan="2">789 Elm St., Anothercity USA</td>
            <td rowspan="2">Anothercity</td>
            <td rowspan="2">TX</td>
            <td rowspan="2">76051</td>
          </tr>
          <tr>
            <td>Emily</td>
            <td>Jones</td>
            <td>23</td>
            <td>Female</td>
          </tr>
        </tbody>
      </table>
      <script type="text/javascript">
        $(function () {
          $('#myDatagrid').datagrid({
            onLoadSuccess: function (data) {
              mergeRows('myDatagrid', 0, ['ID']);
            }
          });
    
          // Merge rows based on column names
          function mergeRows(datagridId, startIndex, fieldNames) {
            var datagrid = $('#' + datagridId);
            var rows = datagrid.datagrid('getRows');
            var mergeCells = [];
            var fieldName;
            var rowspan;
            var i;
            var j;
            var curFieldValue;
            var nextFieldValue;
            var thisRow;
            var nextRow;
            var skipRows = 0;
            var rowSpanIndex;
    
            for (i = startIndex; i < rows.length; i++) {
              thisRow = rows[i];
              nextRow = (i + 1 < rows.length) ? rows[i + 1] : {};
    
              for (j = 0; j < fieldNames.length; j++) {
                fieldName = fieldNames[j];
    
                if (skipRows > 0) {
                  mergeCells.push({ index: i, field: fieldName, rowspan: rowspan });
    
                  if (j === fieldNames.length - 1) {
                    skipRows--;
                  }
    
                  continue;
                }
    
                curFieldValue = thisRow[fieldName];
                nextFieldValue = nextRow[fieldName];
    
                if (curFieldValue !== nextFieldValue) {
                  mergeCells.push({ index: i, field: fieldName, rowspan: 1 });
                } else {
                  rowSpanIndex = mergeCells.findIndex(function (elem) {
                    return elem.index === i - 1 && elem.field === fieldName;
                  });
    
                  if (rowSpanIndex !== -1) {
                    rowspan = mergeCells[rowSpanIndex].rowspan + 1;
                    mergeCells[rowSpanIndex].rowspan = rowspan;
                    skipRows = rowspan - 1;
    
                    if (j === fieldNames.length - 1) {
                      skipRows--;
                    }
                  } else {
                    mergeCells.push({ index: i, field: fieldName, rowspan: 2 });
                  }
                }
              }
            }
    
            datagrid.datagrid('mergeCells', {
              index: mergeCells[0].index,
              field: mergeCells[0].field,
              rowspan: mergeCells[0].rowspan
            });
    
            for (i = 1; i < mergeCells.length; i++) {
              rowIndex = mergeCells[i].index;
              fieldName = mergeCells[i].field;
              rowspan = mergeCells[i].rowspan;
    
              if (rowspan > 1) {
                datagrid.datagrid('mergeCells', {
                  index: rowIndex,
                  field: fieldName,
                  rowspan: rowspan
                });
    
                for (j = rowIndex + 1; j < rowIndex + rowspan; j++) {
                  var tr = datagrid.datagrid('getRowDom', j);
                  tr.addClass('merged-row');
                }
              }
            }
          }
        });
      </script>
    </body>
    
    </html>
    

    在上述代码中,我们首先引入了 EasyUI 相关的 CSS 和 JavaScript 文件,在页面中定义了一个包含多行和多列的复杂表格,其中一些行和列需要进行单元格合并。我们使用了 rowspan 和 colspan 属性来指定需要合并的单元格。在实际应用中,这些数据应该是通过 JavaScript 代码动态生成而来。

    然后,我们使用 EasyUI 的 datagrid 组件来渲染这个表格,并在 onLoadSuccess 事件触发后调用 mergeRows 函数,实现单元格的合并操作。

    mergeRows 函数的实现非常复杂,主要功能是基于某个或多个列名,动态地合并单元格。首先,我们使用 EasyUI 提供的 API 获取所有行数据,并准备好一个空数组 mergeCells 用于存储合并单元格的信息。然后,针对每一列,我们通过逐行比较来判断单元格是否需要合并。如果需要合并,则将相邻单元格的行数进行累加。如果不需要合并,则将当前单元格作为一个新的合并单元格进行存储。

    最后,我们使用 EasyUI 提供的 mergeCells 方法,遍历 mergeCells 数组,依次合并单元格。注意,在对单元格进行合并时,我们使用了 addClass 方法为合并后的单元格添加 merged-row 类,以便为合并后的单元格设置样式。

    通过上述代码,我们就可以在 HTML 页面中使用 EasyUI 的 datagrid 实现合并单元格的复杂表格。需要注意的是,在实际应用中,我们应该根据实际需要进行样式的调整,以便更好地展示数据。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月3日
  • 已采纳回答 5月26日
  • 创建了问题 5月26日