miércoles, 26 de octubre de 2011

Exportar GridView o DataTable a Excel (En HTML o TXT) con C#

Buen Día a Todos


Cuantas veces hemos querido exportar los datos que poseemos en una tabla (GridView) de un WebForm, una pagina web, a una hoja de Excel, o a cualquier Programa Manejador de Hojas de Calculo como OpenOffice, a PDF o a un simple archivo de Texto.


Aquí coloco una solución simple pero funcional.

//Codigo para C#
//Suponemos que tenemos una GridView llamada gridView_
//la cual queremos bajar a Excel
//Este codigo lo podemos colocar en el evento click de algun botón
//Se ocupa: 
//using System.Text;
//using System.IO;

        StringBuilder sb = new StringBuilder();
        StringWriter sw = new StringWriter(sb);
        HtmlTextWriter hw = new HtmlTextWriter(sw);
        Page pagina = new Page();
        HtmlForm form = new HtmlForm();
        
        pagina.Controls.Add(form);
        form.Controls.Add(gridView_);
        pagina.EnableEventValidation = false;
        pagina.DesignerInitialize();
        pagina.RenderControl(hw);
        Response.Clear();
        Response.Buffer = true;
        Response.ContentType = "application/vnd.ms-excel";
        Response.AddHeader("Content-Disposition", "attachment;filename=data.xls");
        Response.Charset = "UTF-8";
        Response.ContentEncoding = Encoding.Default;
        Response.Write(sb.ToString());
        Response.End();



Ahora suponiendo que no tenemos un GridView, pero si un DataTable que queremos bajar a Excel
En ese caso, tendremos que generar el GridView:



//Codigo para C#
//Suponemos que tenemos una DataTable llamada tabla
//la cual queremos bajar a Excel
//Este codigo lo podemos colocar en el evento click de algun botón
//Se ocupa: 
//using System.Text;
//using System.IO;

        GridView gridView_ = new GridView();
        StringBuilder sb = new StringBuilder();
        StringWriter sw = new StringWriter(sb);
        HtmlTextWriter hw = new HtmlTextWriter(sw);
        Page pagina = new Page();
        HtmlForm form = new HtmlForm();

        gridView_.DataSource = tabla;
        gridView_.DataBind();
        

        pagina.Controls.Add(form);


        form.Controls.Add(gridView_);
        pagina.EnableEventValidation = false;
        pagina.DesignerInitialize();
        pagina.RenderControl(hw);
        Response.Clear();
        Response.Buffer = true;
        Response.ContentType = "application/vnd.ms-excel";
        Response.AddHeader("Content-Disposition", "attachment;filename=data.xls");
        Response.Charset = "UTF-8";
        Response.ContentEncoding = Encoding.Default;
        Response.Write(sb.ToString());
        Response.End();



Convertir DataTable a CSV y lanzarlo a Excel en el cliente



Ahora, queremos lanzar un archivo .CSV de una DataTable, el siguiente método hace lo necesario, y lanza el archivo armado para ser abierto con Excel,

public static void Exportar_DataTable_a_CSV(Page page, DataTable tabla)
    {
        string archivo = "";
        int i = 0;
        int j = 0;

        try
        {
            archivo += "Mando esta tabla, Fecha de hoy: " + DateTime.Now.ToShortDateString() + "\n";


            if (tabla.Rows.Count > 0)
            {
                //Imprimimos los encabezados (Headers)
                for (i = 0; i < tabla.Columns.Count; i++)
                {
                    archivo += tabla.Columns[i].ColumnName;
                    archivo += ",";
                }
                archivo += "\n";
                for (i = 0; i < tabla.Rows.Count; i++)
                {//Iteramos en los elementos extrayendo la info y colocandola en formato CSV
                    for (j = 0; j < tabla.Rows[i].ItemArray.Length; j++)
                    {
                        archivo += tabla.Rows[i].ItemArray[j].ToString();
                        archivo += ",";
                    }
                    archivo += "\n";
                }
            }
            else
            {
                archivo += "No existen Registros";
            }

            page.Response.Clear();
            page.Response.Buffer = true;
            page.Response.ContentType = "application/vnd.ms-excel";
            page.Response.AddHeader("Content-Disposition", "attachment;filename=mitablita.csv");
            page.Response.Charset = "UTF-8";
            page.Response.ContentEncoding = Encoding.Default;
            page.Response.Write(archivo);
            page.Response.End();
        }
        catch(Exception ex)
        {
            page.ClientScript.RegisterStartupScript(page.GetType(), "Redirecicon", "");
            Debug.WriteLine(ex);
            Debug.WriteLine(ex.StackTrace);
        }
    }



