【问题标题】:How to assign data in telerik report dynamically from c#?如何从 C# 动态分配 Telerik 报告中的数据?
【发布时间】:2021-09-01 13:12:34
【问题描述】:

我使用设计器设计了报表 trdp 文件,并添加了 Web 服务作为数据源。 我的计划是,当请求报告时,而不是网络源,我想使用 linq 提取数据,并希望将该数据注入报告数据源并希望通过报告处理器传递它。 我所做的是: ``

        var rng = new Random();
        var datas = Enumerable.Range(1, 100).Select(index => new WeatherForecast
            {
                Category = Summaries[rng.Next(Summaries.Length)],
                Date = DateTime.Now.AddDays(index),
                TemperatureC = 1
            }).ToList();

        DataTable dataTable = Newtonsoft.Json.JsonConvert.DeserializeObject<DataTable>(Newtonsoft.Json.JsonConvert.SerializeObject(datas));
        Telerik.Reporting.Report report = null;
        using (var sourceStream = System.IO.File.OpenRead("Reports\\DemoReport.trdp"))
        {
            var reportPackager = new ReportPackager();
            report = (Report)reportPackager.UnpackageDocument(sourceStream);
            var dtsrc = new ObjectDataSource();
            dtsrc.DataSource = dataTable;
            report.DataSource = dtsrc;
        }
        

        Telerik.Reporting.Processing.ReportProcessor reportProcessor = new Telerik.Reporting.Processing.ReportProcessor();
        System.Collections.Hashtable deviceInfo = new System.Collections.Hashtable();
        Telerik.Reporting.Processing.RenderingResult result = reportProcessor.RenderReport("PDF", report, deviceInfo);

        var fileName = "adreport.pdf";
        using (FileStream fs = new FileStream(fileName, FileMode.Create))
        {
            fs.Write(result.DocumentBytes, 0, result.DocumentBytes.Length);
        }
        return Ok();

``

这会生成报告,但不是几页,而是生成的 pdf 报告包含数百页重复的相同数据,这是不寻常的。谁能解释为什么会这样。

【问题讨论】:

    标签: c# telerik-reporting


    【解决方案1】:

    我将尽可能详细地回答这个问题。 对于来自后端代码的角度和动态数据分配的 Telerik 报告,请按照以下步骤操作:-

    1. 通过报表设计器设计报表模板
    2. 将模板放在 c# 过滤器中
    3. 在 Angular 项目中包含报表查看器
    4. 当报表查看器请求报表时,使用 CustomReportResolver 处理它 下面提供了示例代码。
    Angular
    
    <tr-viewer #viewer1 
        [containerStyle]="viewerContainerStyle"
        [serviceUrl]="'https://localhost:5001/api/reports/'"
        [reportSource]="{
            report: 'DemoListReport.trdp',
            parameters:
            {
    
            }
        }"
        [viewMode]="'INTERACTIVE'"
        [scaleMode]="'SPECIFIC'"
        [scale]="1.0"
        [ready]="ready"
        [viewerToolTipOpening]="viewerToolTipOpening"
        [enableAccessibility]="false">
    </tr-viewer>
    <button (click)="viewer1.refreshReport()">Refresh</button>
    <button (click)="viewer1.commands.print.exec()">Print</button>
    
    
    .NET Core 3.1
    Startup.cs
    
     services.TryAddScoped<IReportSourceResolver, CustomReportResolver>();
                // Configure dependencies for ReportsController.
                services.TryAddSingleton<IReportServiceConfiguration>(sp =>
                    new ReportServiceConfiguration
                    {
                        // The default ReportingEngineConfiguration will be initialized from appsettings.json or appsettings.{EnvironmentName}.json:
                            ReportingEngineConfiguration = sp.GetService<IConfiguration>(),
                            // In case the ReportingEngineConfiguration needs to be loaded from a specific configuration file, use the approach below:
                            // ReportingEngineConfiguration = ResolveSpecificReportingConfiguration(sp.GetService<IHostingEnvironment>()),
                            HostAppId = "Html5DemoAppCore",
                            Storage = new Telerik.Reporting.Cache.File.FileStorage(),
                            ReportSourceResolver = new CustomReportResolver()
                    });
    
    
    CustomReportResolver.cs
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using Telerik.Reporting;
    using Telerik.Reporting.Services;
    using Telerik.Reporting.Services.Engine;
    
    namespace MyProject.API.Controllers
    {
        public class CustomReportResolver: IReportSourceResolver
        {
            private static readonly string[] Summaries = new[]
            {
                "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
            };
            
    
            public ReportSource Resolve(string report, OperationOrigin operationOrigin, IDictionary<string, object> currentParameterValues)
            {
                //data
                var rng = new Random();
                var datas = Enumerable.Range(1, 500).Select(index => new WeatherForecast
                {
                    Category = Summaries[rng.Next(Summaries.Length)],
                    Date = DateTime.Now.AddDays(index),
                    TemperatureC = 1
                }).ToList();
                
                
    
                var reportPackager = new ReportPackager();
                Report reportt = null;
                using (var sourceStream = System.IO.File.OpenRead($"Reports\\{report}"))
                {
                    reportt = (Report)reportPackager.UnpackageDocument(sourceStream);
                }
    
                DetailSection detail = (DetailSection)reportt.Items["detailSection1"];
                Table table = (Table)detail.Items["table1"];
                table.DataSource = datas.Take(5);
    
    
                Graph graph = (Graph)detail.Items["graph1"];
                graph.DataSource = datas;
    
    
                InstanceReportSource instanceReportSource = new InstanceReportSource();
                instanceReportSource.ReportDocument = reportt;
    
                return instanceReportSource;
            }
        }
    }
    
    
    

    此处datas 会将您的数据传递给报告。希望这会在以后对其他人有所帮助。

    【讨论】:

      【解决方案2】:

      听起来您的数据源设置不正确(不止一次,例如,首先以编程方式在报告级别,其次在报告定义 (DemoReport.trdp) 中某处的数据项级别)并且您收到 cartesian product

      【讨论】:

      • 如何从 c# 代码中操作该报表定义,我什至尝试在设置新数据列表之前分配 null,但没有成功。
      • 我的报告类是什么?正如我所看到的,他使用了 report = (Report)reportPackager.UnpackageDocument(sourceStream);创建 DemoReport.trdp 类型的报表实例。现在如何设置数据?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-18
      • 2014-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多