现在集成在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很好的整和在了一起,用起来还是蛮方便的。