我正在阅读excel,我首先查询了我的表(没有记录),并获得了数百万条记录。我查询我的表,使用别名在我的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表中读取记录
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;
}
它成功读取并填充数据表中的数据但在数据表中创建自己的列,如F1到F10如何将此数据移动到与数据表中定义的列完全匹配
如何管理此操作以不创建其他列(f1,f2..f10) 任何解决方法都会很明显或请解释我做错了什么以及如何实现这一目标。
更新: 我的Excel文件看起来像这样
答案 0 :(得分:1)
Microsoft.ACE.OLEDB.12.0驱动程序将处理两种类型的Excel电子表格并使用相同的扩展属性。即“Excel 12.0”将打开.xls和.xlsx。
保留HDR = NO,因为OLEDB期望它们在第一行,它们实际上在第11行。
可悲的是,“TypeGuessRows = 0; ImportMixedTypes = Text”被Microsoft.ACE.OLEDB.12.0完全忽略,你必须使用注册表(yuk)。将IMEX = 2更改为IMEX = 1,以确保将混合数据类型视为文本处理。
改回使用“Select * From [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表。
有些想法,你的可回归将包含数据,所以如果你只想要表的结构,那么在Select语句中添加一个“Where RowNum = 0”。要将数据添加到Oracle数据库,您可以1)转换为使用Oracle数据提供程序(ODP),然后使用OracleBulkCopy类或2)只需修改上述内容即可在读取数据时逐行插入。只要您的Excel电子表格中没有大量数据,它就可以正常工作。说了一百万行是很多,所以也许不是最好的选择。您需要验证输入,因为Excel确实不是最好的数据源。