C#各种导入Excel文件的数据的方法总结

在导入前都需要将上传的文件保存到服务器,所以避免重复的写这些代码,先贴出上传文件并保存到服务器指定路径的代码

protected void btnImport_Click(object sender,EventArgs e)

{

Random random=new Random();

ImportClass Import=new ImportClass();

//保存文件的虚拟路径

string path="Import/";

//获取选择的文件名

string fileName=FileUpload.FileName;

//获取文件扩展名称

string fileExt=Path.GetExtension(fileName);

//生成新文件名

string newName=DateTime.Now.ToString("yyyyMMddHHmmssfff")+random.Next(0,9999).ToString();

//获取指定虚拟机路径的物理路径

string fullPath=HttpContext.Current.Server.MapPath(path);

//上传文件保存路径

string savePath=fullPath+newName+fileExt;

//保存文件到服务器

FileUpload1.SaveAs(savePath);

try{

//获取导入的数据

DataSet ds=Import.ImportExcel(savePath);

if(ds !=null&&ds.Tables.Count>0)

{

//这里可以写插入数据库的方法

}

}

catch(Exception ex)

{

throw;

}

}

第一种:

public DataSet ImportExcel(string filePath)

{

DataSet ds=null;

OleDbConnection conn;

string strConn=string.Empty;

string sheetName=string.Empty;

try
            {
                // Excel 2003 版本连接字符串
                strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties=‘Excel 8.0; HDR=YES; IMEX=1;‘";
                conn = new OleDbConnection(strConn);
                conn.Open();
            }
            catch
            {
                // Excel 2007 以上版本连接字符串
                strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties=‘Excel 12.0;HDR=Yes;IMEX=1;‘";
                conn = new OleDbConnection(strConn);
                conn.Open();
            }

            //获取所有的 sheet 表
            DataTable dtSheetName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" });

            ds = new DataSet();

            for (int i = 0; i < dtSheetName.Rows.Count; i++)
            {
                DataTable dt = new DataTable();
                dt.TableName = "table" + i.ToString();

                //获取表名
                sheetName = dtSheetName.Rows[i]["TABLE_NAME"].ToString();

                OleDbDataAdapter oleda = new OleDbDataAdapter("select * from [" + sheetName + "]", conn);

                oleda.Fill(dt);

                ds.Tables.Add(dt);
            }

            //关闭连接,释放资源
            conn.Close();
            conn.Dispose();

            return ds;
        }除了读取过程不太灵活之外,这种读取方式还有个弊端就是,当Excel数据量很大时,会非常占用内存,当内存不够时会抛出内存溢出的异常,不过一般的都适用了。第二种:Microsoft.Office.Interop.Excel.dllpublic DataSet ImportExcel(string filePath){ DataSet ds=null;DataTable dt=null;Microsoft.Office.Interop.Excel.Application excel=new Microsoft.Office.Interop.Excel.Application();Microsoft.Office.Interop.Excel.Workbook workbook=null;Microsoft.Office.Interop.Excel.Worksheet worksheet=null;Microsoft.Office.Interop.Excel.Sheets sheets=null;Microsoft.Office.Interop.Excel.Range range=null;object missing=System.Reflection.Missing.Value;try{if(excel==null){return null;}//打开Excel文件workbook=excel.Workbooks.Open(
filePath, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);//获取所有的sheet表sheets=workbook.Worksheets;ds=new DataSet();for(int i=1;i<=sheets.Count;i++){//获取第一个表worksheet=(Microsoft.Office.Interop.Excel.Worksheet)sheets.get_Item(i);int rowCount=worksheet.UsedRange.Rows.Count;int colCount=worksheet.UsedRange.Columns.Count;int rowIndex=1;int colIndex=1;DataColumn dc;dt=new DataTable();dt.TableName="table"+i.ToString();//读取列名for(int j=0;j<colCount;j++){ range=worksheet.Cells[rowIndex,colIndex+j];dc=new DataColumn();dc.DataType=Type.GetType("System.String");dc.ColumnName=range.Text.ToString().Trim();//添加列dt.Columns.Add(dc);}//读取行数据for(int k=1;k<rowCount;k++){DataRow dr=dt.NewRow();for(int l=0;l<colCount;l++){range=worksheet.Cells[rowIndex+k,colIndex+l];dr[l]=range.Text.ToString();}dt.Tables.Add(dt);}}catch(Exception ex){throw;}finally{workbook.Close();excel.Quit();Marshal.ReleaseComObject(worksheet);Marshal.ReleaseComObject(workbook);Marshal.ReleaseComObject(excel);worksheet=null;workbook=null;excel=null;GC.Collect();}return ds;}这种方法首先需要安装有office Excel,并且是一个单元格一个单元格的读取,所以性能会比较差第三种:NPOIpublic DataSet ImportExcel(string filePath){DataSet ds=null;try{FileStream fileStream=new FileStream(filePath,FileMode.Open);XSSFWorkbook workbook=new XSSFWorkbook(fileStream);ISheet sheet=null;IRow row=null;ds=new DataSet();DataTable dt=null;for(int i=0;i<workbook.Count;i++){dt=new DataTable();dt.TableName="table"+i.ToString();//获取sheet表sheet=workbook.GetSheetAt(i);//起始行索引int rowIndex=sheet.FirstRowNum;//获取行数int rowCount=sheet.LastRowNum;//获取第一行IRow firstRow=sheet.GetRow(rowIndex);//起始列索引int colIndex=firstRow.FirstCellNum;//获取列数int colCount=firstRow.LastCellNum;DataColumn dc=null;//获取列数for(int j=colIndex;j<colCount;j+++{dc=new DataColumn(firstRow.GetCell(j).StringCellValue);dt.Columns.Add(dc);}//跳过第一行列名rowIndex++;for(int k=rowIndex;k<=rowCount;k++){DataRow dr=dt.NewRow();row=sheet.GetRow(k);for(int l=colIndex;l<colCount;l++){if(row.GetCell(l)==null){ continue;}dr[l]=row.GetCell(l).StringCellValue;

}dt.Rows.Add(dr);}ds.Tables.Add(dt);}sheet=null;workbook=null;fileStream.Close();fileStream.Dispose();}catch(Exception ex){throw;}return ds;}我这里用的是.xlsx格式的,也就是Excel2007及以上版本,2003版本的话方法类似,只是打开文件的操作类不一样//2007及以上版本XSSFWorkbook xWorkbook=new XSSFWorkbook(fileStream);//2003版本HSSFWorkbook hWorkbook=new HSSFWorkbook(fileStream);第四种:Aspose.Cells.dllpublic DataSet ImportExcel(string filePath){DataSet ds=null;try{Aspose.Cells.Workbook workbook=new Aspose.Cells.Workbook();//打开文件,参数可以使文件的路径,也可以直接传入一个文件流workbook.Open(filePath)//获取sheet表Aspose.Cells.Worksheets worksheets=workbook.Worksheets;Aspose.Cells.Worksheet worksheet=null;Aspose.Cells.Cells cell=null;ds=new DataSet();DataTable dt=null;int rowIndex=0;int colIndex=0;for(int i=0;i<worksheets.Count;i++){dt=new DataTable();dt.TableName="table"+i.ToString();worksheet=worksheets[i];//获取每个sheet表的所有单元格cells=worksheet.Cells;dt=cells.ExportDataTableAsString(rowIndex,colIndex,Cells.MaxDataRow+1,cells.MaxDataColumn+1,true);ds.Tables.Add(dt);}worksheets.Clear();worksheet=null;worksheets=null;workbokk=null;}catch(Exception ex){throw;}return ds;}这种方法操作比较方便,跟OleDB一样直接获取一个sheet表的数据,不用一个单元格一个单元格的获取。而且操作也比较灵活,你可以一行一行的获取数据,甚至一个单元格一个单元格的获取数据第五种:EPPluspublic DataSet ImportExcel(string filePath){DataSet ds=null;try{//打开文件FileStream fileStream=new FileStream(filePath,FileMode.Open);//读取文件流ExcelPackage package=new ExcelPackage(fileStream);//获取sheet表ExcelWorksheets worksheets=package.Workbook.Worksheets;ExcelWorksheet worksheet=null;ds=new DataSet();DataTable dt=null;for(int i=1;i<=worksheets.Count;i++){dt=new DataTable();dt.TableName="table"+i.ToString();worksheet=worksheets[i];//获取行数int rowCount=worksheet.Dimension.End.Row;//获取列数int colCount=worksheet.Dimension.End.Column;//起始行为1int rowIndex=worksheet.Dimenson.Start.Row;//起始列为1int colIndex=worksheet.Dimension.Start.Colimn;DataColumn dc=null;for(int j=colIndex;j<=colCount;j++){dc=new DataColumn(worksheet.Cells[rowIndex,j].Value.ToString());dt.Columns.Add(dc);}rowIndex++;for(int k=rowIndex;k<=rowCount;k++){DataRow dr=dt.NewRow();for(int l=colIndex;l<=colCount;l++){if(worksheet.GetValue(k,l)==null){continue;}dr[l-1]=worksheet.GetValue(k,l).ToString();}ds.Tables.Add(dt);}package.Dispose();worksheet=null;worksheets=null;package=null;fileStream.Close();fileStream.Dispose();}catch(Exception ex){throw;}return ds;}这种方法读取Excel数据性能还不错,但是要注意的是,sheet、row、col的起始值都是从1开始的
时间: 2024-10-12 07:18:17

