我需要提供从.NET应用程序查看和打印报告的功能。但我需要能够修改报告模板,而无需重新编译应用程序。我看到有两个选项:
Microsoft.Reporting
等报告组件
或使用a的Crystal Reports
.rpt
(或类似)文件
可以根据需要进行修改
必须重新编译应用程序System.Drawing.Printing
并将模板数据存储在数据库中,这样可以简化操作
并避免笨重的报告组件问题选项1是否有效,是否可以避免重新编译应用程序?
选项2是否可行?您如何将模板数据存储在数据库中,以便无需重新编译应用程序即可对其进行修改?
编辑:使用选项1,您是否需要在编译之前定义“数据源”?
答案 0 :(得分:2)
在我看来,根据我的经验,Crystal Reports是一个维护噩梦。我认为需要付出更多努力来维护这些报告,而不是创造它们。它是一种旧产品DOS产品,已经被“黑客攻击”了太多次。
我非常喜欢Microsoft Reports。易于创建和易于维护。我特别喜欢独立报告(rdlc),它消除了对Sql Server Reporting Services的需求。 (我不确定最后一句话在技术上是否正确,但你明白了。)
我使用System.Drawing.Printing来简单打印用户界面显示的信息。 (简单包括跨越和向下的多个页面。)在编码之前,我始终首先考虑Microsoft Reports。特别是,由于用户在看到实际报告后总是会改变他们想要的内容。因此,编码可能需要相当大的努力。这就是为什么我通常只使用用户界面信息,例如列表,表单或其他明确定义的信息,我可以利用控件的现有“draw-to-bitmap”方法。
我没有使用“报告模板”的经验。 Microsoft的rdl和rdlc是XML文件。因此,它们易于操作和存储。将XML存储在数据库,文件系统或资源中应该没有问题。我已将二进制Microsoft Excel工作簿存储为资源文件,根据用户条件对其进行修改,然后在Excel中将其作为模板打开。如果我可以为Excel执行此操作,则报告应该很容易。
我不知道Crystal Reports的更高版本,但是在运行时修改旧版本报告的布局和数据字段是不可能的,难以忍受。我曾在几年前这样做过。我无法添加或删除字段,因此我必须包含所有字段,然后根据需要隐藏/显示每个字段。由于所有静态字段,它使得设计报告变得困难。我想我可以比通过Crystal Reports创建报告更快地手动编写报告。
Crystal Reports是一个单独的部署和安装。您需要阅读许可问题。 Microsoft Reports是.NET Framework的一部分。
那是我的两分钱。我强烈建议您避免使用Crystal Reports。我非常喜欢Microsoft Reports。我无法推荐其他报告系统,但我听说过有关ActiveReports和ComponentOne的好消息。 Microsoft还提供免费的图表库。 (搜索MSDN下载。)
答案 1 :(得分:2)
我从未使用过前面提到的Microsoft报告引擎,所以我不能对它们说些什么。
我与combit List&Label取得了非常好的经历。这是一个基于模板的报告引发(您的报告可以独立于您的应用程序发展)。您需要做的就是将其交给报告的数据(它支持对象源和DataTable)并告诉它使用哪个模板。
List& Label包括一个出色的报表设计器,您可以将其与应用程序一起分发,具有现成的预览组件并支持开箱即用的PDF打印。
在维护方面,您只需要处理一件事:更改数据源的架构 打破已部署的报告 模板,你没有办法 自动迁移它们。
除了这个和价格标签(我认为它是1.5k左右,但它是开发人员许可证,这意味着你可以根据需要为尽可能多的用户部署它),这是一个非常灵活和可靠的解决方案。
答案 2 :(得分:0)
您可以将报告添加为.rdlc文件(选择报告作为Visual Studio中的新项目),并使用Winforms.ReportViewer
(这是您的选择1 ...我认为,除了它不是水晶)。没有第三方组件,它都内置于.NET中。在我看来,使用Crystal比基本报告更容易。使用.rdlc有一些问题,但Crystal也是如此。但是因为它已经融入其中,它的部署肯定比Crystal更容易。
报告模板文件以.rdlc扩展名保存,但实际上它只是XML,您可以指定它位于已编译的应用程序之外。当然,您可以修改XML文件而无需重新编译。我们的应用程序就是这样设置的,因为像我们一样,我们需要能够允许修改。
修改XML可让您完全控制更改报表的布局和/或数据。
XML中的DataSets
节点指定报表期望在其上推送的数据对象。因此,如果您想要向报告发送完全不同类型的数据,那么,是的,可以通过重写该节点来实现。它不能容忍您发送到报告的内容与预期收到的内容之间的任何不匹配。这是唯一让它变得更加繁琐的东西。
答案 3 :(得分:0)
您的#1是“托管显示文档的组件” - 所以应该没问题。如果您在应用程序中托管MSWord,更改.doc文件并不意味着您必须重建应用程序。这将是同样的原则。
#2是可行的,但由于你显然做了足够复杂的事情来考虑Crystal Reports或ReportViewer,它可能不可行。你基本上建议你编写自己更简单(和更难以维护)的Crystal版本。除非你有其他令人信服的理由,否则我会坚持使用现成的解决方案。
答案 4 :(得分:0)
选项#1肯定适用于ActiveReports的RPX格式。有关详细信息,请参阅this page。实际上,ActiveReports比没有任何组件更“笨重”,但xcopy部署的灵活性和微小的DLL使它比大多数都要小。
Scott Willeke
GrapeCity