用c#读取Excel的三种方法_第1页
用c#读取Excel的三种方法_第2页
用c#读取Excel的三种方法_第3页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C#读取Excel的二种方法及比较(1) OleDB 方式优点:将Excel直接当做数据源处理,通过 SQL直接读取内容,读取速度较快。缺点:读取数据方式不够灵活,无法直接读取某一个单元格,只有将整个Sheet页读取出来后(结果为Datatabie)再在Datatable中根据行列数来获取指定的值。当Excel数据量很大时。会非常占用内存,当内存不够时会抛出内存溢出的异常。读取代码如下:1: public DataTable GetExcelTableByOleDBtri ng strExcelPath,stri ng tableName) 2: 3:try4:5:6:7:8:9:DataTa

2、ble dtExcel =new DataTable();/数据表DataSet ds =new DataSet();/获取文件扩展名stri ng strExte nsio n = Syste m.I O.Path.GetExte nsio n(strExcelPath);10:stri ng strFileName = System.lO.Path.GetFileName(strExcelPath);11:/Excel的连接12:OleDbC onnection objC onn = n ull;13:switch (strExte nsion)14:15:case'.xls&qu

3、ot;:16:objCo nn = newOleDIbConn ectio n('Provider=Microsoft .J et.OLEDB.4.O;Data Source="+ strExcelPath+ ""J+ "Extended Properties="Excel 8.O;HDR=NO;IMEX=1;"");17:break;18:case'.xlsx":19:objCo nn = newOleDIbConn ectio n("Provider=Microsoft.ACE.OLE

4、DB.12.O;Data Source=" +strEx(celPath +"" + "Extended Properties="Excel 12.0;HDR=NO;IMEX=1;"");20:break;21:default22:objCo nn = nu II;23:break;24:25:if (objC onn = nu II)26:27:return n ull;28:29:objC onn .Ope n();30:/获取Excel中所有Shee表的信息31:32:/获取Excel的第一个Sheet表名33:/st

5、ri ng tableName = schemaTable.Rows02.ToStri ng().Trim();34:stri ng strSql = "select * from " + tableName + ""35:/获取Excel指定Sheet表中的信息36:OleDbComma nd objCmd = new OleDbComma nd(strSql, objCo nn);37:OleDbDataAdapter myData =new OleDbDataAdapter(strSql,objConn);38:myData.Fill(ds, ta

6、bleName);填充数据39:objCo nn. Close();40:/dtExcel即为excel文件中指定表中存储的信息41:dtExcel = ds.TablestableName;42:retur n dtExcel;43:44:catch45:46:return nu II;47:F面说明一下连接字符串HDR=Yes,这代表第一行是标题,不做为数据使用(但是我在实际使用中, 如果第一行存在复杂数值,那么读取得到的Datatable列标题会自动设置为F1、F2等方式命名,与实际应用不符,所以当时是通过HDR=No方式将所有内容读 取到Datatable中,然后手动将第一行设置成标题

7、的);IMEX ( IMport EXport mode设置IMEX 有三种模式:0 is Export mode1 is Import mode2 is Lin ked mode (full update capabilities)我这里特别要说明的就是IMEX参数了,因为不同的模式代表著不同的读写行 为:当 IMEX=0时为“汇出模式”,这个模式开启的Excel档案只能用来做“写入”用途。当 IMEX=1时为“汇入模式”,这个模式开启的Excel档案只能用来做“读取”用途。当 IMEX=2时为链接模式,这个模式开启的Excel档案可同时支援读取与“写入”用途另外,读取Excel2007版本

8、的文件时,版本应该从8.0改为12.0,同时驱动不能再用Jet,而应该用ACE。负责会造成“找不到可安装的ISAM”的错误。在网上还发现采用这种方式存在取出的Sheet表的个数多于实际Excel表中的Sheet表个数的情况,其原因有二:1. 取出的名称中,包括了 XL命名管理器中的名称(参见 XL2007的公式-命名 管理器,快捷键Crtl+F3);2. 取出的名称中,包括了 FilterDatabase后缀的,这是XL用来记录Filter范围的。对于第一点比较简单,删除已有命名管理器中的内容即可;第二点处理起来比较麻烦,Filter删除后这些名称依然保留着,简单的做法是新增Sheet然后将原

9、Sheet Copy进去。但实际情况并不能为每个 Excel做以上检查。下面给出了过滤 的方案。(此问题我们有验证过,大家自己验证一下吧)1:/objConn为读取Excel的链接,下面通过过滤来获取有效的Sheet页名称集合2:=3:List< stri ng> lstSheetNames =new List<stri ng>();5:6:string strSheetName = string)dtSheetName.Rowsi"TABLE_NAME"7:if (strSheetName.Contain§$") &&a

10、mp; !strSheetName.Replace","").E ndsWith("$")9:/过滤无效SheetName完毕.10:con ti nue;11:12:if (IstSheetNames !=null && !lstSheetNames.Co ntai ns(strSheetName)13:IstSheetNames.Add(strSheetName);14:因为读取出来无效SheetName般情况最后一个字符都不会是$。如果SheetName 有一些特殊符号,读取出来的 SheetName会自动加上单引号。比如

11、在 Excel中将SheetName编辑成 MySheet此时读取出来的 SheetName就为:MySheet(1)$;所以判断最后一个字符是不是$之前最好过滤一下单引号。(2) Com组件的方式(通过添加 引用实现)优点:能够非常灵活的读取Excel中的数据,用户可以灵活的调用各种函数进行 处理。缺点:基于单元格的处理,读取速度较慢,对于数据量较大的文件最好不要使用 此种方式读取。需要添加相应的DLL引用,必须存在此引用才可使用,如果是 Web站点 部署在IIS上时,还需要服务器机子已安装了 Excel,有时候还需要为配置IIS权 限。读取代码如下:1: private Stopwatch

12、 wath =new Stopwatch。;2:/ <summary>3:/ 使用 COM 读取 Excel4:/ </summary>5:/ vparam name="excelFilePath"> 路径 </param>6:/ vretur ns>DataTabel</retur ns>8: 9:Excel.Applicatio n app =new Excel.Applicatio n();10:Excel.Sheets sheets;11:Excel.Workbook workbook = null;12:

13、object oMissi ong = System.Reflectio n. Missi ng.Value;。;14:wath.Start();15:try16:17:if (app = nu ll)18:19:return n ull;20:21:oMissi ong, oMissi ong, oMissi ong, oMissi ong,22:oMissi ong, oMissi ong, oMissi ong, oMissi ong, oMissi ong.oMissi ong, oMissi ong, oMissi ong, oMissio ng);23:/将数据读入到 DataTa

14、ble中Start24:sheets = workbook.Worksheets;25:Excel.Worksheet worksheet = (Excel.Worksheet)sheets.get_ltem/(1)读取第一张表26:if (worksheet = nu II)27:28:stri ng cellC ontent;return n ull;29:30:int iColCou nt = worksheet.UsedRa nge.Colu mn s.Co unt;31:Excel.Ra nge range;32:/负责列头Start33:DataColu mn dc;34:int

15、Colum nID = 1;35:range = (Excel.Ra nge)worksheet.Cells1, 1;36:37:38:dc = new DataColu mn();39:40:41:dt.Colu mn s.Add(dc);42:43:range = (Excel.Ra nge)worksheet.Cells1, +Colu mnID44:45:/End46:for (int iRow = 2; iRow <= iRowCou nt; iRow+)47:48:DataRow dr=dt.NewRow();49:for (int iCol =:1; iCol <=

16、iColCount; iCol+)50:51:range =(Excel.Ra nge)worksheet.CellsiRow, iCol;52:cellCo ntent = (ran ge.Value2 =null) ?"":53:driCol - 1 = cellCo ntent;54:55:dt. Rows.Add(dr);56:57:wath.Stop();58:TimeSpa n ts = wath.Elapsed;59:/将数据读入到 DataTable中 End60:return dt;61:62:catch64:return null;65:66:final

17、ly67:68:workbook.Closefalse oMissi ong, oMissi on g);69:70:workbook = nu II;72:app.Quit();74:app = n ull;75:GC.Collect();76:GC.WaitForPe ndi ngFi nalizers();77:78:79:/ <summary>80:/ 使用COM,多线程读取Excel (1主线程、4副线程)81:/ </summary>82:/ vparam name="excelFilePath"> 路径 </param>

