none
Trasponer datagridview cargado con datos de un excel RRS feed

  • Pregunta

  • Tengo el siguiente codigo

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.OleDb;
    using System.Drawing.Printing;
    using System.Configuration;

    namespace Imprimir
    {
        public partial class Form1 : Form
        {
            string hoja;
            string archivo;
            int a = 0;
            public Form1()
            {
                InitializeComponent();
            }
            public void Impreson(string archivo1, string hoja1)
            {
                //declaramos las variables         
                OleDbConnection conexion = null;
                DataSet dataSet = null;
                OleDbDataAdapter dataAdapter = null;
                string consultaHojaExcel = "Select * from [" + hoja1 + "$]";
                //esta cadena es para archivos excel 2007 y 2010
                string cadenaConexionArchivoExcel = "provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + archivo1 + "';Extended Properties=Excel 12.0;";
                //para archivos de 97-2003 usar la siguiente cadena
                //string cadenaConexionArchivoExcel = "provider=Microsoft.Jet.OLEDB.4.0;Data Source='" + archivo + "';Extended Properties=Excel 8.0;";
                //Validamos que el usuario ingrese el nombre de la hoja del archivo de excel a leer
                if (string.IsNullOrEmpty(hoja1))
                {
                    MessageBox.Show("No hay una hoja para leer");
                }
                else
                {
                    try
                    {
                        //Si el usuario escribio el nombre de la hoja se procedera con la busqueda
                        conexion = new OleDbConnection(cadenaConexionArchivoExcel);//creamos la conexion con la hoja de excel
                        conexion.Open(); //abrimos la conexion
                        dataAdapter = new OleDbDataAdapter(consultaHojaExcel, conexion); //traemos los datos de la hoja y las guardamos en un dataSdapter
                        dataSet = new DataSet(); // creamos la instancia del objeto DataSet
                        dataAdapter.Fill(dataSet, hoja1);//llenamos el dataset
                        dataGridView1.DataSource = dataSet.Tables[0]; //le asignamos al DataGridView el contenido del dataSet
                        conexion.Close();//cerramos la conexion
                        dataGridView1.AllowUserToAddRows = false;       //eliminamos la ultima fila del datagridview que se autoagrega
                    }
                    catch (Exception ex)
                    {
                        //en caso de haber una excepcion que nos mande un mensaje de error
                        MessageBox.Show("Error, Verificar el archivo o el nombre de la hoja", ex.Message);
                    }
                }
                archivo = archivo1;
                hoja = hoja1;
            }
            private void btnCargar_Click(object sender, EventArgs e)
            {
               //creamos un objeto OpenDialog que es un cuadro de dialogo para buscar archivos
               OpenFileDialog dialog = new OpenFileDialog();
               dialog.Filter = "Archivos de Excel (*.xls;*.xlsx)|*.xls;*.xlsx"; //le indicamos el tipo de filtro en este caso que busque
               //solo los archivos excel
               dialog.Title = "Seleccione el archivo de Excel";//le damos un titulo a la ventana
               dialog.FileName = string.Empty;//inicializamos con vacio el nombre del archivo
               //si al seleccionar el archivo damos Ok
               if (dialog.ShowDialog() == DialogResult.OK)
               {
                   //el nombre del archivo sera asignado al textbox
                   txtArchivo.Text = dialog.FileName;
                   hoja = txtHoja.Text; //la variable hoja tendra el valor del textbox donde colocamos el nombre de la hoja
                   Impresion(txtArchivo.Text,hoja); //se manda a llamar al metodo
                   dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; //se ajustan las
                   //columnas al ancho del DataGridview para que no quede espacio en blanco (opcional)
               }
               while (a < this.dataGridView1.Rows.Count)
               {
                    printDocument1.Print();
                    a++;
               }
            }
            private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
            {
                //La fuente que vamos a usar para imprimir.
                Font printFont = new Font("Arial", 10);
                float topMargin = e.MarginBounds.Top;
                float yPos = 0;
                int count = 0;
                int i = 0;
                string texto = "";
                DataGridViewRow row;
                // Calculamos el número de líneas que caben en cada página.
                //linesPerPage = e.MarginBounds.Height / printFont.GetHeight(e.Graphics);
                // Recorremos las filas del DataGridView hasta que llegemos
                // a las líneas que nos caben en cada página o al final del grid.
                while (i < this.dataGridView1.Rows.Count)
                {
                    row = dataGridView1.Rows[a];
                    texto = "";
                    foreach (DataGridViewCell celda in row.Cells)
                    {
                        texto += "\t" + celda.Value.ToString();
                    }
                    // Calculamos la posición en la que se escribe la línea
                    yPos = topMargin + (count * printFont.GetHeight(e.Graphics));
                    // Escribimos la línea con el objeto Graphics
                    e.Graphics.DrawString(texto, printFont, Brushes.Black, 10, yPos);
                    count++;
                    i=dataGridView1.Rows.Count;
                }
                // Una vez fuera del bucle comprobamos si nos quedan más filas
                // por imprimir, si quedan saldrán en la siguente página
                if (i < this.dataGridView1.Rows.Count)
                {
                    e.HasMorePages = true;
                }
                else
                {
                    // si llegamos al final, se establece HasMorePages a
                    // false para que se acabe la impresión
                    e.HasMorePages = false;
                    // Es necesario poner el contador a 0 porque, por ejemplo si se hace
                    // una impresión desde PrintPreviewDialog, se vuelve disparar este
                    // evento como si fuese la primera vez, y si i está con el valor de la
                    // última fila del grid no se imprime nada
                    i = 0;
                }
            }

            private void Form1_Load(object sender, EventArgs e)
            {
                txtHoja.Text = "Hoja1"; //Indicamos la hoja del excel que queremos cargar
            }
        }
    }

    Lo que hace es cargar los datos de un excel y luego imprimir cada fila en una hoja diferente

    Lo que quiero es hacer eso mismo pero con el datagridview transpuesto, es decir: las filas del excel como columnas y las columnas como filas

    Gracias de antemano

    Atte. Roberto

    viernes, 12 de febrero de 2016 15:22

