找回密码
 立即注册

QQ登录

只需一步,快速开始

iamzhaiwei

初级会员

30

主题

100

帖子

260

积分

初级会员

积分
260

活字格认证

iamzhaiwei
初级会员   /  发表于:2013-12-19 14:42  /   查看:14397  /  回复:12
ASP.NET MVC中,页面报表通过LocateDataSource事件动态设置数据源,怎么把Matrix显示的数据导出到Excel中?我的代码如下,有错误,异常信息是:发生了一个意外错误。更多信息: 'No data has been set. Please specify either a DataSet or a DataView to use'
  1. /// <summary>
  2.                 /// 有问题
  3.                 /// </summary>
  4.                 /// <param name="reportName"></param>
  5.                 /// <returns></returns>
  6.                 public ActionResult ExportToExcel(string reportName)
  7.                 {
  8.                         DataTable dt = (DataTable)Session["DataTable"];
  9.                         string pathName = "~/ActiveReports/";
  10.                         string fileName = pathName + reportName;
  11.                         FileInfo fileInfo = new FileInfo(Server.MapPath(fileName));
  12.                         PageReport report = new PageReport(fileInfo);
  13.                         report = (PageReport)Session["Report"];
  14.                        
  15.                         GrapeCity.ActiveReports.Document.PageDocument _reportRuntime = new GrapeCity.ActiveReports.Document.PageDocument(report);
  16.                         GrapeCity.ActiveReports.Export.Excel.Section.XlsExport XlsExport1 = new GrapeCity.ActiveReports.Export.Excel.Section.XlsExport();
  17.                         System.IO.MemoryStream ms = new System.IO.MemoryStream();
  18.                         XlsExport1.FileFormat = GrapeCity.ActiveReports.Export.Excel.Section.FileFormat.Xlsx;
  19.                         XlsExport1.Export(_reportRuntime, ms);
  20.                         Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
  21.                         Response.AddHeader("content-disposition", Server.UrlPathEncode("attachment;filename=客户订单.xlsx"));
  22.                         Response.BinaryWrite(ms.ToArray());
  23.                         Response.End();
  24.                         return Json("");
  25.                 }

  26.                 private DataTable dataTable;
  27.                 public ActionResult GetActiveReport(string reportName, ReportSearchConditionViewModel condition)
  28.                 {
  29.                         dataTable = WorkFileRepository.GetWorkFileDataTable(condition);

  30.                         string pathName = "~/ActiveReports/";
  31.                         string fileName = pathName + reportName;
  32.                         FileInfo fileInfo = new FileInfo(Server.MapPath(fileName));
  33.                         PageReport report = new PageReport(fileInfo);

  34.                         // 创建并设置数据源
  35.                         DataSource dataSource = new DataSource();
  36.                         dataSource.Name = "DataSource1";
  37.                         dataSource.ConnectionProperties.DataProvider = "DATASET";

  38.                         // 设置数据集
  39.                         GrapeCity.ActiveReports.PageReportModel.DataSet dataSet =
  40.                                 new GrapeCity.ActiveReports.PageReportModel.DataSet();
  41.                         Query query = new Query();
  42.                         dataSet.Name = "DataSet1";
  43.                         dataSet.Query = query;
  44.                         query.DataSourceName = "DataSource1";

  45.                         // 添加字段
  46.                         foreach (DataColumn dc in dataTable.Columns)
  47.                         {
  48.                                 Field field = new Field(dc.ColumnName, dc.ColumnName, null);
  49.                                 dataSet.Fields.Add(field);
  50.                         }

  51.                         // 将数据源和数据集绑定到报表中
  52.                         report.Report.DataSources.Add(dataSource);
  53.                         report.Report.DataSets.Add(dataSet);

  54.                         report.Document.LocateDataSource += new LocateDataSourceEventHandler(Document_LocateDataSource);
  55.                         Session["Report"] = report;
  56.                         return PartialView("WebViewer", report);
  57.                 }
  58.                 private void Document_LocateDataSource(Object sender, LocateDataSourceEventArgs args)
  59.                 {
  60.                         args.Data = dataTable;
  61.                 }
复制代码

12 个回复

倒序浏览
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2013-12-19 16:19:00
沙发
iamzhaiwei

我看了你以上代码,只从代码看没有可以的地方,但是代码里面有你自己的应用程序集,我无法直接调试,你可以给我发一个能重现该问题的示例程序吗,这样问题调查会更快速一些。
回复 使用道具 举报
iamzhaiwei
初级会员   /  发表于:2013-12-19 18:01:00
板凳
回复 2楼dof的帖子



工程里面需要引用Active Repots控件的DLL文件,您给添加上,触发导出到Excel操作的按钮在分类报表页面。
麻烦给看一下。
需求主要是:
1.从Excel导入
2.导出到Excel

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2013-12-20 13:21:00
地板
iamzhaiwei

我看了你的代码,你报表的数据源是动态构建的,而在ExportToExcel中没有构建报表数据源,没有在LocateDataSource事件中加载数据,这是以上错误信息的主要原因。

