Foros del Web » Programación para mayores de 30 ;) » .NET »

cargar excel a un gridview en asp.net y c#

Estas en el tema de cargar excel a un gridview en asp.net y c# en el foro de .NET en Foros del Web. bueno primero los saludo, soy nuevo en el foro y espero poder aportar tanto como me puedan ayudar, bueno al punto en cuestion: estoy desarrollando ...
  #1 (permalink)  
Antiguo 02/01/2011, 15:49
 
Fecha de Ingreso: enero-2011
Ubicación: Concepción
Mensajes: 26
Antigüedad: 13 años, 3 meses
Puntos: 0
cargar excel a un gridview en asp.net y c#

bueno primero los saludo, soy nuevo en el foro y espero poder aportar tanto como me puedan ayudar, bueno al punto en cuestion:

estoy desarrollando una aplicación en donde devo cargar un archivo excel a un gridview, la idea es que desde un fileupload obtengo la uvicación del archivo en el equipo y de hay en un boton aparte uso esa dirección para cargar el archivo en cuestion, el problema esta en que no c como hacerlo :(....ya perdi la cuenta de cuantos foros e visitado tratando de encontrar la solución, encontre una aplicación que se supone hace lo que necesito pero no me funciona , me marca un error al momento de cargar el excel al gridview y no entiendo cua es, por favor si alguien me pudiera explicar de forma clara o aun mejor pasarme un codigo para entenderlo se los agradeseria enormemente, aqui les dejo lo que encontre:

http://arielserlin.blogspot.com/2008/12/cargar-hoja-de-excel-xls-en-gridview-de.html

el error que me da es el mismo que le da a una persona que posteo casi al final, me dice que el motor jet no encuentra la hoja1, q no existe, plz estoy desesperado ayudenme TT...de antemano gracias

Última edición por cuervo_odin; 03/01/2011 a las 13:58
  #2 (permalink)  
Antiguo 03/01/2011, 15:16
Avatar de Porlachucha  
Fecha de Ingreso: noviembre-2008
Ubicación: Santiago
Mensajes: 172
Antigüedad: 15 años, 5 meses
Puntos: 5
Respuesta: cargar excel a un gridview en asp.net y c#

tienes 3 formas de hacer esta tarea....

1.- Cargar usando adaptador JET... lo cual no te recomiendo a menos que asegures que los tipos de datos no van a cambiar en las filas, ya que esto provoca que el motor se confunda y formatee los datos de acuerdo a los 5 primeros registros de cada columna..
de todas formas aca te dejo un codigo con el cual puedes usar este metodo.

Código:
        public static DataTable dttLeerDatosDesdeExcel(string sNombreArchivo, string sNombreHoja, bool bTodoTexto)
        {
            try
            {
                OleDbConnection oConnXLS = new OleDbConnection();        //Crea una nueva conexion al excel
                OleDbCommand oDBCmdXLS = new OleDbCommand();             //objeto command, para excel
                OleDbDataAdapter oDBDaXLS = new OleDbDataAdapter();      //objeto dataadapter para el excel
                DataTable dttDatosXLS = new DataTable();                  //contiene TODOS los datos del Excel
                //oConnXLS.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + sNombreArchivo + ";Extended Properties=\"Excel 8.0;HDR=No;IMEX=1\"";

                //string sConexionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + sNombreArchivo + @;Extended Properties="Excel 8.0;HDR=No;IMEX=1";
                //oConnXLS.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + sNombreArchivo + ";Extended Properties=Excel 8.0;";

                string sConexionString;
                if (bTodoTexto)
                {
                    sConexionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=";
                    sConexionString += sNombreArchivo;
                    sConexionString += ";Extended Properties=\"Excel 8.0;HDR=No;IMEX=1\"";
                }
                oConnXLS.ConnectionString = sConexionString;
                oConnXLS.Open();
                oDBCmdXLS.CommandText = "Select * From [" + sNombreHoja + "$]";
                oDBCmdXLS.Connection = oConnXLS;
                oDBDaXLS.SelectCommand = oDBCmdXLS;
                oDBDaXLS.Fill(dttDatosXLS);
                oConnXLS.Close();
                if (dttDatosXLS.Rows.Count > 0)
                {
                    return dttDatosXLS;
                }
                else
                {
                    return null;
                }
            }
            catch (System.IO.IOException Err0)
            {
                return null;
            }
        }
una segunda opcion, es utilizar Objetos COM, par alo cual debes tener instalado office (excel) en la maquina donde vas a ejecutar el programa. Toiene un inconveniente, y es que es un poco complicado eliminar las instancias de la memoria despues de terminar de usar la fiuncion... esto puede provocar por ejemplo si se instala en un server, que se vayan generando procesos que no se eliminan.. y al fiunal tienes como 1000....
El codigo es el siguiente (al final hay unos procesos que sirven para eliminar procesos de la memoria, pero no funciona muy bien)

Código:
          private System.Data.DataSet _dttXlsToDts(string _sPath, string _sHoja, System.Data.DataTable _dttFormato, string _sPassword)
        {
            dtsDataSource = new DataSet(_sPath.Substring(_sPath.LastIndexOf("\\") + 1));
            int iTime = 50;
            Microsoft.Office.Interop.Excel.Application oApp = new Microsoft.Office.Interop.Excel.Application();
            Microsoft.Office.Interop.Excel.Workbooks oBooks = oApp.Workbooks;
            Microsoft.Office.Interop.Excel.Workbook oBook = oBooks.Add(Type.Missing);

            oBook = oApp.Workbooks.Open(_sPath,             //Source File Name
                                      0,                    //UpdateLinks
                                      false,                //ReadOnly
                                      5,                    //Format
                                      "",                   //Password
                                      "",                   //WriteResPassword
                                      true,                 //IgnoreReadOnly
                                      Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, //Origin
                                      "\t",                 //Delimiter
                                      false,                //Editable
                                      false,                //Notify
                                      0,                    //Converter
                                      false,                //AddToMru
                                      null,                 //Load
                                      null);                //CorruptLoad

            for (int i = 1; i < oBook.Worksheets.Count + 1; i++)
            {
                Microsoft.Office.Interop.Excel.Worksheet sheet = new Microsoft.Office.Interop.Excel.Worksheet();
                sheet = (Microsoft.Office.Interop.Excel.Worksheet)oBook.Worksheets.get_Item(i);
                if (sheet.Name.ToString().Trim().ToUpper() == _sHoja.Trim().ToUpper())
                {


                    System.Data.DataTable dttAux = new System.Data.DataTable();
                    dttAux = loadDataTable((Microsoft.Office.Interop.Excel.Worksheet)oBook.Worksheets.get_Item(i));
                    if (dttAux == null || dttAux.Rows.Count == 0)
                    {
                        continue;
                    }

                    // revisa si existe el datatable con el formato
                    if (_dttFormato != null && _dttFormato.Rows.Count > 0)
                    {
                        if (bFormatoOK(_dttFormato, dttAux))
                        {
                            dtsDataSource.Tables.Add(dttAux);
                        }
                    }
                }
            }
            #region Close WorkBook Method Parameters
            //NAR(hoja, iTime);
            oBook.Close(false, Type.Missing, Type.Missing);
            NAR(oBook, iTime);
            NAR(oBooks, iTime);
            oApp.Quit();
            NAR(oApp, iTime);

            if (!bKillExcellProcess(iTime))
            {
                return null;
            }
            #endregion
            return dtsDataSource;
            #endregion
        }

        public static void NAR(object o, int iTime)
        {
            try
            {
                System.Threading.Thread.Sleep(iTime);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
                System.Threading.Thread.Sleep(iTime);
            }
            catch (Exception ex)
            {
                System.Console.WriteLine("objeto cerrado [" + o.ToString().Trim() + "] Error [" + ex.ToString().Trim() + "]");
            }
            finally
            {
                o = null;
            }
        }
        public static bool bKillExcellProcess(int iTime)
        {
            // elimina procesos excel por si hubiese alguno
            try
            {
                System.Threading.Thread.Sleep(iTime);
                int idproc = GetIDProcces("EXCEL");
                while (idproc != -1)
                {
                    System.Threading.Thread.Sleep(iTime);
                    idproc = GetIDProcces("EXCEL");
                    if (idproc != -1)
                    {
                        Process.GetProcessById(idproc).Kill();
                    }
                }
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }
        public static int GetIDProcces(string nameProcces)
        {
            try
            {
                Process[] asProccess = Process.GetProcessesByName(nameProcces);
                foreach (Process pProccess in asProccess)
                {
                    /*if (pProccess.MainWindowTitle.ToString().Trim().Substring(0, 14) == "Microsoft Excel")
                    {
                        return pProccess.Id;
                    }*/

                    if (pProccess.MainWindowTitle == "")
                    {
                        return pProccess.Id;
                    }
                }
                return -1;
            }
            catch (Exception ex)
            {
                return -1;
            }
        }
Una tercera opcion (que es mejor que las 2 anteriores), pero que es necesario tener instalado un prodyucto de terceros ej: aspose, devexpress, o alguna otra weba por el estilo.. este metodo es mejor, porque no tiene los problemas de los metodos anteriores.. pero requiere licencia.
aca te dejo un ejemplo con un producto que se llam aspose
Código:
        public static DataTable dttLeerDatosDesdeExcel(string sArchivo, string sHoja, DataTable dttFormatoExcel)
        {
            Aspose.Cells.License license = new Aspose.Cells.License();
            license.SetLicense("Aspose.Cells.lic");
            Workbook workbook = new Workbook();
            workbook.Open(sArchivo);
            Worksheet worksheet = workbook.Worksheets[sHoja];
            int iNumeroMaximoFilas = worksheet.Cells.MaxDataRow + 1;
            int iNumeroMaximoColumnas = worksheet.Cells.MaxDataColumn + 1;
            DataTable dttAux = worksheet.Cells.ExportDataTable(0, 0, iNumeroMaximoFilas, iNumeroMaximoColumnas, false);
            return dttAux;

        }

espero te sirva
__________________
Nada mas patetico que "detestar" a Intel o Microsoft o Windows o Apple ... apuesto que eres el tipico teton espinilluo y pajero que usa Linux para sentirse capo ...
  #3 (permalink)  
Antiguo 03/01/2011, 16:08
 
Fecha de Ingreso: enero-2011
Ubicación: Concepción
Mensajes: 26
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: cargar excel a un gridview en asp.net y c#

bueno gracias por tu ayuda, creo que lo que estoy usando es muy similar a la segunda opción que me diste, pero el problema esta en que al momento de tomar los datos de la hoja excel, en este caso de la hoja1 me dice que el motor de base de datos Microsoft Jet no pudo encontrar el objeto 'Hoja1$' y me pide que me Asegúre de que el objeto existe, y que he escrito el nombre y la ruta de acceso al objeto correctamente; ahora, se muy bien que el objeto existe, esta en el escritorio de mi equipo y ademas la ruta esta bien = ps, entonce no c que problema es exactamente, también pense que puede ser un problema de versiones de excel ( 2007 o 2003 ) pero tampoco es eso :( .....bueno e aqui lo q tengo aver si alguien me puede ayudar plz TT....:

protected void Page_Load(object sender, EventArgs e)
{
string cnstr = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=C:\\horarios.xls;"
+ "Extended Properties=Excel 8.0";
System.Data.OleDb.OleDbConnection oledbConn = new System.Data.OleDb.OleDbConnection(cnstr);
string strSQL = "SELECT * FROM [Hoja1$]";

System.Data.OleDb.OleDbCommand cmd = new System.Data.OleDb.OleDbCommand(strSQL, oledbConn);
DataSet ds = new DataSet();
System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter(cmd);
da.Fill(ds);
GridView1.DataSource = ds;
GridView1.DataBind();
}

de antemano gracias por su tiempo y pasiensia y ojala que salga ^^

Última edición por cuervo_odin; 03/01/2011 a las 16:14
  #4 (permalink)  
Antiguo 03/01/2011, 20:15
Avatar de Porlachucha  
Fecha de Ingreso: noviembre-2008
Ubicación: Santiago
Mensajes: 172
Antigüedad: 15 años, 5 meses
Puntos: 5
Respuesta: cargar excel a un gridview en asp.net y c#

dices que el archivo a leer esta en tu escritorio... pero tienes el archivo en la raiz del disco c:
revisa ese punto. por lo demas, es lo mismo que el primer ejemplo que te di, salvo que ahi esta parametrizado.

saludos
plch
__________________
Nada mas patetico que "detestar" a Intel o Microsoft o Windows o Apple ... apuesto que eres el tipico teton espinilluo y pajero que usa Linux para sentirse capo ...
  #5 (permalink)  
Antiguo 04/01/2011, 09:33
 
Fecha de Ingreso: enero-2011
Ubicación: Concepción
Mensajes: 26
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: cargar excel a un gridview en asp.net y c#

gracias por tu ayuda, me a servido, al menos ya no me marca el error de antes y al pareser creo que se hace la conección, el problema es que no me carga nada en el gridview :/.....
tengo esto en un boton de cargar en mi pagina web, entonces al momento de precionarlo me aparese abajo conectando con localhost, pasan unos segundos....y no pasa nada....se me ocurre que talvez el problema esta en la parte donde se conecta el gridview con el dataset.....plz....help TT

protected void Button1_Click(object sender, EventArgs e)
{
string cnstr = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=C:\\Users\\Ramiro\\Desktop\\horarios.xls;"
+ "Extended Properties=Excel 8.0";
System.Data.OleDb.OleDbConnection oledbConn = new System.Data.OleDb.OleDbConnection(cnstr);
string strSQL = "SELECT * FROM [Hoja1$]";

System.Data.OleDb.OleDbCommand cmd = new System.Data.OleDb.OleDbCommand(strSQL, oledbConn);
DataSet ds = new DataSet();
System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter(cmd);
da.Fill(ds);
GridView1.DataSource = ds;
GridView1.DataBind();
}

...............
  #6 (permalink)  
Antiguo 04/01/2011, 12:00
Avatar de Porlachucha  
Fecha de Ingreso: noviembre-2008
Ubicación: Santiago
Mensajes: 172
Antigüedad: 15 años, 5 meses
Puntos: 5
Respuesta: cargar excel a un gridview en asp.net y c#

la verdad, no le veo ningun problema al codigo qu epusiste... puede ser que quiza la hoja no tenga el nombre que estas señalando?? intenta revisar eso, porque a simple vista, el codigo deberia funcionar.
de todas formas, te recomiendo que debugees la aplicacion, y vayas paso a paso viendo si el dataset que tienes definido se carga con datos.

salu2
plch
__________________
Nada mas patetico que "detestar" a Intel o Microsoft o Windows o Apple ... apuesto que eres el tipico teton espinilluo y pajero que usa Linux para sentirse capo ...
  #7 (permalink)  
Antiguo 05/01/2011, 11:48
 
Fecha de Ingreso: enero-2011
Ubicación: Concepción
Mensajes: 26
Antigüedad: 13 años, 3 meses
Puntos: 0
SOLUCIONADO POR FIN: cargar excel a un gridview en asp.net y c#

POR FIN PUDE LOGRARLO!!!!!XD
estuve webiando como un mes por foros ,google y más y más foros pero al fin lo consegui en esta pagina esta explicado paso a paso y con lujo de detalles para los que necesiten lo mismo q yo necesitaba :D

http://msmvps.com/blogs/cwalzer/pages/exceladoaspnet.aspx

al pareser mi problema estab en que no le avia asignado en nombre de espasio de datos al libro excel, hay explica muy bien como hacerlo, aunque es un excel 2003 si no me equivovo, para los q tengan el office 2007 eso se hace en menu>formulas>administrador de nombres y hay le dan el nombre que necesiten :D
bueno un gusto aportar con esto y gracias a Porlachucha q me ayudo a aclarar algunas cosas , un saludo...

Etiquetas: excel, gridview
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:26.