none
Generar un archivo excel en C# RRS feed

  • Pregunta

  • Buen día,

    Espero puedan explicarme o si pueden proporcionarme algún link de como generar un archivo excel en c#
    Estoy haciendo un programa utilizando sql server 2008 r2 y Visual Studio 2012 C# y requiero que al ingresar los datos de:

    No.MAQUINA NUM ORDEN CANT.PZS

    103                     16672                 14

    y una vez terminado de ingresar la información en cada columna, dar click en un botón y me cree un archivo con este formato:


    Espero me haya dado a entender y espero su colaboración.

    Muchas gracias,
    Saludos Cordiales.

    lunes, 20 de agosto de 2018 16:19

Respuestas

  • Cierto, tienes toda la razón. Empecé pesando en Excel y no sé por qué razón mientras estaba escribiendo me despisté y me puse a hablar del PDF, probablemente porque poco antes había estado contestando a otra pregunta donde pedían un PDF.

    Para el Excel también podrías usar la opción del reporte y pedir la exportación en Excel en lugar de PDF.

    La opción de librerías de terceras partes también sería válida, por ejemplo, podrías usar la librería ClosedXML.

    También hay una librería de Microsoft que puedes usar, llamada OpenXML. La curva de aprendizaje es un poco empinada, pero una vez que aprendes a usarla es potentísima y puedes generar lo que quieras en el Excel, grabándolo línea por línea. Solo vale para xlsx, no para xls.

    Otra opción es usar el propio Excel si es que va a estar instalado en los equipos en los que vaya a rodar el programa. Pones en tu proyecto una Referencia como objeto COM, y le envías los comandos para que construya la hoja con los datos que quieras.

    Otra opción es usar el driver de OleDb. Este es muy sencillo de usar si te basta con tener datos en forma tabular, porque lo llamas como si fuera una base de datos. Pero solo te permite una tabla por hoja, así que no valdría para generar el formato que quieres.

    • Propuesto como respuesta Jorge TurradoMVP martes, 21 de agosto de 2018 7:54
    • Marcado como respuesta Cashmere VM martes, 21 de agosto de 2018 17:52
    martes, 21 de agosto de 2018 6:05
    Moderador
  • hola

    usa librerias basadas en open xml

    Inserting Tables

    alli veras un ejemplo de como usar ClosedXml

    lo bueno es que no necesitas de office instado para poder generar el excel

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Cashmere VM martes, 21 de agosto de 2018 17:53
    martes, 21 de agosto de 2018 13:39
  • si coloco el 103 me manda la información del ID - 13

    Es un error un poco raro. Tendrías que seguir la ejecución con el debugger, copiar la sentencia que te ha generado en tiempo de ejecución, y ejecutarla manualmente contra el SQL Server a ver qué devuelve.

    Por ejemplo, dado que usas un "LIKE" y lleva un comodín, podría ser que hubiera más de un registro devuelto por la consulta, y dado que solo lees el primero que te devuelve, tal vez éste no sea el que esperabas. Pero esto es pura especulación, para saber lo que está pasando de verdad, sigue la ejecución con el debugger y comprueba en lado servidor cuál es la consulta realmente generada y qué es lo que realmente está devolviendo.

    • Marcado como respuesta Cashmere VM miércoles, 22 de agosto de 2018 14:21
    miércoles, 22 de agosto de 2018 5:54
    Moderador
  • Lo más sencillo es quitar el "%", si no quieres hacer búsquedas con comodines, es más de hecho no solo no necesitas la búsqueda con comodines sino que de hecho es la que te está haciendo fallar el programa. ¿Por qué pusiste el LIKE y el % si no quieres buscar todos los registros que empiecen por el mismo valor?

    scmd.CommandText = "SELECT Num_Orden FROM CapturasTej WHERE No_Maquina = ('" + txtNoMaquina.Text + "')";
            

    Nota: En la sentencia anterior únicamente te he corregido el LIKE y el %, no te he arreglado la mala práctica de concatenar en la sentencia un dato tecleado por el usuario. Esto se arregla parametrizando la sentencia, pero sobre este tema ya se han vertido ríos de tinta en los foros y en artículos en Internet, así que no vamos a repetirlo aquí.

    • Marcado como respuesta Cashmere VM miércoles, 22 de agosto de 2018 21:47
    miércoles, 22 de agosto de 2018 21:02
    Moderador
  • Pon el código completo tal como te ha quedado después de quitarle el % y el LIKE. Si sigue fallando, debe haber todavía algún comodín por algún sitio.
    • Marcado como respuesta Cashmere VM jueves, 23 de agosto de 2018 14:45
    jueves, 23 de agosto de 2018 5:50
    Moderador

