两种方法读取Excel文件

终于在博客园发表自己的第一篇博文了,由于自己属于刚入门的菜鸟,文章不是很专业,还请大家多指教,Ok,废话不多说了,直接进主题,前一阵项目需求,需要添加导入excel数据到oracle数据库,第一次直接用OleDb的方法导入,结果由于用户提供的excel文件数据不规范,例如一列中格式为DateTime,但其中既有汉字描述,又有字符串,导入会出现错误,于是经过在网上搜索总结,发现了另一种方法,就是分单元格依次导入。两种方法各有特点: 方法一:OleDb方法,导入速度快,但是导入过程微软自己进行,开发者无法控制,所以无法处理个别单元格的问题。 方法二:分单元格导入,采用微软提供的Office开发包。 下面是两种方法的代码: 方法一:需要引入命名空间using System.Data.OleDb; /// /// ReadExcelDataAll()读取Excel数据,一次填充DataSet,速度快,但不可以处理不规则的数据类型 /// /// /// DataSet public DataSet ReadExcelDataAll(string filePath) { string strConExcel07 = "Provider=Microsoft.ACE.OLEDB.12.0;" + " Extended Properties=Excel 12.0;" + "data source=" + filePath; string strSQL = " SELECT * FROM [" + excelSheetName + "$] ";//excelSheetName是要导入excel的sheet页名称 DataSet myDataSet = new DataSet(); OleDbConnection myConn = new OleDbConnection(strConExcel07); OleDbDataAdapter myCommand = new OleDbDataAdapter(strSQL, myConn); try { myConn.Open(); myCommand.Fill(myDataSet); C日志打印.PrintLog("导入Excel日志.log", "Excel文件解析成功。"); } catch (Exception ex) { myConn.Close(); C日志打印.PrintLog("导入Excel错误日志.log", "Excel文件解析失败,错误信息为:" + ex.Message, true); } //关闭此数据链接 myConn.Close(); return myDataSet; } 方法二:由于读取的速度相比方法一慢了很多,所以添加进度条。此方法能够对单元格进行个别处理,消除不规则的数据格式 需要引入的命名空间using Excel = Microsoft.Office.Interop.Excel; /// /// ReadExcelDataCell()按单元格数据,读取速度慢,但可以处理不规则数据类型 /// /// Excel文件路径 /// 读取进度条 /// DataTable public DataTable ReadExcelDataDivCell(string filePath, ProgressBar progressBar) { Excel.Application xlsApp = null; Excel.Workbook workBook = null; Excel.Worksheet workSheet = null; int sheetIndex = 1; DataTable dataTable = new DataTable(); try { object objOpt = System.Reflection.Missing.Value; xlsApp = new Excel.Application(); workBook = xlsApp.Workbooks.Open(filePath, objOpt, objOpt, objOpt, objOpt, objOpt, objOpt, objOpt, objOpt, objOpt, objOpt, objOpt, objOpt, objOpt, objOpt); workSheet = (Excel.Worksheet)workBook.Worksheets.get_Item(sheetIndex); DataRow newRow = null; progressBar.Visibility = Visibility.Visible; progressBar.Maximum = workSheet.UsedRange.Rows.Count; //System.Windows.Forms.Cursor.Clip = new System.Drawing.Rectangle(1440, 900, 1440, 900); for (int i = 1; i <= workSheet.UsedRange.Rows.Count; i++) { progressBar.Value = i; System.Windows.Forms.Application.DoEvents(); newRow = dataTable.NewRow(); for (int j = 1; j <= workSheet.UsedRange.Columns.Count; j++) { bool expression1 = (Excel.Range)workSheet.Cells[i, j] != null; bool expression2 = ((Excel.Range)workSheet.Cells[i, j]).Text != ""; if (expression1 && expression2) { if (i == 1) { DataColumn column = new DataColumn(((Excel.Range)(workSheet.Cells[i, j])).Value2); dataTable.Columns.Add(column); } else { Excel.Range range = workSheet.Cells[i, j]; var rangeDataType = range.Value.GetType(); if (rangeDataType == typeof(System.DateTime)) { newRow[j - 1] = range.Value.ToString("yyyy-MM-dd"); } else { newRow[j - 1] = range.Value; } } } } if (i != 1) { dataTable.Rows.Add(newRow); } } } catch (Exception ex) { progressBar.Visibility = Visibility.Collapsed; MessageBox.Show("导入Excel数据失败,失败信息如下:\n" + ex); } finally { workSheet = null; workBook = null; xlsApp.Quit(); int generation = System.GC.GetGeneration(xlsApp); xlsApp = null; System.GC.Collect(generation); } return dataTable; }
原文地址:https://www.cnblogs.com/gerogezhao/p/2009518.html