none
Inserir linha no Excel através do C# RRS feed

  • Pergunta

  • Olá a todos,

    estou iniciando no C# e estou criando um programinha para tratar dados de medições meteorológicas. Essa medição é feita de 5 em 5 minutos. Assim sendo, começa-se a medir 00:05 e a próxima medição será 00:10. Só que, as vezes, ele não faz uma medição: de 00:05 vai para 00:15.

    Esse programa que eu estou fazendo é para inserir linhas onde eu encontrar essa falta. Eu já consegui fazer o código para localizar os "furos de dados" e retornar o número da linha que necessita ser inserida. Agora, falta conseguir inserir a linha.

    Procurei em diversos foruns porém não encontrei nada que funcionasse. Segue a parte do programa na qual preciso inserir a linha:

    Excel._Worksheet oSheet; /*define oSheet como sheet */
                var teste = new Excel.Application(); /* variavel teste como uma aplicação de Excel */
                teste.Workbooks.Open(@"C:\Users\Rafael\Documents\FOTOVOLTAICA\Pasta2.xlsm", Type.Missing, false); /*Abrir uma planilha de excel atraves da aplicação teste */
                ((Excel.Worksheet)teste.Application.ActiveWorkbook.Sheets[1]).Select(Type.Missing);
                oSheet = (Excel._Worksheet)teste.ActiveSheet; /*Define oSheet uma sheet do arquivo ativo */
                teste.Visible = true;
    
                for (int i = 1; i < dataGridView1.RowCount - 1; i++)
                {
                    if (dataGridView1.Rows[i].Cells[0].Value.ToString() == "" || dataGridView1.Rows[i].Cells[1].Value.ToString() == "")
                    {
    
                        dataGridView1.Rows.RemoveAt(i);
                        i--;
                    }
    
                }
    
                string[] erros = new string[8];
                int t = dataGridView1.Rows.Count - 1;
    
    
    
                for (int a = 1; a <= t; a++)
                {
    
                    erros[a] = dataGridView1.Rows[a].Cells[3].Value.ToString();
    
    
                }
    
                for (int b = 1; b <= 8; b++)
                {
                    Excel.Range r = teste.ActiveSheet.get_Range("A" + erros[b].ToString(), "A" + erros[b].ToString()).EntireRow;
                    r.Insert(Excel.XlInsertShiftDirection.xlShiftDown);
    
    
                }
                
            }

    O Excel.Range r = ... Não está funcionando para este fim. Alguém saberia alguma alternativa?

    Muito obrigado,

    Rafael.

    domingo, 6 de abril de 2014 20:02

Respostas

  • Da uma olhada nisso.

                for (int i = 2; i < dtb.Rows.Count + 2; i++)
                {
                    DataRow row = dtb.Rows[i - 2]; // excel funciona no 1 e dtb no 0 então subtrai um para igualar os 2
                    for (int i2 = 1; i2 < dtb.Columns.Count + 1; i2++)
                    {
                        try
                        {
                            Microsoft.Office.Interop.Excel.Range rg = (ws.Cells[i, i2] as Microsoft.Office.Interop.Excel.Range); // primeiro linha segundo coluna, no dtb começa 0 execel começa 1
                            rg.Value2 = row[i2 - 1].ToString();
                        }
                        catch
                        {
                        }
    
                    }
                }

    • Sugerido como Resposta Giovani Cr segunda-feira, 7 de abril de 2014 18:59
    • Marcado como Resposta Giovani Cr quarta-feira, 9 de abril de 2014 19:39
    segunda-feira, 7 de abril de 2014 17:17
  • Olá Dietrich_Prg,

    muito obrigado pela resposta. Consegui resolver meu problema com o seguinte código:

    const int xlShiftDown = -4121;
                        Excel.Range oRange = oSheet.get_Range("A"+linhas[b]);
                        Excel.Range oRow = oRange.EntireRow;
                        oRow.Insert(xlShiftDown);

    Obrigado novamente.

    Rafael.

    • Marcado como Resposta Giovani Cr quarta-feira, 9 de abril de 2014 19:39
    segunda-feira, 7 de abril de 2014 23:58

Todas as Respostas

  • Da uma olhada nisso.

                for (int i = 2; i < dtb.Rows.Count + 2; i++)
                {
                    DataRow row = dtb.Rows[i - 2]; // excel funciona no 1 e dtb no 0 então subtrai um para igualar os 2
                    for (int i2 = 1; i2 < dtb.Columns.Count + 1; i2++)
                    {
                        try
                        {
                            Microsoft.Office.Interop.Excel.Range rg = (ws.Cells[i, i2] as Microsoft.Office.Interop.Excel.Range); // primeiro linha segundo coluna, no dtb começa 0 execel começa 1
                            rg.Value2 = row[i2 - 1].ToString();
                        }
                        catch
                        {
                        }
    
                    }
                }

    • Sugerido como Resposta Giovani Cr segunda-feira, 7 de abril de 2014 18:59
    • Marcado como Resposta Giovani Cr quarta-feira, 9 de abril de 2014 19:39
    segunda-feira, 7 de abril de 2014 17:17
  • Olá Dietrich_Prg,

    muito obrigado pela resposta. Consegui resolver meu problema com o seguinte código:

    const int xlShiftDown = -4121;
                        Excel.Range oRange = oSheet.get_Range("A"+linhas[b]);
                        Excel.Range oRow = oRange.EntireRow;
                        oRow.Insert(xlShiftDown);

    Obrigado novamente.

    Rafael.

    • Marcado como Resposta Giovani Cr quarta-feira, 9 de abril de 2014 19:39
    segunda-feira, 7 de abril de 2014 23:58
  • é possivel mesclar celulas de uma planilia com o mesmo valor via código?

    segunda-feira, 9 de abril de 2018 20:40