Todas las respuestas

  • Te pongo un par de opciones que se me ocurren:

    1) Definir un informe .rdl con Reporting Services en lado servidor o un .rdlc para el ReportViewer en lado cliente. El informe define unas tablas con el formato que deseas en el PDF, y toma los datos a partir de un parámetro que le pasas por programación. Cuando quieras generar el PDF desde C#, le pasas el comando de "exportar a PDF" al Webservice de SSRS (si usaste un .rdlc) o al ReportViewer (si usaste un .rdl).

    2) Usar una librería de terceros para generar PDF, tal como iTextSharp. En este caso, le vas proporcionando por programación uno por uno cada uno de los datos que se requieren. Llevará mucho código, pero es muy versátil porque puedes generar "lo que quieras", a diferencia de la opción del reporte, que solo es sencilla si el contenido del PDF concuerda con las facilidades del generador de informes.

    lunes, 20 de agosto de 2018 18:57
    Moderador
  • Gracias por tu respuesta Alberto Población,

    Pero no quiero generar un PDF, sino un archivo EXCEL con el formato que adjunte de la imagen en mi pregunta.
    Espero me puedas guiar un poco más al tema de crear un archivo Excel desde mi programa de C#


    Quedo en espera de una pronta respuesta.
    Gracias.

    lunes, 20 de agosto de 2018 20:46
  • Cierto, tienes toda la razón. Empecé pesando en Excel y no sé por qué razón mientras estaba escribiendo me despisté y me puse a hablar del PDF, probablemente porque poco antes había estado contestando a otra pregunta donde pedían un PDF.

    Para el Excel también podrías usar la opción del reporte y pedir la exportación en Excel en lugar de PDF.

    La opción de librerías de terceras partes también sería válida, por ejemplo, podrías usar la librería ClosedXML.

    También hay una librería de Microsoft que puedes usar, llamada OpenXML. La curva de aprendizaje es un poco empinada, pero una vez que aprendes a usarla es potentísima y puedes generar lo que quieras en el Excel, grabándolo línea por línea. Solo vale para xlsx, no para xls.

    Otra opción es usar el propio Excel si es que va a estar instalado en los equipos en los que vaya a rodar el programa. Pones en tu proyecto una Referencia como objeto COM, y le envías los comandos para que construya la hoja con los datos que quieras.

    Otra opción es usar el driver de OleDb. Este es muy sencillo de usar si te basta con tener datos en forma tabular, porque lo llamas como si fuera una base de datos. Pero solo te permite una tabla por hoja, así que no valdría para generar el formato que quieres.

    • Propuesto como respuesta Jorge TurradoMVP martes, 21 de agosto de 2018 7:54
    • Marcado como respuesta Cashmere VM martes, 21 de agosto de 2018 17:52
    martes, 21 de agosto de 2018 6:05
    Moderador
  • hola

    usa librerias basadas en open xml

    Inserting Tables

    alli veras un ejemplo de como usar ClosedXml

    lo bueno es que no necesitas de office instado para poder generar el excel

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Cashmere VM martes, 21 de agosto de 2018 17:53
    martes, 21 de agosto de 2018 13:39
  • Agradezco que me hayas atendido a mis dudas.
    Me fui por lo más sencillo que es la utilización de librerías. 

    Muchas Gracias Alberto Poblacion, si tengo alguna duda más la expresare en este blog. 

    Gracias buena respuesta!

     
    martes, 21 de agosto de 2018 17:55
  • Hola Leandro Tuttini,

    muchas gracias por tu colaboración, me ayudo mucho.
    Ahora tengo un conflicto con mi programa que cada vez que ingreso el ID si coloco el 103 me manda la información del ID - 13 (osea no me acepta los ceros, y con todos los ID que tengo un cero en medio lo interpreta como si fuera un número sin el cero de en medio o  el 230, me manda la información del 23). 
    Espero me haya dado a entender, tengo este código:

    /* FILTRO PARA BUSCAR POR NÚMERO DE MAQUINA */
            private void txtNoMaquina_KeyUp(object sender, KeyEventArgs e)
            {
                SqlConnection cnn = new SqlConnection(@"Data Source=gp12; Initial Catalog=CT; User ID=sa; Password="###");
                cnn.Open();
                SqlCommand scmd = cnn.CreateCommand();
                scmd.CommandType = CommandType.Text;
                scmd.CommandText = "SELECT Num_Orden FROM CapturasTej WHERE No_Maquina LIKE ('" + txtNoMaquina.Text + "%')";
                scmd.ExecuteNonQuery();
                DataTable dt = new DataTable();
                SqlDataReader reader = scmd.ExecuteReader();
                if (reader.Read())
                {
                    txtNoOrden.Text = reader["Num_Orden"].ToString();
                }
                cnn.Close();
            }     

    Espero puedas ayudarme y espero me haya dado a entender.
    Gracias.

    martes, 21 de agosto de 2018 18:15
  • Hola Alberto Poblacion,

    Muchas gracias por tu colaboración, me ayudo mucho.

    Ahora tengo un conflicto con mi programa que cada vez que ingreso el ID si coloco el 103 me manda la información del ID - 13 (osea no me acepta los ceros, y con todos los ID que tengo un cero en medio lo interpreta como si fuera un número sin el cero de en medio o  el 230, me manda la información del 23). 
    Espero me haya dado a entender, tengo este código:

    /* FILTRO PARA BUSCAR POR NÚMERO DE MAQUINA */
            private void txtNoMaquina_KeyUp(object sender, KeyEventArgs e)
            {
                SqlConnection cnn = new SqlConnection(@"Data Source=gp12; Initial Catalog=CT; User ID=sa; Password="###");
                cnn.Open();
                SqlCommand scmd = cnn.CreateCommand();
                scmd.CommandType = CommandType.Text;
                scmd.CommandText = "SELECT Num_Orden FROM CapturasTej WHERE No_Maquina LIKE ('" + txtNoMaquina.Text + "%')";
                scmd.ExecuteNonQuery();
                DataTable dt = new DataTable();
                SqlDataReader reader = scmd.ExecuteReader();
                if (reader.Read())
                {
                    txtNoOrden.Text = reader["Num_Orden"].ToString();
                }
                cnn.Close();
            }     

    Espero puedas ayudarme y espero me haya dado a entender.
    Gracias.

    martes, 21 de agosto de 2018 18:39
  • si coloco el 103 me manda la información del ID - 13

    Es un error un poco raro. Tendrías que seguir la ejecución con el debugger, copiar la sentencia que te ha generado en tiempo de ejecución, y ejecutarla manualmente contra el SQL Server a ver qué devuelve.

    Por ejemplo, dado que usas un "LIKE" y lleva un comodín, podría ser que hubiera más de un registro devuelto por la consulta, y dado que solo lees el primero que te devuelve, tal vez éste no sea el que esperabas. Pero esto es pura especulación, para saber lo que está pasando de verdad, sigue la ejecución con el debugger y comprueba en lado servidor cuál es la consulta realmente generada y qué es lo que realmente está devolviendo.

    • Marcado como respuesta Cashmere VM miércoles, 22 de agosto de 2018 14:21
    miércoles, 22 de agosto de 2018 5:54
    Moderador
  • Gracias Alberto Poblacion,
    Ya debugge y me dí cuenta que no solo con el cero hace eso, por ejemplo si colocó en el txtNoMaquina el 18 me lanza la información del primer ID que empieza con 18, es decir, tengo ID del rango 1 al 255, así que cuando coloco el 18, me lanza información del primer ID de 181, osea se me hace algo raro que haga eso cuando tengo ese cacho de código en otros programas y no me hacen esta situación.

    Llegue a pensar que tal vez eran el Tipo de Dato de la base de datos, pero tampoco es eso, ya que hice una tabla igual colocando numeric como tipo de dato, ya que yo los tengo como int pero me sigue saliendo esa peculiar situación. Con esto me he roto la cabeza porque me es extraño que haga eso. Si tienes otra forma para que busque o me colabores al respecto estaría agradecida totalmente.


    miércoles, 22 de agosto de 2018 14:40
  • [...] por ejemplo si colocó en el txtNoMaquina el 18 me lanza la información del primer ID que empieza con 18
    A la vista de lo que comentas, se deduce que el error es precisamente el que te dije antes, es decir, el comodín que tienes metido en el LIKE.
    miércoles, 22 de agosto de 2018 17:10
    Moderador
  • Entonces como lo podría modificar para hacer la búsqueda mediante el textbox y referente al ID me muestre la información en los demás textbox, por favor.

    Gracias.
    miércoles, 22 de agosto de 2018 19:08
  • Lo más sencillo es quitar el "%", si no quieres hacer búsquedas con comodines, es más de hecho no solo no necesitas la búsqueda con comodines sino que de hecho es la que te está haciendo fallar el programa. ¿Por qué pusiste el LIKE y el % si no quieres buscar todos los registros que empiecen por el mismo valor?

    scmd.CommandText = "SELECT Num_Orden FROM CapturasTej WHERE No_Maquina = ('" + txtNoMaquina.Text + "')";
            

    Nota: En la sentencia anterior únicamente te he corregido el LIKE y el %, no te he arreglado la mala práctica de concatenar en la sentencia un dato tecleado por el usuario. Esto se arregla parametrizando la sentencia, pero sobre este tema ya se han vertido ríos de tinta en los foros y en artículos en Internet, así que no vamos a repetirlo aquí.

    • Marcado como respuesta Cashmere VM miércoles, 22 de agosto de 2018 21:47
    miércoles, 22 de agosto de 2018 21:02
    Moderador
  • Oh oh lo acabo de probar bien y sigo con ese error de que coloco el ID-130 y me lanza la información del ID-13 

    Espero puedas seguir ayudándome. Gracias

    miércoles, 22 de agosto de 2018 22:01
  • Pon el código completo tal como te ha quedado después de quitarle el % y el LIKE. Si sigue fallando, debe haber todavía algún comodín por algún sitio.
    • Marcado como respuesta Cashmere VM jueves, 23 de agosto de 2018 14:45
    jueves, 23 de agosto de 2018 5:50
    Moderador
  • Coloque tal cual es código, pero ya me percate porque me sale así. Porque no tengo en mi base de datos el 130 y entonces lo toma como un 13 pero entonces ahí me falta una validación para esta situación. 
    Validar que no pinte nada sino existe el ID colocado. 

    Muchas Gracias Alberto Poblacion, de verdad me has ayudado mucho. Excelente aportación.

     
    jueves, 23 de agosto de 2018 14:47