reportviewer导出格式控制

现在集成在vs(我的是VS2012)中的报表工具reportviewer,在导出office文档是,默认导出的格式是最新的xlsx或者docx格式,但是客户很多用的还是古老的office2003,这就必须的控制输出2003格式的文档。

通过下面的viewer.ServerReport.Render控制生成文件,然后将文件发送个客户端的方式,可以解决,但是总归需要去自己写太多的代码,并且会影响画面的原有布局方式。

public bool Export(ReportViewer viewer, string exportType)
  {
      Warning[] warnings = null;
      string[] streamIds = null;
      string mimeType = string.Empty;
      string encoding = string.Empty;
      string extension = string.Empty;
      string deviceInfo = string.Empty;
      string filetype = string.Empty;
      string reportsTitle = GetReportTitle(viewer); // just gets the Report title... make your own method
 
      //ReportViewer needs a specific type (not always the same as the extension)
      if (exportType == "XLS")
      {
          filetype = "Excel";
      }
      else
      {
          filetype = exportType;
      }
 
      byte[] bytes = viewer.ServerReport.Render(filetype, null, // deviceinfo not needed for csv
          out mimeType, out encoding, out extension, out streamIds, out warnings);
 
      System.Web.HttpContext.Current.Response.Buffer = true;
      System.Web.HttpContext.Current.Response.Clear();
 
      System.Web.HttpContext.Current.Response.ContentType = mimeType;
      System.Web.HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=" + reportsTitle + "." + exportType);
 
      System.Web.HttpContext.Current.Response.BinaryWrite(bytes);
 
      System.Web.HttpContext.Current.Response.Flush();
      System.Web.HttpContext.Current.Response.End();
 
      return true;
  }

 如果不想去通过这个方法来实现,那么可以通过控制张票的导出格式来控制。这样就可以简单的保持原有的reportviewer风格,自由的控制处理的格式,也只需要少量的代码来控制。

代码如下:

 protected void rptViewer_PreRender(object sender, EventArgs e)
        {
            RenderingExtension[] resut = rptViewer.LocalReport.ListRenderingExtensions();
            foreach (RenderingExtension item in rptViewer.LocalReport.ListRenderingExtensions())
            {
// item 具有Visable属性,但是这个属性是只读属性,不能修改,所以通过反射进行了修改
if (item.Name.ToUpper() == "EXCEL") { // 显示excel2003格式导出按钮 FieldInfo fi = item.GetType().GetField("m_isVisible", BindingFlags.Instance | BindingFlags.NonPublic); fi.SetValue(item, true); } if (item.Name.ToUpper() == "WORD") { // 显示word2003导出按钮 FieldInfo fi = item.GetType().GetField("m_isVisible", BindingFlags.Instance | BindingFlags.NonPublic); fi.SetValue(item, true); } if (item.Name.ToUpper() == "EXCELOPENXML") { // 不显示excel2003以上版本的格式 FieldInfo fi = item.GetType().GetField("m_isVisible", BindingFlags.Instance | BindingFlags.NonPublic); fi.SetValue(item, false); } if (item.Name.ToUpper() == "WORDOPENXML") { // 不显示word以上版本的格式 FieldInfo fi = item.GetType().GetField("m_isVisible", BindingFlags.Instance | BindingFlags.NonPublic); fi.SetValue(item, false); } } }

PS:通过这种方式能够简单的控制本身支持的处理格式,如果只要处理pdf,可以把其他格式的m_isVisible全部设置成false,只把pdf的m_isVisible设置成true。

rdlc报表虽然不是很灵活,但是要做简单表报还是能够胜任的,而且操作简单,与vs很好的整和在了一起,用起来还是蛮方便的。

 

posted on 2013-01-30 10:50  猿人甲  阅读(3683)  评论(7编辑  收藏  举报