在企业应用开发中,经常需要将报表导出为Excel、PDF或Word格式。尽管Microsoft Office工具提供了一些内置的解决方案,但将这些工具集成到ASP.NET应用中并非易事。本文将介绍一种方法,即使用ReportViewer控件来实现这一需求。
在开发过程中,经常遇到需要将报表导出为多种格式的需求。尽管可以使用Crystal Report等工具,但这些工具往往需要额外的成本和开发工作。因此,寻求一种更简便的方法来实现报表的导出功能。
面临的问题是,已经投入了大量资源开发了基于ASP.NETWeb页面的报表,这些报表使用了GridView、Repeater和HTML控件,并且包含了.NET图表组件、图片和表格数据。现在,客户要求提供一种功能,可以将这些HTML报表导出为Excel、Word和PDF格式。
可以通过使用ReportViewer控件来解决这个问题。ReportViewer控件允许将.NET图表保存为图片,并在RDLC报告中导出。此外,还可以利用ReportViewer的导出功能,将Web页面原样导出。
要使用ReportViewer控件,需要满足以下条件:
以下是使用ReportViewer控件导出报表的步骤:
以下是设置ReportViewer属性的示例代码:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Microsoft.Reporting.WebForms.ReportParameter[] ReportParameters =
new Microsoft.Reporting.WebForms.ReportParameter[1];
ReportParameters[0] =
new Microsoft.Reporting.WebForms.ReportParameter(
"ReportParameter1",
file: Server.MapPath("MemoryStreamImage.JPG"));
ReportViewer1.LocalReport.SetParameters(ReportParameters);
}
}
请注意,ReportViewer控件默认在异步Ajax模式下工作,因此需要在母版页中添加ScriptManager。
如果希望将.NET图表组件导出到Excel、PDF和Word,可以使用以下代码。首先,将.NET图表对象保存在内存或服务器路径中,然后将这个路径作为ReportViewer控件的参数值传递。
public void ExportChart(Chart chart)
{
MemoryStream image = new MemoryStream();
chart.SaveImage(image, ChartImageFormat.Png);
Response.ContentType = "image/png";
Response.AppendHeader("Content-Disposition", String.Format("attachment; filename={0}.png", Page.Title.Replace(" ", "_")));
Response.OutputStream.Write(image.ToArray(), 0, (int)image.Length);
}
ReportViewer1.LocalReport.DataSources.Clear();
ReportViewer1.LocalReport.ReportPath = "report1.rdlc";
List _ParamList = new List();
ReportViewer1.LocalReport.EnableExternalImages = true;
_ParamList.Add(new Microsoft.Reporting.WebForms.ReportParameter("ImagePath", "/Images/Sample.JPG"));
ReportViewer1.LocalReport.SetParameters(_ParamList);
ReportViewer1.DataBind();
Microsoft.Reporting.WebForms.Warning[] warnings;
string[] streamids;
string mimeType;
string encoding;
string extension;
string deviceInfo =
"" +
"PDF " +
"8.5in " +
"11in " +
"0.5in " +
"0.25in " +
"0.25in " +
"1in " +
" ";
byte[] writeBinaryBytes = new byte[0];
writeBinaryBytes = ReportViewer1.LocalReport.Render("PDF", deviceInfo, out mimeType, out encoding, out extension, out streamids, out warnings);
HttpContext.Current.Response.Buffer = true;
HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=" + "San.pdf");
HttpContext.Current.Response.ContentType = "application/octet-stream";
HttpContext.Current.Response.BinaryWrite(writeBinaryBytes);
HttpContext.Current.Response.Flush();