如何在后台执行报表生成并将文件保存在服务器
本帖最后由 Lenka.Guo 于 2016-8-9 18:43 编辑报表请求到webservice 服务如何在服务端完成生成报表,保存为pdf格式 并存储在服务器,这个过程不需要用户干预
ar 9.0 版本
对了,我们发送了软件版本升级申请邮件啊, 怎么没有联系我们升级啊
本帖最后由 Lenka.Guo 于 2016-8-9 18:44 编辑
您好,
在服务端导出报表,并存放在服务器电脑上,只需要在后台添加导出按钮之后,将导出文件的Path 改成服务器地址就可以了。
添加导出按钮:
http://blog.gcpowertools.com.cn/ ... ze_flashviewer.aspx
protected void Button1_Click(object sender, EventArgs e)
{
report = new GrapeCity.ActiveReports.PageReport(new System.IO.FileInfo(Server.MapPath("\\Reports\\BillingInvoice.rdlx")));
reportDocument = new GrapeCity.ActiveReports.Document.PageDocument(report);
System.IO.DirectoryInfo outputDirectory = new System.IO.DirectoryInfo(@"D:\Demo");
outputDirectory.Create();
// Provide settings for your rendering output.
GrapeCity.ActiveReports.Export.Pdf.Page.Settings pdfSetting = new GrapeCity.ActiveReports.Export.Pdf.Page.Settings();
GrapeCity.ActiveReports.Extensibility.Rendering.ISettings setting = pdfSetting;
//Set the rendering extension and render the report.
GrapeCity.ActiveReports.Export.Pdf.Page.PdfRenderingExtension pdfRenderingExtension = new GrapeCity.ActiveReports.Export.Pdf.Page.PdfRenderingExtension();
GrapeCity.ActiveReports.Rendering.IO.FileStreamProvider outputProvider = new GrapeCity.ActiveReports.Rendering.IO.FileStreamProvider(outputDirectory, System.IO.Path.GetFileNameWithoutExtension(outputDirectory.Name));
reportDocument.Render(pdfRenderingExtension, outputProvider, pdfSetting);
}
升级邮件,抱歉,我在这边查找下,然后给咱们那边处理。
本帖最后由 lihuioooo 于 2016-8-10 10:58 编辑
Lenka.Guo 发表于 2016-8-9 18:42
您好,
在服务端导出报表,并存放在服务器电脑上,只需要在后台添加导出按钮之后,将导出文件的Path 改成 ...
尝试了, 报错
这个过程是在 报表数据填充后执行的转换,然后报错
/// <summary>
/// 导出为pdf
/// </summary>
/// <param name="pg"></param>
private void ExportToPdf(PageReport pg)
{
System.IO.DirectoryInfo outputDirectory = new System.IO.DirectoryInfo(@"D:\Demo");
outputDirectory.Create();
// Provide settings for your rendering output.
GrapeCity.ActiveReports.Export.Pdf.Page.Settings pdfSetting = new GrapeCity.ActiveReports.Export.Pdf.Page.Settings();
GrapeCity.ActiveReports.Extensibility.Rendering.ISettings setting = pdfSetting;
try
{
GrapeCity.ActiveReports.Export.Pdf.Page.PdfRenderingExtension pdfRenderingExtension = new GrapeCity.ActiveReports.Export.Pdf.Page.PdfRenderingExtension();
GrapeCity.ActiveReports.Rendering.IO.FileStreamProvider outputProvider = new GrapeCity.ActiveReports.Rendering.IO.FileStreamProvider(outputDirectory, System.IO.Path.GetFileNameWithoutExtension(outputDirectory.Name));
_pageDocument.Render(pdfRenderingExtension, outputProvider, pdfSetting);
HttpContext.Current.Response.ContentType = "application/pdf";
HttpContext.Current.Response.AddHeader("content-disposition", Server.UrlPathEncode("attachment;filename=客户订单.pdf"));
System.IO.MemoryStream ms = new System.IO.MemoryStream();
GrapeCity.ActiveReports.Rendering.IO.MemoryStreamProvider _provider = new GrapeCity.ActiveReports.Rendering.IO.MemoryStreamProvider();
_provider.GetPrimaryStream().OpenStream().CopyTo(ms);
HttpContext.Current.Response.BinaryWrite(ms.ToArray());
HttpContext.Current.Response.End();
}
catch (Exception ex)
{
throw;
}
//Set the rendering extension and render the report.
}
private void Cah020_LocateDataSource2(object sender, LocateDataSourceEventArgs args)
{
string sql = "";
string where = "";
if (args.Report.PageReport.Report.DataSets.Count > 0)
{
sql = args.Report.PageReport.Report.DataSets.Query.CommandText;//获取报表的sql 语句
}
for (int i = 0; i < args.Report.Parameters.Count; i++)
{
if (args.Report.Parameters.Name.ToLower() == "sql")
{
where = args.Report.Parameters.CurrentValue == null ? "" : args.Report.Parameters.CurrentValue.ToString();
break;
}
}
CYW.Hotel.IBLL.IGetDataForReport data = new CYW.Hotel.BLL.GetReportData();
DataTable tab = data.GetSelectReportDatas(sql);
args.Data = tab;
ExportToPdf(definition);
}
我如果想不存文件, 直接把报表处理为流入库呢? 以上是我的代码实现
本帖最后由 Lenka.Guo 于 2016-8-10 11:24 编辑
导出调用的report的document对象提供的导出方法,所以需要传递Document对象,我在这边做了一个小的修改,将ExportToPdf写在OnCreateReportHandler 方法中,可以导出正常:
PageReport definition1 = (PageReport)base.OnCreateReportHandler("Reports/report1.rdlx");
// 为了加快验证速度,这一版本我们采用的是直接绑定数据库的方法,如果确实需要也可以修改为运行时数据源绑定
PageDocument _pageDocument = new PageDocument(definition1);
definition1.Document.LocateDataSource += new LocateDataSourceEventHandler(Document_LocateDataSource);
GrapeCity.ActiveReports.PageReportModel.ReportParameter ptotalpage = new GrapeCity.ActiveReports.PageReportModel.ReportParameter();
ptotalpage.Name = "总页数";
ptotalpage.Prompt = "总页数";
ptotalpage.DataType = GrapeCity.ActiveReports.PageReportModel.ReportParameterDataType.Integer;
ptotalpage.DefaultValue.Values.Add(ExpressionInfo.FromString("1"));
ptotalpage.Hidden = true;
definition1.Report.ReportParameters.Add(ptotalpage);
ExportToPdf(definition1.Document);
return definition1;
Lenka.Guo 发表于 2016-8-10 11:06
导出调用的report的document对象提供的导出方法,所以需要传递Document对象,我在这边做了一个小的修改,将 ...
程序走到箭头处就返回了,拿不到数据呢
能提供一个完整可运行的例子吗? 我的需求就是 在 报表的webservice 上把报表拿到然后存入数据库,我试验了几次都不行,程序异常退出 已解决,需要这么处理
private void ExportPdf(PageReport doc)
{
try
{
var pdf = new PdfExport();
var memStream = new System.IO.MemoryStream();
pdf.Export(doc.Document, memStream);
byte[] b = memStream.ToArray();
}
catch (Exception ex)
{
throw;
}
} 谢谢您的分享,我把我改过的共享给您,还有升级已经于7月24日给徐工和另外一名工程师回复过了。
本帖最后由 lihuioooo 于 2016-8-10 18:10 编辑
还有个小问题啊, 就是在OnCreateReportHandler 里如何取报表的参数值呢?不在LocateDataSourceEventHandler 里取 通过这一行代码大,但是在OnCreate方法中只能获取到参数的默认值,而在LocateDatasource中可以获取到参数的当前值,即用户当前的选择
definition1.Report.ReportParameters.DefaultValue.ToString();
页:
[1]
2