Crear reportes en Excel con ASP.NET

Fecha: 11/Jul/2004 (08 de julio del 2004)
Autor: Julio César Duran Barragán

.

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 Function

Para 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.




ir al índice

Fichero con el código de ejemplo: juceduba_ASPinExcel.zip - 2 KB