Lo podemos usar de la siguiente manera (tablita es un DataTable que contiene cierta info):

Exportar_DataTable_a_CSV(this, tablita)

Por cierto que para usarlo debemos agregar las librerias:
System.Data;
System.Web.SessionState;
System.IO;
System.Diagnostics;

Explico el codigo de manera rapida:


* El chiste de la descarga de la Tabla a Excel es bajar un archivo con codigo HTML que contendra una pagina web con una sola tabla (la gridview o datatble que deseamos), debido a que Excel es bonito y sabe interpretar HTML la podremos visualizar sin problema.


* Creamos un nuevo Html Form, es decir, una nueva pagina web, que contendra una gridview.


* La gridview que contendra dicha pagina web será la misma que queremos descargar a Excel, o en el otro caso asignamos la dataTable a un objeto girdview nuevo.


* Renderizamos los controles (Inicializamos)


* Descargamos la pagina web completa, que sea abierta por Excel y listo.


* En el caso de la descarga a csv, que es mucho mas ligera y rapida, ya que usa un algoritmo sencillísimo, cuidado si el campo contiene comas.


Con especiales gracias a:
Codigo en VB por Chalalo





Tags:

  • Exportar DataTable a Excel (ASP .Net)
  • Exportar GridView a Excel (ASP .Net)
  • Descargar GridView a Excel
  • Exportar DataTable en CSV
  • Exportar DataTable C#
  • Descargar DataTable a Excel
  • Descargar Tabla como CSV
  • Crear y descargar archivo del servidor



lunes, 24 de octubre de 2011

Convertidor A/D con pic16f887 y LCD JHD 162A (PIC C CCS)

Pequeño pero practico programa para usar el convertidor Analogico - Digital por medio del Pic 16f887 y una pantalla lcd de 16x2


Codigo:

#include <16f887.h>                   //Nuestro pic
#device adc = 10                       //Convertidor AD a 10bits
#use delay (clock=8000000)            //Fosc=8Mhz
#include <lcd.c>                      //Libreria de la lcd

//Declaracion de variables publicas
//int bits_frecuencia;
//int bits_dutyCicle;
float Frecuencia;
float DutyCicle;

//Prototipos de Funciones
void Refresh_lcd();
float Get_Lectura(int channel);



void main()
{
   setup_oscillator(OSC_8MHZ|OSC_INTRC);  //Programamos oscilador interno del Pic a 8MHZ
   set_tris_b(0);                         //Puerto B como salida
   lcd_init();                            //Inicializamos LCD
   lcd_putc("Iniciando...");                //"Hola Mundo"
   DutyCicle = 0.0;
   Frecuencia = 0.0;
   delay_ms(5);
   
   while(1)
   {
      output_toggle(PIN_B5);              //Parpadeamos Led, output_toggle cambia el estado logico del pin pasado de parametro
      
      Frecuencia = Get_Lectura(0);
      DutyCicle = Get_Lectura(1);
      
      Refresh_lcd();
      
      delay_ms(250);                     //Esperamos a lo sonso 250 ms
   }
}


float Get_Lectura(int channel)
{
   float medicion=0;                     //variable entera que contendra la medicion del convertidor AD
   int1 done = 0;                        //Contendra 1 si el convertidor terminó de convertir
   
   setup_adc (adc_clock_internal);     //Usando el oscilador interno 
   setup_adc_ports (all_analog);       //Todo el puerto analogico como entrada analogica    
   set_adc_channel (channel);          //Establecemos el canal de lectura analogica
   delay_ms(1);                       //a small delay is required after setting the channel
   medicion=read_adc ();               // Hace conversión AD 
   done = adc_done();                  //done = 1 si el convertidor termino de convertir
   while(!done)
   {
      done = adc_done();               //Mientras no acabe de convertir se seguira ciclando
   }
   setup_adc (adc_off);                //detenemos al convertidor
   return medicion;                    //Regresamos la medicion
}

