【问题标题】:Dynamic tabular data report in ASP.NetASP.Net 中的动态表格数据报告
【发布时间】:2016-05-31 22:23:20
【问题描述】:

我正在开发一个 MVC5 Web 应用程序,我需要从任何数据库表生成报告。用户将选择他想要打印的表格,然后选择要包含在报告中的列,系统应该简单地显示一个带有数据的网格(表格)。

在 HTML 表格中显示数据当然不是问题,我还设法使用数据生成 Excel 文件,供用户下载。

但是,我还需要提供报告的可打印形式,例如 PDF 或其他不需要特殊软件(例如 MS Office)即可打开和打印的格式。

起初我认为我应该选择 ReportViewer 控件,但问题是我的报告是动态的,因为用户选择了他需要的列。我看到其他人尝试生成报告定义文件,但我希望有一些不那么难看的东西。

有没有办法获取一个 HTML 表格,它可以很好地计算单元格的大小,并从中创建一个 PDF?如果列太多,我当然不介意将报告水平拆分为多个页面。

【问题讨论】:

  • 既然你已经有了 HTML,我建议你看看 iText 的 XMLWorker:developers.itextpdf.com/examples/xml-worker/html-tables。这些示例是用 Java 编写的,但对于 C# 来说应该足够明显。 iTextSharp 是 iText 的 .NET 端口。披露:我在 iText Software 工作。
  • 有趣。我能以某种方式水平处理柱子吗?我的意思是,如果一页中的列太多,我可以将其中的一些移到下一页吗?
  • @kagelos 我有一个解决方案可以满足您的需求,但它需要 jquery。那我可以用jquery给你解决方案吗?
  • 当然,jQuery 没问题。

标签: c# asp.net-mvc-5 report pdf-generation xlsx


【解决方案1】:

你可以试试Spartacus

这是一个相对较新的 .NET 库,完全用 C# 编写。它可以连接到许多不同的数据库并生成 Excel 和 PDF 格式的报告。

我在 Google Drive 中上传了 3 个文件:

为了使用 Spartacus,您需要引用 System.Data 和 System.Xml 包,以及 Spartacus.dll。

在以下示例中,我通过简单的步骤从 template.xml 创建了 report.pdf:

Spartacus.Database.Generic v_database;
Spartacus.Reporting.Report v_report;
System.Data.DataTable v_table;

v_database = new Spartacus.Database.Postgresql("127.0.0.1", "database", "postgres", "password");

v_table = v_database.Query(
    "select 'Example of Report made with Spartacus' as title, " +
    "       product, " +
    "       description, " +
    "       unit, " +
    "       quantity, " +
    "       total_cost, " +
    "       unit_cost " +
    "from table", "REPORT");

v_report = new Spartacus.Reporting.Report(1, "template.xml", v_table);
v_report.Execute();
v_report.Save("report.pdf");

请注意,您不需要使用 Spartacus.Database 对象。如果您可以通过其他方式获取 System.Data.DataTable,则可以将其传递给 Report 对象。

但是,有一个问题。正如您在 XML 模板中看到的,对于每一列,您需要知道:

  • 列名(显然)
  • 标题
  • 对齐(左、右或居中)
  • 填充(百分比,100 为页面总宽度减去边距宽度)
  • 类型(INTEGER、REAL、BOOLEAN、CHAR、DATE 或 STRING)

填充和类型是必不可少的,您可能需要保留所有列的信息。 如果这太难实现,并且您只能获取列名和类型,则可以仅根据类型计算近似值,如下所示:

  • product 是 STRING 类型,默认填充 = 30
  • description 是 STRING 类型,默认填充 = 30
  • unit 是 STRING 类型,默认填充 = 30
  • 数量 是 REAL 类型,默认填充 = 15
  • total_cost 是 REAL 类型,默认填充 = 15
  • unit_cost 是 REAL 类型,默认填充 = 15

所有默认填充的总和是30+30+30+15+15+15 = 135,大于100。所以可以归一化为100,这样:

  • 列填充 = 列默认填充 *(默认填充总和 / 100)

之后,您需要生成带有动态字段信息的动态 template.xml 文件。

免责声明:我是 Spartacus 的创建者和维护者。

【讨论】:

  • 看起来很不错。我该如何处理列不适合水平放置在一页中的情况?
  • @kagelos Spartacus 不允许这样做。如果您指定一列具有总宽度的 30%,则它将始终具有总宽度的 30%。如果内容不适合此空间,则 Spartacus 会动态剪切内容。
【解决方案2】:

SSRS 对自动处理分页有很好的支持,但遵循它的规则是关键。

Understanding Pagination in Reporting Services (Report Builder 3.0 and SSRS)

如果您将报表设计为一页宽,但它跨多个页面呈现,请检查报表正文的宽度(包括边距)是否不大于物理页面大小宽度。为防止将空白页添加到报表中,您可以通过将容器角向左拖动来减小容器大小。

【讨论】:

  • 我相信您错过了问题中最重要的部分,即动态添加/删除报告的列。如果它是静态报告,或者我只是对将 HTML 转换为 PDF 感兴趣,我一开始就不会问问题。我正在寻找一种解决方案,我可以以编程方式将报告水平拆分为多个页面。
  • 恕我直言 SSRS 对此提供了最好的支持,但您对事物的声音并不感兴趣。
  • @JeremyThompson 如何以编程方式在 SSRS 中创建动态添加列的报告?正如我在我的问题中提到的,到目前为止我看到的解决方案试图通过打印(丑陋的)文本/代码来创建定义文件。我想避免这种情况。
  • 这很棘手,我认为您必须让 SSRS 来处理将 Tablix 拆分为页面:stackoverflow.com/a/30858423
  • @JeremyThompson 仍然不是我想要的。我需要能够在运行时向报告中添加列。我没有先验的 rdlc 文件。
猜你喜欢
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多