终于在博客园发表自己的第一篇博文了,由于自己属于刚入门的菜鸟,文章不是很专业,还请大家多指教,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;
}