Crystal reports 水晶报告“;“文件中断”;
我正在生成一个Crystal Reports报告,它最终需要拆分成数千个pdf文件。理想的情况是,Crystal Reports有一个类似“文件分隔符”的东西,比如分页符,您可以在适当的位置将其插入到文件中 我还需要对文件名进行合理的精细控制……比如“fileName{CustomerId}{CustomerIsLocal}.pdf” 我想可能需要第三方软件。想法Crystal reports 水晶报告“;“文件中断”;,crystal-reports,pdf-generation,Crystal Reports,Pdf Generation,我正在生成一个Crystal Reports报告,它最终需要拆分成数千个pdf文件。理想的情况是,Crystal Reports有一个类似“文件分隔符”的东西,比如分页符,您可以在适当的位置将其插入到文件中 我还需要对文件名进行合理的精细控制……比如“fileName{CustomerId}{CustomerIsLocal}.pdf” 我想可能需要第三方软件。想法 TIA.我认为Crystal不支持这种功能。目前,我们自己在应用程序中对此进行管理,特别是在需要自定义名称格式的情况下,您的意图是为
TIA.我认为Crystal不支持这种功能。目前,我们自己在应用程序中对此进行管理,特别是在需要自定义名称格式的情况下,您的意图是为客户群运行报告。您必须考虑使用一些代码来完成这项工作(我们使用的是C) 如果您在这方面有更多问题,请随时提问,以便我可以提供帮助
Adriaan我认为Crystal不支持这种功能。目前,我们自己在应用程序中对此进行管理,特别是在需要自定义名称格式的情况下,您的意图是为客户群运行报告。您必须考虑使用一些代码来完成这项工作(我们使用的是C) 如果您在这方面有更多问题,请随时提问,以便我可以提供帮助
Adriaan您正在寻找的功能通常被称为“爆破”。虽然有各种第三方工具可以做到这一点,但Business Objects Enterprise也可以(尽管Crystal Reports Server不能)。它可能超出了您的价格范围,但它在报告分发中为您提供的灵活性绝对值得一看。您正在寻找的功能通常被称为“爆破”。虽然有各种第三方工具可以做到这一点,但Business Objects Enterprise也可以(尽管Crystal Reports Server不能)。它可能超出了您的价格范围,但它在报告分发中为您提供的灵活性绝对值得一看……我想为任何其他前来寻找答案的人记录这一点:
private readonly CrystalReportViewer reportViewer = new CrystalReportViewer();
...
this.reportViewer.ReportSource = @"C:\PathToReport\Report.rpt";
using (var crystalReport = new ReportDocument())
{
foreach (DataRow row in dataSet.Tables[0].Rows)
{
var customerId = int.Parse(row["customerId"].ToString());
var isCurrent = bool.Parse(row["isCurrent"].ToString());
var totalSales = int.Parse(row["totalSales"].ToString());
// generate the report for each row
this.CreateReport(customerId, isCurrent, totalSales, crystalReport);
}
}
private void CreateReport(int customerId, bool isCurrent, int totalSales, ReportDocument crystalReport)
{
crystalReport.Load(this.reportViewer.ReportSource.ToString());
crystalReport.SetParameterValue("customerId", customerId);
crystalReport.SetParameterValue("isCurrent", isCurrent);
crystalReport.SetParameterValue("TotalSales", totalSales);
var fileName = string.Format("EndOfYear_{0}_{1}.pdf", customerId, isCurrent ? 1 : 0);
var outputPath = Path.Combine(this.txtOutputDirectory.Text, fileName);
crystalReport.ExportToDisk(ExportFormatType.PortableDocFormat, outputPath);
}
参考资料:
CrystalDecisions.CrystalReports.Design
CrystalDecisions.CrystalReports.Engine
此代码生成如下文件名:
“EndOfYear_123456_1.pdf”
当然可以为每一行生成报表对象,而不是将其传入,但速度会慢很多。就我所见,重用同一个报表对象不会产生任何负面影响,并且会使事情进展快十倍左右
您唯一需要做的另一件事是如何准备Crystal报告,这超出了本教程的范围。祝你好运 我想为任何其他前来寻找答案的人记录这一点:
private readonly CrystalReportViewer reportViewer = new CrystalReportViewer();
...
this.reportViewer.ReportSource = @"C:\PathToReport\Report.rpt";
using (var crystalReport = new ReportDocument())
{
foreach (DataRow row in dataSet.Tables[0].Rows)
{
var customerId = int.Parse(row["customerId"].ToString());
var isCurrent = bool.Parse(row["isCurrent"].ToString());
var totalSales = int.Parse(row["totalSales"].ToString());
// generate the report for each row
this.CreateReport(customerId, isCurrent, totalSales, crystalReport);
}
}
private void CreateReport(int customerId, bool isCurrent, int totalSales, ReportDocument crystalReport)
{
crystalReport.Load(this.reportViewer.ReportSource.ToString());
crystalReport.SetParameterValue("customerId", customerId);
crystalReport.SetParameterValue("isCurrent", isCurrent);
crystalReport.SetParameterValue("TotalSales", totalSales);
var fileName = string.Format("EndOfYear_{0}_{1}.pdf", customerId, isCurrent ? 1 : 0);
var outputPath = Path.Combine(this.txtOutputDirectory.Text, fileName);
crystalReport.ExportToDisk(ExportFormatType.PortableDocFormat, outputPath);
}
参考资料:
CrystalDecisions.CrystalReports.Design
CrystalDecisions.CrystalReports.Engine
此代码生成如下文件名:
“EndOfYear_123456_1.pdf”
当然可以为每一行生成报表对象,而不是将其传入,但速度会慢很多。就我所见,重用同一个报表对象不会产生任何负面影响,并且会使事情进展快十倍左右
您唯一需要做的另一件事是如何准备Crystal报告,这超出了本教程的范围。祝你好运 Report Runner Batch是一种廉价的第三方解决方案,可以做到这一点:
Report Runner Batch是一种廉价的第三方解决方案,可以实现以下功能:
这似乎正是我要寻找的,但您从中构建数据集是什么?对不起,如果这是一个愚蠢的问题;我对此有点陌生。我只是从一个普通的ADO查询中构建了它……如果我今天这样做,我可能会有一个实体列表。这似乎正是我要寻找的,但你从中构建数据集是什么?对不起,如果这是一个愚蠢的问题;我对这个有点陌生。我只是从一个普通的ADO查询构建了它…如果我今天这样做,我可能会有一个实体列表。