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很好的整和在了一起,用起来还是蛮方便的。
浙公网安备 33010602011771号