none
como importar y exportar un excel a mi sql server desde una asp.net C# RRS feed

  • Pregunta

  • Hola amigos 

    antes que nada aclaro que de este tema no se nada nunca he intentado subir un excel desde un asp.net c#

    y tal como dice la pregunta lo que quiero es importar y exportar un archivo Excel y que la informacion del excel acutualize mi tabla de la base de datos tengo esto pero no lo entiendo bien

    protected void ExportarCSV(DataTable table)
        {
            System.IO.FileStream ostrm;
            try
            {
                String sFilename = "Archivo.csv";
                System.IO.File.Delete(Page.MapPath(sFilename));
                ostrm = new System.IO.FileStream(Page.MapPath(sFilename), System.IO.FileMode.Append);
                System.IO.StreamWriter sw = new System.IO.StreamWriter(ostrm, System.Text.Encoding.Unicode);
                String s = "";
                DataSet dsContactos = (DataSet)Session["dtGridContactos"];
                if (table == null)
                    return;
                for (int i = 1; i < table.Columns.Count; i++)
                    s = s + table.Columns + ";";
                sw.WriteLine(s.TrimEnd(';'));
                s = "";
                for (int i = 0; i < table.Rows.Count; i++)
                {
                    for (int j = 0; j < table.Columns.Count; j++)
                        s = s + HttpUtility.HtmlDecode(table.Rows[i][j].ToString()) + ";";
                    sw.WriteLine(s.TrimEnd(';'));
                    s = "";
                }
                sw.Close();
                Response.Clear();
                //Response.AddHeader("content-disposition", "attachment;filename=Archivo.csv");
                Response.Charset = "";
                Response.Cache.SetCacheability(HttpCacheability.NoCache);
                Response.ContentType = "application/vnd.csv";
                Response.Charset = "UTF-8";
                Response.ContentEncoding = System.Text.Encoding.Unicode;
                Response.Redirect(sFilename, false);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message, ex);
            }
        }
    la otra cuestion es saber si puedo hacerlo con linq y no con dataset porque asi lo requiere el proyecto

    jueves, 16 de octubre de 2014 1:21

Respuestas

  • Ya estoy nuevamente.-

    En cuanto al error anterior es debido a que su metodo retorna un List<CobroEN>

    public List<CobroEN> GenearListaCobroMensual(Int32 banco, DateTime pFecha, int P)

    para que su codigo funcione debería Convertir su List<> en DataTable

    Para convertir una Lista en Datable

    Debe Crear un Metodo que reciba como parametro un List<> y Retorne un DataTable

     public static DataTable ConvertToDatatable<T>(IList<T> data)
            {
                PropertyDescriptorCollection props =
                    TypeDescriptor.GetProperties(typeof(T));
                DataTable table = new DataTable();
                for (int i = 0; i < props.Count; i++)
                {
                    PropertyDescriptor prop = props[i];
                    table.Columns.Add(prop.Name, prop.PropertyType);
                }
                object[] values = new object[props.Count];
                foreach (T item in data)
                {
                    for (int i = 0; i < values.Length; i++)
                    {
                        values[i] = props[i].GetValue(item);
                    }
                    table.Rows.Add(values);
                }
                return table;
            }

    Si usted esta trabajando en DotNet 3.0 o 3.5 agrege a la declaracion del metodo la palabra reservada "this"


     public static DataTable ConvertToDatatable<T>(this IList<T> data)

    En su Metodo debera hacer uso del metodo conversor

    .....   
     _Connection.Close();
    
     return ConvertToDatatable(_Lista);
    Espero sea de ayuda Saludos

    G. Poliovei

    • Marcado como respuesta Francisco901 martes, 21 de octubre de 2014 23:31
    martes, 21 de octubre de 2014 15:55
  • Hola George me da este error

    No olvide la palabra reservada static

    public static DataTable ConvertToDatatable<T>(this IList<T> data)

    si esta usando el metodo en su capa de datos no olvide cambiar el tipo de retorno en el principal

    public DataTable GenearListaCobroMensual(Int32 banco, DateTime pFecha, int P)


    G. Poliovei

    • Marcado como respuesta Francisco901 martes, 21 de octubre de 2014 23:31
    martes, 21 de octubre de 2014 21:15
  • Hola George ya lo hice pero me pide que la clase se igual estatica no generica pero si coloco como estatica la clase no me conecta con la interfaz la de la DAL

    esto es lo que me aparece como error

    no se si hay alguna forma que el metodo de extencion sea generico o es mas facil enlazar la DALcon la UI con el static en la clase 

    Quite la palabra reservada this de los argumentos


    G. Poliovei

    • Marcado como respuesta Francisco901 martes, 21 de octubre de 2014 23:31
    martes, 21 de octubre de 2014 22:52