18、;83:/ vretur ns>DataTabel</retur ns>85:86:Excel.Applicati on app = new Excel.Applicatio n();87:Excel.Sheets sheets null;88:Excel.Workbook workbook = null;89:object oMissi ong = System.Reflectio n. Missi ng.Value;。;91:wath.Start();92:try93:94:if(app=null)95:96:return null;97:oMissi ong, oMis

19、si ong, oMissi ong, oMissi ong, oMissi ong,99:oMissi ong, oMissi ong, oMissi ong, oMissi ong, oMissi ong,oMissi ong, oMissi ong, oMissi on g);100:/将数据读入到 DataTable中 Start101:sheets = workbook.Worksheets;102:Excel.Worksheet worksheet = (Excel.Worksheet)sheets.get_Item/1);读取第一张表103:104:105:106:107:108

20、:109:110:111:112:113:114:115:116:117:118: "_1";119:120:121:122:123:if (worksheet = n ull)retur n n ull;stri ng cellC ontent;int iColCou nt = worksheet.UsedRa nge.Colu mn s.Co unt;Excel.Ra nge ran ge;/负责列头StartDataColu mn dc;int Colum nID = 1;range = (Excel.Ra nge)worksheet.Cells1, 1;while

21、(iColCou nt >= Colu mn ID)dc = new DataColu mn();if (strNewColu mnN ame 丄en gth = 0) strNewColu mnN ame =/判断列名是否重复for (int i = 1; i < ColumnID; i+)if (dt.Colu mn si - 1.Colum nN ame = strNewColum nN ame)strNewColu mn Name = strNewColu mnN ame +"_1"124:125:dc.Colu mnN ame = strNewColu