Respuestas

  • Hola:

     Analiza esta librería SpreadSheetLight con ella podrás leer el archivo excel e ir programando lo que deseas de una manera tan sencilla que te sorprenderás, básicamente la lógica a seguir es:

    1. Carga el archivo excel en memoria

    2. Recorre las columnas y registros usando algo como esto:

    private void Import()
            {
                //usamos el objeto FileSteam para recuperar el archivo
                FileStream fs = new FileStream("TestExcel.xlsx", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                //
                //Creamos el obejto SLDocument para cargar el archivo Excel
                SLDocument sl = new SLDocument(fs);
    
                //refinimos el indice de la fila de donde comenzaremos a leer
                int rowIndex = 2;
    
                //recorremos el objeto SLDocument mediante un ciclo While
                //este ciclo recorre el documento miestras no se encuentre una celda vacia
                while (!string.IsNullOrEmpty(sl.GetCellValueAsString(rowIndex, 1)))
                {
                    //tomamos los valores de las celdas y lo pasamos a las respectivas columnas del control DataGridView
                    dgvDatos.Rows.Add(sl.GetCellValueAsString(rowIndex, 1), sl.GetCellValueAsString(rowIndex, 2),
                        sl.GetCellValueAsString(rowIndex, 3), sl.GetCellValueAsString(rowIndex, 4));
    
                    //incrementeamos una unidad al indice de la fila para continuar con el recorrido
                    rowIndex += 1;
                }
            }
    En el ejemplo de código observa que se va moviendo la variable que representa el indice de los registros, ahí fácilmente puedes poner otro While que recorra las columnas y vaya tomando sus valores.

     


    Saludos desde Monterrey, Nuevo León, México!!!

    • Marcado como respuesta Roberto__ miércoles, 20 de julio de 2016 21:55
    viernes, 12 de febrero de 2016 19:34