Todas las respuestas

  • Lamentablemente, ya tengo todo cerrado, y no seria capaz de guiarte correctamente, pero puedo darte algunas pautas si gustas como referencia

    G. Poliovei

    jueves, 16 de octubre de 2014 1:51
  • si me parece George gracias

    jueves, 16 de octubre de 2014 14:05
  • Hola amigo e estado trabajando en mi proyecto y tengo este codigo pero me da error

    y en el codigo me dice este error

    este es mi codigo quien me puede ayudar

     protected void btnGenerarCobroExcel_Click(object sender, EventArgs e)
            {
                DataTable dtExportar;
                string Clave_secreta = "clave_de_32_caracteres_obligado.";
                try
                {
                    if (ddlLista.SelectedValue == "Mensual")
                    {
                        CobrosDALen _ListaMensuales = new CobrosDALen();
    
                        dtExportar = _ListaMensuales.GenearListaCobroMensual(Convert.ToInt32(ddlBanco.SelectedValue), 0);
                        DataTable mitabla = new DataTable();
    
                        if (ddlBanco.SelectedValue == "2")
                        {
                            mitabla.Columns.Add("uno");
                            mitabla.Columns.Add("KeyTagCliente");
                            mitabla.Columns.Add("Nombre");
                            mitabla.Columns.Add("NumeroTarjeta1");
                            mitabla.Columns.Add("FechaVencimiento1");
                            mitabla.Columns.Add("MontoCobro");
                            mitabla.Columns.Add("FechaCobro");
                            mitabla.Columns.Add("espacio");
                            mitabla.Columns.Add("NombreTarjetaHabiente1");
                            foreach (DataRow row in dtExportar.Rows)
                            {
                                DataRow fila = mitabla.NewRow();
                                fila[0] = 1;
                                fila[1] = row[0].ToString();
                                fila[2] = row[1].ToString();
                                fila[3] = _Encriptacion.desencriptar(row[2].ToString(), Clave_secreta);
                                fila[4] = row[3].ToString();
                                fila[5] = row[4].ToString();
                                fila[6] = row[5].ToString();
                                fila[7] = row[6].ToString();
                                fila[8] = row[7].ToString();
                                mitabla.Rows.Add(fila);
                            }
                        }
                        if (ddlBanco.SelectedValue == "1")
                        {
                            mitabla.Columns.Add("KeyTagCliente");
                            mitabla.Columns.Add("Nombre");
                            mitabla.Columns.Add("NumeroTarjeta1");
                            mitabla.Columns.Add("FechaVencimiento1");
                            mitabla.Columns.Add("MontoCobro");
                            mitabla.Columns.Add("NombreTarjetaHabiente1");
                            foreach (DataRow row in dtExportar.Rows)
                            {
                                DataRow fila = mitabla.NewRow();
                                fila[0] = row[0].ToString();
                                fila[1] = row[1].ToString();
                                fila[2] = _Encriptacion.desencriptar(row[2].ToString(), Clave_secreta);
                                fila[3] = row[3].ToString();
                                fila[4] = row[4].ToString();
                                fila[5] = row[7].ToString();
                            }
                        }
                        ExportToExcel(mitabla);
                    }
                    if (btnGenerarCobroExcel.Text == "Generar Archivo Excel" || btnGenerarCobroCSV.Text == "Generar Archivo CSV")
                    {
                        lblErrorGen.Text = "Generacion de Lista Exitosa";
                    }
                }
                catch (Exception l)
                {
                    lblErrorGen.Text = "Generacion de Lista erronea. Error en el archivo" + l;
                }
            }
    
            protected void btnGenerarCobroCSV_Click(object sender, EventArgs e)
            {
                DataTable dtExportar;
                string Clave_secreta = "clave_de_32_caracteres_obligado.";
                try
                {
                    if (ddlLista.SelectedValue == "Mensual")
                    {
                        CobrosDALen _ListaMensuales = new CobrosDALen();
    
                        dtExportar = _ListaMensuales.GenearListaCobroMensual();
                        DataTable mitabla = new DataTable();
    
                        if (ddlBanco.SelectedValue == "2")
                        {
                            mitabla.Columns.Add("uno");
                            mitabla.Columns.Add("KeyTagCliente");
                            mitabla.Columns.Add("Nombre");
                            mitabla.Columns.Add("NumeroTarjeta1");
                            mitabla.Columns.Add("FechaVencimiento1");
                            mitabla.Columns.Add("MontoCobro");
                            mitabla.Columns.Add("FechaCobro");
                            mitabla.Columns.Add("espacio");
                            mitabla.Columns.Add("NombreTarjetaHabiente1");
                            foreach (DataRow row in dtExportar.Rows)
                            {
                                DataRow fila = mitabla.NewRow();
                                fila[0] = 1;
                                fila[1] = row[0].ToString();
                                fila[2] = row[1].ToString();
                                fila[3] = _Encriptacion.desencriptar(row[2].ToString(), Clave_secreta);
                                fila[4] = row[3].ToString();
                                fila[5] = row[4].ToString();
                                fila[6] = row[5].ToString();
                                fila[7] = row[6].ToString();
                                fila[8] = row[7].ToString();
                                mitabla.Rows.Add(fila);
                            }
                        }
                        if (ddlBanco.SelectedValue == "1")
                        {
                            mitabla.Columns.Add("KeyTagCliente");
                            mitabla.Columns.Add("Nombre");
                            mitabla.Columns.Add("NumeroTarjeta1");
                            mitabla.Columns.Add("FechaVencimiento1");
                            mitabla.Columns.Add("MontoCobro");
                            mitabla.Columns.Add("NombreTarjetaHabiente1");
                            foreach (DataRow row in dtExportar.Rows)
                            {
                                DataRow fila = mitabla.NewRow();
                                fila[0] = row[0].ToString();
                                fila[1] = row[1].ToString();
                                fila[2] = _Encriptacion.desencriptar(row[2].ToString(), Clave_secreta);
                                fila[3] = row[3].ToString();
                                fila[4] = row[4].ToString();
                                fila[5] = row[7].ToString();
                            }
                        }
                        ExportarCSV(mitabla);
                    }
                    if (btnGenerarCobroExcel.Text == "Generar Archivo Excel" || btnGenerarCobroCSV.Text == "Generar Archivo CSV")
                    {
                        lblErrorGen.Text = "Generacion de Lista Exitosa";
                    }
                }
                catch (Exception l)
                {
                    lblErrorGen.Text = "Generacion de Lista erronea. Error en el archivo" + l;
                }
            }

    lunes, 20 de octubre de 2014 20:47
  • Hola, habría que mirar el método

    GenearListaCobroMensual

    G. Poliovei

    lunes, 20 de octubre de 2014 21:03
  • Hola Gracias por contestar George este es mi metodo 

     public List<CobroEN> GenearListaCobroMensual(Int32 banco, DateTime pFecha, int P)
            {
                string _StringDeConexion = @"Data Source=FRANCISCO-HP\PROGRASQLSERVER;Initial Catalog=BefitSysDB;Integrated Security=True";
    
                using (SqlConnection _Connection = new SqlConnection(_StringDeConexion))
                {
                    _Connection.Open();
    
                    List<CobroEN> _Lista = new List<CobroEN>();
    
                    #region
                    string sentencia = (@"
                    declare @Idbanco int
                    declare @fecha date
                    declare @P int
    
                    -----------------------------------------------------------------------------------------------------------------------
    
                    if @Idbanco = 2
                    begin
    SELECT distinct KeyTagCliente,
           [Nombre1Socio]+isnull(' '+[Nombre2Socio],' ')+ isnull(' '+[Apellido1Socio],' ')+ isnull(' '+[Apellido2Socio],' ') as Nombre,
           NumeroTarjeta1,
          (SUBSTRING(CONVERT(VARCHAR(10),FechaVencimientoTarjeta1, 103),4, 2)+RIGHT(CONVERT(VARCHAR(10),FechaVencimientoTarjeta1, 103), 4)) AS [MMYYYY] , 
           (left(Round(t.Mensualidad *1.13,2),5)) as Mensualidad
            ,(SUBSTRING(CONVERT(VARCHAR(10),getdate(), 103),1, 2)+ SUBSTRING(CONVERT(VARCHAR(10),getdate(), 103),4, 2)+RIGHT(CONVERT(VARCHAR(10),getdate(), 103), 4)) AS cobro ,
           
           --@Fecha as Fechac,
           ' ' as espacio,
           NombreTarjetaHabiente1,
           bin
      FROM [dbo].DatosSocioLGV c inner join dbo.TipoMembresia t on 
      t.CodigoTipoMembresia  = c.CodigoTipoMembresia where CodigoEstadoCliente = 'Activo' and t.PeriodoCobro = 'Mensual' 
     end
     
     
     
     if @Idbanco = 1  and @P =1
     begin
     
     SELECT distinct KeyTagCliente,
          [Nombre1Socio]+isnull(' '+[Nombre2Socio],' ')+ isnull(' '+[Apellido1Socio],' ')+ isnull(' '+[Apellido2Socio],' ')  as nombre,
           NumeroTarjeta1,
            (SUBSTRING(CONVERT(VARCHAR(10),FechaVencimientoTarjeta1, 103),4, 2)+RIGHT(CONVERT(VARCHAR(10),FechaVencimientoTarjeta1, 103), 4)) AS [MMYYYY] , 
           (left(Round(t.Mensualidad *1.13,2),5))as Mensualidad,
            --(left(CONVERT(VARCHAR(10),@Fecha, 103), 2)+RIGHT(CONVERT(VARCHAR(10),@Fecha, 103), 4)) AS Cobro , 
           --@Fecha,
           NombreTarjetaHabiente1,
           bin
      FROM [dbo].DatosSocioLGV c inner join dbo.TipoMembresia t on 
      t.CodigoTipoMembresia  = c.CodigoTipoMembresia where CodigoEstadoCliente = 'Activo' and t.Periodocobro = 'Mensual' 
      --and bin in(select bin FROM dbo.Bines)
      end
      
      if @Idbanco = 1  and @P =0
     begin
     
     SELECT distinct KeyTagCliente,
          [Nombre1Socio]+isnull(' '+[Nombre2Socio],' ')+ isnull(' '+[Apellido1Socio],' ')+ isnull(' '+[Apellido2Socio],' ')  as nombre,
           NumeroTarjeta1,
            (SUBSTRING(CONVERT(VARCHAR(10),FechaVencimientoTarjeta1, 103),4, 2)+RIGHT(CONVERT(VARCHAR(10),FechaVencimientoTarjeta1, 103), 4)) AS [MMYYYY] , 
           (left(Round(t.Mensualidad *1.13,2),5))as Mensualidad,
            --(left(CONVERT(VARCHAR(10),@Fecha, 103), 2)+RIGHT(CONVERT(VARCHAR(10),@Fecha, 103), 4)) AS Cobro , 
           --@Fecha,
           NombreTarjetaHabiente1,
           bin
      FROM [dbo].DatosSocioLGV c inner join dbo.TipoMembresia t on 
      t.CodigoTipoMembresia  = c.CodigoTipoMembresia where CodigoEstadoCliente = 'Activo' and t.Periodocobro = 'Mensual' 
      --and bin not in(s
                    ");
                    #endregion
    
                    SqlCommand _Command = new SqlCommand(sentencia, _Connection);
    
                    IDataReader _reader = _Command.ExecuteReader();
    
                    while (_reader.Read())
                    {
                        _Lista.Add(new CobroEN(_reader.GetString(0), _reader.GetString(1), _reader.GetString(2), _reader.GetString(3),
                            _reader.GetString(4), _reader.GetString(5), _reader.GetDateTime(6), _reader.GetDecimal(7), _reader.GetString(8), _reader.GetString(9)));
                    }
    
                    _Connection.Close();
    
                    return _Lista;
                }
            }

    lo que hice fue hacer una consulta desde mi Capa de acceso a datos la cual se enlaza con mi capa de entidades no se si es correcto lo que hice y si la consulta esta correcta

    lunes, 20 de octubre de 2014 21:25
  • Voy a hablar sobre el error especifico que le marca

    Su Metodo debe recibir 3 argumentos

     public List<CobroEN> GenearListaCobroMensual(Int32 banco, DateTime pFecha, int P)
    Usted le esta pasando primero

    (ninguno)

      dtExportar = _ListaMensuales.GenearListaCobroMensual();
    y en otra llamada le esta pasando (dos)
       dtExportar = _ListaMensuales.GenearListaCobroMensual(Convert.ToInt32(ddlBanco.SelectedValue), 0);


    G. Poliovei

    lunes, 20 de octubre de 2014 21:33
  • hola George gracias por tenerme paciencia

    ya puse los tres argumentos y me da este error

    if (ddlLista.SelectedValue == "Mensual")
                    {
                        CobrosDALen _ListaMensuales = new CobrosDALen();
    
                        dtExportar = _ListaMensuales.GenearListaCobroMensual(Convert.ToInt32(ddlBanco.SelectedValue), Convert.ToDateTime(txtMes.Text), 0);
                        DataTable mitabla = new DataTable();
    
                        if (ddlBanco.SelectedValue == "2")
                        {
                            mitabla.Columns.Add("uno");
                            mitabla.Columns.Add("KeyTagCliente");
                            mitabla.Columns.Add("Nombre");
                            mitabla.Columns.Add("NumeroTarjeta1");
                            mitabla.Columns.Add("FechaVencimiento1");
                            mitabla.Columns.Add("MontoCobro");
                            mitabla.Columns.Add("FechaCobro");
                            mitabla.Columns.Add("espacio");
                            mitabla.Columns.Add("NombreTarjetaHabiente1");
                            foreach (DataRow row in dtExportar.Rows)
                            {

    lunes, 20 de octubre de 2014 22:30
  • Pero cual es el objetivo final?

    Solo quiere exportar la información de un excel a su base de datos?

    Porque puedo sugerir otras técnicas menos complejas si desea como por ejemplo el uso de OPENROWSET


    G. Poliovei

    lunes, 20 de octubre de 2014 22:35
  • no al reves de la base de datos debo exporta a excel y viceversa, la cuestión es que estos excel son listas de cobros que se descarga cada cierto tiempo y se mandan a un banco para que sean autorizadas luego el banco las menda de nuevo y se actualiza la informacion importando el excel que el banco manda con los clientes a quienes se les aprobo el cobro, yo tengo varios procedimientos almacenados que hacen estos procesos pero me han pedido que no use los SP y que lo haga directo en el codigo como lo hice en la pregunta pero si hay formas menos complicada estoy abierto a opiniones que toda ayuda sera muy bien recibida.

    no se si me di a entender en el objetivo con el OPENROWSET Podria lograr este objetivo

    lunes, 20 de octubre de 2014 23:01
  • Por supuesto, puede hacer una prueba en su management

    Este es un ejemplo muy bueno

    Sugiero que efectué algunas pruebas en su bd

    usted puede cargar la informacion a una tabla del server y procesarla a traves de un SP listando el resultado



    G. Poliovei


    lunes, 20 de octubre de 2014 23:27
  • Por supuesto, puede hacer una prueba en su management

    Este es un ejemplo muy bueno

    Sugiero que efectué algunas pruebas en su bd

    usted puede cargar la informacion a una tabla del server y procesarla a traves de un SP listando el resultado



    G. Poliovei


    Hola George gracias por contestar y el apoyo ya revise la información y si esta muy pero muy interesante pero segúnlo que entendí este método no tiene la capacidad de crear el archivo al momento de exportar y yo lo que necesito es que cuando exporte de la base de datos me genere en automático el documento de excel
    martes, 21 de octubre de 2014 0:57
  • usted puede crear un nuevo archivo y exportar la información, manana en la manana preparamos un ejemplo y lo dejo para usted

    saludos


    G. Poliovei

    martes, 21 de octubre de 2014 1:50
  • Muchas gracias George enserio no se como agradecerle por su ayuda mas que solo decirle gracias y me quedo corto gracias y no lo digo solo por ser adulador
    martes, 21 de octubre de 2014 15:17
  • Ya estoy nuevamente.-

    En cuanto al error anterior es debido a que su metodo retorna un List<CobroEN>

    public List<CobroEN> GenearListaCobroMensual(Int32 banco, DateTime pFecha, int P)

    para que su codigo funcione debería Convertir su List<> en DataTable

    Para convertir una Lista en Datable

    Debe Crear un Metodo que reciba como parametro un List<> y Retorne un DataTable

     public static DataTable ConvertToDatatable<T>(IList<T> data)
            {
                PropertyDescriptorCollection props =
                    TypeDescriptor.GetProperties(typeof(T));
                DataTable table = new DataTable();
                for (int i = 0; i < props.Count; i++)
                {
                    PropertyDescriptor prop = props[i];
                    table.Columns.Add(prop.Name, prop.PropertyType);
                }
                object[] values = new object[props.Count];
                foreach (T item in data)
                {
                    for (int i = 0; i < values.Length; i++)
                    {
                        values[i] = props[i].GetValue(item);
                    }
                    table.Rows.Add(values);
                }
                return table;
            }

    Si usted esta trabajando en DotNet 3.0 o 3.5 agrege a la declaracion del metodo la palabra reservada "this"


     public static DataTable ConvertToDatatable<T>(this IList<T> data)

    En su Metodo debera hacer uso del metodo conversor

    .....   
     _Connection.Close();
    
     return ConvertToDatatable(_Lista);
    Espero sea de ayuda Saludos

    G. Poliovei

    • Marcado como respuesta Francisco901 martes, 21 de octubre de 2014 23:31
    martes, 21 de octubre de 2014 15:55
  • Hola George me da este error

    martes, 21 de octubre de 2014 20:33
  • Hola George me da este error

    No olvide la palabra reservada static

    public static DataTable ConvertToDatatable<T>(this IList<T> data)

    si esta usando el metodo en su capa de datos no olvide cambiar el tipo de retorno en el principal

    public DataTable GenearListaCobroMensual(Int32 banco, DateTime pFecha, int P)


    G. Poliovei

    • Marcado como respuesta Francisco901 martes, 21 de octubre de 2014 23:31
    martes, 21 de octubre de 2014 21:15
  • Hola George ya lo hice pero me pide que la clase se igual estatica no generica pero si coloco como estatica la clase no me conecta con la interfaz la de la DAL

    esto es lo que me aparece como error

    no se si hay alguna forma que el metodo de extencion sea generico o es mas facil enlazar la DALcon la UI con el static en la clase 

    martes, 21 de octubre de 2014 22:32
  • Hola George ya lo hice pero me pide que la clase se igual estatica no generica pero si coloco como estatica la clase no me conecta con la interfaz la de la DAL

    esto es lo que me aparece como error

    no se si hay alguna forma que el metodo de extencion sea generico o es mas facil enlazar la DALcon la UI con el static en la clase 

    Quite la palabra reservada this de los argumentos


    G. Poliovei

    • Marcado como respuesta Francisco901 martes, 21 de octubre de 2014 23:31
    martes, 21 de octubre de 2014 22:52
  • Gracias muchas gracias ya no me da el error muchas gracias por la paciencia ahora a liriar con otro problema pero gracias muchas gracias por el apoyo 
    • Propuesto como respuesta George Poliovei miércoles, 22 de octubre de 2014 0:07
    martes, 21 de octubre de 2014 23:30
  • Hola George perdon que te moleste de nuevo ya compile el sistema y cuando doy click en el boton que exporta los datos al excel y me da este error

    Generacion de Lista erronea. Error en el archivoSystem.Data.SqlClient.SqlException (0x80131904)

    En especifico esto me muestra

    porque da ese error no se si me puedes ayudar perdon por las molestias

    jueves, 23 de octubre de 2014 1:26
  • Hola ya lo solucione solo era agregar un END a mi sentencia y ya no salio ese error

    lo unico que no entiendo es porque descarga vacio el archivo CSV 

    jueves, 23 de octubre de 2014 18:05