请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

bgrimm_auto

初级会员

45

主题

156

帖子

423

积分

初级会员

积分
423

微信认证勋章

bgrimm_auto
初级会员   /  发表于:2016-10-19 15:45  /   查看:7439  /  回复:10
我在设计器里设计了如下报表:
blob597117614.png
里面设置了一个表格 名称为DataSet

但是在实现数据加载时候:
一、我测试了手动写json格式:
var data = {
                    Work_No: '八车间',
                    DateTime: new Date(),
                    Section_People: '卢中伟',
                    DataSet: [
                      { Date: '1', Col_1: '11', Code_1: '111', Dcode_1: '111', Col_2: '95', Col_3: '1.99' },
                      { Date: '2', Col_1: '12', Code_1: '111', Dcode_1: '111', Col_2: '60', Col_3: '4.99' },
                      { Date: '3', Col_1: '12', Code_1: '111', Dcode_1: '111', Col_2: '16', Col_3: '15.99' }
                    ]
                };
                source = new GcSpread.Sheets.CellBindingSource(data);
                var sheet = spread.sheets[0];
                sheet.setDataSource(source);

实现了数据加载;

二、当我从数据库中加载数据,从后台通过json格式传入前台时候数据加载不出来:
1、
blob700444030.png
以上是我从数据库中查询的数据:

2、开始使用了
var jsdata = getDataSet(sdate, strMyID, "../Service/MES_Service.asmx/GetProductPR002");

            var bindData = new GcSpread.Sheets.CellBindingSource(jsdata);
            var sheet = spread.sheets[0];
            sheet.setDataSource(bindData);


数据不能加载;

3、第二次修改使用
       var jsdata = getDataSet(sdate, strMyID, "../Service/MES_Service.asmx/GetProductPR002");
            //加载数据
            var data = {
                DataSet: jsdata
            };
            var bindData = new GcSpread.Sheets.CellBindingSource(jsdata);
            var sheet = spread.sheets[0];
            sheet.setDataSource(bindData);

数据还是不能加载出来
jsdata数据如下
blob913804016.png blob770536803.png

请问是什么原因呢




10 个回复

倒序浏览
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2016-10-19 17:09:46
沙发
您好

var data = {
                DataSet: jsdata
            };
           // var bindData = new GcSpread.Sheets.CellBindingSource(jsdata);
           //这里应该是设置错了
            var bindData = new GcSpread.Sheets.CellBindingSource(data);
回复 使用道具 举报
bgrimm_auto
初级会员   /  发表于:2016-10-20 10:06:55
板凳
还有一个json数据的问题:
现在我的报表里面不单单有表格数据,还有一对一的单个数据:
json只有写成此类型才能全部显示:
var data = {
                    Work_No: '八车间',
                    DateTime: new Date(),
                    Section_People: '卢中伟',
                    DataSet: [
                      { Date: '1', Col_1: '11', Code_1: '111', Dcode_1: '111', Col_2: '95', Col_3: '1.99' },
                      { Date: '2', Col_1: '12', Code_1: '111', Dcode_1: '111', Col_2: '60', Col_3: '4.99' },
                      { Date: '3', Col_1: '12', Code_1: '111', Dcode_1: '111', Col_2: '16', Col_3: '15.99' }
                    ]
                }
可是从后台取数据传入前端时候,写成如此格式,前端json解析错误,请问应该如何处理呢?
是不是必须要单独获取两次数据才行,那么在保存数据时候获取到的json数据又是什么类型的,如何解析进行保存呢
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2016-10-20 10:18:40
地板
你那个 new Date() json是解析了的。你可以把这个字段先空着,到前台再加,或者后台设置一个时间的string
回复 使用道具 举报
bgrimm_auto
初级会员   /  发表于:2016-10-20 10:37:30
5#
上面那个我在前端写好的格式,可以进行数据加载;
我实际后端数据是这样的:
string temp = serializer.Serialize(lstTmp);
string temp2 = serializer.Serialize(lstTmp2);


blob866461181.png 这个temp是我要放在表格中的数据,表格必须要明明一个DataSet,

blob822018737.png 这个temp2是我需要放在单个里面的数据,

可是在后端我想把这两个拼接进行return到前端时候,怎么都实现不了那种可以加载的格式,

