Range rang=sheet2.get_Range(excelApp.Cells[2,1],excelApp.Cells[/color[color=#FF0000]][dgvCLPshow.Rows.Count+1,dgvCLPshow.Columns.Count]);
 object[,] objData=new object[dgvCLPshow.Rows.Count,dgvCLPshow.Columns.Count];
 for (int i = 0; i < dgvCLPshow.Rows.Count; i++)
 {
  for (int j = 0; j < dgvCLPshow.Columns.Count; j++)
   {
      objData[i,j]= dgvCLPshow.Rows[i].Cells[j].Value;
    }
     exportCount = i;
 }
 rang.Value2 = objData;以上红色代码为我添加代码,之前我只是用循环来导出datagridview中的数据到excel,速度真的挺慢的,到网上看了一下,就把这几句代码加上去试一下,谁知道速度却快了好几倍,1万多条数据3秒内就导出了,我想问一下各位上面的那个数组,那样声明是不是算二维数组,但是为什么二维数组可以直接负给excel,而且速度快这么多

解决方案 »

  1.   

     Range rang=sheet2.get_Range(excelApp.Cells[2,1],excelApp.Cells[dgvCLPshow.Rows.Count+1,dgvCLPshow.Columns.Count]);
                    object[,] objData=new object[dgvCLPshow.Rows.Count,dgvCLPshow.Columns.Count];

                    for (int i = 0; i < dgvCLPshow.Rows.Count; i++)
                    {
                        for (int j = 0; j < dgvCLPshow.Columns.Count; j++)
                        {
                            objData[i,j]= dgvCLPshow.Rows[i].Cells[j].Value;
                        }
                        exportCount = i;
                    }
                    rang.Value2 = objData;
      

  2.   

    Excel支持二维数组的导入及导出方法,所以快了。
      

  3.   

    还有很多方法,比如拷贝粘贴,先把数据拷贝到内存,然后粘贴到excel中,这样也挺快。
    不过自我感觉还是二维数组导入最好用。把一个二维数组直接赋给一个rang,和把table中一个个元素,分别赋给一个个rang比,当然快很多了。
    调用excel本来就慢,一个个操作range就更慢,所以一定要避免一个个操作range.
      

  4.   

    for (int i = 0; i < dgvCLPshow.Rows.Count; i++)
     {
      for (int j = 0; j < dgvCLPshow.Columns.Count; j++)
      {
      objData[i,j]= dgvCLPshow.Rows[i].Cells[j].Value;
      }
      exportCount = i;
     }
    上面这个代码本身dgvCLPshow.Rows.Count; 就存在性能问题excel 本身通过二维数组直接定位单元格,不会一行一列定位这就是快的根本原因
      

  5.   

    不是很明白,普通的循环也是一个个元素导出,别一个方法也是一个个数据放到二维数组中,再把二维数组负给rang.同样是一个个的赋值,为什么就快那么多。
      

  6.   

    给一个range赋值,管它range范围多大的,用的时间差别很小的。
    但是每次new 一个range,用的时间就多了。
    其实说白了,就是给一个range赋值和给无数的range赋值的区别。
      

  7.   

    C#操作Excel时写入值需要做的步骤是:首先定位需要插入值的Range,然后对该Range复制,首先要清楚,通过C#操作Excel组件的速度是很慢的;你循环dgv,相当于把定位Range,写入Range值这件事情做了dgv.Rows.Count*dgv.Columns.Count次!
    相反,首先在内存循环dgv,将dgv的值整合到一个Object[,]中,然后一次性对Range复制,这个过程只需要做一次!