如何将数据从 excel 插入到具有 headers 的数据表?
How to insert data from excel to datatable which has headers?
我正在阅读 excel 有几百万条记录,首先我查询我的 table(没有记录)并得到 Datable。我使用别名查询 table 以获取在 excel sheet 中定义的列名称。
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;
所以我的数据table看起来像这样,
然后我从excelsheet
读取记录
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;
}
它成功读取并在数据中填充数据table,但在数据中创建了自己的列table,例如 F1 到 F10 我如何移动这些数据以与我在数据中定义的列完全匹配[= =41=]
我将如何管理它以不创建其他列 (f1,f2..f10)
任何解决方法都会很明显,或者请解释我做错了什么以及我该如何实现。
更新:
我的 Excel 文件看起来像这样
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 table 中?您没有具体说明,但这似乎是可能的结果。如果是这样,这是一种糟糕的方法。您不需要将整个 table 读入内存附加数据,然后更新数据库。您需要做的就是读取 excel 文件并将数据插入 Oracle table.
有些想法,您的返回table 将包含数据,因此如果您只想要table 的结构,则将"Where RowNum=0" 添加到Select 语句。要将数据添加到您的 Oracle 数据库,您可以 1) 转换为使用 Oracle 数据提供程序 (ODP),然后使用 OracleBulkCopy Class 或 2) 只需修改上面的内容以在您读取数据时逐行插入。只要您的 Excel 电子表格中没有大量数据,它就可以正常工作。话虽如此,一百万行很多,所以也许不是最好的选择。您将需要验证输入,因为 Excel 实际上并不是最好的数据源。
我正在阅读 excel 有几百万条记录,首先我查询我的 table(没有记录)并得到 Datable。我使用别名查询 table 以获取在 excel sheet 中定义的列名称。
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;
所以我的数据table看起来像这样,
然后我从excelsheet
读取记录 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;
}
它成功读取并在数据中填充数据table,但在数据中创建了自己的列table,例如 F1 到 F10 我如何移动这些数据以与我在数据中定义的列完全匹配[= =41=]
我将如何管理它以不创建其他列 (f1,f2..f10) 任何解决方法都会很明显,或者请解释我做错了什么以及我该如何实现。
更新: 我的 Excel 文件看起来像这样
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 table 中?您没有具体说明,但这似乎是可能的结果。如果是这样,这是一种糟糕的方法。您不需要将整个 table 读入内存附加数据,然后更新数据库。您需要做的就是读取 excel 文件并将数据插入 Oracle table.
有些想法,您的返回table 将包含数据,因此如果您只想要table 的结构,则将"Where RowNum=0" 添加到Select 语句。要将数据添加到您的 Oracle 数据库,您可以 1) 转换为使用 Oracle 数据提供程序 (ODP),然后使用 OracleBulkCopy Class 或 2) 只需修改上面的内容以在您读取数据时逐行插入。只要您的 Excel 电子表格中没有大量数据,它就可以正常工作。话虽如此,一百万行很多,所以也许不是最好的选择。您将需要验证输入,因为 Excel 实际上并不是最好的数据源。