void Refresh_lcd()
{
   lcd_putc("\f");
   printf(lcd_putc,"Frec: %5.1f",Frecuencia);
   lcd_putc("\n");
   printf(lcd_putc,"DC: %5.1f",DutyCicle);
   
}



Esquematico:

Esquematico para el 16f887


Descargas:

DSN Isis Proteus: dsn
Codigo para Pic C de CCS: codigoC
xadecimal para Pic: hexa

_________________________________________________________________________________
USANDO EL PIC16F877A

El PIC16f887 es mas nuevo, mas barato y con unas cuantas mejoras con respecto a su compatriota algo ya anciano el PIC16f877X dígase también PIC16f877A.

Bueno, pero parace ser que muchos siguen usando estos ultimos PIC, por ello y por petición en un comentario en esta entrada he decidido ampliar este ejemplo usando un 16f877a.

Aquí está chan chan chan:

(La única diferencia en el código es comentar la línea 20 "setup oscillator()", porqué? porque el PIC 16F877A no la soporta ya que NO POSEE OSCILADOR INTERNO, solo es cuestion de ver la datasheet y el .h del PIC)

Esquemático:

Esquematico para el 16f877a


DSN Isis Proteus: dsn
Codigo para PicC de CCS: codigoC
Hexadecimal: hexa

Hola Mundo con pic16f887 y LCD JHD 162A (PIC C CCS)

Sencillo programa para desplegar algo en una flamante pantalla lcd de 16x2 usando un pic 16f887


#include <16f887.h>                   //Nuestro pic
#use delay (clock=8000000)            //Fosc=8Mhz
#include <lcd.c>                      //Libreria de la lcd


void main()
{
   setup_oscillator(OSC_8MHZ|OSC_INTRC);  //Programamos oscilador interno del Pic a 8MHZ
   set_tris_b(0);                         //Puerto B como salida
   lcd_init();                            //Inicializamos LCD
   lcd_putc("Hola Mundo");                //"Hola Mundo"
   while(1)
   {
      delay_ms(10);                       //Esperamos a lo sonso 10 ms
      output_toggle(PIN_B5);              //Parpadeamos Led, output_toggle cambia el estado logico del pin pasado de parametro
      delay_ms(250);                     //Esperamos a lo sonso 250 ms
   }
}
He aqui el esquemático:


Descargas:

DSC para Isis Proteus: DSN Proteus ISIS
Codigo .c para Pic C de CCS (PCWHD): CodigoC

Fotuca de mi circuito

domingo, 16 de octubre de 2011

Simple comunicación serial con C# y Arduino

A continuación se presenta la creación de una consola para enviarle una variable a un Arduino por puerto USB-Serial:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            char var;
            while (true)
            {
                var = Convert.ToChar(Console.Read());
                Send_Serial(var);
            }
        }

        public static void Send_Serial(char var)
        {
            SerialPort puerto = new SerialPort("COM5", 9600);
            if (!puerto.IsOpen)
            {
                puerto.Open();
                puerto.Write(var.ToString());
                puerto.Close();
            }
        }
    }
}

A continuación el código fuente para el Arduino:

void setup()
{
 Serial.begin(9600);
  pinMode(13,OUTPUT);
}

void loop()
{
  if(Serial.available())
 {
    switch(Serial.read())
    {
      case 'a':
        digitalWrite(13,HIGH);        
        break;
      
      case 'b':
        digitalWrite(13,LOW);      
        break;
    }
 } 
}

En la siguiente imagen vemos el resultado de compilar el programa en C#:


Por ultimo presentamos un vídeo del Arduino y la consola trabajando:



Conclusiones:
Con esto se demuestra que no tienes que usar un Hyper-terminal, sino que puedes hacer el tuyo propio para comunicarte tu Arduino y hasta hacer esto para cualquier microcontrolador.

Powered iGus