Lenka.Guo 发表于 2020-10-30 16:04:16

在线设计器中如何在新建报表的时候内置好数据源

在线设计器往往是集成到项目中,且是为不懂技术的业务人员使用的,因此开发人员不期望用户来自己配置数据源,而是在打开设计器时直接配置好数据源他们就可以直接设计即可。
本篇文章就来分享下如何实现新建报表时内置数据源。


1. 打开 View-Design-Index.cshtml 页面,在代码后面调用以下接口,默认新建时创建模板报表:

GrapeCity.ActiveReports.WebDesigner.renderApplication(designerId, designerOptions);

                // 在Create时候为报表打开模板文件,方便为新建报表绑定数据源
      GrapeCity.ActiveReports.WebDesigner.api.createReport({
            templateInfo: {
                                id: "OrganizationBrandedReport.rdlx",
                       
            },
      });2. 修改 Services中的ITemplatesService.cs
public interface ITemplatesService
    {
                TemplateInfo[] GetTemplatesList();
                byte[] GetTemplate(string id,string ds);
                TemplateThumbnail GetTemplateThumbnail(string id);
    }3. 修改 Implementation 中的FileSystemTemplate.cs

public byte[] GetTemplate(string id,string ds)
                {
                        var fullPath = Path.Combine(_rootFolder.FullName, id);

                        if (!File.Exists(fullPath)) throw new FileNotFoundException();

                        var templateXml = File.ReadAllBytes(fullPath);
                        var template = ReportConverter.FromXML(templateXml);
                       
                        // 为Template绑定数据源
                        AddDataSetDataSource(template,ds);

                        var thumbnail = template.EmbeddedImages.FirstOrDefault(i => i.Name == templateThumbnailName);
                        if (thumbnail != null) template.EmbeddedImages.Remove(thumbnail);

                        var templateJson = ReportConverter.ToJson(template);
                        return templateJson;
                }

                // 为报表创建数据源,并指定Json 字串
                public static Report AddDataSetDataSource(Report report, string ds)
                {
                        // create DataSource for the report
                        DataSource dataSource = new DataSource();
                        dataSource.Name = "TESTData";
                        dataSource.ConnectionProperties.DataProvider = "JSON";
                        string datasource1 = "jsondoc="+ds;
                        dataSource.ConnectionProperties.ConnectString = datasource1;
                        //Create DataSet with specified query and load database fields to the DataSet
                        DataSet dataSet = new DataSet();
                        Query query = new Query();
                        dataSet.Name = "Sample DataSet";
                        query.DataSourceName = "TESTData";                       
                        query.CommandText = ExpressionInfo.FromString("$.[*]");
                        dataSet.Query = query;

                        String[] fieldsList = new String[] { "postId", "id", "name","body" };

                        foreach (string fieldName in fieldsList)
                        {
                                Field field = new Field(fieldName, fieldName, null);
                                dataSet.Fields.Add(field);
                        }
                        //create report definition with specified DataSet and DataSource
                        report.DataSources.Add(dataSource);
                        report.DataSets.Add(dataSet);
                        return report;
                }4. 修改 Contollers里面的 DesignController.csCreate方法
public ActionResult Create( string datasource1, string theme = "blue")
                {
                       
                        TempData["datasource"] = datasource1;// 保存Query中的DataSource String
                        ViewBag.Theme = theme;
                        return View("Index");
                }


5. 修改 Contollers里面的 TemplatesController.csGetTemplate方法

                        if (string.IsNullOrWhiteSpace(id)) return BadRequest();

                        //获取前台传递的 datasource String
                        var datasource01 = TempData["datasource"] as string;                       
                        var template = templatesService.GetTemplate(id, datasource01);// 将DataSource String 传递给模板,对应的要修改 ItempaletService 的GetTemplate方法增加参数2
                        return File(template, "application/json");




页: [1]
查看完整版本: 在线设计器中如何在新建报表的时候内置好数据源