lihuioooo 发表于 2016-8-9 16:51:52

如何在后台执行报表生成并将文件保存在服务器

本帖最后由 Lenka.Guo 于 2016-8-9 18:43 编辑

报表请求到webservice 服务如何在服务端完成生成报表,保存为pdf格式 并存储在服务器,这个过程不需要用户干预
ar 9.0 版本

对了,我们发送了软件版本升级申请邮件啊, 怎么没有联系我们升级啊

Lenka.Guo 发表于 2016-8-9 18:42:23

本帖最后由 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:17:05

本帖最后由 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:06:52

本帖最后由 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;


lihuioooo 发表于 2016-8-10 14:25:21

Lenka.Guo 发表于 2016-8-10 11:06
导出调用的report的document对象提供的导出方法,所以需要传递Document对象,我在这边做了一个小的修改,将 ...


程序走到箭头处就返回了,拿不到数据呢

lihuioooo 发表于 2016-8-10 15:29:20

能提供一个完整可运行的例子吗? 我的需求就是 在 报表的webservice 上把报表拿到然后存入数据库,我试验了几次都不行,程序异常退出

lihuioooo 发表于 2016-8-10 16:19:28

已解决,需要这么处理
   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;
            }
      }

Lenka.Guo 发表于 2016-8-10 17:46:39

谢谢您的分享,我把我改过的共享给您,还有升级已经于7月24日给徐工和另外一名工程师回复过了。

lihuioooo 发表于 2016-8-10 17:53:21

本帖最后由 lihuioooo 于 2016-8-10 18:10 编辑

还有个小问题啊, 就是在OnCreateReportHandler 里如何取报表的参数值呢?不在LocateDataSourceEventHandler 里取

Lenka.Guo 发表于 2016-8-11 09:20:47

通过这一行代码大,但是在OnCreate方法中只能获取到参数的默认值,而在LocateDatasource中可以获取到参数的当前值,即用户当前的选择
   definition1.Report.ReportParameters.DefaultValue.ToString();
页: [1] 2
查看完整版本: 如何在后台执行报表生成并将文件保存在服务器