C#导入导出Excel数据的两种方法
本文为大家分享了C#导入导出Excel数据的具体代码,供大家参考,具体内容如下
注:对于实体类对象最好新建一个并且继承原有实体类,这样可以将类型进行修改;
方法一:此种方法是用EPPLUS中的FileInfo流进行读取的(是不是流我还真不太了解,若有懂得请留言,非常感谢了)
usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; usingAbp.Extensions; namespaceHYZT.Ltxy.International.Ctrip.Exporting { publicclassExcelLib { publicICtripPolicyExcelImportGetExcel(stringfilePath) { if(filePath.Trim().IsNullOrEmpty()) thrownewException("文件名不能为空"); //因为这儿用得是EPPLUS对Excel进行的操作,所以只能操作 //2007以后的版本以后的(即扩展名为.xlsx) if(!filePath.Trim().EndsWith("xlsx")) thrownewException("请使用officeExcel2007版本或2010版本"); elseif(filePath.Trim().EndsWith("xlsx")) { ICtripPolicyExcelImportres=newCtripPolicyExcelImport(filePath.Trim()); returnres; } elsereturnnull; } } }
方法接口:
usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; namespaceHYZT.Ltxy.International.Ctrip.Exporting { publicinterfaceICtripPolicyExcelImport { ///打开文件 boolOpen(); //ExcelVersionVersion{get;} ///文件路径 stringFilePath{get;set;} ///文件是否已经打开 boolIfOpen{get;} ///文件包含工作表的数量 intSheetCount{get;} ///当前工作表序号 intCurrentSheetIndex{get;set;} ///获取当前工作表中行数 intGetRowCount(); ///获取当前工作表中列数 intGetColumnCount(); ///获取当前工作表中某一行中单元格的数量 ///行序号 intGetCellCountInRow(intRow); /// 获取当前工作表中某一单元格的值(按字符串返回) ///行序号 /// 列序号 stringGetCellValue(intRow,intCol); /// 关闭文件 voidClose(); } }
方法实现:
usingOfficeOpenXml; usingSystem; usingSystem.Collections.Generic; usingSystem.IO; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; namespaceHYZT.Ltxy.International.Ctrip.Exporting { publicclassCtripPolicyExcelImport:ICtripPolicyExcelImport { publicCtripPolicyExcelImport() {} publicCtripPolicyExcelImport(stringpath) {filePath=path;} privatestringfilePath=""; privateExcelWorkbookbook=null; privateintsheetCount=0; privateboolifOpen=false; privateintcurrentSheetIndex=0; privateExcelWorksheetcurrentSheet=null; privateExcelPackageep=null; publicboolOpen() { try { ep=newExcelPackage(newFileInfo(filePath)); if(ep==null)returnfalse; book=ep.Workbook; sheetCount=book.Worksheets.Count; currentSheetIndex=0; currentSheet=book.Worksheets[1]; ifOpen=true; } catch(Exceptionex) { thrownewException(ex.Message); } returntrue; } publicvoidClose() { if(!ifOpen||ep==null)return; ep.Dispose(); } //publicExcelVersionVersion //{get{returnExcelVersion.Excel07;}} publicstringFilePath { get{returnfilePath;} set{filePath=value;} } publicboolIfOpen {get{returnifOpen;}} publicintSheetCount {get{returnsheetCount;}} publicintCurrentSheetIndex { get{returncurrentSheetIndex;} set { if(value!=currentSheetIndex) { if(value>=sheetCount) thrownewException("工作表序号超出范围"); currentSheetIndex=value; currentSheet=book.Worksheets[currentSheetIndex+1]; } } } publicintGetRowCount() { if(currentSheet==null)return0; returncurrentSheet.Dimension.End.Row; } publicintGetColumnCount() { if(currentSheet==null)return0; returncurrentSheet.Dimension.End.Column; } publicintGetCellCountInRow(intRow) { if(currentSheet==null)return0; if(Row>=currentSheet.Dimension.End.Row)return0; returncurrentSheet.Dimension.End.Column; } //根据行号和列号获取指定单元格的数据 publicstringGetCellValue(intRow,intCol) { if(currentSheet==null)return""; if(Row>=currentSheet.Dimension.End.Row||Col>=currentSheet.Dimension.End.Column)return""; objecttmpO=currentSheet.GetValue(Row+1,Col+1); if(tmpO==null)return""; returntmpO.ToString(); } } }
方法调用实现功能:
//用于程序是在本地,所以此时的路径是本地电脑的绝对路劲; //当程序发布后此路径应该是服务器上的绝对路径,所以在此之前还要有 //一项功能是将本地文件上传到服务器上的指定位置,此时在获取路径即可 publicstringGetExcelToCtripPolicy(stringfilePath) { ExcelLiblib=newExcelLib(); if(filePath==null) returnnewReturnResult(false,"未找到相应文件"); stringstr=tmp.GetCellValue(i,j); returnstr; }
方法二:将Excel表格转化成DataTable表,然后在对DataTable进行业务操作
usingAbp.Application.Services; usingOfficeOpenXml; usingSystem; usingSystem.Collections.Generic; usingSystem.Data; usingSystem.IO; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; namespaceHYZT.Ltxy.International.Ctrip.GetExcelToDataTable { publicclassEPPlusHelperAppService:ApplicationService,IEPPlusHelperAppService { privatestaticstringGetString(objectobj) { try { returnobj.ToString(); } catch(Exceptionex) { return""; } } //////将指定的Excel的文件转换成DataTable(Excel的第一个sheet) /// ///文件的绝对路径 /// publicDataTableWorksheetToTable(stringfilePath) { try { FileInfoexistingFile=newFileInfo(filePath); ExcelPackagepackage=newExcelPackage(existingFile); ExcelWorksheetworksheet=package.Workbook.Worksheets[1];//选定指定页 returnWorksheetToTable(worksheet); } catch(Exception) { throw; } } /// ///将worksheet转成datatable /// ///待处理的worksheet /// 返回处理后的datatable publicstaticDataTableWorksheetToTable(ExcelWorksheetworksheet) { //获取worksheet的行数 introws=worksheet.Dimension.End.Row; //获取worksheet的列数 intcols=worksheet.Dimension.End.Column; DataTabledt=newDataTable(worksheet.Name); DataRowdr=null; for(inti=1;i<=rows;i++) { if(i>1) dr=dt.Rows.Add(); for(intj=1;j<=cols;j++) { //默认将第一行设置为datatable的标题 if(i==1) dt.Columns.Add(GetString(worksheet.Cells[i,j].Value)); //剩下的写入datatable else dr[j-1]=GetString(worksheet.Cells[i,j].Value); } } returndt; } } }
之前我有一个程序用的是方法一进行Excel导入的,速度不是很快,后来我又用了第二种方法但是速度更慢了,到底这两种方法哪种快,请指导,还是我用第二种方法的时候业务判断有问题,不得而知,就请明白人指导我到底这两种方法哪种比较好些。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。