版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
C#讀取Excel的三種方法及比較(1)OleDB方式優(yōu)點:將Excel直接當做數據源處理,通過SQL直接讀取內容,讀取速度較快。缺點:讀取數據方式不夠靈活,無法直接讀取某一個單元格,只有將整個Sheet頁讀取出來后(結果為Datatable)再在Datatable中根據行列數來獲取指定的值。當Excel數據量很大時。會非常占用內存,當內存不夠時會拋出內存溢出的異常。讀取代碼如下:1:publicDataTableGetExcelTableByOleDB(stringstrExcelPath,stringtableName)2:(3:try4: {5:DataTabledtExcel=newDataTable。;6:〃數據表7:DataSetds=newDataSet();8:〃獲取文件擴展名9:stringstrExtension=System.IO.Path.GetExtension(strExcelPath);10:stringstrFileName=System.IO.Path.GetFileName(strExcelPath);11://Excel的連接12:OleDbConnectionobjConn=null;
13:switch(strExtension)14: {15:case".xls":16:objConn=newOleDbConnection("Provider=MicrosoftJetOLEDB.4.0;DataSource="+strExcelPath+";"+"ExtendedProperties=\''Excel8.0;HDR=NO;IMEX=1;\"");17:break;18:case".xlsx":19:objConn=newOleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;DataSource="+strExcelPath+";"+"ExtendedProperties=\"Excel12.0;HDR=NO;IMEX=1;\"");20:break;21:default:22:objConn=null;23:break;TOC\o"1-5"\h\z24: }25:if(objConn==null)26: {27:returnnull;28: }29:objConn.Open();30://獲取Excel中所有Sheet表的信息
31://System.Data.DataTableschemaTable=objConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables,null);32://獲取Excel的第一個Sheet表名33://stringtableName=schemaTable.Rows[0][2].ToString().Trim();34:stringstrSql="select*from["+tableName+'1”;35://獲取Excel指定Sheet表中的信息36:OleDbCommandobjCmd=newOleDbCommand(strSql,objConn);37:OleDbDataAdaptermyData=newOleDbDataAdapter(strSql,objConn);38:myData.Fill(ds,tableName);//填充數據39:objConn.Close();40://dtExcel即為excel文件中指定表中存儲的信息41:dtExcel=ds.Tables[tableName];42:returndtExcel;TOC\o"1-5"\h\z}44:catch{46:returnnull;}}下面說明一下連接字符串HDR=Yes,這代表第一行是標題,不做為數據使用(但是我在實際使用中,如果第一行存在復雜數值,那么讀取得到的Datatable列標題會自動設置為F1、
F2等方式命名,與實際應用不符,所以當時是通過HDR=No方式將所有內容讀取到Datatable中,然后手動將第一行設置成標題的);IMEX(IMportEXportmode)設置IMEX有三種模式:0isExportmodeisImportmodeisLinkedmode(fullupdatecapabilities)我這里特別要說明的就是IMEX參數了,因為不同的模式代表著不同的讀寫行為:當IMEX=0時為“匯出模式”,這個模式開啟的Excel檔案只能用來做“寫入”用途。當IMEX=1時為“匯入模式”,這個模式開啟的Excel檔案只能用來做“讀取”用途。當IMEX=2時為“鏈接模式”,這個模式開啟的Excel檔案可同時支援“讀取”與“寫入”用途。另外,讀取Excel2007版本的文件時,版本應該從8.0改為12.0,同時驅動不能再用Jet,而應該用ACE。負責會造成“找不到可安裝的ISAM”的錯誤。在網上還發(fā)現采用這種方式存在取出的Sheet表的個數多于實際Excel表中的Sheet表個數的情況,其原因有二:
.取出的名稱中,包括了XL命名管理器中的名稱(參見XL2007的公式--命名管理器,快捷鍵Crtl+F3);.取出的名稱中,包括了FilterDatabase后綴的,這是XL用來記錄Filter范圍的。對于第一點比較簡單,刪除已有命名管理器中的內容即可;第二點處理起來比較麻煩,Filter刪除后這些名稱依然保留著,簡單的做法是新增Sheet然后將原SheetCopy進去。但實際情況并不能為每個Excel做以上檢查。下面給出了過濾的方案。(此問題我們有驗證過,大家自己驗證一下吧)1://objConn為讀取Excel的鏈接,下面通過過濾來獲取有效的Sheet頁名稱集合2:System.Data.DataTableschemaTable=objConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables,null);3:List<string>lstSheetNames=newList<string>。;4:for(inti=0;i<schemaTable.Rows.Count;i++)TOC\o"1-5"\h\z5: {6:stringstrSheetName=(string)dtSheetName.Rows[i]["TABLE_NAME“];7:if(strSheetName.Contains("$")&&!strSheetName.Replace('"","").EndsWith("$"))8: {9://過濾無效SheetName完畢….10:continue;11: }
12:if(IstSheetNames!=null&&llstSheetNames.Contains(strSheetName))13:lstSheetNames.Add(strSheetName);14: }因為讀取出來無效SheetName一般情況最后一個字符都不會是$。如果SheetName有一些特殊符號,讀取出來的SheetName會自動加上單引號。比如在Excel中將SheetName編輯成MySheet(l),此忖讀取出來的SheetName就為:'MySheet(1)$',所以判斷最后一個字符是不是$之前最好過濾一下單引號。(2)Com組件的方式(通過添加Microsoft.Office.Interop.Excel引用實現)優(yōu)點:能夠非常靈活的讀取Excel中的數據,用戶可以靈活的調用各種函數進行處理。缺點:基于單元格的處理,讀取速度較慢,對于數據量較大的文件最好不要使用此種方式讀取。需要添加相應的DLL引用,必須存在此引用才可使用,如果是Web站點部署在IIS上時,還需要服務器機子已安裝了Excel,有忖候還需要為配置IIS權限。讀取代碼如下:1:privateStopwatchwath=newStopwatch。;2:///<summary>3:///使用COM讀取Excel
4:///</summary>5:///<paramname="excelFilePath">路徑</param>6:///<returns>DataTabel</returns>7:publicSystem.Data.DataTableGetExcelData(stringexcelFilePath)8:(9:Excel.Applicationapp=newExcel.Application();10:Excel.Sheetssheets;11:Excel.Workbookworkbook=null;12:objectoMissiong=System.Reflection.Missing.Value;13:System.Data.DataTabledt=newSystem.Data.DataTable();14:wath.Start();15:try16: {17:if(app==null)18:19:returnnull;20:21:workbook=app.Workbooks.Open(excelFilePath,oMissiong,21:oMissiong,oMissiong,oMissiong,oMissiong,22:oMissiong,oMissiong,oMissiong,oMissiong,oMissiong,oMissiong,oMissiong,oMissiong,oMissiong);23://將數據讀入到23://將數據讀入到DataTable中Start24:sheets=workbook.Worksheets;24:25:Excel.Worksheetworksheet=(Excel.Worksheet)sheets.get_Item(1);//讀取第一張表26:if(worksheet==null)27:returnnull;28:stringcellContent;29:intiRowCount=worksheet.UsedRange.Rows.Count;30:intiColCount=worksheet.UsedRange.Columns.Count;31:Excel.Rangerange;32://負責列頭Start33:DataColumndc;34:intColumnID=1;35: range=(Excel.Range)worksheet.Cells[1,1];36:while(range.Text.ToString().Trim()!=""){dc=newDataColumn();39:dc.DataType=System.Type.GetType("System.String");40:dc.ColumnName=range.Text.ToString().Trim();41:dt.Columns.Add(dc);range=(Excel.Range)worksheetCells[1,++ColumnID];44:
45://End46:for(intiRow=2;iRow<=iRowCount;iRow++)TOC\o"1-5"\h\z47: {48:DataRowdr=dt.NewRow();49:for(intiCol=1;iCol<=iColCount;iCol++){range=(Excel.Range)worksheetCells[iRow,iCol];52:cellContent=(range.Value2==null)?"":range.Text.ToString();53:dr[iCol-1]=cellContent;54: }55:dt.Rows.Add(dr);56: }57:wath.Stop();58:TimeSpants=wath.Elapsed;59://將數據讀入到DataTable中——End60:returndt;TOC\o"1-5"\h\z}62:catch{64:returnnull;}66:finally
67:68:workbook.Close(false,oMissiong,oMissiong);69:System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);70: workbook=null;71:app.Workbooks.Close();72:app.Quit();73:System.Runtime.InteropServices.Marshal.ReleaseComObject(app);74: app=null;75:GC.Collect();76:GC.WaitForPendingFinalizers();}}79:///<summary>80:///使用COM,多線程讀取Excel(1主線程、4副線程)81:///</summary>82:///<paramname="excelFilePath”>路徑</param>83:///<returns>DataTabel</returns>84:publicSystem.Data.DataTableThreadReadExcel(stringexcelFilePath){86:Excel.Applicationapp=newExcel.Application();87:Excel.Sheetssheets=null;88:Excel.Workbookworkbook=null;
89:objectoMissiong=System.Reflection.Missing.Value;90:System.Data.DataTabledt=newSystem.Data.DataTable();91:wath.Start();92:tryTOC\o"1-5"\h\z{94:if(app==null){96:returnnull;}workbook=app.Workbooks.Open(excelFilePath, oMissiong,oMissiong,oMissiong,oMissiong,oMissiong,oMissiong,99:oMissiong,oMissiong,oMissiong,oMissiong,oMissiong,oMissiong,oMissiong,oMissiong);100:〃將數據讀入到DataTable中——Start101: sheets=workbook.Worksheets;102:Excel.Worksheetworksheet=(Excel.Worksheet)sheets.get_Item(1);//讀取第一張表103:if(worksheet==null)104:returnnull;105:stringcellContent;106:intiRowCount=worksheet.UsedRange.Rows.Count;107:intiColCount=worksheet.UsedRange.Columns.Count;
108:Excel.Rangerange;109:〃負責列頭Start110:DataColumndc;111:intColumnID=1;112: range=(Excel.Range)worksheet.Cells[1,1];113:while(iColCount>=ColumnID){dc=newDataColumn。;116:dc.DataType=System.Type.GetType("System.String“);117:stringstrNewColumnName=range.TextToStringO.Trim。;118:if(strNewColumnName.Length==0)strNewColumnName="_1";119:〃判斷列名是否重復120:for(inti=1;i<ColumnID;i++)TOC\o"1-5"\h\z121: {122:if(dt.Columns[i-1].ColumnName==strNewColumnName)123:strNewColumnName=strNewColumnName+"_1”;124: }125:dc.ColumnName=strNewColumnName;126:dt.Columns.Add(dc);range=(Excel.Range)worksheet.Cells[1,++ColumnID];}129://End
130:〃數據大于500條,使用多進程進行讀取數據131:if(iRowCount-1>500)132: {133:〃開始多線程讀取數據134:〃新建線程135:intb2=(iRowCount-1)/10;136:DataTabledt1=newDataTable("dt1");dt1=dtClone。;138:SheetOptionssheet1thread=newSheetOptions(worksheet,iColCount,2,b2+1,dt1);Threadothread1=newThread(newThreadStart(sheet1thread.SheetToDataTable));140:othread1.Start();141://阻塞1毫秒,保證第一個讀取dt1142:Thread.Sleep(1);143:DataTabledt2=newDataTable("dt2");dt2=dtClone。;145:SheetOptionssheet2thread=newSheetOptions(worksheet,iColCount,b2+2,b2*2+1,dt2);Threadothread2=newThread(newThreadStart(sheet2thread.SheetToDataTable));147:othread2.Start();
148:DataTabledt3=newDataTable("dt3n);149: dt3=dtClone。;150:SheetOptionssheet3thread=newSheetOptions(worksheet,iColCount,b2*2+2,b2*3+1,dt3);151: Threadothread3=newThread(newThreadStart(sheet3thread.SheetToDataTable));152:othread3.Start();153:DataTabledt4=newDataTable("dt4");154: dt4=dt.Clone();155:SheetOptionssheet4thread=newSheetOptions(worksheet,iColCount,b2*3+2,b2*4+1,dt4);156: Threadothread4=newThread(newThreadStart(sheet4thread.SheetToDataTable));157:othread4.Start();158:〃主線程讀取剩余數據159:for(intiRow=b2*4+2;iRow<=iRowCount;iRow++)160: {161:DataRowdr=dt.NewRow();162:for(intiCol=1;iCol<=iColCount;iCol++){range=(Excel.Range)worksheet.Celis[iRow,iCol];165:cellContent=(range.Value2==null)?"":range.Text.ToString();
166:dr[iCol-1]=cellContent;167: }168:dt.Rows.Add(dr);169: }170:othread1Join();171:othread2Join();172:othread3JoinO;173:othread4JoinO;174:〃將多個線程讀取出來的數據追加至dt1后面175:foreach(DataRowdrindt.Rows)176:dt1.Rows.Add(dr.ItemArray);177:dt.Clear();178:dt.Dispose();179:foreach(DataRowdrindt2.Rows)180:dt1.Rows.Add(dr.ItemArray);181:dt2.Clear();182:dt2.Dispose();183:foreach(DataRowdrindt3.Rows)184:dt1.Rows.Add(dr.ItemArray);185:dt3.Clear();186:dt3.Dispose();187:foreach(DataRowdrindt4.Rows)
188:dt1.Rows.Add(dr.ItemArray);189:dt4.Clear();190:dt4.Dispose();191:returndt1;TOC\o"1-5"\h\z192: }193:else194: {195:for(intiRow=2;iRow<=iRowCount;iRow++)196: {197:DataRowdr=dtNewRow。;198:for(intiCol=1;iCol<=iColCount;iCol++){range=(Excel.Range)worksheet.Cells[iRow,iCol];201:cellContent=(range.Value2==null)?"":range.Text.ToString();202:dr[iCol-1]=cellContent;203: }204:dt.Rows.Add(dr);}}207:wath.Stop();208:TimeSpants=wath.Elapsed;209:〃將數據讀入到DataTable中——End
210:returndt;TOC\o"1-5"\h\z211: }212:catch213: {214:returnnull;215: }216:finally217: {218:workbook.Close(false,oMissiong,oMissiong);219:System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);220:System.Runtime.InteropServices.Marshal.ReleaseComObject(sheets);221: workbook=null;222:app.Workbooks.Close();223:app.Quit();224:System.Runtime.InteropServices.Marshal.ReleaseComObject(app);225: app=null;226:GC.Collect();227:GC.WaitForPendingFinalizers();}}(3)NPOI方式讀取Excel(此方法未經過測試)
NPOI是POI項目的.NET版本。POI是一個開源的Java讀寫Excel、WORD等微軟OLE2組件文檔的項目。使用NPOI你就可以在沒有安裝Office或者相應環(huán)境的機器上對WORD/EXCEL文檔進行讀寫。優(yōu)點:讀取Excel速度較快,讀取方式操作靈活性缺點:需要下載相應的插件并添加到系統(tǒng)引用當中。1:///<summary>2:///將excel中的數據導入到DataTable中3:///</summary>4:///<paramname="sheetName”>excel工作薄sheet的名稱</param>5:///<paramname="isFirstRowColumn">第一行是否是DataTable的列名</param>6:///<m皿狽>返回的DataTable</returns>7:publicDataTableExcelToDataTable(stringsheetName,boolisFirstRowColumn)8:{9:ISheetsheet=null;10:DataTabledata=newDataTable。;11:intstartRow=0;12:try{fs=newFileStream(fileName,FileMode.Open,FileAccess.Read);15:if(fleName.IndexOf(".xlsx")>0)//2007版本
16:workbook=newXSSFWorkbook(fs);16:17:elseif(fileName.IndexOf
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026社群健康助理員招聘面試題及答案
- 游戲娛樂產業(yè)未來發(fā)展趨勢
- 2025 年大學工業(yè)設計(工業(yè)設計基礎)試題及答案
- 西昌市教育系統(tǒng)2025年下半年考核引進教師(98人)考試筆試備考試題及答案解析
- 2026天津河西區(qū)其他事業(yè)單位招聘3人考試筆試模擬試題及答案解析
- 2025云南昭通市蘋果產業(yè)發(fā)展中心招聘城鎮(zhèn)公益性崗位工作人員1人考試筆試備考試題及答案解析
- Java程序設計-電子教案-單元7(69-72)
- 2025廣西南寧市武鳴區(qū)陸斡中心衛(wèi)生院招聘編外工作人員1人考試筆試備考試題及答案解析
- DB5114∕T 11-2019 農村產權流轉交易 土地經營權流轉交易服務規(guī)范
- 河北省七校2026屆高三上學期一模考試生物試題(含答案)
- 四川省教育考試院2025年公開招聘編外聘用人員考試筆試模擬試題及答案解析
- 高層建筑屋面光伏板安裝高處作業(yè)安全方案
- 餐廳前廳經理合同范本
- 出口大姜合同
- (2025年)(完整版)醫(yī)療器械基礎知識培訓考試試題及答案
- 特種設備安全管理培訓培訓
- 口腔科手術安全核查制度
- 2025年國家開放大學(電大)《勞動法》期末考試備考題庫及答案解析
- 山東魯商集團招聘筆試2025
- 產品研發(fā)IPD流程操作手冊
- 2025年大學公安管理學專業(yè)題庫- 公安管理學專業(yè)信息系統(tǒng)應用
評論
0/150
提交評論