function getDataSet(sdate, strMyID, path) {
            var dataList = null;
            $.ajax({
                type: "POST",
                async: false,
                contentType: "application/json;charset=utf-8", //WebService 会返回Json类型            
                url: path, //方法所在页面和方法名
                data: "{'sdate': '" + sdate + "','strMyID': '" + strMyID + "'}",
                success: function (json) {
                    dataList = eval(json.d);
                }
            });
            return dataList;
        }


就是在这里解析时候就不行,
如果直接把两个后台的通过逗号拼接回来可以解析,但是在前端又不知道该如何组合了

var data ={
                DataSet: jsdata
            };

这种方式只能是传回一个表格数据,可是我需要都传回进行加载




回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2016-10-20 10:54:59
6#
两种方式
1. 前端组合
如果是前端组合的话,两个异步请求必须都完成后才能组合,可以嵌套两个请求但是这样效率太低,也可以设置标记标量,等两个请求都返回了再组合。
组合时候应该是
var data ={
             Work_No: jsdata1[0]["Work No"],
                    DateTime: jsdata1[0]["DateTime"],
                    Section_People: jsdata1[0]["Section_People"],
                DataSet: jsdata2
            };
2. 后端组合

后端组合的话您需要先把您的lstTmp 和 lstTmp2组合
在lstTmp 的类中添加DataSet属性,然后让lstTmp.lstTmp = lstTmp2.
最后直接序列化lstTmp 返回即可。

前端的话应该是 是var data  = jsdata【0】

回复 使用道具 举报
bgrimm_auto
初级会员   /  发表于:2016-10-20 13:50:39
7#
blob663433837.png
现在需要实现以下:
1) blob882322692.png
此列我需要重新命名:
blob907247924.png
function initSpread(spread) {
            //var sheet = spread.getActiveSheet();
            var activeSheet = spread.sheets[0];
            activeSheet.isPaintSuspended(true);
            activeSheet.setName("生产日报表");
            activeSheet.setArray(3, 0, [['日期', 'KCL%', 'CaSO4%', 'MgCL2%', 'NaCL%', '合计', '单耗', '合计1', '单耗2', '合计', '单耗', '合计', '单耗', '合计', '单耗', '合计', '单耗', '合计', '单耗', '95%', '93%', '90%', '<90%', '日产备注', '日产值', '备注']]);
            activeSheet.addSpan(2, 23, 2, 2);
            activeSheet.addSpan(2, 25, 2, 1);
            //var tables = sheet.getTables();
            //var table = sheet.getTables("DataSet");
            var table = activeSheet.findTableByName("DataSet");
            table.setColumnDataFormula(6, "=[Col_5]/[Col_24]");
            activeSheet.isPaintSuspended(false);
        }

blob717242126.png
这里在重新设置单元格格式时候,因为里面有重复的 “合计” “单耗” 但是只能显示一次,重复了就不能显示;

2、列公式设置问题:
blob873500671.png
此方法进行列公式设置后,运行会报错
blob244901427.png
3、我想在合计一行加个公式,请问如何合计表格加载的 一列值的合计,以及合计一行加另外两个的相除,因为合计一行不固定是哪行 blob21752623.png
blob745460509.png blob995286865.png
4、在我设计表格时候,我把 列的筛选按钮去掉了,可是一加载数据就又出现了筛选按钮
blob202453002.png
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2016-10-20 17:48:11
8#
您好,您的问题我已收到,处理后统一给您回复
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2016-10-21 11:25:04
9#
1。 Table的Col 是不允许重复的,所以看来您得隐藏table 的header 用单元格设置列头。
2. 应该是没有找到Table,您的table名字不是那个 因为您页面就一个table 您可以 var table = activeSheet.getTables()【0】;
3。利用Excel公式 =[[#Totals], [Column2]]/[[#Totals], [Column3]],这个你去Excel里做一下,然后复制过来
4. sTable.filterButtonVisible(2, false);绑定后重新设置下
回复 使用道具 举报
bgrimm_auto
初级会员   /  发表于:2016-10-21 13:35:22
10#
您好!以上几个问题都解决了,还是有一个合计行的公式,因为合计行不在表格中,需要实现的有两个:1、合计行的值是计算表格中的数据;2、合计行中有的用合计行中两列值计算; blob83959960.png
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部