[C#] 讀 Excel 資料

  • 13776
  • 0
  • C#
  • 2008-11-24

摘要:[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就不怕別人拿去用,我不是靠布落格賺錢的,也沒必要賺什麼人氣,純粹只是抱持著拋磚引玉的心態,學會的東西就是你的,你在進步,我也在成長,無所謂。

方法一:這種直接讀取單元格的方法釋放很重要。大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站i$Qd I7FS:_
   Excel.Application excel = null;
b2h"l$z e![0   Excel.Workbooks wbs = null;大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站 ^5A8b}0UwZ
   Excel.Workbook wb = null;大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站#lY0J ?d1EL�Z
   Excel.Worksheet ws = null;大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站 a1x.r oc1M
   Excel.Range range1 = null;大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站9[3yvRG%m
   object Nothing = System.Reflection.Missing.Value;
o9J!B/N/m@0    
)v1U F(w A|w0   try大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站f!m�w/qN/l
   {大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站/L)y�ndeP?Rq
    excel = new Excel.Application();大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站0S)x.G%F'`8gWc
    excel.UserControl = true;
:g7l4Q+olhSY0    excel.DisplayAlerts = false;大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站q�i5b"Mx c m~!k
                    大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站q:_/w-NTw'|$Z%Yx
    excel.Application.Workbooks.Open(this.FilePath,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing ) ;
2z|%ov9P6N l0    
~dIS(]0    wbs = excel.Workbooks;
%sL6NM~+JmTRlE0    wb = wbs[1];大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站+H _6{ND#w Q"g y
    ws = (Excel.Worksheet)wb.Worksheets["Sheet2"];
o5uw(VJ*@%}0    大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站?g'WJ}!^Z
          
!l:~iE }5DjQI._;g0    int rowCount = ws.UsedRange.Rows.Count;
+C%U9ML|*]7_�\0    int colCount = ws.UsedRange.Columns.Count;大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站(^ jJ#b%W^[^7w-b;S
    if (rowCount <= 0)
@K7_ hu{0     throw new InvalidFormatException("文件中沒有數據記錄");
*Y1b;EpL?6LUo0    if (colCount < 4 )大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站LN[�C6D5R/g
     throw new InvalidFormatException("字段個數不對");大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站m!gc'T,n6C2j?
    大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站I b Q&t C3h
    for (int i = 0;i<colCount ;i++)
6`L+u5`$i:xI:CJ$R0    {大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站|*b3vo iJkA
     this.rowNo = i + 1;大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站.q#p-|;U3P;A9}%q
     object[] row = new object[4];大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站 gZ c?f
     for (int j = 0;j<4;j++)大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站B1wIXz,z
     {
X�b Z M.}0      range1 = ws.get_Range(ws.Cells[i+2,j+1],ws.Cells[i+2,j+1]);
tFg/bt0      row[j] = range1.Value;大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站:`3i:^.]8QGR p(R
      if (row[0] == null)
0h u e7Jy0      {
!Yf#]EL0       this.isNullRecord++;
'Up0U{vC3xj0       break;
WQ$u#qx;H0      }
+}2M.~F7U;vy8h_*c0     }大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站*g"sUHn
                    大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站 Hc J.l4o4P,Lc
     if (this.isNullRecord > 0)
cC0z1qJ'Lf'Mp0D:A�I0      continue;大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站-AB2sF/zn
     DataRow dataRow = this.readExcel(row);大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站7l(C/s-\/v1L.nb
     if (this.isNullRecord == 1)大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站i4OD9u Lr-f
      continue;
WD*V0X Ne"l+F0  大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站S.{ O"Jn+A"_-gnn
     if (this.verifyData(dataRow) == false)大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站w"v9s\v+G$T|
      errFlag++;
xic%G\O J ?:i0  大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站g Fd'KG)v)s"i
     this.updateTableCurr(dataRow);大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站X-`3Uvy3Z0BN
    }
,f:t}tc~&q0    大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站Y:MmQg Z(G
   }大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站:N t/n t�YL
   finally大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站?%Q%^"YW.eum
   {
(]l%T&pz/Mu:G s8C4z0    if (excel != null)大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站/l�aihD [*XN
    {
2o(X:F6?F.~:^ z0     if (wbs != null)
:t&s.WP%Sbe0     {
&^Cc+H'q-^J2W-E6t0      if (wb != null)
@D&H~u`$E0      {大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站 w/E"f+P*{7j9\
       if (ws != null)
Y.M@%p^#?5tY0       {
$DBIts$]0|6gs0        if (range1 != null)大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站 b^;h(S.r.a&lv
        {
d"~ p ^t~w6f0         System.Runtime.InteropServices.Marshal.ReleaseComObject(range1);
Wlc\;Y0         range1 = null;大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站6wft7u)t
        }大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站|A~&_~d
        System.Runtime.InteropServices.Marshal.ReleaseComObject(ws);大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站BHt.b:}$h8U
        ws = null;大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站�z/EL){z4b
       }
YWi+FdPCs0       wb.Close(false,Nothing,Nothing);  
.jb@Ex{BV*aP0       System.Runtime.InteropServices.Marshal.ReleaseComObject(wb);大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站 xh V{IN
       wb = null;
\1XShK {3x7J0      }
C/QjfU$A0      wbs.Close();大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站&z$J"h_,j-z+EE%S L
      System.Runtime.InteropServices.Marshal.ReleaseComObject(wbs);
%@'c:T%Z(^an [0      wbs = null;
s+pR3v4~3h5J1|-y0     }大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站&`CF9gfm
     excel.Application.Workbooks.Close();大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站6Oxo/e/|)MCVt
     excel.Quit();大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站%g!wZ3s9DL?4e
     System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站3] S`(~(`D:m"[
     excel = null;
"Hn] dD9Q t0     GC.Collect();大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站0` r"tB*d2k-D"K.i
    }
/h/nF~5X)T+~!U:n0   }大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站}s9A QZL
方法二:這裡是fill進dataset,也可以返回OleDbDataReader來逐行讀,數據較快
s-v-sKH{lj*rP0註:這種方法容易把混合型的字段作為null值讀取進來,解決辦法是改造連接字符串
]`Jn,t'j%K'iZ0strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Erp1912.xls;Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'";大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站F Q \)F+QL
通過Imex=1來把混合型作為文本型讀取,避免null值


6]#[d/tsS'B9]0private DataSet importExcelToDataSet(string FilePath)
u}f:I0Ov|'COtR0  {大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站'|P d5YX
   string strConn;
p1@ y|.W/fL1\r0   strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + FilePath + ";Extended Properties=Excel 8.0;";
?u.f;SdpXB,Q0   OleDbConnection conn = new OleDbConnection(strConn);
w0h}p&V0gti9Pxf0   OleDbDataAdapter myCommand = new OleDbDataAdapter("SELECT * FROM [Sheet1$]",strConn);大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站*n&Ey;^h1yS&_
   DataSet myDataSet = new DataSet();
m_*om1g1Rj#_e'r0   try大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站u j)b3P0}o
   {
%~U\G*np!^a:`N0    myCommand.Fill(myDataSet);
;hmJ"lq UF._$e0   }大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站 q'vh:I:o6_UJ
   catch(Exception ex)大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站sDi#pj4fk
   {
b;lm@l.y5{(D+v+l0    throw new InvalidFormatException("該Excel文件的工作表的名字不正確," + ex.Message);
}�U!O-y:N0   }
A4}F,YQUl0   return myDataSet;大風車社區門戶-多媒體互動英語交流平台-中英文門戶網站g;\%MJ2{ f
  }

 

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo