Как динамически назначать данные в отчете telerik с c#?

#c# #telerik-reporting

Вопрос:

Я разработал файл trdp отчета с помощью конструктора и добавил веб-службу в качестве источника данных. Мой план состоит в том, что, когда будет запрошен отчет, вместо веб-источника я хочу извлечь данные с помощью 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 содержит несколько сотен страниц с одними и теми же данными, что является необычным. Может ли кто-нибудь объяснить, почему это происходит.

Ответ №1:

Я собираюсь ответить на этот вопрос как можно подробнее. Для создания отчетов telerik с угловым и динамическим назначением данных из внутреннего кода выполните следующие действия:-

  1. Создайте шаблон отчета с помощью конструктора отчетов
  2. Поместите шаблон в папку c#
  3. Включить средство просмотра отчетов в угловой проект
  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)) , и вы получаете декартово произведение.

Комментарии:

1. Как манипулировать этим определением отчета из кода c#, я даже пытался присвоить значение null перед настройкой нового списка данных, но это не сработало.

2. Отчет MyReport = новый отчет MyReport(); документы. telerik.com/reporting/programmatic-creating-report

3. каким будет класс «мой отчет»? Как я вижу, он использовал report = (Отчет)reportPackager. Распакованный документ(исходный поток); для создания экземпляра отчета типа DemoReport.trdp. Теперь, как установить данные ?