页面树结构
转至元数据结尾
转至元数据起始

1、需求背景

客户有个需求是,提供一个excel,excel的某一列或几列有数据,想办法通过已有的数据为条件,查询出其它列数据补充完整。譬如:手头已经有个excel文件,这里面是他需要关注的客户,每次查也都是这批客户,希望直接查出这批客户的其他相关信息。

方案:通过excel模板导入数据到数据库表中,并且只为每个用户保留他自己最后一次导入的数据,然后将报表的参数的值来源于这张库表或者直接用这张表与现有数据关联查询,最后导出成excel,即为客户需要的excel。

定制点产品原有的excel导入功能只有全量(把以往导的全删)和增量,这里需要按用户全量,就是A用户导入excel文件时,需要删除A用户以往导入的数据,其他用户的还是要保留。 所以在excel导入数据到表中时,需根据用户名进行导入。

注意:本示例来源于实际项目,原始版本是V6.1。

此示例同样也适用于 v7

2、实现方案

增加数据处理模式:按当前用户全量删除

增加数据处理类,可点击后面按钮自动添加

 

绑定数据表,必须有一列来存放用户名

 

3、主要代码

MyRowDataImporter类

package cn.com.smartbi;
import java.sql.Connection;
import java.sql.Statement;
import javax.servlet.http.HttpSession;
import org.apache.log4j.Logger;
import smartbi.daq.excelimport.DefaultRowDataImporter;
import smartbi.daq.excelimport.ImportFileConfig;
import smartbi.daq.excelimport.RowData;
import smartbi.daq.excelimport.RowDataImporterResult;
import smartbi.net.sf.json.JSONArray;
import smartbi.net.sf.json.JSONObject;
import smartbi.state.IStateModule;
import smartbi.state.StateModule;
import smartbi.usermanager.User;
import smartbi.usermanager.UserManagerModule;
import smartbi.util.StringUtil;
public class MyRowDataImporter extends DefaultRowDataImporter {
	private static final Logger LOG = Logger.getLogger(MyRowDataImporter.class);
	
	/**
	 * 执行行数据导入逻辑,删除对应用户原有的记录
	 */
	@Override
	public RowDataImporterResult process(RowData rowData, ImportFileConfig config) throws Exception {
		if(!isDeleteRows()){
			JSONObject jObj = config.getConfig();
			User user = (User) UserManagerModule.getInstance().getCurrentUser();
			String username = user.getName();
			String column = "";
			String dataprocessMode = jObj.optString("dataprocessMode");
			JSONArray json = jObj.optJSONArray("columnConfigs");
			for(int i=0;i<json.length();i++){
				JSONObject job = json.getJSONObject(i);
				if(job.has("javaClassName")&&"smartbi.daq.excelimport.CurrentUserIDCellDataGenerator".equals(job.getString("javaClassName"))){
					column = job.getString("fieldName"); //获取用户ID字段
				}
			}
			//新增的数据处理模式
			if (StringUtil.equals("UserFull", dataprocessMode)) {
				String tableName = jObj.optString("tableName");
				String deleteSql = "delete from " + tableName +" where "+column+"='"+username+"'";
				// String dsId = jObj.optString("dataSourceId");
				Connection conn = config.getConn();
				try {
					Statement stat = conn.createStatement();
					stat.execute(deleteSql);
					setIsDeleteRows("true");  //由于每导入一行数据会执行该方法,删除数据只需要执行一次,故加此状态判断
				} catch (Exception e) {
					LOG.error(e.getMessage(), e);
				}
			}
		}
		return super.process(rowData, config);
	}
	
	//用户全量excel导入时,在处理每行数据时,判断是否已经处理过原有数据
	public boolean isDeleteRows(){
		IStateModule stateModule = StateModule.getInstance();
		HttpSession session = stateModule.getSession();
		String isDeleteRows = (String) session.getAttribute("isDeleteRows");
		if("true".equals(isDeleteRows)){
			return true;
		}
		return false;
	}
	public void setIsDeleteRows(String attr){
		IStateModule stateModule = StateModule.getInstance();
		HttpSession session = stateModule.getSession();
		session.setAttribute("isDeleteRows", attr);
	}
	
}

4、简单应用示例

第一步:

准备好一个数据表,如下图:

id为唯一标识,username存放当前用户名(必要),column1为条件数据

第二步:

将上表加入到数据源中,根据excel数据新建导入模版(参考Excel数据导入),设置如下:

第三步:

制作报表,首先创建参数

新建查询,引用上述参数:

制作报表,查看数据

比如我用admin用户导入两条数据(饮料,调味品)

我用testuser用户导入两条数据(点心、日用品)

数据表中的数据如下:

如果再次导入数据,会覆盖当前用户对应原有的数据

5、如何将excel导入模版绑定到报表中

如果是电子表格报表,可参考导入模版绑定到电子表格报表

如果是其它类型报表,或者需要一个模版绑定多个报表,可参考下面示例代码:

可用第三课:宏资源包配置多个报表对应的模版

1、电子表格

ClientSide(客户端)     spreadsheetReport(对象)     onRender(事件)

