Crear reportes en Excel con ASP.NET
|
. |
Lo que necesitamos para comenzar es tener instalado Microsoft Excel en el servidor. Además necesitas dar los permisos que se necesita para el uso de el Excel desde ASP .Net, esto lo haremos añadiendo al archivo web.config de la aplicación la siguiente línea:
<identity impersonate="true"/>
o en dado caso configurar la aplicación con una cuenta que cuente con los permisos necesarios para la ejecución de Excel. Además de estas cosas necesitamos dar privilegios de escritura al directorio donde vaya a ejecutarse la aplicación. Comencemos abriendo un nuevo proyecto de asp.net en Visual Studio .Net. Para esto vamos a hacer uso de COM Interop. Entonces vamos a agregar una referencia a nuestro proyecto desde el explorador de soluciones, en el elemento referencia damos un clic derecho sobre la carpeta referencias y después damos agregar referencia, seleccionamos Microsoft Excel Object Library, damos agregar y después aceptamos el cuadro de diálogo, esto agregará una referencia a nuestro proyecto que nos permitirá hacer uso de la riqueza que nos proporciona esta librería.
Abrimos el codebehind de Webform1 e importamos el siguiente namespaces:Imports System.Runtime.InteropServices.Marshal
A continuación sigue código en Visual Basic:
Private Sub Page_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load Dim oExcel As New Excel.Application Dim oBooks As Excel.Workbooks, oBook As Excel.Workbook Dim oSheets As Excel.Sheets, oSheet As Excel.Worksheet Dim oCells As Excel.Range Dim sFile As String, sTemplate As String Dim dt As DataTable = CType(Application.Item("MyDataTable"), DataTable) sFile = Server.MapPath(Request.ApplicationPath) & "\MyExcel.xls" sTemplate = Server.MapPath(Request.ApplicationPath) & "\MyTemplate.xls" oExcel.Visible = False : oExcel.DisplayAlerts = False 'Start a new workbook oBooks = oExcel.Workbooks oBooks.Open(Server.MapPath(Request.ApplicationPath) & "\MyTemplate.xls") 'Load colorful template with graph oBook = oBooks.Item(1) oSheets = oBook.Worksheets oSheet = CType(oSheets.Item(1), Excel.Worksheet) oSheet.Name = "First Sheet" oCells = oSheet.Cells DumpData(dt, oCells) oSheet.SaveAs(sFile) oBook.Close() 'Quit Excel and thoroughly deallocate everything oExcel.Quit() ReleaseComObject(oCells) ReleaseComObject(oSheet) ReleaseComObject(oSheets) ReleaseComObject(oBook) ReleaseComObject(oBooks) ReleaseComObject(oExcel) oExcel = Nothing oBooks = Nothing oBook = Nothing oSheets = Nothing oSheet = Nothing oCells = Nothing System.GC.Collect() Response.Redirect(sFile) End Sub 'Outputs a DataTable to an Excel Worksheet Private Function DumpData(ByVal dt As DataTable, ByVal oCells As Excel.Range) As String Dim dr As DataRow, ary() As Object Dim iRow As Integer, iCol As Integer 'Output Column Headers For iCol = 0 To dt.Columns.Count - 1 oCells(2, iCol + 1) = dt.Columns(iCol).ToString Next 'Output Data For iRow = 0 To dt.Rows.Count - 1 dr = dt.Rows.Item(iRow) ary = dr.ItemArray For iCol = 0 To UBound(ary) oCells(iRow + 3, iCol + 1) = ary(iCol).ToString Response.Write(ary(iCol).ToString & vbTab) Next Next End FunctionPara comenzar declaramos algunas variables necesarias y cargamos algunos datos, después generamos unos archivos temporales a partir de documentos contenidos en el directorio de la aplicación. Entonces damos la orden a Excel para que no nos muestre ningún mensaje o pop up o cualquier otro IU y creamos una Hoja en blanco. Después introducimos los elementos de la tabla por medio de un ciclo en la celda que corresponda, Y por último guardamos en un archivo temporal en el servidor. La ventaja que tenemos al usar esta forma para crear reportes es que como se pudieron dar cuenta el archivo de Excel que se abrió se tomó de uno ya creado, entonces se puede agregar un gráfico y al introducir los nuevos datos el gráfico tomará los valores introducidos como validos además de que el formato se le puede dar con anterioridad.
Fichero con el código de ejemplo: juceduba_ASPinExcel.zip - 2 KB