A partir de Visual Studio 2005, se incluyeron nuevos controles (ReportViewer
) y clases (LocalReport, ServerReport
, etc) con los cuales se pueden diseñar reportes tanto para aplicaciones de escritorio como para aplicaciones Web.
Una característica útil de estas nuevas clases, al igual que los reportes diseñados en Crystal Reports, es que permiten automatizar el proceso de conversión de los reportes a diferentes a diferentes formatos: MS Excel, PDF e Imagenes (en formato TIFF).
Revisando documentación acerca de este conjunto de clases encontré un ejemplo publicado por Raj Kaimal que justamente exporta los reportes a formato PDF desde ASP.NET usando el método Render de la clase LocalReport:
csharp:
private void RenderReport
()
{
LocalReport localReport =
new LocalReport
();
localReport.
ReportPath = Server.
MapPath("~/Productos.rdlc");
ReportDataSource reportDataSource = new ReportDataSource("Ejemplo_Productos", GetData());
localReport.DataSources.Add(reportDataSource);
string reportType = "PDF";
string mimeType;
string encoding;
string fileNameExtension;
//The DeviceInfo settings should be changed based on the reportType
//http://msdn2.microsoft.com/en-us/library/ms155397.aspx
string deviceInfo =
"<DeviceInfo>" +
" <OutputFormat>PDF</OutputFormat>" +
" <PageWidth>8.5in</PageWidth>" +
" <PageHeight>11in</PageHeight>" +
" <MarginTop>0.5in</MarginTop>" +
" <MarginLeft>1in</MarginLeft>" +
" <MarginRight>1in</MarginRight>" +
" <MarginBottom>0.5in</MarginBottom>" +
"</DeviceInfo>";
Warning[] warnings;
string[] streams;
byte[] renderedBytes;
//Render the report
renderedBytes = localReport.Render(
reportType,
deviceInfo,
out mimeType,
out encoding,
out fileNameExtension,
out streams,
out warnings);
Response.Clear();
Response.ContentType = mimeType;
Response.AddHeader("content-disposition", "attachment; filename=productos." + fileNameExtension);
Response.BinaryWrite(renderedBytes);
Response.End();
}
En la primera porción de código resaltada, reportType
puede tomar los siguientes valores: PDF, Excel o Image
; los valores para deviceInfo
varían de acuerdo al formato que se use y están documentados en MSDN
Por si alguien está interesado, he preparado un pequeño ejemplo basado en el código mostrado.