C#各种导入Excel文件的数据的方法总结的相关文章

C# 各种导入 Excel 文件的数据的方法总结

在导入之前都需要将上传的文件保存到服务器,所以避免重复的写这些代码,先贴出上传文件并保存到服务器指定路径的代码. protected void btnImport_Click(object sender, EventArgs e) { Random random = new Random(); ImportClass Import = new ImportClass(); //保存文件的虚拟路径 string path = "Import/"; //获取选择的文件名 string fi

R读写Excel文件中数据的方法

用R语言读写Excel的方法有很多,但每种方法都有让人头疼的地方,比如xlsx包的代码复杂,只支持Excel2007:RODBC不易理解,限制太多,程序不稳定,会出各种怪毛病.另存为csv格式的方法倒是比较通用比较稳定,但又存在操作麻烦,无法程序化处理多个文件的问题.提取xml也是个办法,但步骤太多代码太复杂,令人望而生畏.用剪贴板转换也不好,这同样需要人工参与,还不如存为csv. 相比之下,用gdata包来读取,配合WriteXLS写入Excel则可以很好的避开上述麻烦.这两个包都支持Exce

C#导入excel文件到oracle的方法

平时需要把excel导入到oracle中,现总结方法如下: 1.使用OLE方式: string ConnStr = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" + 文件.xls+ ";Extended Properties=Excel 8.0"; OleDbConnection conn = new OleDbConnection(ConnStr); conn.Open(); Data

winfrom_导入Excel文件加载数据到datagridview并将数据保存到数据库

1.效果图: Excel表: winfrom界面: 主要先 选择Excel文件--->显示文件路径--->选择是那一个Excel表--->加载显示在下面的datagridview--->导入到数据库保存 2.点击 '选择Excel' 按钮事件: 1 private void btn_excel_Click(object sender, EventArgs e) 2 { 3 try 4 { 5 //获取Excel文件路径和名称   6 OpenFileDialog odXls = n

基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能

思路: 1.首先,页面前端,上传附件,提交给后台,并带一个随机性的参数(可以用时间戳): 2.后端接收附件,做一系列的逻辑处理,无误后,将对应的文件存储在上传的目录下: 3.然后前端,上传附件成功后,进行请求后端,读取数据,后端接口对应将附件数据读取出来,前端进行显示(ajax请求): 4.前端展示数据,用户对数据检测无误,点击保存(ajax请求后端保存代码的接口),当然也可以有选择性的选择某些数据记录进行保存,楼主这里做的是全部保存(后端处理接口,自动过滤重复数据): 5.拿到对应的所需有用数

excel数据 入库mysql 和 mysql数据 导入excel文件

1.excel数据入库mysql 首先准备excel文件, 标红的地方需要留意,一个是字段名所在行,一个表名对应页: 然后私用mysql工具 navicat, 选择数据库,然后导入文件, 选中相应execl文件,即可导入. 栏位名行  对应excel文件中,字段名所在的行. 第一个数据行  对应excel文件中,第一行数据所在的行. ----------------------------------------------------------------------------------

Java POI导入Excel文件

今天在公司需要做个导入Excel文件的功能,所以研究了一下,参考网上的一些资料总算是做出来了,在此记录一下防止以后忘记怎么弄. 本人用的是poi3.8,所以需要的JAR包如下: poi-3.8.jar poi-excelant-3.8-20120326.jar poi-ooxml-3.8-20120326.jar poi-ooxml-schemas-3.8-20120326.jar poi-scratchpad-3.8-20120326.jar xmlbeans-2.3.0.jar 附上百度云盘

C#实现从EXCEL文件读取数据到SqlServer数据库

用第三方组件:NPOI组件实现 先去官网:http://npoi.codeplex.com/下载需要引入dll(可以选择.net2.0或者.net4.0的dll),然后在网站中添加引用.使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写. 先创建一个实体类: [Table("Customer") ] public class Customer { [Key] public int Id { get; set; } public

django 导入Excel文件 ORM 批量操作

导入excel文件后批量插入"bulk_create"方法 1.先定义数据模型 from django.db import models from django.utils.translation import ugettext_lazy as _ ACTIVE_TYPE = ( (1, _(u"已激活")), (0, _(u"未激活")), ) class Unit(models.Model): """ 社会单位