none
Transferir dataGridView para o excel com tratamento de campo data [RESOLVIDO] RRS feed

  • Pergunta

  • Bom dia pessoal!

    vem aqui para solicitar um help - tô ralando para tentar solucionar - usando o Visual2010 e excel 2007, na aplicação tenho esse código para transferir o grid para o excel.

    private void btExportar_Click(object sender, EventArgs e)
            {            
                int linha, coluna;
                
                Microsoft.Office.Interop.Excel.Application XcelApp = new Microsoft.Office.Interop.Excel.Application();
                Microsoft.Office.Interop.Excel.Range celulas;
                            
                
                    try
                    {
                        XcelApp.Application.Workbooks.Add(Type.Missing);
                        
                        //CRIA E PREENCHE O CABEÇALHO DA PLANILHA                    
                        for (coluna = 1; coluna < dataGridCupom.Columns.Count + 1; coluna++)
                        {
    
                            XcelApp.Cells[1, coluna] = dataGridCupom.Columns[coluna - 1].HeaderText;
                          
                        }
    
                        
                        //PREENCHE O CORPO DA PLANILHA
                        for (linha = 0; linha < dataGridCupom.Rows.Count; linha++)
                        {
                            
                            for (coluna = 0; coluna < dataGridCupom.Columns.Count; coluna++)
                            {                                
                                    XcelApp.Cells[linha + 2, coluna + 1] = dataGridCupom.Rows[linha].Cells[coluna].Value.ToString();
                            }
                                                    
                        }
    
                        celulas = XcelApp.get_Range("A2", "A"+linha);
                        //NESSE FORMATO QUANDO TRANSPORTADO ELE CONVERTE PARA O FORMATO pt/BR
                        //PORÉM AS DATAS ACIMA DO DIA 12 VEEM ACOMPANHADAS DE HORA E SEGUNDOS
                        //PERCEBA QUE ELE ESTÁ NO FORMATO (EUA)
                        celulas.NumberFormatLocal = "mm/dd/aaaa";
    
                        //CENTRALIZA OS TEXTOS DO CABEÇALHO
                        celulas = XcelApp.get_Range("A1", "I1");
                        celulas.HorizontalAlignment = Microsoft.Office.Interop.Excel.Constants.xlCenter;
                        
                        //AJUSTA O TAMANHO DAS CÉLULAS DE ACORDO COM O TEXTO
                        XcelApp.Columns.AutoFit();
                        
                        //TORNA A PLANILHA VISÍVEL
                        XcelApp.Visible = true;
    
                        MessageBox.Show("Arquivo transferido com sucesso!", ".:: I N F O R M A Ç Ã O ::.", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Erro : " + ex.Message);
                        XcelApp.Quit();
                    }
                }
            }
    
            }

    Na formatação já tentei com o formato "dd/mm/aaaa" mas quando  é transferido ela é invertida para o formato americano. Isso acontece até o dia 12 do mês e depois retorna para o formato brasileiro. Trazendo junto hora, minutos e segundos (o que eu não quero). Quando formatado no formato americano - esse aí do código - até o dia 12 vem como eu quero - só as datas - e a partir do dia 13 veem as datas com as horas, minutos e segundos (o que eu não quero).

    Lembro que no excel a data está formatada para o formato local (brasileiro)

    Será que alguém pode ajudar?

    Marcello M. Mariano


    • Editado Marcello M. Mariano quarta-feira, 22 de março de 2017 12:07 Destaque no título [RESOLVIDO]
    segunda-feira, 20 de março de 2017 12:16

Respostas

