zoukankan      html  css  js  c++  java
  • asp.net core使用水晶报表问题

    背景

    最近项目上遇到一个需求,要后台通过定时任务把水晶报表生成pdf文件,然后邮件发送给相关人。

    技术实现思路

    选用ASP.NET Core框架(基于2.2版本),通过IHostedService接口结合Quartz实现定时任务。但由于当前水晶报表SDK只支持Framework框架,所以ASP.NET Core选择基于.net framework 4.7。关于在ASP.NET Core下整合Quartz定时任务功能,在博客园里已经与很多的技术贴,不再赘述,特别要说明的一定,由于默认IIS托管,会导致应用程序池回收问题,会导致定时任务退出,所以如果IIS托管,需要设置应用程序池的启动模式的值为AlwaysRunning闲置超时的值设置为0

    下面言归正传,重点说下如何使用水晶报表。

    1. 下载Crystal Reports For VS的开发包,地址:https://www.crystalreports.com/crvs/confirm/

    2. 获取rpt水晶报表模板文件

    3. 编码实现导出功能

    编码

    首先需要引用两个程序集:CrystalDecisions.CrystalReports.Engine``CrystalDecisions.Shared

    封装的主要代码逻辑

    using CrystalDecisions.CrystalReports.Engine;
    using CrystalDecisions.Shared;
    using Microsoft.Extensions.Logging;
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Text;
    
    namespace CrontabService.Services.report
    
    {
        public class CrystalReportGenerator
        {
            private ReportDocument _rd;
            private readonly ILogger<PurchaseNotifyMsgCreatorService> _logger;
            public CrystalReportGenerator(string templatePath, ConnectionInfo connectionInfo, ILogger<PurchaseNotifyMsgCreatorService> logger)
            {
                _logger = logger;
                TableLogOnInfo t = new TableLogOnInfo();
                t.ConnectionInfo = connectionInfo;
                _rd = new ReportDocument();
                _rd.Load(templatePath);
               foreach (Table table in _rd.Database.Tables)
               {
                  table.ApplyLogOnInfo(t);
               }
    
                          
            }
            public string GenerateReport(Dictionary<string,object> paras,string reportFileName)
            {
                try
                {
                    foreach (var kv in paras)
                    {
                        _rd.SetParameterValue(kv.Key, kv.Value);
                    }
                    var reportPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"report" + reportFileName);
    
    
                    //导出为pdf格式
                    _rd.ExportToDisk(ExportFormatType.PortableDocFormat, reportPath);
                    return reportPath;
                }
                catch (Exception e)
                {
                    _logger?.LogError(e, "GenerateReport error");
    
    
                }
    
            }
        }
    }
    
    

    其中ConnectionInfo类里面主要是数据库的信息,这个里面需要把报表中应用到的表重新应用下数据库连接信息,否则导出的时候,会提示数据库连接失败的错误

    由于水晶报表有两种获取数据源的两种方式:pushpull,push就是主动编码设置数据源,调用方法SetDataSource既可以了,pull就是报表根据模板中维护的数据源信息,自己到数据库中拉去信息。

    因为我这个是后台任务去生成报表,所以就没有 reportview的控件,这个里面我就遇到了问题了,我开始一直通过SetDataSource的方式去给数据源,结果一执行ExportToDisk方法就throw exception,提示数据库连接失败,后来网上找到解决方法,让用pull方式,定义好数据库连接,并把报表模板的参数值设置好,执行ExportToDisk就成功了,这个我猜测可能直接通过ReportDocument去导出时,默认还是用的pull方式,由于不熟悉水晶报表的使用,还忘大神指点!

    遇到的坑

    上面顺利在开发环境测试成功,等发布后,部署到IIS后,出现一堆问题!

    • 出现无法加载log4net的异常错误,如下,一脸懵逼,怎么和log4net有关了,网上一顿研究,也有sap官方社区的回答,基本都是说编译时的目标平台选择有问题,应该选择成X86,然后一顿狂试,无果,一直这个异常。
    Could not load file or assembly ‘log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304’ or one of its dependencies. The system cannot find the file specified
    
    • 实在没辙,找了个32位的log4net放到目录中,咦,换了个异常,提示没有CrystalReports 的runtime,此时才意识到,开发环境,按照sdk时已经默认安装运行时,生产环境没有,还是到这个https://www.crystalreports.com/crvs/confirm/这个网站下载SAP Crystal Reports runtime engine for .NET framework,进行安装

    • 信心满满的重启,哎,奇迹还是没有出现,又出现了新的异常,如下,空指针异常,my god,又是什么鬼,发现是执行_rd.ExportToDisk时异常,但_rd并不为null啊。

      System.NullReferenceException: 未将对象引用设置到对象的实例。
       在 CrystalDecisions.CrystalReports.Engine.FormatEngine.ExportToStream(ExportRequestContext reqContext)
       在 CrystalDecisions.CrystalReports.Engine.FormatEngine.Export(ExportRequestContext reqContext)
       在 CrystalDecisions.CrystalReports.Engine.ReportDocument.ExportToDisk(ExportFormatType formatType, String fileName)
      
    • 在一脸懵逼之际,自己神出鬼没的取看了下运行时和sdk的版本

      SDK版本:CRforVS13SP25_0-10010309

      运行时版本:CR13SP26MSI64_0-10010309

    下意识的看到一个是     SP25 ,一个是 SP26 ,难度是因为版本不一致导致的?

    试试吧,到官网下载了新的SDK版本 CRforVS13SP26_0-10010309安装部署。

    • 这次奇迹出现了,顺利跑起来,生成了期待已久的报表文件!

    总结

    确认过眼神,要选对的人!~~~~~~~~

    逻辑本身很简单,部署过程一波三折,运行时,版本匹配一定要牢记!

    最后,坑都是自己挖的,也是自己跳的,但自己再跳出来后,眼界可能有点不一样了!

  • 相关阅读:
    Web.config Transformation Syntax for Web Application Project Deployment
    xcode 8.1 (8B62)真机调试配置
    主机与虚拟机互ping
    mac系统下安装mysql步骤
    iphone设备尺寸规格
    linux环境下oracle静默安装
    实现静默安装APK的方法
    mac系统下如何删除银行安全插件
    mac系统下设置eclipse的补全快捷键方法
    给Xcode增加复制行、删除行快捷键的方法
  • 原文地址:https://www.cnblogs.com/liuww/p/12036559.html
Copyright © 2011-2022 走看看