先看看效果

效果不错吧,就是样式稍微差点,没办法Extjs的表头是渐变的,不过样式改起来应该不难.

接下来是数据:

"{columModle:[{header:\"用电单位\",dataIndex:\"用电单位\"},

{header:\"2009-06 _度数\",dataIndex:\"2009-06 _度数\"},

{header:\"2009-06 _单价\",dataIndex:\"2009-06 _单价\"},

{header:\"2009-06 _金额\",dataIndex:\"2009-06 _金额\"},

{header:\"2009-07 _度数\",dataIndex:\"2009-07 _度数\"},

{header:\"2009-07 _单价\",dataIndex:\"2009-07 _单价\"},

{header:\"2009-07 _金额\",dataIndex:\"2009-07 _金额\"},

{header:\"2009-08 _度数\",dataIndex:\"2009-08 _度数\"},

{header:\"2009-08 _单价\",dataIndex:\"2009-08 _单价\"},

{header:\"2009-08 _金额\",dataIndex:\"2009-08 _金额\"},

{header:\"合计_度数\",dataIndex:\"合计_度数\"},

{header:\"合计_金额\",dataIndex:\"合计_金额\"}],

fieldsNames:[{name:\"用电单位\"},{name:\"2009-06 _度数\"},{name:\"2009-06 _单价\"},{name:\"2009-06 _金额\"},{name:\"2009-07 _度数\"},

{name:\"2009-07 _单价\"},{name:\"2009-07 _金额\"},{name:\"2009-08 _度数\"},{name:\"2009-08 _单价\"},{name:\"2009-08 _金额\"},

{name:\"合计_度数\"},{name:\"合计_金额\"}],

data:[{\"用电单位\":\"1\",\"2009-06 _度数\":\"\",\"2009-06 _单价\":\"\",\"2009-06 _金额\":\"\",\"2009-07 _度数\":\"1.00\",\"2009-07 _单价\":\"2.00\",\"2009-07 _金额\":\"2.0000\",\"2009-08 _度数\":\"4.00\",\"2009-08 _单价\":\"2.00\",\"2009-08 _金额\":\"8.0000\",\"合计_度数\":\"5.00\",\"合计_金额\":\"10.0000\"}]}"

主要是红色的部分

然后是js:

Ext.onReady(function() {
            var conn = new Ext.data.Connection();
            conn.request({ url: 'FuelCompany.ashx', callback: function(options, success, response) {
                var a = response.responseText;
                var json = new Ext.util.JSON.decode(a);
                var jsonrows = "[[";
                var rows = {};
                var _temp = [];
                for (var item in json.columModle) {
                    if (item >= 0) {
                        var tempHeader = json.columModle[item].header
                        if (tempHeader.split('_').length > 1) {
                            _temp.push(tempHeader.split('_')[0]);
                            json.columModle[item].header = tempHeader.split('_')[1];
                        }
                        else
                            _temp.push("");
                    }
                }
                var i = 1;
                for (var item in _temp) {
                    if (item >= 0) {
                        if (_temp[item] != _temp[Number(item) + 1]) {
                            jsonrows += "{header:'" + _temp[item] + "',colspan:" + i.toString() + ",align:'center'},";
                            i = 1;
                        }
                        else
                            i++;
                    }
                }
                jsonrows = jsonrows.substring(0, jsonrows.length - 1);
                jsonrows += "]]";
                var cm = new Ext.grid.ColumnModel({
                    columns: json.columModle,
                    rows: new Ext.util.JSON.decode(jsonrows)
                });
                var ds = new Ext.data.JsonStore({
                    data: json.data,
                    fields: json.fieldsNames
                });
                var header = new Ext.ux.plugins.GroupHeaderGrid();
                var grid = new Ext.grid.EditorGridPanel({
                    height: 400,
                    region: 'center',
                    split: true,
                    border: false,
                    store: ds,
                    plugins: [header],
                    cm: cm,
                    renderTo: 'Div_CompanyProfile'
                });
            }
            });
        });

注意: Ext.ux.plugins.GroupHeaderGrid类源文件如下图所示

GroupHeaderPlugin.js文件源码:

Ext.namespace("Ext.ux.plugins");

Ext.ux.plugins.GroupHeaderGrid = function(config) {

Ext.apply(this, config);

};

Ext.extend(Ext.ux.plugins.GroupHeaderGrid, Ext.util.Observable, {

init: function(grid) {

var v = grid.getView();

v.beforeMethod('initTemplates', this.initTemplates);

v.renderHeaders = this.renderHeaders.createDelegate(v, [v.renderHeaders]);

v.afterMethod('onColumnWidthUpdated', this.updateGroupStyles);

v.afterMethod('onAllColumnWidthsUpdated', this.updateGroupStyles);

v.afterMethod('onColumnHiddenUpdated', this.updateGroupStyles);

v.getHeaderCell = this.getHeaderCell;

v.updateSortIcon = this.updateSortIcon;

v.getGroupStyle = this.getGroupStyle;

},

initTemplates: function() {

var ts = this.templates || {};

if (!ts.gheader) {

ts.gheader = new Ext.Template(

'<table border="0" cellspacing="0" cellpadding="0" class="ux-grid-group-table" style="{tstyle}">',

'<thead>{rows}{header}</thead>',

'</table>'

);

}

if (!ts.header) {

ts.header = new Ext.Template(

'<tr class="x-grid3-hd-row">{cells}</tr>'

);

}

if (!ts.gcell) {

ts.gcell = new Ext.Template(

'<td class="x-grid3-hd {cls} x-grid3-td-{id}" style="{style}" rowspan="{rowspan}" colspan="{colspan}">',

'<div {tooltip} class="x-grid3-hd-inner x-grid3-hd-{id}" unselectable="on" style="{istyle}">{value}</div>',

'</td>'

);

}

this.templates = ts;

},

renderHeaders: function(renderHeaders) {

var ts = this.templates, rows = [], table = [];

for (var i = 0; i < this.cm.rows.length; i++) {

var r = this.cm.rows[i], cells = [], col = 0;

for (var j = 0; j < r.length; j++) {

var c = r[j];

c.colspan = c.colspan || 1;

c.rowspan = c.rowspan || 1;

while (table[i] && table[i][col]) {

col++;

}

c.col = col;

for (var rs = i; rs < i + c.rowspan; rs++) {

if (!table[rs]) {

table[rs] = [];

}

for (var cs = col; cs < col + c.colspan; cs++) {

table[rs][cs] = true;

}

}

var gs = this.getGroupStyle(c);

cells[j] = ts.gcell.apply({

id: c.id || i + '-' + col,

cls: c.header ? 'ux-grid-hd-group-cell' : 'ux-grid-hd-nogroup-cell',

style: 'width:' + gs.width + ';' + (gs.hidden ? 'display:none;' : '') + (c.align ? 'text-align:' + c.align + ';' : ''),

rowspan: c.rowspan,

colspan: gs.colspan,

tooltip: c.tooltip ? (Ext.QuickTips.isEnabled() ? 'ext:qtip' : 'title') + '="' + c.tooltip + '"' : '',

value: c.header || ' ',

istyle: c.align == 'right' ? 'padding-right:16px' : ''

});

}

rows[i] = ts.header.apply({

cells: cells.join('')

});

}

return ts.gheader.apply({

tstyle: 'width:' + this.getTotalWidth() + ';',

rows: rows.join(''),

header: renderHeaders.call(this)

});

},

getGroupStyle: function(c) {

var w = 0, h = true, cs = 0;

for (var i = c.col; i < c.col + c.colspan; i++) {

if (!this.cm.isHidden(i)) {

var cw = this.cm.getColumnWidth(i);

if(typeof cw == 'number'){

w += cw;

}

h = false;

cs++;

}

}

return {

width: (Ext.isBorderBox ? w : Math.max(w - this.borderWidth, 0)) + 'px',

hidden: h,

colspan: cs || 1

}

},

updateGroupStyles: function(col) {

var rows = this.mainHd.query('tr.x-grid3-hd-row');

for (var i = 0; i < rows.length - 1; i++) {

var cells = rows[i].childNodes;

for (var j = 0; j < cells.length; j++) {

var c = this.cm.rows[i][j];

if ((typeof col != 'number') || (col >= c.col && col < c.col + c.colspan)) {

var gs = this.getGroupStyle(c);

cells[j].style.width = gs.width;

cells[j].style.display = gs.hidden ? 'none' : '';

cells[j].colSpan = gs.colspan;

}

}

}

},

getHeaderCell : function(index){

return this.mainHd.query('td.x-grid3-cell')[index];

},

updateSortIcon : function(col, dir){

var sc = this.sortClasses;

var hds = this.mainHd.select('td.x-grid3-cell').removeClass(sc);

hds.item(col).addClass(sc[dir == "DESC" ? 1 : 0]);

}

});

ExtJs 实现动态列,动态多表头 在这里添加日志标题相关推荐

  1. ExtJS 表格自定义列-动态widget

    一.需求: 表格中根据数据不同,动态渲染出不同的组件. 二.环境: 1.操作系统: Microsoft Windows 10 专业版 2.OS 版本:          10.0.14393 暂缺 B ...

  2. 在线报表设计实战系列 – 制作动态列与静态列混排的报表(5)

    在线报表设计实战系列 – 制作动态列与静态列混排的报表(5) 葡萄城报表是一套强大的报表开发和系统搭建工具,既能与您开发的报表软件项目紧密集成,也可独立部署运行,支持多数据源,具有无编码.灵活.稳定等 ...

  3. easyexcel 动态列_easyexcel动态表头列导出SequenceDiagram 阅读源码事半功倍

    EasyExcel简介 Java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢 ...

  4. ABP 多模块关联查询、分组统计、列转行、Vue 复合表头动态列

    本文记录了一次使用abp Core5 ,vue 开发复杂报表的经历. 0.需求概述 业务需求是:统计一个化工厂车队形式记录数据中异常停车的报表,维度可以按照车俩.驾驶员两个维度进行统计,统计的元素有: ...

  5. [转]bootstrap table 动态列数

    原文地址:https://my.oschina.net/u/2356355/blog/1595563 据说bootstrap table非常好用,从入门教程中了解到它的以下主要功能: 由于固定表头意味 ...

  6. easyexcel 列头合并_Easyexcel使用文档及动态列的实现

    Java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有 ...

  7. [转]RDLC 动态列

    本文转自:http://blog.csdn.net/luochengbang/article/details/9964551 很久没有写博客了,关于动态列,国内很少资料有介绍动态列的,所想写点心得给哥 ...

  8. Vue+Element表格动态列+表格分页

    LayUI表格动态列及分页LayUI+JavaScript表格动态列+表格分页 效果如图: 代码: 引用JQuery,Vue,Element等文件,换成自己的路径 <!DOCTYPE html& ...

  9. 使用easypoi导出excel实现动态列

    使用easypoi导出excel实现动态列 说明 使用的是easypoi进行导出 行头是动态生成 依据key进行列匹配,进行数据填充 第一列进行纵向动态合并 自己的一个使用,记录一下 工具依赖 < ...

最新文章

  1. 火狐浏览器中打开java_将Firefox浏览器嵌入Java Swing中
  2. 作者:李廉(1951-),男,合肥工业大学计算机与信息学院教授
  3. BPM配置故事之案例2-文本默认值
  4. textContent和innerText属性的区别
  5. MGRE、OSPF综合实验
  6. 【2019西安邀请赛热身赛C:】python算数表达式求值+模拟int溢出
  7. 01串匹配问题 —— Binary Strings【Gym - 101845B】
  8. Redpill:在后渗透中实现反向TCP Shell
  9. 简单易学的机器学习算法——Mean Shift聚类算法
  10. 单片机c语言中主程序怎么写,单片机的主程序和中断程序是怎么样运行的
  11. 工业级光纤收发器 百兆单模双纤内电/光电转换器/光钎收发 耐高温
  12. Runaway Robot游戏通关算法实现过程总结
  13. linux下hwclock及clock命令详解
  14. 利用计算机求解一个实际问题的步骤是,数学在计算机科学的应用.doc
  15. android手机控制电视,[转载]android万能遥控器之二--用手机遥控电视
  16. 计算机英语作文150字,英语作文150字
  17. buffers/cache含义
  18. 爱思华宝邮件服务器技术规范
  19. 典型高速系统应用框图举例
  20. 【TeklaPad】下载地址

热门文章

  1. c++适配器模式adapter
  2. C++技能的4种方法
  3. SpringBoot系列:Spring Boot集成定时任务Quartz
  4. Notepad++插件之ftp/sftp远程编辑功能,以及各种插件(转:http://blog.csdn.net/happy_wu/article/details/73302994)
  5. 3线程的终止方式,线程属性,NPTL
  6. y7000p电池固件_拯救者Y7000、Y7000P、Y9000k显卡切换了解一下
  7. mongoose 批量修改字段_记一次脚本批量修改数据库字符集所埋下的一个坑及解决思路...
  8. 多元线性回归算法python实现_手写算法-Python代码推广多元线性回归
  9. 深度学习Caffe实战笔记(19)Windows平台 Faster-RCNN 制作自己的数据集
  10. react native 从头开始