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

时间:2016-02-19 11:02:32

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

您可以尝试Spartacus

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

我在Google云端硬盘中上传了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)

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

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

所有默认填充的总和是30 + 30 + 30 + 15 + 15 + 15 = 135,大于100.所以你可以标准化为100,这样:

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

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

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

答案 1 :(得分:0)

SSRS非常支持自动处理分页,但遵循其规则是关键。

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

  

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