导入Excel到DataTable中的两种实现
来源:互联网 发布:linux强制停止sh 编辑:程序博客网 时间:2024/06/15 10:06
导入Excel到数据库中是一个常见的操作,这里采用两种实现,一种比较简洁,一种侧重效率。
这里说明一下:导入的Excel可以包含多个sheet,最终都导入到dataset的同一个table中。
一、简洁实现:
/// <summary> /// 导入Excel到DataSet中 /// </summary> /// <param name="strFileSourse">文件的路径和文件全名,含扩展名</param> /// <returns></returns> public DataSet ExcelToDataSet(string strFileSourse) { DataSet ds = new DataSet(); //Excel数据源(兼容03/10) string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + strFileSourse + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\""; //连接 OleDbConnection conn = new OleDbConnection(strConn); try { conn.Open(); //获取Excel中所有的sheet DataTable dtSheet = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); //把Excel中所有的sheet数据读到一个Table中 for (int i = 0; i < dtSheet.Rows.Count; i++) { string strSheetName = dtSheet.Rows[i]["TABLE_NAME"].ToString(); OleDbDataAdapter OleDa = new OleDbDataAdapter("select * from [" + strSheetName + "]", conn); OleDa.Fill(ds, "TableName"); conn.Close(); } } catch (Exception) { //System.Windows.Forms.MessageBox.Show(e.ToString()); throw; } finally { if (conn.State!=ConnectionState.Closed) { conn.Close(); } } return ds; }
二、侧重效率:
/// <summary> /// 导入Excel到DataSet中 /// </summary> /// <param name="strFileUrl">文件的路径和文件全名,含扩展名</param> /// <returns></returns> public DataSet ImportExcel(string strFileUrl) { //创建进程 Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.ApplicationClass(); //获取Microsoft.Office.Interop.Excel进程启动结束的时间 afterTime = DateTime.Now; if (xlApp==null) { returnstatue = -1; returnmessage = "无法创建Microsoft.Office.Interop.Excel.Application对象,请先检查您的计算机是否安装了Office!"; return null; } //判断要上传的文件是否正在被其他进程使用 Microsoft.Office.Interop.Excel.Workbook workBook; try { workBook = xlApp.Workbooks.Open(strFileUrl, 0, false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, 1, 0); } catch (Exception) { returnstatue = -1; returnmessage = "Excel文件处于打开状态,请保存您的文件后关闭!"; return null; } //获取所有Sheet名称 int intSheetCount = workBook.Worksheets.Count; //根据sheet个数,定义字串数组 string[] SheetSet = new string[intSheetCount]; //System.Collections.ArrayList al = new System.Collections.ArrayList(); //获取Excel中的sheet名数组 for (int i = 0; i < intSheetCount; i++) { SheetSet[i - 1] = ((Microsoft.Office.Interop.Excel.Worksheet)workBook.Worksheets[i]).Name; } //释放Excel相关对象资源 workBook.Close(null, null, null); xlApp.Quit(); if (workBook!=null) { //系统中包含有很多释放com对象/cache等常见的所有资源的方法 System.Runtime.InteropServices.Marshal.ReleaseComObject(workBook); workBook = null; } if (xlApp!=null) { //交由内存托管,马上释放资源(Interop互操作、Marshal整顿) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp); xlApp = null; } //强制CLR执行内存回收 GC.Collect(); //获取了sheet数组后,作为数据源,将Excel中的数据读取到DataSet中 DataSet ds = new DataSet(); string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + strFileUrl + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\""; using (OleDbConnection conn = new OleDbConnection(strConn)) { conn.Open(); OleDbDataAdapter da; for (int i = 0; i < intSheetCount; i++) { string sql = "select * from ["+SheetSet[i-1]+"+$]"; da = new OleDbDataAdapter(sql, conn); //将所有的数据集都填充到一个Table中 da.Fill(ds, "Table"); da.Dispose(); } conn.Close(); conn.Dispose(); } ////TODO:销毁Excel进程 Kill(xlApp); return ds; }
[System.Runtime.InteropServices.DllImport("User32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)] private static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID); /// <summary> /// 销毁Excel线程 /// </summary> /// <param name="excel"></param> private void Kill(Microsoft.Office.Interop.Excel.Application excel) { //得到这个句柄,具体作用是得到这块内存入口 IntPtr t = new IntPtr(excel.Hwnd); int k = 0; //得到唯一标志k GetWindowThreadProcessId(t, out k); //k的引用 System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k); //关闭k p.Kill(); }
以上是两种不同的实现,第二种更多的调用了操作系统的接口,这里只限于是Windows操作系统,包括销毁进程的方法,也是调用了系统的接口。
- 导入Excel到DataTable中的两种实现
- Excel导入DataTable的两种方法
- excel 导入到datatable
- Excel 导入到数据库中的两种方法(.net)
- 使用NPOI将DataTable中的数据导入到Excel中
- 将excel中的数据导入到DataTable中
- DataTable数据导入到Excel
- 【C#.NET】将excel中的sheet1导入到dataGridView1中 ,或者导入到DataTable,导入到DataSet
- C#将DataTable导入到Excel
- 将Excel导入到虚拟DataTable中
- C#将Datatable导入到Excel
- 将Dataset中的多个DataTable导入到一个Excel文件的多个Sheet中
- DataTable数据导入Excel(导入到三个工作表)
- VB.net 如何复制datatable中的row到另一个datatable中.两种方法
- 读取excel中的表格到datatable
- 两种方法DatagridView轻松导入到Excel
- 【C#.NET】将excel或将CSV文件中的sheet1导入到dataGridView1中 ,或者导入到DataTable,导入到DataSet
- jsp中将数据库中的数据导入到excel的实现
- 博客URL_继续补充中
- 数据库监控脚本(三)
- C++ new delete的问题
- C#属性
- JNI字段描述符“([Ljava/lang/String;)V”
- 导入Excel到DataTable中的两种实现
- AVL树
- 如何在windows上安装部署设置SVN服务器
- nohup命令让程序运行于后台
- linux 添加 系统路径
- HRegionServer启动和停止过程分析
- 一个老工程师给年轻人的忠告
- 数据库监控
- Response.Write("...")与 Response.Redirect("...")不能同时使用