你需要在 ExportToExcel 方法中仿照GetActiveReport那样构建报表。
回复 使用道具 举报
iamzhaiwei
初级会员   /  发表于:2013-12-23 09:08:00
5#
回复 4楼dof的帖子

我按照您说的做了修改,还是出现那个错误
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2013-12-23 14:56:00
6#
我修改了 ExportToExcel 方法,代码如下:
  1.         public ActionResult ExportToExcel(string reportName)
  2.         {
  3.         ReportSearchConditionViewModel condition = new ReportSearchConditionViewModel();
  4.         condition.City = -1;
  5.         condition.ClassifyBasisID = 0;
  6.         condition.County = -1;
  7.         condition.FirstYear = 0;
  8.         condition.LastYear = 0;
  9.         condition.Province = 0;

  10.         dataTable = WorkFileRepository.GetWorkFileDataTable(condition);
  11.         string pathName = &quot;~/ActiveReports/&quot;;
  12.         string fileName = pathName + reportName;
  13.         FileInfo fileInfo = new FileInfo(Server.MapPath(fileName));
  14.         PageReport report = new PageReport(fileInfo);

  15.         // 创建并设置数据源
  16.         DataSource dataSource = new DataSource();
  17.         dataSource.Name = &quot;DataSource1&quot;;
  18.         dataSource.ConnectionProperties.DataProvider = &quot;DATASET&quot;;

  19.         // 设置数据集
  20.         GrapeCity.ActiveReports.PageReportModel.DataSet dataSet =
  21.             new GrapeCity.ActiveReports.PageReportModel.DataSet();
  22.         Query query = new Query();
  23.         dataSet.Name = &quot;DataSet1&quot;;
  24.         dataSet.Query = query;
  25.         query.DataSourceName = &quot;DataSource1&quot;;

  26.         // 添加字段
  27.         foreach (DataColumn dc in dataTable.Columns)
  28.         {
  29.             Field field = new Field(dc.ColumnName, dc.ColumnName, null);
  30.             dataSet.Fields.Add(field);
  31.         }

  32.         // 将数据源和数据集绑定到报表中
  33.         report.Report.DataSources.Add(dataSource);
  34.         report.Report.DataSets.Add(dataSet);

  35.         GrapeCity.ActiveReports.Document.PageDocument _reportRuntime = new GrapeCity.ActiveReports.Document.PageDocument(report);
  36.         _reportRuntime.LocateDataSource += _reportRuntime_LocateDataSource;
  37.         GrapeCity.ActiveReports.Export.Excel.Section.XlsExport XlsExport1 = new GrapeCity.ActiveReports.Export.Excel.Section.XlsExport();
  38.         System.IO.MemoryStream ms = new System.IO.MemoryStream();
  39.         XlsExport1.FileFormat = GrapeCity.ActiveReports.Export.Excel.Section.FileFormat.Xlsx;
  40.         XlsExport1.Export(_reportRuntime, ms);
  41.         Response.ContentType = &quot;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet&quot;;
  42.         Response.AddHeader(&quot;content-disposition&quot;, Server.UrlPathEncode(&quot;attachment;filename=客户订单.xlsx&quot;));
  43.         Response.BinaryWrite(ms.ToArray());
  44.         Response.End();
  45.         return Json(&quot;&quot;);
  46.         }

  47.     void _reportRuntime_LocateDataSource(object sender, LocateDataSourceEventArgs args)
  48.     {
  49.         args.Data = dataTable;
  50.     }
复制代码
回复 使用道具 举报
iamzhaiwei
初级会员   /  发表于:2014-2-25 16:23:00
7#
回复 6楼dof的帖子

我是这样做的:
报表显示后,保存在Session中,导出报表时候,从Session中恢复报表,导出报表的代码如下所示:
  1. PageReport report = (PageReport)this.Session[fileName];
  2.                         GrapeCity.ActiveReports.Export.Pdf.Section.PdfExport export = new GrapeCity.ActiveReports.Export.Pdf.Section.PdfExport();
  3.                         string fileFullName = pathName + &quot;\\&quot; + fileName + &quot;.pdf&quot;;
  4.                         export.Export(report.Document, fileFullName);
复制代码
回复 使用道具 举报
roger.wang
社区贡献组   /  发表于:2014-2-25 16:40:00
8#
回复 7楼iamzhaiwei的帖子

谢谢您的反馈。
回复 使用道具 举报
iamzhaiwei
初级会员   /  发表于:2014-2-25 16:43:00
9#
回复 8楼roger.wang的帖子

我没说明白,这样做有问题,运行到export.Export(report.Document, fileFullName);时候,有异常:未将对象引用设置到对象的实例。
回复 使用道具 举报
roger.wang
社区贡献组   /  发表于:2014-2-25 16:53:00
10#
回复 9楼iamzhaiwei的帖子

O(∩_∩)O~,明白了。
您3#的demo可以重现吗?   
在哪个浏览器环境下,IE8还是IE9?
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部