domingo, 9 de septiembre de 2012

Mostrar un archivo Excel 2003, 2007 en GridView en ASP.NET 2008 con OleDbDataAdapter

He visto muchos ejemplos de como hacer esto pero algunos no funcionan jeje asi que aqui comparto este codigo que si funciona ya sea el archivo excel en diferentes versiones 1997, 2003 o 2007. Lo primero que haremos sera pulsar el boton examinar, buscamos el archivo excel luego lo copiaremos ese archivo al directorio web y de alli crearemos el enlace de la hoja de excel al gridview.
Lo primero sera crear un proyecto web y agregar un scriptmanager, un uploadpanel y dentro de el al gridview para refrescar esa parte y no toda la pagina, tambien agregamos un control FileUpload, un boton y un Label debajo. Estos 3 ultimos controles podemos ponerlos dentro de una tabla y los 2 primeros dentro del grid, personalizando al gridview para darle mayor vistocidad lucira asi:
el codigo que tendra nuestro body sera mas o menos el siguiente:
<body>
    <form id="form1" runat="server">
    <div>
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:GridView ID="GridView1" runat="server" CellPadding="4"
Font-Names="Verdana" Font-Size="Small" ForeColor="#333333">
<RowStyle BackColor="#EFF3FB" />
<FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
<SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
<HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<EditRowStyle BackColor="#2461BF" />
<AlternatingRowStyle BackColor="White" />
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>
<table>
<tr>
<td><asp:FileUpload ID="fupExcel" runat="server" Font-Names="Verdana"
Font-Size="Small" /></td>
</tr>
<tr>
<td><asp:Button ID="btnUpload" runat="server" Text="Upload" Font-Names="Verdana"
Font-Size="Small" onclick="btnUpload_Click" /></td>
</tr>
<tr>
<td>
    <asp:Label ID="Label1" runat="server"></asp:Label>
    </td>
</tr>
</table>
</div>
    </form>
</body>
para nuestro codigo importamos las siguientes librerias:
using System.Data.OleDb;
using System.IO;
olvide decirles antes de escribir el codigo de abajo para subir el excel, creen una carpeta llamada Invoices dentro de su proyecto, en la misma ruta donde esta su web default1.aspx ya que esta carpeta es la que nos servira para crear el enlace. Una vez dicho esto escriban este codigo dentro del evento click del boton Upload.
if (fupExcel.HasFile)
        {
            try
            {
                HttpFileCollection uploads = HttpContext.Current.Request.Files;
                for (int i = 0; i < uploads.Count; i++)
                {
                    HttpPostedFile upload = uploads[i];
                    if (upload.ContentLength == 0)
                        continue;
                    string c = System.IO.Path.GetFileName(upload.FileName);
                    try
                    {
                        upload.SaveAs(Server.MapPath("Invoices\\") + c);
                    }
                    catch (Exception Exp)
                    {
                        throw (Exp);
                    }
                }
                if (fupExcel.PostedFile != null)
                {
                    HttpPostedFile attFile = fupExcel.PostedFile;
                    int attachFileLength = attFile.ContentLength;
                    if (attachFileLength > 0)
                    {
                        if (fupExcel.PostedFile.ContentLength > 0)
                        {
                            string Extension = Path.GetExtension(fupExcel.PostedFile.FileName);
                            string inFileName = Path.GetFileName(fupExcel.PostedFile.FileName);
                            string pathDataSource = Server.MapPath("Invoices\\") + inFileName;

                            string conStr = "";
                            if (Extension == ".xls" || Extension == ".xlsx")
                            {
                                switch (Extension)
                                {
                                    case ".xls": //Excel 1997-2003
                                        conStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source='" + pathDataSource.ToString() + "';" + "Extended Properties=Excel 8.0;";
                                        break;
                                    case ".xlsx": //Excel 2007
                                        conStr = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source='" + fupExcel.PostedFile.FileName.ToString() + "';" + "Extended Properties=Excel 8.0;";
                                        break;
                                    default:
                                        break;
                                }

                                OleDbConnection connExcel = new OleDbConnection(conStr.ToString());
                                OleDbCommand cmdExcel = new OleDbCommand();
                                OleDbDataAdapter oda = new OleDbDataAdapter();
                                DataTable dt = new DataTable();
                                connExcel.Open();
                                DataSet ds = new DataSet();
                                //Selecting Values from the first sheet
                                //Sheet name must be as Sheet1
                                OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM [Members$]", conStr.ToString());
                                da.Fill(ds);
                                GridView1.DataSource = ds;
                                GridView1.DataBind();
                                if (GridView1.Columns.Count > 0)
                                {
                                }
                                connExcel.Close();
                                if (File.Exists(pathDataSource))
                                {
                                    File.Delete(pathDataSource);
                                }
                            }
                            else
                            {
                                //Show your error in any error controls
                            }
                        }
                        else
                        {
                            fupExcel.Focus();
                            GridView1.DataSource = null;
                            GridView1.DataBind();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        else
            Label1.Text = "Seleccione un archivo";
la variable fupexcel es el control FileUpload que les mencione en un principio. El primer if es para el caso que se presione el boton Upload sin haber seleccionado el archivo Excel. Presionen F5 y les saldra asi:

4 comentarios:

  1. hola estyo utilizando este ejemplo pero al momneto de gargar el excel me sale un erro y me dice que el objeto Members$ no se pudo encontrar me ayudas. a que ase referencia ese objeto..........

    ResponderEliminar
  2. Hola Andres, cuando haces SELECT * FROM [Members$]" estas buscando la hoja de tu excel donde Members es el nombre de tu hoja donde tienes tus datos,... cual es el nombre de la tuya?

    ResponderEliminar
  3. a mi no me saca ningun error pero tampoco me muestra nada solo la pagina de navegacion que saca el error de Internet Explorer no puede mostrar la página web.
    como puedo solucionar este problema..? o que es lo que esta pasando en el codigo..?

    ResponderEliminar
  4. a los que les da el error del members$ reemplacen la linea del if del 2007 por

    case ".xlsx": //Excel 2007
    conStr = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source='" + pathDataSource.ToString() + "';" + "Extended Properties=Excel 8.0;";
    break;

    ResponderEliminar