ASP.Net 中的动态表格数据报表

本文关键字:数据 数据报 报表 表格 动态 Net ASP | 更新日期: 2023-09-27 18:35:31

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

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

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

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

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

ASP.Net 中的动态表格数据报表

你可以

试试斯巴达克斯。

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

我在谷歌云端硬盘中上传了 3 个文件:

  • 斯巴达克斯.dll
  • 模板.xml
  • 报告.pdf
为了使用 Spartacus,

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

在下面的示例中,我通过简单的步骤从模板创建了报告.pdf.xml:

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 是页面的总宽度减去边距宽度)
  • 类型(整数、实数、布尔值、字符、日期或字符串)

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

  • 产品类型为 STRING,默认填充 = 30
  • 说明类型为 STRING,默认填充 = 30
  • 单位类型为 STRING,默认填充 = 30
  • 数量为 REAL 类型,默认填充 = 15
  • total_cost 的类型为 REAL,默认填充 = 15
  • unit_cost的类型为 REAL,默认填充 = 15

所有默认填充的总和为 30+30+30+15+15+15 = 135,大于 100。因此,您可以通过以下方式规范化为 100:

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

之后,您将需要生成具有动态字段信息的动态模板.xml文件。

免责声明:我是斯巴达克斯的创造者和维护者。

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

了解报表服务中的分页(报表生成器 3.0 和 SSRS)

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