Todas as Respostas

  • Olá,

    O problema ocorre porque você está utilizando o ToString() para gravar os valores das células... quando você faz isso, o Excel grava em formato de String... exatamente a data completa, já que no seu médido ToString() você não especificou o formato.... 

    Em uma pesquisa rápida, encontrei algo sobre o método ToOADate() que converte uma data para o formato numérico utilizado pelo Excel... assim a sua formtação posterior vai aplicar corretamente... O único detalhe é que você precisa fazer este ToOADate() somente na informação que for Data...

    Documentação do método: https://msdn.microsoft.com/en-gb/library/system.datetime.tooadate.aspx

    Att,


    Fabio Rosa.

    segunda-feira, 20 de março de 2017 12:52
  • Ok Fabio Rosa. Vlw pelo feedback. Tratarei o código e retorno o resultado.

    Marcello M. Mariano

    segunda-feira, 20 de março de 2017 17:03
  • Então. Ficou assim:

    Depois de muito labutar - lombalgia maldita - muitas tentativas e erros segue a resolução do problema.

    Espero que aproveitem!

    Agradeço ao Fabio Rosa pela força.

    private void btExportar_Click(object sender, EventArgs e)
            {            
                int linha, coluna;
                DateTime vData;
                
                Microsoft.Office.Interop.Excel.Application XcelApp = new Microsoft.Office.Interop.Excel.Application();
                Microsoft.Office.Interop.Excel.Range celulas;
    
                    try
                    {
                        XcelApp.Application.Workbooks.Add(Type.Missing);
                        
                        //CRIA E PREENCHE O CABEÇALHO DA PLANILHA                   
                        for (coluna = 1; coluna < dataGridCupom.Columns.Count + 1; coluna++)
                        {
                            XcelApp.Cells[1, coluna] = dataGridCupom.Columns[coluna - 1].HeaderText;
                        }
                                            
                        //PREENCHE O CORPO DA PLANILHA
                        for (linha = 0; linha < dataGridCupom.Rows.Count; linha++)
                        {
                            
                            for (coluna = 0; coluna < dataGridCupom.Columns.Count; coluna++)
                            {
                                if (coluna == 0)//SE A COLUNA DO GRID FOR 0 - ONDE EU TENHO AS DATAS...
                                {
                                    //CONVERTE PARA O FORMATO DateTime E CARREGA A VARIÁVEL vData COM O VALOR...
                                    vData = Convert.ToDateTime(dataGridCupom.Rows[linha].Cells[coluna].Value);
    
                                    //E GRAVA NA PLANILHA E INCREMENTA LINHA E COLUNA
                                    XcelApp.Cells[linha + 2, coluna + 1] = vData;
                                    //MessageBox.Show(vData.ToShortDateString()+"  "+linha.ToString());
                                }
                                    
                                //SE COLUNA DIFERENTE DE 0, GRAVA COMO STRING
                                else
                                {
                                    XcelApp.Cells[linha + 2, coluna + 2] = dataGridCupom.Rows[linha].Cells[coluna].Value.ToString();
                                }
                                
                            }
                                                    
                        }
    
                        celulas = XcelApp.get_Range("A2", "A"+linha);
                        //COLOQUEI O FORMATO pt(BR)
                        //E AS DATAS PERMANECERAM NO FORMATO ShortDateTime();
                        celulas.NumberFormatLocal = "dd/mm/aaaa";
    
                        //CENTRALIZA OS TEXTOS DO CABEÇALHO
                        celulas = XcelApp.get_Range("A1", "I1");
                        celulas.HorizontalAlignment = Microsoft.Office.Interop.Excel.Constants.xlCenter;
                        
                        //AJUSTA O TAMANHO DAS CÉLULAS DE ACORDO COM O TEXTO
                        XcelApp.Columns.AutoFit();
                        
                        //TORNA A PLANILHA VISÍVEL
                        XcelApp.Visible = true;
    
                        MessageBox.Show("Arquivo transferido com sucesso!", ".:: I N F O R M A Ç Ã O ::.", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Erro : " + ex.Message);
                        XcelApp.Quit();
                    }
                }
            }
    
            }

    No mais vamos em frente que o Brasil precisa da gente!

    #partiu + C#

    Marcello M. Mariano

    quarta-feira, 22 de março de 2017 12:04
  • Olá Marcello!

    Que bom que conseguiu resolver!

    Estamos sempre disponível para apoiar!

    Abraço!


    Fabio Rosa.

    quarta-feira, 22 de março de 2017 12:48