如何提高C#中將資料匯入到Excel的效能

來源:互聯網
上載者:User

C#中將表資料匯入Excel一般都是將資料逐個Cell的插入到Excel裡。如下(只是代碼片斷):

Object missing = Missing.Value;

Excel.Application myexcel = new Excel.Application(); //建立EXCEL執行個體

myexcel.Application.Workbooks.Open(filename, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing); //開啟filename表

myexcel.Visible = false;

Excel.Workbook myworkbook = myexcel.Workbooks[1];

Excel.Worksheet myworksheet = (Excel.Worksheet)myexcel.Worksheets[1];//聲明一頁的執行個體

for (int i = 0; i < rownum; i++)

{

     GridViewRow gvr = mydata.Rows[i];

     for (int j = 0; j < colnum; j++)

    {

myexcel.Cells[i + 8, j + 1] = "'" + gvr.Cells[j].Text.Replace("&nbsp;","");

    }

}

但是,由於對Excel的Cell賦值效率很低(因為每對Cell賦一次值都回導致調用一次Excel COM+組件的介面),所有如果資料多起來的話,對Excel COM+組件的訪問就會很頻繁,從而導致程式運行效率極其低下。

要解決這個問題主要是減少對Cell的訪問次數。查閱Excel的API可知,可以通過對它的一個屬性Value2賦值(數組)來實現和上述代碼一樣的作用。這就可以避免了頻繁訪問Cell而導致的效能急劇下降。

改進後的代碼如下:

    …

Array arr = Array.CreateInstance(typeof(String), rownum, colnum);

for (i = 0; i < rownum; i++)

{

for (j = 0; j < colnum; j++)

{

arr.SetValue(mydata.Rows[i].Cells[j].Text.Replace("&nbsp", ""), i, j);

}

}

Excel.Range range = myworksheet.get_Range(myworksheet.Cells[5, 1], myworksheet.Cells[rownum + 4, colnum]);

range.Value2 = arr;

BTW:老是覺得Excel的屬性Value2的命名看起來很不舒服,有點不是很規範。不知他們為什麼要這樣命名。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.