摘要:[C#] 讀 Excel 資料
隨手記~
dear all : 
感謝普羅大眾的支持沒想到一篇垃圾文竟然引起那麼大的響應,受到關注的程度真是讓我受寵若驚,倒是那些我親手Keyin經過測試的的東西,卻乏人問津,唉~真是一大諷刺。
這東西是隨手記錄而已,別說垃不垃圾,連出處都不清楚,程式碼是否可執行我也不清楚,所以我也覺得沒必要太在意,如果你真的要知道作者是誰,請你們追根究底將網路上每一篇長的一樣的文章都詢問清楚吧,這樣或許太為難你們了,只要將這篇長的一模一樣的文章作者追出來就好,我也想知道作者是誰,這篇資料網路上到處找都找的到,試試搜尋"c# 讀 excel" 關鍵字。
http://www.google.com.tw/search?q=c%23+%E8%AE%80+excel&sourceid=navclient-ff&ie=UTF-8&rlz=1B3GGGL_zh-TWTW300TW300
如果你覺得這篇文章很垃圾,你也可以不用看,因為我也覺得很垃圾,我自己連能不能執行都不知道;但你如果都用盜版軟體、MP3、電影,然後在這裡假清高,選擇性支持正版,覺得我很垃圾,你可以選擇不要看這篇資料,我也不會因此而看不起你,因為你自己是什麼樣的人,自己最清楚;倒是我裡面還有寫很多好用的東西,程度不是很高,也非常需要有人去指導,有空去那邊討論討論,促進彼此的成長;如果你想用這篇垃圾文幫我衝人氣,跟我打打嘴砲,這倒是蠻好的,我還蠻樂意的。
另外,我的文章只要有貼圖上完原始碼都是經過測試,歡迎各位分享,我敢寫在blog就不怕別人拿去用,我不是靠布落格賺錢的,也沒必要賺什麼人氣,純粹只是抱持著拋磚引玉的心態,學會的東西就是你的,你在進步,我也在成長,無所謂。
方法一:這種直接讀取單元格的方法釋放很重要。
   Excel.Application excel = null;
   Excel.Workbooks wbs = null;
   Excel.Workbook wb = null;
   Excel.Worksheet ws = null;
   Excel.Range range1 = null;
   object Nothing = System.Reflection.Missing.Value;
    
   try
   {
    excel = new Excel.Application();
    excel.UserControl = true;
    excel.DisplayAlerts = false;
                    
    excel.Application.Workbooks.Open(this.FilePath,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing ) ;
    
    wbs = excel.Workbooks;
    wb = wbs[1];
    ws = (Excel.Worksheet)wb.Worksheets["Sheet2"];
    
          
    int rowCount = ws.UsedRange.Rows.Count;
    int colCount = ws.UsedRange.Columns.Count;
    if (rowCount <= 0)
     throw new InvalidFormatException("文件中沒有數據記錄");
    if (colCount < 4 )
     throw new InvalidFormatException("字段個數不對");
    
    for (int i = 0;i<colCount ;i++)
    {
     this.rowNo = i + 1;
     object[] row = new object[4];
     for (int j = 0;j<4;j++)
     {
      range1 = ws.get_Range(ws.Cells[i+2,j+1],ws.Cells[i+2,j+1]);
      row[j] = range1.Value;
      if (row[0] == null)
      {
       this.isNullRecord++;
       break;
      }
     }
                    
     if (this.isNullRecord > 0)
      continue;
     DataRow dataRow = this.readExcel(row);
     if (this.isNullRecord == 1)
      continue;
  
     if (this.verifyData(dataRow) == false)
      errFlag++;
  
     this.updateTableCurr(dataRow);
    }
    
   }
   finally
   {
    if (excel != null)
    {
     if (wbs != null)
     {
      if (wb != null)
      {
       if (ws != null)
       {
        if (range1 != null)
        {
         System.Runtime.InteropServices.Marshal.ReleaseComObject(range1);
         range1 = null;
        }
        System.Runtime.InteropServices.Marshal.ReleaseComObject(ws);
        ws = null;
       }
       wb.Close(false,Nothing,Nothing);  
       System.Runtime.InteropServices.Marshal.ReleaseComObject(wb);
       wb = null;
      }
      wbs.Close();
      System.Runtime.InteropServices.Marshal.ReleaseComObject(wbs);
      wbs = null;
     }
     excel.Application.Workbooks.Close();
     excel.Quit();
     System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
     excel = null;
     GC.Collect();
    }
   }
方法二:這裡是fill進dataset,也可以返回OleDbDataReader來逐行讀,數據較快
註:這種方法容易把混合型的字段作為null值讀取進來,解決辦法是改造連接字符串
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Erp1912.xls;Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'";
通過Imex=1來把混合型作為文本型讀取,避免null值
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET