如何从Excel中插入数据到具有标题的数据表?

我正在读excel有像百万logging首先我查询我的表(没有logging),并获得Datable。 我查询我的表来获取列名称定义在我的Excel表使用别名。

var dal = new clsConn(); var sqlQuery = "SELECT FETAPE_THEIR_TRANDATE \"Date\" ,ISSUER Issuer, ISSU_BRAN Branch , STAN_NUMB STAN, TERMID TermID, ACQUIRER Acquirer,DEBIT_AMOUNT Debit,CREDIT_AMOUNT Credit,CARD_NUMB \"Card Number\" , DESCRIPTION Description FROM ALLTRANSACTIONS"; var returntable = dal.ReadData(sqlQuery); DataRow ds = returntable.NewRow(); var dtExcelData = returntable; 

所以我的数据表看起来像这样,

在这里输入图像说明

然后我从excel表读取logging

  OleDbConnection con = null; if (ext == ".xls") { con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filepath + ";Extended Properties=Excel 8.0;"); } else if (ext == ".xlsx") { con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepath + ";Extended Properties=\"Excel 12.0;IMEX=2;HDR=NO;TypeGuessRows=0;ImportMixedTypes=Text\""); } con.Open(); dt = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); string getExcelSheetName = dt.Rows[0]["Table_Name"].ToString(); //OleDbCommand ExcelCommand = new OleDbCommand(@"SELECT * FROM [" + getExcelSheetName + @"]", con); OleDbCommand ExcelCommand = new OleDbCommand("SELECT F1, F2, F3, F4, F5,F6,F7,F8,F9,F10 FROM [Sheet1$]", con); OleDbDataAdapter ExcelAdapter = new OleDbDataAdapter(ExcelCommand); try { ExcelAdapter.Fill(dtExcelData); //Here I give the datatable which i made previously } catch (Exception ex) { //lblAlert2.CssClass = "message-error"; //lblAlert2.Text = ex.Message; } 

它成功读取并填充数据表中的数据,但在数据表中创build自己的列,如F1到F10我怎样才能移动这个数据完全匹配我在数据表中定义的列

在这里输入图像说明

我将如何pipe理这个不创build其他列(f1,f2..f10)任何解决方法将明显或请解释我做错了什么,我怎么能做到这一点。

更新:我的Excel文件看起来像这样

在这里输入图像说明

Microsoft.ACE.OLEDB.12.0驱动程序将处理这两种types的Excel电子表格并使用相同的扩展属性。 即“Excel 12.0”将打开.xls和.xlsx。

保留HDR = NO,因为OLEDB期望它们在第一行,而它们实际上在第11行。

可悲的是“TypeGuessRows = 0; ImportMixedTypes = Text”被Microsoft.ACE.OLEDB.12.0完全忽略,你必须使用registry(yuk)。 将IMEX = 2更改为IMEX = 1,以确保将混合数据types处理为文本。

改回使用“select*从[Sheet1 $]”,然后我不知道你将不得不手动处理源数据。

 OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepath + ";Extended Properties=\"Excel 12.0;IMEX=1;HDR=NO\""); con.Open(); DataTable dt = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); string getExcelSheetName = (string)dt.Rows[0]["Table_Name"]; DataTable xlWorksheet = new DataTable(); xlWorksheet.Load(new OleDbCommand("Select * From [" + getExcelSheetName + "]", con).ExecuteReader()); //More than 11 rows implies 11 header rows and at least 1 data row if (xlWorksheet.Rows.Count > 11 & xlWorksheet.Columns.Count >= 10) { for (int nRow = 11; nRow < xlWorksheet.Rows.Count; nRow++) { DataRow returnRow = returntable.NewRow(); for (int nColumn = 0; nColumn < 10; nColumn++) { //Note you will probably get conversion problems here that you will have to handle returnRow[nColumn] = xlWorksheet.Rows[nRow].ItemArray[nColumn]; } returntable.Rows.Add(returnRow); } } 

我猜你只是想将excel数据添加到你的ALLTRANSACTION表中? 你没有指定,但似乎是这个可能的结果。 如果是的话,这是一个可怕的方式来做到这一点。 您不需要将整个表读入内存追加数据,然后更新数据库。 所有你需要做的就是读取excel文件并将数据插入到Oracle表中。

一些想法,你的可归还将包含数据,所以如果你只是想要表的结构,然后添加一个“Where RowNum = 0”select语句。 要将数据添加到Oracle数据库中,您可以1)转换为使用Oracle数据提供程序(ODP),然后使用OracleBulkCopy Class或2)在读取数据时,只需修改上述内容以逐行插入。 只要您的Excel电子表格中没有大量的数据,它就可以正常工作。 说了百万行是很多,所以也许不是最好的select。 您将需要validationinput,因为Excel不是最好的数据源。