22、 mn Name;126:dt.Colu mn s.Add(dc);127:range = (Excel.Ra nge)worksheet.Cells1, +Colu mn ID;128:129:/End130:/数据大于500条,使用多进程进行读取数据131:if (iRowCou nt - 1 > 500)132:133:/开始多线程读取数据134:/新建线程135:int b2 = (iRowCou nt - 1) / 10;136:DataTable dt1 =new DataTable"dt1");137:dt1 = dt.Clo ne();138:Shee

23、tOpti ons sheet1thread =ew SheetOpti on s(worksheet,iColCount, 2, b2 + 1, dtl);139:Thread othread1 =new Thread (lewThreadStart(sheetlthread.SheetToDataTable);140:othread1.Start();141:/阻塞1毫秒,保证第一个读取dt1142:Thread.Sleep(1);143:DataTable dt2 =n ew DataTable"dt2");144:dt2 = dt.Clo ne();145:Shee

24、tOpti ons sheet2thread =ew SheetOpti on s(worksheet,iColCount, b2 + 2, b2 * 2 + 1, dt2);146:Thread othread2 =new Thread (lewThreadStart(sheet2thread.SheetToDataTable);147:othread2.Start();148:DataTable dt3 =n ew DataTable"dt3");149:dt3 = dt.Clo ne();150:SheetOpti ons sheet3thread =ew Sheet

