【问题标题】:How to insert data from excel to datatable which has headers?如何将数据从excel插入到具有标题的数据表中?
【发布时间】:2017-01-02 07:45:07
【问题描述】:

我正在阅读具有数百万条记录的 excel,首先我查询我的表(无记录)并获取 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表中读取记录

  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 文件是这样的

【问题讨论】:

  • 您的 Excel 看起来如何?快照会很有帮助。
  • 你为什么使用SELECT F1, F2, F3, F4, F5,F6,F7,F8,F9,F10 FROM [Sheet1$]而不是'select * from [Sheet1$]
  • 我已经尝试了两个查询,都给出了相同的结果
  • 我已经给出了excel的快照,请看我的编辑
  • 您肯定需要在加载前清理 Excel(删除不需要的行)。我已经使用 SQLBulkCopy 将数据从 Excel 加载到具有 ColumnMapping 属性的 SQLServer,但不确定您正在尝试的方法。 在公共网站上分享此类详细信息之前,请不要敏感并隐藏个人信息(信用卡号、姓名)。

标签: c# excel datatable oledb


【解决方案1】:

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

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

遗憾的是,Microsoft.ACE.OLEDB.12.0 完全忽略了“TypeGuessRows=0;ImportMixedTypes=Text”,您必须使用注册表 (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 并不是最好的数据源。

【讨论】:

    猜你喜欢
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多