我正在开发一个MVC5 Web应用程序,我需要从任何数据库表生成报告。用户将选择要打印的表,然后选择要包含在报告中的列,系统应该只显示包含数据的网格(表)。
在HTML表格中显示数据当然不是问题,我还设法生成包含用户可以下载的数据的Excel文件。
但是,我还需要提供报告的可打印形式,例如PDF或其他不需要特殊软件(如MS Office)的格式来打开和打印。
起初我以为我应该使用ReportViewer控件,但问题是我的报表是动态的,因为用户选择了他需要的列。我已经看到其他人尝试生成报告定义文件,但我希望不那么难看。
有没有办法获取一个HTML表,它可以很好地计算单元格的大小,并从中创建PDF?如果列太多,我当然不介意在多个页面中水平拆分报告。
答案 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模板中看到的,对于每个列,您需要知道:
填写和类型是必不可少的,您可能需要保留有关所有列的信息。 如果这太难实现,并且您只能获取列名称和类型,则可以仅基于类型计算aproximation,如下所示:
所有默认填充的总和是30 + 30 + 30 + 15 + 15 + 15 = 135,大于100.所以你可以标准化为100,这样:
之后,您将需要生成包含动态字段信息的动态template.xml文件。
免责声明:我是斯巴达克斯'创作者和维护者。
答案 1 :(得分:0)
SSRS非常支持自动处理分页,但遵循其规则是关键。
Understanding Pagination in Reporting Services (Report Builder 3.0 and SSRS)
如果您将报表设计为一页宽,但它在多个页面上呈现,请检查报表正文的宽度(包括边距)是否大于物理页面大小宽度。要防止将空白页添加到报表中,可以通过将容器角拖到左侧来减小容器大小。