1

我正在努力做到这一点,以便我们可以每天生成某些报告并将它们通过电子邮件发送给列表中的一群人。

我已经为重复性工作测试了 Hangfire,它运行良好。所以这不是问题。但我正在尝试从我现有的 Crystal Report 文件 (.rpt) 创建一个报告。基本上我想做到这一点,以便在执行此作业时,代码将创建报告,将其以 PDF 格式保存到指定路径的磁盘中,然后我可以将其作为附件通过电子邮件发送给人们。因此,无需能够在网页上查看报告。这个想法实际上是在后面的代码中生成报告,将其保存为 PDF,并在保存后从后面的代码中通过电子邮件发送它。

我遇到的问题与水晶报告的实际生成和保存有关。顺便说一句,我正在测试中生成一个 excel 文件,但我会将其更改为 PDF 以获取实际报告。这是我迄今为止生成报告的内容:

        string path = @"Save folder relative-path";
        //"report" is declared at the class level and instantiated below.
        report = new ReportDocument();
        report.SetDatabaseLogon(ConfigurationManager.AppSettings["Username"], ConfigurationManager.AppSettings["Password"]);
        report.Load(Server.MapPath("Relative path to the report"));
        report.SetDataSource(GetDataSet()); //This gets the dataset filled with data for the report

        try
        {
            ExportOptions options = new ExportOptions();

            DiskFileDestinationOptions diskFileOptions = new DiskFileDestinationOptions();
            ExcelFormatOptions excelOptions = new ExcelFormatOptions();
            diskFileOptions.DiskFileName = path + "Test Report.xls";

            options.ExportDestinationType = ExportDestinationType.DiskFile;
            options.ExportFormatType = ExportFormatType.Excel;
            options.ExportDestinationOptions = diskFileOptions;
            options.ExportFormatOptions = excelOptions;
            report.Export();

            /*
            This is where I would call a method to email the report to people
            */
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error generating report: " + ex.Message);
        }

此代码位于 Web 应用程序的 global.asax 文件中的 Application_Start 处调用的方法中。当我运行应用程序时,当我在 Hangfire 仪表板中查看失败的作业时,作业失败并引发此错误,即使我知道我的代码中的路径是正确的:

System.IO.FileNotFoundException 无法加载文件或程序集“App_global.asax.twm32qri,Version=0.0.0.0,Culture=neutral,PublicKeyToken=null”或其依赖项之一。该系统找不到指定的文件。

System.IO.FileNotFoundException:无法加载文件或程序集“App_global.asax.twm32qri,Version=0.0.0.0,Culture=neutral,PublicKeyToken=null”或其依赖项之一。该系统找不到指定的文件。文件名:'App_global.asax.twm32qri, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMarkHandle stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName,ObjectHandleOnStack 类型)在 System.RuntimeTypeHandle.GetTypeByName(字符串名称,布尔 throwOnError,布尔 ignoreCase,布尔反射,StackCrawlMark 和 stackMark,IntPtr pPrivHostBinder,布尔 loadTypeFromPartialName)在 System.Type.GetType(字符串 typeName,

警告:程序集绑定日志记录已关闭。要启用程序集绑定失败日志记录,请将注册表值 [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) 设置为 1。注意:与程序集绑定失败日志记录相关的一些性能损失。要关闭此功能,请删除注册表值 [HKLM\Software\Microsoft\Fusion!EnableLog]。

编辑:

我也遇到了另一个错误。这与加载报告文件有关。

失败 执行作业期间发生异常。CrystalDecisions.CrystalReports.Engine.LoadSaveReportException

报告文件路径无效。

CrystalDecisions.CrystalReports.Engine.LoadSaveReportException:报告文件路径无效。在 CrystalDecisions.CrystalReports.Engine.ExceptionThrower.ThrowEngineException(String messageID, EngineExceptionErrorID id) 在 CrystalDecisions.CrystalReports.Engine.ReportDocument.Load(String filename, OpenReportMethod openMethod, Int16 parentJob) 在 CrystalDecisions.CrystalReports.Engine.ReportDocument.EnsureLoadReport() 在CrystalDecisions.CrystalReports.Engine.ReportDocument.SetDatabaseLogon(String user, String password) 在 路径\Global.asax.cs:line 98中的 Intranet.Global.GenerateReport()

4

1 回答 1

1

想通了这个问题。我显然需要使用 CrystalReportViewer 对象并将 ReportDocument 对象设置为其源。CrystalReportViewer 类位于 CrystalDecisions.Web 命名空间中。

using (ReportDocument report = new ReportDocument())
{
    using (CrystalReportViewer viewer = new CrystalReportViewer())
    {
        string path = System.Web.Hosting.HostingEnvironment.MapPath(@"Destination path here");
        report.Load(System.Web.Hosting.HostingEnvironment.MapPath(@"Path to .rpt file here"));
        report.SetDatabaseLogon(ConfigurationManager.AppSettings["Username"], ConfigurationManager.AppSettings["Password"]);

        string file = path + "TestReport.xls";

        //These two lines below are important. The report won't generate without them.
        viewer.ReportSource = report;
        viewer.RefreshReport();

        //Just deleting the file if it exists.
        if (File.Exists(file))
            File.Delete(file);

        report.ExportToDisk(ExportFormatType.Excel, diskFileOptions.DiskFileName);
    }
}
于 2015-06-18T21:41:39.687 回答