【问题标题】:How to manage changes to reports in .NET?如何在 .NET 中管理对报告的更改?
【发布时间】:2010-05-13 08:55:17
【问题描述】:

我需要提供从 .NET 应用程序查看和打印报告的能力。但我需要能够修改报告模板而无需重新编译应用程序。我看到有两个选项:

  1. 使用报告组件,例如Microsoft.ReportingCrystal Reports 使用 .rpt(或类似的)文件 可以根据需要修改,无需 必须重新编译应用程序
  2. 使用System.Drawing.Printing 并将模板数据存储在数据库中,这样可以让事情变得更简单 并避免庞大的报告组件问题

选项 1 是否有效,是否避免了重新编译应用程序的需要?

选项 2 可行吗?您将如何将模板数据存储在数据库中,以便在无需重新编译应用程序的情况下对其进行修改?

编辑:使用选项 1,您是否需要在编译之前定义“数据源”?

【问题讨论】:

  • 您需要明确您的术语。 “Microsoft Reports Technology”包含在 Microsoft.Reporting 命名空间中。 ReportViewer 是一个用于查看“Microsoft Report Documents”的控件。这些报告文档是 XML 文件。
  • 考虑看一下 FastReports,它可以按照您在第 1 点中的建议使用,因为报告不必编译并可以作为资源加载。我还发现它比 Crystal 更好用。
  • FastReports 的费用是多少?

标签: .net reporting


【解决方案1】:

根据我的经验和经验,Crystal Reports 是维护的噩梦。我相信要在它们的生命周期中维护这些报告需要付出更多的努力。它是被“黑”太多次的老产品DOS产品。

我真的很喜欢 Microsoft 报告。易于创建和易于维护。我特别喜欢无需 Sql Server Reporting Services 的独立报告 (rdlc)。 (我不确定最后一句话在技术上是否正确,但你明白了。)

我使用 System.Drawing.Printing 来简单打印用户界面显示的信息。 (Simple 包括上下多个页面。)我总是在编码之前首先考虑 Microsoft Reports。特别是,因为用户总是在看到实际报告后更改他们想要的内容。因此,编码可能需要相当大的努力。这就是为什么我通常只处理用户界面信息,例如列表、表单或其他明确定义的信息,在这些信息中我可以利用控件现有的“绘制到位图”方法。

我没有使用“报告模板”的经验。 Microsoft 的 rdl 和 rdlc 是 XML 文件。因此,它们易于操作和存储。将 XML 存储在数据库、文件系统或资源中应该没有问题。我已将二进制 Microsoft Excel 工作簿存储为资源文件,根据用户条件对其进行修改,然后在 Excel 中将它们作为模板打开。如果我可以为 Excel 做到这一点,那么报告应该很容易。

我不知道水晶报表的更高版本,但是在运行时修改旧版本报表的布局和数据字段从不可能到难以忍受的困难。几年前我做过一次。我无法添加或删除字段,因此我必须包含所有字段,然后根据需要隐藏/显示每个字段。由于所有静态字段,这使得设计报告变得困难。我想我手工编写报告的速度比通过 Crystal Reports 创建报告的速度要快。

Crystal Reports 是单独的部署和安装。您需要阅读许可问题。 Microsoft Reports 是 .NET Framework 的一部分。

那是我的两分钱。我强烈建议您避免使用 Crystal Reports。我真的很喜欢微软报告。我无法推荐其他报告系统,但我听说过有关 ActiveReports 和 ComponentOne 的好消息。 Microsoft 还提供免费的图表库。 (搜索 MSDN 下载。)

【讨论】:

  • 使用 Microsoft Reports,如何实现对 XML 中数据字段的完全控制?您可以使用数据库中任何表中的任何字段吗?
  • 我不明白你的问题。什么是完全控制?既然它是一个报告系统,为什么你不能使用任何表格中的任何字段?我没有操作报告文档的 XML,因为我从来不需要这样做,并且避免这样做。
  • 我会尽力解释。我希望能够更改报告(无需重新编译应用程序)并能够包含数据库中任何位置的数据字段。
  • 是的,报告 (rdl) 文件无需编译即可修改。因为它们只是 XML。它们可以随意设置/更改为指向任何 DB/Table/Function/SP,并且完全独立于您编写的任何代码。
  • @jamone:如何避免在编译时指定“数据源”?
