Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.Net中的动态表格数据报表_C#_Asp.net Mvc 5_Report_Pdf Generation_Xlsx - Fatal编程技术网

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

C# ASP.Net中的动态表格数据报表,c#,asp.net-mvc-5,report,pdf-generation,xlsx,C#,Asp.net Mvc 5,Report,Pdf Generation,Xlsx,我正在开发一个MVC5 web应用程序,需要从任何数据库表生成报告。用户将选择要打印的表,然后选择要包含在报告中的列,系统只需显示一个包含数据的网格表 在HTML表中显示数据当然不是问题,我还设法用数据生成Excel文件,用户可以下载 不过,我还需要提供一个可打印的报告格式,如PDF或其他一些不需要特殊软件(如MS Office)打开和打印的格式 起初我认为应该使用ReportViewer控件,但问题是,由于用户选择了所需的列,所以我的报表是动态的。我曾看到其他人试图生成报告定义文件,但我希望它

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

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

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

起初我认为应该使用ReportViewer控件,但问题是,由于用户选择了所需的列,所以我的报表是动态的。我曾看到其他人试图生成报告定义文件,但我希望它不那么难看


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

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

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

你可以试试

这是一个相对较新的.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,则可以将其传递给报表对象

然而,有一个陷阱。正如您在XML模板中看到的,对于每一列,您都需要知道:

显然是列名 标题 左对齐、右对齐或居中对齐 填充百分比,100是页面总宽度减去页边距宽度 输入整数、实数、布尔值、字符、日期或字符串 填充和键入是必需的,您可能需要保留有关所有列的信息。 如果这太难实现,并且只能获取列名和类型,则可以仅基于类型计算近似值,如下所示:

产品类型为字符串,默认填充=30 说明为字符串类型,默认填充=30 单位为字符串类型,默认填充=30 数量为实型,默认填充=15 总成本为实型,默认填充=15 单位成本为实际类型,默认填充=15 所有默认填充的总和为30+30+30+15+15+15=135,大于100。因此,您可以通过以下方式将其规格化为100:

列填充=列默认填充*默认填充之和/100 之后,您将需要生成包含动态字段信息的dynamictemplate.xml文件


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

既然您已经有了HTML,我建议您看看iText的XMLWorker:。这些示例是用Java编写的,但对于C来说应该足够明显了。iTextSharp是iText的.NET端口。披露:我在iText软件工作。很有趣。我能水平安装立柱吗?我的意思是,如果一个页面中有太多的列,我可以将其中的一些移动到下一个页面吗?@kagelos我有一个解决方案,它完全符合您的要求,但需要jquery。那么,我可以使用jquery并为您提供解决方案吗?当然,jquery很好。我相信您错过了问题的最重要部分,即报表的列是动态添加/删除的。如果它是一个静态报告,或者我只是对将HTML转换成PDF感兴趣,那么我一开始就不会问任何问题。我正在寻找一种解决方案,可以通过编程将报告水平拆分为多个页面。IMHO SSRS对此有最好的支持,但您对此并不感兴趣。@Jeremythonpson我如何通过编程在SSRS中创建一个报告,并在其中动态添加列?正如我在问题中提到的,到目前为止,我看到的解决方案试图通过打印难看的文本/代码来创建定义文件。我想避免这种情况。这很棘手,我认为你必须让SSRS来处理将小报拆分成多页的问题:@Jeremythonpson仍然不是我想要的。我需要能够在运行时向报表中添加列。我事先没有rdlc文件。看起来很不错。但是,我如何处理这些列无法水平放入一页的情况?@kagelos Spartacus不允许这样做。如果指定一列具有总宽度的30%,则 将始终具有总宽度的30%。如果内容不适合此空间,则Spartacus会动态剪切内容。