25、Opti on s(worksheet,iColCount, b2 * 2 + 2, b2 * 3 + 1, dt3);151:Thread othread3 =new Thread (lewThreadStart(sheet3thread.SheetToDataTable);152:othread3.Start();153:DataTable dt4 =new DataTable"dt4");154:dt4 = dt.Clo ne();155:SheetOpti ons sheet4thread =ew SheetOpti on s(worksheet,iColCou n

26、t, b2 * 3 + 2, b2 * 4 + 1, dt4);156:Thread othread4 =new Thread (lewThreadStart(sheet4thread.SheetToDataTable);157:othread4.Start();158:/主线程读取剩余数据159:for (int iRow = b2 * 4 + 2; iRow <= iRowCou nt; iRow+)160:161:DataRow dr = dt.NewRow();162:for (int iCol = 1; iCol <= iColCount; iCol+)163:164:r

27、ange = (Excel.Ra nge)worksheet.CellsiRow, iCol;165:cellCo ntent = (ran ge.Value2 =null) ?"":166:driCol - 1 = cellCo ntent;167:168:dt.Rows.Add(dr);169:170:othread1.J oin();171:othread2.J oin();172:othread3.J oin();173:othread4. Join();174:/将多个线程读取出来的数据追加至dt1后面175:foreach(DataRow dr i n dt.R

28、ows)176:dt1.Rows.Add(dr.ltemArray);177:dt.Clear();178:dt.Dispose();179:foreach(DataRow dr i n dt2.Rows)180:dt1.Rows.Add(dr.ltemArray);181:182:183:184:185:186:187:188:189:190:191:192:193:194:195:196:197:198:199:200:201:dt2.Clear();dt2.Dispose();foreach(DataRow dr i n dt3.Rows)dt3.Clear();dt3.Dispose(

29、);foreach(DataRow dr i n dt4.Rows)dt4.Clear();dt4.Dispose();return dt1;elsefor (int iRow = 2; iRow <= iRowCou nt; iRow+)DataRow dr = dt.NewRow();for (int iCol = 1; iCol <= iColCount; iCol+)range = (Excel.Ra nge)worksheet.CellsiRow, iCol;cellCo ntent = (ran ge.Value2 =null) ?"":202:dr

30、iCol - 1 = cellCo ntent;203:205:206:207:wath.Stop();208:TimeSpa n ts = wath.Elapsed;209:/将数据读入到DataTable中End210:return dt;211:212:catch213:214:return null;215:216:finally217:218:workbook.Closefalse oMissi ong, oMissi on g);219:221:workbook = n ull;223:app.Quit();225:app = n ull;226:GC.Collect();227:

31、GC.WaitForPe ndi ngFi nalizers();228: 229:(3) NPOI方式读取Excel (此方法未经过测试)NPOI是POI项目的.NET 版本。POI是一个开源的Java读写Excel、WORD等微软OLE2组件文档的项目。使用NPOI你就可以在没有安装 Ofice或者相 应环境的机器上对 WORD/EXCEL 文档进行读写。优点:读取Excel速度较快,读取方式操作灵活性缺点:需要下载相应的插件并添加到系统引用当中。1:/ <summary>2:/ 将exceI中的数据导入到 DataTable中3:/ </summary>4:/ v

32、param name="sheetName">excel 工作薄 sheet的名称 </param>5:/ vparam name="isFirstRowColumn"> 第一行是否是 DataTable的列名</param>6:/ vreturns> 返回的 DataTablev/returns>7:public DataTable ExcelToDataTablesJri ng sheetNamebool isFirstRowColu mn)8: 9:10:11:12:13:14:15:16:17:18:19:20:21:22:23:24:25:26:27:28:ISheet sheet =null;DataTable data =new DataTable();int startRow = 0;tryfs = new FileStream(fileName, FileMode.Open, FileAccess.Read);版本workbook = new XSSFWorkbook(fs);elseif (fileName.IndexOf('.xls") > 0) / 2003 版本workbook =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论