【解决方案2】:

我从未使用过前面提到的 Microsoft 报表引擎,所以我不能说任何关于它们的信息。

我对@9​​87654321@ 的体验非常好。它是一个基于模板的报告引擎(您的报告可以独立于您的应用程序而演变)。您需要做的就是将报告的数据交给它(它支持对象源和数据表)并告诉它使用哪个模板。

List&Label 包括一个出色的报表设计器,您可以将其与应用程序一起分发,具有现成的预览组件并支持开箱即用的 PDF 打印。

在维护方面,您只需要注意一件事:更改数据源的架构 打破已经部署的报告 模板,你没有办法 自动迁移它们。

除此之外,价格标签(我认为它大约是 1.5k,但它是开发人员许可,这意味着您可以为任意数量的用户部署任意数量的应用程序)这是一个非常灵活和可靠的解决方案。

【讨论】:

    【解决方案3】:

    您的 #1 是“托管显示文档的组件” - 所以应该没问题。如果您在应用程序中托管 MSWord,更改 .doc 文件并不意味着您必须重新构建应用程序。这将是相同的原则。

    #2 是可行的,但是由于您显然在做一些复杂到足以考虑使用 Crystal Reports 或 ReportViewer 的事情,因此它可能不可行。您基本上是在建议您编写自己的更简单(并且错误且更难维护)的 Crystal 版本。除非您有真正令人信服的理由不这样做,否则我会坚持使用现成的解决方案。

    【讨论】:

      【解决方案4】:

      您可以将报告添加为 .rdlc 文件(选择 报告 作为 Visual Studio 中的新项目),并使用 Winforms.ReportViewer(这是您的选项 1 ...我认为,除了它不是水晶)。没有第三方组件,它们都内置在 .NET 中。在我看来,它比 Crystal 更容易用于基本报告。使用 .rdlc 有一些问题,但 Crystal 也是如此。但是因为它是内置的,所以它肯定比 Crystal 更容易部署。

      报告模板文件以 .rdlc 扩展名保存,但实际上它只是 XML,您可以指定它位于已编译的应用程序之外。当然,您可以在不重新编译的情况下修改 XML 文件。我们的应用就是这样设置的,因为和您一样,我们需要能够允许修改。

      修改 XML 允许您完全控制更改报告的布局和/或数据。 XML 中的DataSets 节点指定了报告期望推送给它的数据对象。因此,如果您想向报告发送完全不同类型的数据,是的,可以通过重写该节点来实现。它不会容忍您发送给报告的内容与预期接收的内容之间的任何不匹配。这是唯一让它变得更加繁琐的事情。

      【讨论】:

      • 我不急于使用 ReportViewer 或 Crystal 的原因是它们似乎都需要在源代码中设置“数据源”。我可能全都错了,但您似乎无法更改报告,以便它从数据库中完全不同的表中提取。
      • @Craig Johnston:您可以设置两者的“数据源”,就像设置其他支持数据源的 .NET 对象的数据源一样。设置 Crystal Reports 的数据源比 Microsoft Reports 稍微模糊一些。
      • "这是唯一让它变得更加繁琐的地方。"然而,这对于报告来说是正常的。 Crystal Reports 对字段名称和数据类型的更改非常敏感。 Microsoft Reports 更宽容,因为它按字段名称匹配。
      • @hawbsl:你是说不用重新编译app就可以改变报表中的数据源和字段?
      • @hawbsl:如果您想更改要推送到报表的数据对象,而不重新编译应用程序怎么办。这行得通吗?
      【解决方案5】:

      选项 #1 绝对适用于 ActiveReports 的 RPX 格式。请参阅this page 了解更多信息。实际上,ActiveReports 比没有组件更“笨重”,但是 xcopy 部署灵活性和微小的 DLL 使它比大多数组件更“笨重”。

      Scott Willeke
      GrapeCity
      

      【讨论】:

        猜你喜欢
        • 2013-07-22
        • 1970-01-01
        • 2016-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多