none
DataGridView Formatar numero RRS feed

  • Pergunta

  • Galera eu tenho um Grid, que carrego atravez de uma consulta no SQL, gostaria de formatar o numero de 66666.66 para 6.666,66 é possivel?

    Obrigado!


    Edgar Esteves - www.localdosuporte.com.br
    quarta-feira, 20 de maio de 2009 19:41

Respostas

  • Boa tarde Edgar utilize a propriedade da coluna do DataGridView (a qual deseja formatar o valor) DefaultCellStyle na sequência coloque na propriedade Format o seguinte valor "###,##0.00".
    Guilherme Pizolato (MCP) - Microsoft Certified Professional
    • Marcado como Resposta Edgar Esteves quinta-feira, 21 de maio de 2009 11:22
    quarta-feira, 20 de maio de 2009 20:33
  • Boa tarde Edgar.

    Utilize o seguinte código.

                foreach (DataRow dr in pDataTable.Rows)
                {
                    System.Windows.Forms.Application.DoEvents();
                    i = 0;
                    sb = string.Empty;
                    //para cada columna de datos
                    foreach (DataColumn dc in pDataTable.Columns)
                    {
                        //solo mostrar aquellas columnas q pertenezcan a la grilla
                        //notar que debe haber sincronia con las columnas del la cabecera
                        if (dgv != null && dgv.Columns[dc.Caption] != null)
                        {
                           
                            //Verifica se o tipo de dado é um double ou seja é um número
                            if(dgv.Columns[dc.Caption].ValueType.Equals(double))
                            {
                                double douValor = Convert.ToDouble((Information.IsDBNull(dr[i]) ? 0 : FormatCell(dr[i])));

                                sb = sb + douValor.ToString("###,##0.00" + ControlChars.Tab;
                            }


                            else
                            {
                                System.Windows.Forms.Application.DoEvents();
                                //Linea q genera la impresión del registro
                                sb = sb + (Information.IsDBNull(dr[i]) ? string.Empty : FormatCell(dr[i])) + ControlChars.Tab;
                            }

                        }
                        else if (dgv == null)
                        {
                            System.Windows.Forms.Application.DoEvents();
                            //Linea q genera la impresión del registro
                            sb = sb + (Information.IsDBNull(dr[i]) ? string.Empty : FormatCell(dr[i])) + ControlChars.Tab;
                        }
                        i++;
                    }
                }


    Guilherme Pizolato (MCP) - Microsoft Certified Professional
    • Marcado como Resposta Edgar Esteves sexta-feira, 22 de maio de 2009 11:48
    quinta-feira, 21 de maio de 2009 19:10
  • Edgar bom dia fiz uns testes aqui e funcionou legal.

                if (dgv.Columns[dc.Caption].ValueType.Equals(typeof(double)))
                {
                    double douValor = Convert.ToDouble((Information.IsDBNull(dr[i]) ? 0 : FormatCell(dr[i])));
                    sb = sb + douValor.ToString("###,##0.00") + ControlChars.Tab;
                }
    Guilherme Pizolato (MCP) - Microsoft Certified Professional
    • Marcado como Resposta Edgar Esteves sexta-feira, 22 de maio de 2009 13:37
    sexta-feira, 22 de maio de 2009 13:13

Todas as Respostas

  • Boa tarde Edgar utilize a propriedade da coluna do DataGridView (a qual deseja formatar o valor) DefaultCellStyle na sequência coloque na propriedade Format o seguinte valor "###,##0.00".
    Guilherme Pizolato (MCP) - Microsoft Certified Professional
    • Marcado como Resposta Edgar Esteves quinta-feira, 21 de maio de 2009 11:22
    quarta-feira, 20 de maio de 2009 20:33
  • Obrigado Guilherme!
    Edgar Esteves - www.localdosuporte.com.br

    -- EDITADO --

    Guilherme, percebi que mudando essa opção eu crio apenas uma mascara correto? pois quado exporto para o excel usando o ExportToExcel.cs ele não exporta com essa mascara, saberia pq?

    Obrigado
    quinta-feira, 21 de maio de 2009 11:23
  • Bom dia Edgar é isso mesmo estamos colocando uma máscara no campo. Para você exportar os valores com a máscara você vai ter de ajustar o código da classe ExportToExcel para fazer isso.
    Guilherme Pizolato (MCP) - Microsoft Certified Professional
    quinta-feira, 21 de maio de 2009 11:50
  • Bom dia Edgar é isso mesmo estamos colocando uma máscara no campo. Para você exportar os valores com a máscara você vai ter de ajustar o código da classe ExportToExcel para fazer isso.
    Guilherme Pizolato (MCP) - Microsoft Certified Professional

    Obrigado Guilherme, vou dar uma olhada lá. ;)
    Edgar Esteves - www.localdosuporte.com.br
    quinta-feira, 21 de maio de 2009 12:16
  • Guilherme abusando de seu conhecimento, encontrei onde ele pecorre no GRID e vai salvando no EXCEL, é o codigo abaixo, gostaria de saber se é possivel criar uma especie de if, exemplo se ele olhar a coluna e for numerica aplicar o format que vc ensinou, caso não continua o normal.

    Obrigado

    Code:

                foreach (DataRow dr in pDataTable.Rows) 
                {
                    System.Windows.Forms.Application.DoEvents();
                    i = 0;
                    sb = string.Empty;
                    //para cada columna de datos
                    foreach (DataColumn dc in pDataTable.Columns)
                    {
                        //solo mostrar aquellas columnas q pertenezcan a la grilla
                        //notar que debe haber sincronia con las columnas del la cabecera
                        if (dgv != null && dgv.Columns[dc.Caption] != null)
                        {
                            System.Windows.Forms.Application.DoEvents();
                            //Linea q genera la impresión del registro
                            sb = sb + (Information.IsDBNull(dr[i]) ? string.Empty : FormatCell(dr[i])) + ControlChars.Tab;
    
                        }
                        else if (dgv == null)
                        {
                            System.Windows.Forms.Application.DoEvents();
                            //Linea q genera la impresión del registro
                            sb = sb + (Information.IsDBNull(dr[i]) ? string.Empty : FormatCell(dr[i])) + ControlChars.Tab;
                        }
                        i++;
                    }

    Edgar Esteves - www.localdosuporte.com.br
    quinta-feira, 21 de maio de 2009 13:34
  • Boa tarde Edgar.

    Utilize o seguinte código.

                foreach (DataRow dr in pDataTable.Rows)
                {
                    System.Windows.Forms.Application.DoEvents();
                    i = 0;
                    sb = string.Empty;
                    //para cada columna de datos
                    foreach (DataColumn dc in pDataTable.Columns)
                    {
                        //solo mostrar aquellas columnas q pertenezcan a la grilla
                        //notar que debe haber sincronia con las columnas del la cabecera
                        if (dgv != null && dgv.Columns[dc.Caption] != null)
                        {
                           
                            //Verifica se o tipo de dado é um double ou seja é um número
                            if(dgv.Columns[dc.Caption].ValueType.Equals(double))
                            {
                                double douValor = Convert.ToDouble((Information.IsDBNull(dr[i]) ? 0 : FormatCell(dr[i])));

                                sb = sb + douValor.ToString("###,##0.00" + ControlChars.Tab;
                            }


                            else
                            {
                                System.Windows.Forms.Application.DoEvents();
                                //Linea q genera la impresión del registro
                                sb = sb + (Information.IsDBNull(dr[i]) ? string.Empty : FormatCell(dr[i])) + ControlChars.Tab;
                            }

                        }
                        else if (dgv == null)
                        {
                            System.Windows.Forms.Application.DoEvents();
                            //Linea q genera la impresión del registro
                            sb = sb + (Information.IsDBNull(dr[i]) ? string.Empty : FormatCell(dr[i])) + ControlChars.Tab;
                        }
                        i++;
                    }
                }


    Guilherme Pizolato (MCP) - Microsoft Certified Professional
    • Marcado como Resposta Edgar Esteves sexta-feira, 22 de maio de 2009 11:48
    quinta-feira, 21 de maio de 2009 19:10
  • Guilherme muito obrigado cara, isso irá ficar perfeito, estou desde ontem tentando aplica esse codigo, porém ele esta dando erro na linha do if

                            if(dgv.Columns[dc.Caption].ValueType.Equals(double))
                            {
                                double douValor = Convert.ToDouble((Information.IsDBNull(dr[i]) ? 0 : FormatCell(dr[i])));
    
                                sb = sb + douValor.ToString("###,##0.00") + ControlChars.Tab;
                            }

    na linha do SB = SB só faltava fechar o ')', só que na linha do IF da o seguinte erro:

    Error 1 Invalid expression term 'double' 

     Procurei na net, estou desde ontem e não consegui =/

    Muito obrigado, e já marquei como Útil sua ultima resposta.

     


    Edgar Esteves - www.localdosuporte.com.br
    sexta-feira, 22 de maio de 2009 11:51
  • Bom dia Edgar desculpe pela demora.

    Utilize na linha do if o typeOf para verificar se é um double.

    if(dgv.Columns[dc.Caption].ValueType.Equals(typeOf(double)))

    Guilherme Pizolato (MCP) - Microsoft Certified Professional
    sexta-feira, 22 de maio de 2009 12:20
  • Bom dia Edgar desculpe pela demora.

    Utilize na linha do if o typeOf para verificar se é um double.

    if(dgv.Columns[dc.Caption].ValueType.Equals(typeOf(double)))

    Guilherme Pizolato (MCP) - Microsoft Certified Professional


    Bom dia Guilherme, cara não precisa se desculpar não você esta é quebrando um enorme galho, coloquei do jeito que você mensionou porém ainda esta com o mesmo erro, fica um sublinhado vermelho no final do double =/


                            if (dgv.Columns[dc.Caption].ValueType.Equals(typeOf(double)))
    
                            {
    
                                double douValor = Convert.ToDouble((Information.IsDBNull(dr[i]) ? 0 : FormatCell(dr[i])));
    
    
    
                                sb = sb + douValor.ToString("###,##0.00") + ControlChars.Tab;
    
                            }

    Obrigado novamente!
    sexta-feira, 22 de maio de 2009 12:35
  • Edgar bom dia fiz uns testes aqui e funcionou legal.

                if (dgv.Columns[dc.Caption].ValueType.Equals(typeof(double)))
                {
                    double douValor = Convert.ToDouble((Information.IsDBNull(dr[i]) ? 0 : FormatCell(dr[i])));
                    sb = sb + douValor.ToString("###,##0.00") + ControlChars.Tab;
                }
    Guilherme Pizolato (MCP) - Microsoft Certified Professional
    • Marcado como Resposta Edgar Esteves sexta-feira, 22 de maio de 2009 13:37
    sexta-feira, 22 de maio de 2009 13:13
  • Edgar bom dia fiz uns testes aqui e funcionou legal.

                if (dgv.Columns[dc.Caption].ValueType.Equals(typeof(double)))
                {
                    double douValor = Convert.ToDouble((Information.IsDBNull(dr[i]) ? 0 : FormatCell(dr[i])));
                    sb = sb + douValor.ToString("###,##0.00") + ControlChars.Tab;
                }
    Guilherme Pizolato (MCP) - Microsoft Certified Professional

    Guilherme encontrei é o seguinte, typeOf no meu e no seu typeof ficou ok! ai deu erro na conversão de 0 : FormatCell(dr[i])));

    que ele tentava de int para string, ai fiz o seguinte:

    double

    douValor = Convert.ToDouble((Information.IsDBNull(dr[i]) ? 0 : Convert.ToDouble(FormatCell(dr[i]))));

    e ficou ok! estou debugando o export aqui e no if ele ta pegando o titulo do grid e não os dados, por tanto ele nem entra no if para efetuar a ação.


    estou colocando abaixo o codigo completo do Export quando tiver um tempo parda dar uma olhada eu agradeço, enquanto isso vou tentando, se conseguir respondo aqui

    Obrigado

    Segue codigo:



    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    using System.Windows.Forms;
    using Microsoft.Office.Interop;
    using Microsoft.VisualBasic;
    using Microsoft.Office.Interop.Excel;
    using System.Data;
    using System.Reflection;
    using System.Collections;
    using System.Configuration;
    //using Opcion.Util;
    
    
    namespace Tools.ExportToExcel
    {
        public class ExportToExcel
        {
    
            /// <summary>
            /// Exporta la información de un dataGridView a Excel
            /// </summary>
            /// <param name="dataGridView">DataGridView de origen</param>
            /// <param name="pFullPath_toExport">Ruta del archivo exportado</param>
            /// <param name="nameSheet">Nombre de la hoja</param>
            /// <param name="showExcel">Mostrar excel?</param>
            public void dataGridView2Excel(DataGridView dataGridView, string pFullPath_toExport, string nameSheet)
            {
                Object obj = dataGridView.DataSource;
                System.Data.DataTable dt = new System.Data.DataTable();
    
                //Obtener un datatable del datagridview
                if (dataGridView.DataSource is DataSet)
                {
                    if (((System.Data.DataSet)dataGridView.DataSource).Tables.Count > 0)
                        dt = ((System.Data.DataSet)dataGridView.DataSource).Tables[0];
                    else
                        dt = new System.Data.DataTable();
                }
                else if (dataGridView.DataSource is System.Data.DataTable)
                {
                    dt = (System.Data.DataTable)dataGridView.DataSource;
                }
                else if (dataGridView.DataSource is ArrayList)
                {
                    ArrayList arr = (ArrayList)dataGridView.DataSource;
                    dt = ArrayListToDataTable(arr);
    
                }
                dataTable2Excel(dt, dataGridView, pFullPath_toExport, nameSheet);
            }
    
            /// <summary>
            /// Exporta la información de un DataTable a Excel
            /// </summary>
            /// <param name="pDataTable">DataTable de origen</param>
            /// <param name="dgv">DataGridView de origen (solo para tomar los titulos de las columnas y determinar las columnas a mostrar)</param>
            /// <param name="pFullPath_toExport">Ruta a exportar</param>
            /// <param name="nameSheet">Nombre de la hoja</param>
            /// <param name="showExcel">Mostrar excel?</param>
            public void dataTable2Excel(System.Data.DataTable pDataTable, DataGridView dgv, string pFullPath_toExport, string nameSheet) 
            {
                string vFileName = Path.GetTempFileName();
                FileSystem.FileOpen(1, vFileName, OpenMode.Output, OpenAccess.Default, OpenShare.Default, -1);
    
                string sb = string.Empty;
                //si existe datagridview, tomar de él los nombres de columnas y la visibilidad de las mismas
                if (dgv != null)
                {
                    foreach (DataColumn dc in pDataTable.Columns)
                    {
                        System.Windows.Forms.Application.DoEvents();
                        string title = string.Empty;
    
                        //recuperar el título que aparece en la grilla
                        //Notar que debe haber sincronía con las columnas del detalle
                        if (dgv.Columns[dc.Caption] != null)
                        {
                            //Obtener el texto de cabecera de la grilla
                            title = dgv.Columns[dc.Caption].HeaderText;
                            sb += title + ControlChars.Tab;
                        }
                    }
                }
                else 
                {
                    //si no existe datagridview tomar el nombre de la columna del datatable
                    foreach (DataColumn dc in pDataTable.Columns)
                    {
                        System.Windows.Forms.Application.DoEvents();
                        string title = string.Empty;
    
                        title = dc.Caption;
                        sb += title + ControlChars.Tab;
    
                    }
                }
                
                FileSystem.PrintLine(1, sb);
    
                int i = 0;
                //para cada fila de datos
                foreach (DataRow dr in pDataTable.Rows) 
                {
                    System.Windows.Forms.Application.DoEvents();
                    i = 0;
                    sb = string.Empty;
                    //para cada columna de datos
                    foreach (DataColumn dc in pDataTable.Columns)
                    {
                        //solo mostrar aquellas columnas q pertenezcan a la grilla
                        //notar que debe haber sincronia con las columnas del la cabecera
                        if (dgv != null && dgv.Columns[dc.Caption] != null)
                        {
                            //Verifica se o tipo de dado é um double ou seja é um número
                            if (dgv.Columns[dc.Caption].ValueType.Equals(typeof(double)))
                            {
                                double douValor = Convert.ToDouble((Information.IsDBNull(dr[i]) ? 0 : Convert.ToDouble(FormatCell(dr[i]))));
                                sb = sb + douValor.ToString("###,##0.00") + ControlChars.Tab;
                            }
                            else
                            {
                                System.Windows.Forms.Application.DoEvents();
                                //Linea q genera la impresión del registro
                                sb = sb + (Information.IsDBNull(dr[i]) ? string.Empty : FormatCell(dr[i])) + ControlChars.Tab;
                            }
                        }
                        else if (dgv == null)
                        {
                            System.Windows.Forms.Application.DoEvents();
                            //Linea q genera la impresión del registro
                            sb = sb + (Information.IsDBNull(dr[i]) ? string.Empty : FormatCell(dr[i])) + ControlChars.Tab;
                        }
                        i++;
                    }
    
    
                    FileSystem.PrintLine(1, sb);
                }
                FileSystem.FileClose(1);
                TextToExcel(vFileName, pFullPath_toExport, nameSheet);
            }
    
            /// <summary>
            /// Limpieza de caracteres de la celda a exportar
            /// </summary>
            /// <param name="cell">Celda del datarow a formatear</param>
            /// <returns>cadena formateada</returns>
            private string FormatCell(Object cell)
            {
                string TextToParse = Convert.ToString(cell);
                return TextToParse.Replace(",", string.Empty);
            }
    
            /// <summary>
            /// Exporta un determinado texto en cadena a excel
            /// </summary>
            /// <param name="pFileName">Filename del archivo exportado</param>
            /// <param name="pFullPath_toExport">Ruta del archivo exportado</param>
            /// <param name="nameSheet">nombre de la hoja</param>
            /// <param name="showExcel">Mostrar excel?</param>
            private void TextToExcel(string pFileName, string pFullPath_toExport, string nameSheet)
            {
                System.Globalization.CultureInfo vCultura = System.Threading.Thread.CurrentThread.CurrentCulture;
                System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US");
                Microsoft.Office.Interop.Excel.Application Exc = new Microsoft.Office.Interop.Excel.Application();
                Exc.Workbooks.OpenText(pFileName, Missing.Value, 1,
                    XlTextParsingType.xlDelimited,
                    XlTextQualifier.xlTextQualifierNone,
                    Missing.Value, Missing.Value,
                    Missing.Value, true,
                    Missing.Value, Missing.Value,
                    Missing.Value, Missing.Value,
                    Missing.Value, Missing.Value,
                    Missing.Value, Missing.Value, Missing.Value);
    
                Workbook Wb = Exc.ActiveWorkbook;
                Worksheet Ws = (Worksheet)Wb.ActiveSheet;
                Ws.Name = nameSheet;
    
                try
                {
                    //Formato de cabecera
                    Ws.get_Range(Ws.Cells[1, 1], Ws.Cells[Ws.UsedRange.Rows.Count, Ws.UsedRange.Columns.Count]).AutoFormat(XlRangeAutoFormat.xlRangeAutoFormatClassic1, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
                }
                catch
                {
                    Ws.get_Range(Ws.Cells[1, 1], Ws.Cells[Ws.UsedRange.Rows.Count, Ws.UsedRange.Columns.Count]);
                }
    
                string tempPath = Path.GetTempFileName();
    
                pFileName = tempPath.Replace("tmp", "xls");
                File.Delete(pFileName);
    
                if (File.Exists(pFullPath_toExport))
                {
                    File.Delete(pFullPath_toExport);
                }
                Exc.ActiveWorkbook.SaveAs(pFullPath_toExport, 1, null, null, null, null, XlSaveAsAccessMode.xlNoChange, null, null, null, null, null);
    
                Exc.Workbooks.Close();
    
                System.Runtime.InteropServices.Marshal.ReleaseComObject(Ws);
                Ws = null;
    
                System.Runtime.InteropServices.Marshal.ReleaseComObject(Wb);
                Wb = null;
    
                Exc.Quit();
    
                System.Runtime.InteropServices.Marshal.ReleaseComObject(Exc);
                Exc = null;
                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();
                System.Threading.Thread.CurrentThread.CurrentCulture = vCultura;
    
            }
    
            /// <summary>
            /// Convierte un arraylist de objetos en un datatable a partir de las 'propiedades' del arraylist
            /// </summary>
            /// <param name="array">Arraylist de objetos</param>
            /// <returns>DataTable de salida</returns>
            public static System.Data.DataTable ArrayListToDataTable(ArrayList array)
            {
                System.Data.DataTable dt = new System.Data.DataTable();
                if (array.Count > 0)
                {
                    object obj = array[0];
                    //Convertir las propiedades del objeto en columnas del datarow
                    foreach (PropertyInfo info in obj.GetType().GetProperties())
                    {
                        dt.Columns.Add(info.Name, info.PropertyType);
                    }
                }
                foreach (object obj in array)
                {
                    DataRow dr = dt.NewRow();
                    foreach (DataColumn col in dt.Columns)
                    {
                        Type type = obj.GetType();
    
                        MemberInfo[] members = type.GetMember(col.ColumnName);
    
                        object valor;
                        if (members.Length != 0)
                        {
                            switch (members[0].MemberType)
                            {
                                case MemberTypes.Property:
                                    //leer las propiedades del objeto
                                    PropertyInfo prop = (PropertyInfo)members[0];
                                    try
                                    {
                                        valor = prop.GetValue(obj, new object[0]);
                                    }
                                    catch
                                    {
                                        valor = prop.GetValue(obj, null);
                                    }
    
                                    break;
                                case MemberTypes.Field:
                                    //leer los campos del objeto (no se usa 
                                    //dado q hemos poblado el dt con las propiedades del arraylist)
                                    FieldInfo field = (FieldInfo)members[0];
                                    valor = field.GetValue(obj);
                                    break;
                                default:
                                    throw new NotImplementedException();
                            }
                            dr[col] = valor;
                        }
                    }
                    dt.Rows.Add(dr);
                }
                return dt;
            }
    
    
    
            public static string readcell(Range oRange)
            {
                String result = string.Empty;
                if (oRange != null)
                {
                    if (oRange.Text != null)
                    {
                        result = oRange.Text.ToString();
                    }
                }
                return result;
            }
    
        }
    }
    




    sexta-feira, 22 de maio de 2009 13:45
  • Bom dia Edgar fiz aqui uns testes utilizando DataTable com uma coluna do tipo double, fiz umas alterações no código da classe que me passou e de certo exporto para o Excel colocando a máscara nos valores do tipo Double.
    O que você tem de verificar para que essa classe funcione corretamente é o tipo de dado da coluna que está vindo os valores números (se é um decimal, double, int), após fazer isso no if (dgv.Columns[dc.Caption].ValueType.Equals(typeof(double))) mude o typeof para o tipo utilizado nos seus valores.

    Segue o código da classe.

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    using System.Windows.Forms;
    using Microsoft.Office.Interop;
    using Microsoft.VisualBasic;
    using Microsoft.Office.Interop.Excel;
    using System.Data;
    using System.Reflection;
    using System.Collections;
    using System.Configuration;
    //using Opcion.Util;


    namespace Tools.ExportToExcel
    {
        public class ExportToExcel
        {
            /// <summary>
            /// Exporta la información de un dataGridView a Excel
            /// </summary>
            /// <param name="dataGridView">DataGridView de origen</param>
            /// <param name="pFullPath_toExport">Ruta del archivo exportado</param>
            /// <param name="nameSheet">Nombre de la hoja</param>
            /// <param name="showExcel">Mostrar excel?</param>
            public void dataGridView2Excel(DataGridView dataGridView, string pFullPath_toExport, string nameSheet)
            {
                Object obj = dataGridView.DataSource;
                System.Data.DataTable dt = new System.Data.DataTable();

                //Obtener un datatable del datagridview
                if (dataGridView.DataSource is DataSet)
                {
                    if (((System.Data.DataSet)dataGridView.DataSource).Tables.Count > 0)
                        dt = ((System.Data.DataSet)dataGridView.DataSource).Tables[0];
                    else
                        dt = new System.Data.DataTable();
                }
                else if (dataGridView.DataSource is System.Data.DataTable)
                {
                    dt = (System.Data.DataTable)dataGridView.DataSource;
                }
                else if (dataGridView.DataSource is ArrayList)
                {
                    ArrayList arr = (ArrayList)dataGridView.DataSource;
                    dt = ArrayListToDataTable(arr);

                }
                dataTable2Excel(dt, dataGridView, pFullPath_toExport, nameSheet);
            }

            /// <summary>
            /// Exporta la información de un DataTable a Excel
            /// </summary>
            /// <param name="pDataTable">DataTable de origen</param>
            /// <param name="dgv">DataGridView de origen (solo para tomar los titulos de las columnas y determinar las columnas a mostrar)</param>
            /// <param name="pFullPath_toExport">Ruta a exportar</param>
            /// <param name="nameSheet">Nombre de la hoja</param>
            /// <param name="showExcel">Mostrar excel?</param>
            public void dataTable2Excel(System.Data.DataTable pDataTable, DataGridView dgv, string pFullPath_toExport, string nameSheet)
            {
                string vFileName = Path.GetTempFileName();
                FileSystem.FileOpen(1, vFileName, OpenMode.Output, OpenAccess.Default, OpenShare.Default, -1);

                string sb = string.Empty;
                //si existe datagridview, tomar de él los nombres de columnas y la visibilidad de las mismas
                if (dgv != null)
                {
                    foreach (DataColumn dc in pDataTable.Columns)
                    {
                        System.Windows.Forms.Application.DoEvents();
                        string title = string.Empty;

                        //recuperar el título que aparece en la grilla
                        //Notar que debe haber sincronía con las columnas del detalle
                        if (dgv.Columns[dc.Caption] != null)
                        {
                            //Obtener el texto de cabecera de la grilla
                            title = dgv.Columns[dc.Caption].HeaderText;
                            sb += title + ControlChars.Tab;
                        }
                    }
                }
                else
                {
                    //si no existe datagridview tomar el nombre de la columna del datatable
                    foreach (DataColumn dc in pDataTable.Columns)
                    {
                        System.Windows.Forms.Application.DoEvents();
                        string title = string.Empty;

                        title = dc.Caption;
                        sb += title + ControlChars.Tab;

                    }
                }

                FileSystem.PrintLine(1, sb);

                int i = 0;
                //para cada fila de datos
                foreach (DataRow dr in pDataTable.Rows)
                {
                    System.Windows.Forms.Application.DoEvents();
                    i = 0;
                    sb = string.Empty;
                    //para cada columna de datos
                    foreach (DataColumn dc in pDataTable.Columns)
                    {
                        //solo mostrar aquellas columnas q pertenezcan a la grilla
                        //notar que debe haber sincronia con las columnas del la cabecera
                        if (dgv != null && dgv.Columns[dc.Caption] != null)
                        {
                            //Verifica se o tipo de dado é um double ou seja é um número
                            if (dgv.Columns[dc.Caption].ValueType.Equals(typeof(double)))
                            {
                                double douValor = Convert.ToDouble((Information.IsDBNull(dr[i]) ? 0 : Convert.ToDouble(dr[i])));
                                sb = sb + douValor.ToString("###,##0.00") + ControlChars.Tab;
                            }
                            else
                            {
                                System.Windows.Forms.Application.DoEvents();
                                //Linea q genera la impresión del registro
                                sb = sb + (Information.IsDBNull(dr[i]) ? string.Empty : FormatCell(dr[i])) + ControlChars.Tab;
                            }
                        }
                        else if (dgv == null)
                        {
                            System.Windows.Forms.Application.DoEvents();
                            //Linea q genera la impresión del registro
                            sb = sb + (Information.IsDBNull(dr[i]) ? string.Empty : FormatCell(dr[i])) + ControlChars.Tab;
                        }
                        i++;
                    }


                    FileSystem.PrintLine(1, sb);
                }
                FileSystem.FileClose(1);
                TextToExcel(vFileName, pFullPath_toExport, nameSheet);
            }

            /// <summary>
            /// Limpieza de caracteres de la celda a exportar
            /// </summary>
            /// <param name="cell">Celda del datarow a formatear</param>
            /// <returns>cadena formateada</returns>
            private string FormatCell(Object cell)
            {
                string TextToParse = Convert.ToString(cell);
                return TextToParse.Replace(",", string.Empty);
            }

            /// <summary>
            /// Exporta un determinado texto en cadena a excel
            /// </summary>
            /// <param name="pFileName">Filename del archivo exportado</param>
            /// <param name="pFullPath_toExport">Ruta del archivo exportado</param>
            /// <param name="nameSheet">nombre de la hoja</param>
            /// <param name="showExcel">Mostrar excel?</param>
            private void TextToExcel(string pFileName, string pFullPath_toExport, string nameSheet)
            {
                System.Globalization.CultureInfo vCultura = System.Threading.Thread.CurrentThread.CurrentCulture;
                System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CurrentCulture;
                Microsoft.Office.Interop.Excel.Application Exc = new Microsoft.Office.Interop.Excel.Application();
                Exc.Workbooks.OpenText(pFileName, Missing.Value, 1,
                    XlTextParsingType.xlDelimited,
                    XlTextQualifier.xlTextQualifierNone,
                    Missing.Value, Missing.Value,
                    Missing.Value, false,
                    Missing.Value, Missing.Value,
                    Missing.Value, Missing.Value,
                    Missing.Value, Missing.Value,
                    Missing.Value, Missing.Value, Missing.Value);

                Workbook Wb = Exc.ActiveWorkbook;
                Worksheet Ws = (Worksheet)Wb.ActiveSheet;
                Ws.Name = nameSheet;

                try
                {
                    //Formato de cabecera
                    Ws.get_Range(Ws.Cells[1, 1], Ws.Cells[Ws.UsedRange.Rows.Count, Ws.UsedRange.Columns.Count]).AutoFormat(XlRangeAutoFormat.xlRangeAutoFormatClassic1, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
                }
                catch
                {
                    Ws.get_Range(Ws.Cells[1, 1], Ws.Cells[Ws.UsedRange.Rows.Count, Ws.UsedRange.Columns.Count]);
                }

                string tempPath = Path.GetTempFileName();

                pFileName = tempPath.Replace("tmp", "xls");
                File.Delete(pFileName);

                if (File.Exists(pFullPath_toExport))
                {
                    File.Delete(pFullPath_toExport);
                }
                Exc.ActiveWorkbook.SaveAs(pFullPath_toExport, 1, null, null, null, null, XlSaveAsAccessMode.xlNoChange, null, null, null, null, null);

                Exc.Workbooks.Close();

                System.Runtime.InteropServices.Marshal.ReleaseComObject(Ws);
                Ws = null;

                System.Runtime.InteropServices.Marshal.ReleaseComObject(Wb);
                Wb = null;

                Exc.Quit();

                System.Runtime.InteropServices.Marshal.ReleaseComObject(Exc);
                Exc = null;
                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();
                System.Threading.Thread.CurrentThread.CurrentCulture = vCultura;

            }

            /// <summary>
            /// Convierte un arraylist de objetos en un datatable a partir de las 'propiedades' del arraylist
            /// </summary>
            /// <param name="array">Arraylist de objetos</param>
            /// <returns>DataTable de salida</returns>
            public static System.Data.DataTable ArrayListToDataTable(ArrayList array)
            {
                System.Data.DataTable dt = new System.Data.DataTable();
                if (array.Count > 0)
                {
                    object obj = array[0];
                    //Convertir las propiedades del objeto en columnas del datarow
                    foreach (PropertyInfo info in obj.GetType().GetProperties())
                    {
                        dt.Columns.Add(info.Name, info.PropertyType);
                    }
                }
                foreach (object obj in array)
                {
                    DataRow dr = dt.NewRow();
                    foreach (DataColumn col in dt.Columns)
                    {
                        Type type = obj.GetType();

                        MemberInfo[] members = type.GetMember(col.ColumnName);

                        object valor;
                        if (members.Length != 0)
                        {
                            switch (members[0].MemberType)
                            {
                                case MemberTypes.Property:
                                    //leer las propiedades del objeto
                                    PropertyInfo prop = (PropertyInfo)members[0];
                                    try
                                    {
                                        valor = prop.GetValue(obj, new object[0]);
                                    }
                                    catch
                                    {
                                        valor = prop.GetValue(obj, null);
                                    }

                                    break;
                                case MemberTypes.Field:
                                    //leer los campos del objeto (no se usa
                                    //dado q hemos poblado el dt con las propiedades del arraylist)
                                    FieldInfo field = (FieldInfo)members[0];
                                    valor = field.GetValue(obj);
                                    break;
                                default:
                                    throw new NotImplementedException();
                            }
                            dr[col] = valor;
                        }
                    }
                    dt.Rows.Add(dr);
                }
                return dt;
            }

     

            public static string readcell(Range oRange)
            {
                String result = string.Empty;
                if (oRange != null)
                {
                    if (oRange.Text != null)
                    {
                        result = oRange.Text.ToString();
                    }
                }
                return result;
            }

        }
    }


    Guilherme Pizolato (MCP) - Microsoft Certified Professional
    sexta-feira, 22 de maio de 2009 14:43
  • Edgar segue o resultado que a classe me gerou

    Valor Descricao
    10,99 Produto A


    Guilherme Pizolato (MCP) - Microsoft Certified Professional
    sexta-feira, 22 de maio de 2009 14:45
  • Guilherme era isso mesmo, olhei nas propriedades e não é double e sim decimal, agora deu certo. muito obrigado! estou te devendo uma cerveja rs...
    sexta-feira, 22 de maio de 2009 14:49