Page tree
Skip to end of metadata
Go to start of metadata

示例说明

对电子表格报表进行回写时,经常会遇到如下这些需求。点击工具栏上的“添加行”按钮时,要求新插入行的某些单元格能自动赋值,比如让“序号”列值自增;或者“日期”字段自动插入当前系统时间;或者“信息录入人”字段自动插入当前登录用户名等。类似上述需求,皆可以参照如下方法进行设置。

本示例中,实现插入一行时,自动为序号赋值。

注:该方法适用于只插入一行数据的情况。

如需插入多行,可以网络搜索js代码生成UUID的方法,向单元格中插入UUID,即可保证插入数据不重复。

版本及客户端说明

1.smartbi版本:最新版本

2.客户端:PC

3.浏览器:IE11、谷歌浏览器(Chrome)、火狐浏览器(Firefox)

设置方法

1.创建回写电子表格

电子表格设计器中(Microsoft Office Excel),创建回写电子表格报表,填报属性和回写规则可自由定义。

2.进入宏界面

在浏览器中,选中电子表格,右键选择 编辑宏 进入报表宏界面

 

3.新建客户端宏

在报表宏界面新建客户端模块。在弹出的新建模块对话框中,选择对象为spreadSheetReport、事件为onWriteBackInsertedRow、并把下面宏代码复制到代码编辑区域,根据实际情况修改

宏类型

类型

对象

事件

ClientSide

spreadsheetReport

onWriteBackInsertedRow

 

宏代码

function main(spreadsheetReport, editingCellPosition) {
    var row = editingCellPosition.row;
    var col = editingCellPosition.column;
    //执行sql,获取序号
    var newIdValue = getSqlResult();
    //为新增的一行序号单元格赋值
    
    //判断当前编辑的是否是"序号"所在的列,从0开始,所以B列的列序号是1
    if(col==1){//这里填写的是点击插入单元格所在列
	//以下col+0中的0填写的是自动赋值单元格所在列
    spreadsheetReport.spreadsheetReportWriteBack.setWriteBackCellData(row + 1, col + 0, newIdValue, newIdValue);//此方法必须保证该单元格设置了填报属性
    }
};
/**
 * 执行SQL语句,获取结果集
 */
function getSqlResult() {
    var util = jsloader.resolve("freequery.common.util");
     var ret = util.remoteInvoke("DataSourceService","execute",["DS.资源库_业务库","select max(f_ContactID) + 1 as t from  contacts", 1000,true,false]);
    if (ret.succeeded && ret.result) {
        var data = ret.result.data;
        return data[0][0].value;
    }
};



若是生成的uuid,不希望来源于数据库,可以通过Java方式获取到,如下:

 

function main(spreadsheetReport, editingCellPosition) {
    var row = editingCellPosition.row;
    var col = editingCellPosition.column;
    //执行sql,获取序号
    var newIdValue = getUuid();
    //为新增的一行序号单元格赋值
    
    //判断当前编辑的是否是"序号"所在的列,从0开始,所以B列的列序号是1
    if(col==1){
    spreadsheetReport.spreadsheetReportWriteBack.setWriteBackCellData(row + 1, col + 0, newIdValue, newIdValue);
    }
};
/**
 * 执行SQL语句,获取结果集
 */
function getUuid() {
  var s = [];
        var hexDigits = "0123456789abcdef";
        for (var i = 0; i < 36; i++) {
            s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
        }
        s[14] = "4"; 
        s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); 
                                                            
        s[8] = s[13] = s[18] = s[23] = "-";
        var uuid = s.join("");
        return uuid;
};

 

关键对象总结

  • 将数据值插入到到指定位置的回写单元格中:setWriteBackCellData(row, column, value, displayValue);
  • 根据事件参数,获取到当前在编辑单元格的位置:editingCellPosition: {row, column}。
  • 通过 SQL 语句获取插入值,请参考:宏代码中如何执行SQL语句

 

资源下载

报表资源:

表sql:

  • No labels

1 Comment

  1. 需求说明:点击工具栏上的“添加行”按钮时,要求新插入行的某些单元格能自动赋值,比如让“序号”列值自增,并且在保存数据之前插入多行也能自动让多行的“序号”列值自增,此需求可参考以下宏代码实现;

    注:此示例宏仅供参考,若实际应用场景与此不符合,须自行调整宏代码。

    function main(spreadsheetReport, editingCellPosition) {

    var row = editingCellPosition.row; 

    var col = editingCellPosition.column;

    //执行sql,获取序号

    var newIdValue = getSqlResult();
    //为新增的一行序号单元格赋值

    if(spreadsheetReport._newIdValue){
    spreadsheetReport._newIdValue = spreadsheetReport._newIdValue + 1;
    newIdValue = spreadsheetReport._newIdValue;
    }else{
    spreadsheetReport._newIdValue = newIdValue;
    }

    //判断当前编辑的是否是“序号”所在的列,从0开始,所以B列的列序号是1

    if(col==1){

    spreadsheetReport.spreadsheetReportWriteBack.setWriteBackCellData(row + 1, col + 0, newIdValue, newIdValue);

    } 

    };

    /** 

    * 执行SQL语句,获取结果集

    */

    function getSqlResult() {

    var util = jsloader.resolve("freequery.common.util");

    // var ret = util.remoteInvoke("DataSourceService", "getDataByQuerySql", ["DS.资源库_业务库", "select max(f_ContactID) + 1 as t from contacts", 0, 1000]);

    var ret = util.remoteInvoke("DataSourceService","execute",["DS.资源库_业务库","select max(f_ContactID) + 1 as t from contacts", 1000,true,false]);

    if (ret.succeeded && ret.result) {

    var data = ret.result.data;

    return data[0][0].value;

    }

    };