var mappings = {
    // "电子表格"资源ID
    'I2c91918a27eff3ab0145a86c6a4317e1': {
        //导入模板ID
        'importId': 'I4028828b015774ec74ec29f30157751e3c18005d'
    },
    //配置多个电子表格对应模版
    '报表id': {
        //导入模板ID,可配置同一个模版
        'importId': 'I4028828b015774ec74ec29f30157751e3c18005d'
    }
}
function main(spreadsheetReport) {
    // debugger;
    // 获取电子表格参数面板
    var td = spreadsheetReport.elem_space2;
    if (!spreadsheetReport._newBtn) { // 不重复添加按钮
        var input = document.createElement("INPUT");
        input.type = "button";
        input.value = "导入参数";
        input.title = "导入参数";
        input.style.width = "100";
        input.style.height = "20";
        var newBtn = td.appendChild(input);
        spreadsheetReport.addListener(input, "click", doNewButtonClick,
            spreadsheetReport);
        spreadsheetReport._newBtn = newBtn;
    }
    // debugger;
    // 新添加按钮Click事件处理函数
    function doNewButtonClick(e) {
        var arr = new Array();
        var obj = new Object();
        obj.id = getImportId(spreadsheetReport);
        arr.push(obj);
        if (!dialogFactory) {
            var dialogFactory = jsloader.resolve("freequery.dialog.dialogFactory");
        }
        var dialogConfig = {};
        dialogConfig.title = "导入参数信息";
        dialogConfig.size = dialogFactory.size.LARGE;
        dialogConfig.fullName = "smartbi.spreadsheetreport.OpenImportConfigDialog";
        dialogFactory.showDialog(dialogConfig, [arr], null, this);
    }
}
function getImportId(spreadsheetReport) {debugger;
    return mappings[spreadsheetReport.queryId].importId || "";
}

2、灵活分析

ClientSide(客户端)     simpleReport(对象)     onRender(事件)

var mappings = {
    // "灵活分析"资源ID
    'I2c94ea86296db80801296dd20f12005a': {
        //导入模板ID
        'importId': 'I4028828b015774ec74ec29f30157751e3c18005d'
    },
    //配置多个报表对应模版
    '报表id': {
        //导入模板ID,可配置同一个模版
        'importId': 'I4028828b015774ec74ec29f30157751e3c18005d'
    }
}
function main(simpleReport, simpleReportContext) {
    var node = simpleReport.pagePanel.firstpage.parentNode;
    //创建查询按钮
    var queryBtn = document.createElement("button");
    queryBtn.value = "导入参数"; //如需要修必按钮风格,请自行实现
    queryBtn.innerHTML = "导入参数";
    queryBtn.className = "query-button";
    queryBtn.style.marginLeft = "10px";
    node.appendChild(queryBtn);
    simpleReport.addListener(queryBtn, "click", doNewButtonClick, this);
    function doNewButtonClick(e) {
        var arr = new Array();
        var obj = new Object();
        obj.id = getImportId(simpleReport);
        arr.push(obj);
        if (!dialogFactory) {
            var dialogFactory = jsloader.resolve("freequery.dialog.dialogFactory");
        }
        var dialogConfig = {};
        dialogConfig.title = "导入参数信息";
        dialogConfig.size = dialogFactory.size.LARGE;
        dialogConfig.fullName = "smartbi.spreadsheetreport.OpenImportConfigDialog";
        dialogFactory.showDialog(dialogConfig, [arr], null, this);
    }
}
function getImportId(simpleReport) {
    return mappings[simpleReport.queryId].importId || "";
}

3、组合分析

ClientSide(客户端)     simpleReport(对象)     onRenderTable(事件)

var mappings = {
    // "组合分析"资源ID
    'I2c94ea86296db80801296dd20f12005a': {
        //导入模板ID
        'importId': 'I4028828b015774ec74ec29f30157751e3c18005d'
    },
    //配置多个报表对应模版
    '报表id': {
        //导入模板ID,可配置同一个模版
        'importId': 'I4028828b015774ec74ec29f30157751e3c18005d'
    }
}
function main(simpleReport, simpleReportContext) {
    var node = simpleReport.pagePanel.firstpage.parentNode;
    
    if(!simpleReport.newButton){
        //创建查询按钮
        var queryBtn = document.createElement("button");
        queryBtn.value = "导入参数"; //如需要修必按钮风格,请自行实现
        queryBtn.innerHTML = "导入参数";
        queryBtn.className = "query-button";
        queryBtn.style.marginLeft = "10px";
        node.appendChild(queryBtn);
        simpleReport.newButton = queryBtn;
        simpleReport.addListener(queryBtn, "click", doNewButtonClick, this);
    }
    function doNewButtonClick(e) {
        var arr = new Array();
        var obj = new Object();
        obj.id = getImportId(simpleReport);
        arr.push(obj);
        if (!dialogFactory) {
            var dialogFactory = jsloader.resolve("freequery.dialog.dialogFactory");
        }
        var dialogConfig = {};
        dialogConfig.title = "导入参数信息";
        dialogConfig.size = dialogFactory.size.LARGE;
        dialogConfig.fullName = "smartbi.spreadsheetreport.OpenImportConfigDialog";
        dialogFactory.showDialog(dialogConfig, [arr], null, this);
    }
}
function getImportId(simpleReport) {
    return mappings[simpleReport.queryId].importId || "";
}

6、相关资源(EPPR-8801)

可能涉及到表不同,资源不一定能用,需稍作一定的修改。

migrate .xml

Excelimport.rar

excelimport.ext

  • 无标签