如何避免使用Excel文件中的数据从DataTable中删除非浮点值?

时间:2017-09-11 16:52:37

标签: c# excel oledb oledbdataadapter

我正在使用以下代码从Excel文件中获取带有Sheet的信息的DataTable变量:

// Just a few examples about connectionString and Excel's file path:
string pathFile = @"C:\Windows\MyFolder\myExcelSample.xlsx";
string excelConnString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + pathFile + ";Extended Properties='Excel 12.0;HDR=YES;IMEX=1;';";

using (OleDbConnection objConn = new OleDbConnection(cadenaConexion))
{
    objConn.Open();
    OleDbCommand cmd = new OleDbCommand();
    OleDbDataAdapter oleda = new OleDbDataAdapter();
    DataSet ds = new DataSet();
    DataTable dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
    string sheetName = string.Empty;

    if (dt != null)
    {
        var tempDataTable = (from dataRow in dt.AsEnumerable()
                             where !dataRow["TABLE_NAME"].ToString().Contains("FilterDatabase")
                             select dataRow).CopyToDataTable();
        dt = tempDataTable;
        sheetName = dt.Rows[TABLE_ROW]["TABLE_NAME"].ToString();
    }

    cmd.Connection = objConn;
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = "SELECT * FROM [" + sheetName + "]";
    oleda = new OleDbDataAdapter(cmd);
    oleda.Fill(ds, "Fact_TEMP");
    tbl_temporal = ds.Tables["Fact_TEMP"];
    objConn.Close();
}

Excel文件有一个名为“Document No#”的列,此代码表示为float类型,但此列的值不是float。

以下是一些例子:

444036
CO27_009734
CO31_050656
444041
444041
CO24_102377
CO64_000021
444043
CO24_102378
444044
444044
CO24_102380
CO24_102381
444046
444046444049
444050
CO24_102384

并且tbl_temporal变量中删除了非float类型的值。

有哪些其他方法可以解决这种情况,即不会让用户更新Excel文件中列(默认情况下为General的类型?

我必须分享的一些信息:

  • Excel文件的扩展名为“.xlsx”,有40340行。
  • 无法修改Excel文件。此Excel文件由用户提供,用户只需将他/她的Excel文件上传到我们的系统,我们的系统必须解决问题,不应修改架构或其数据。

2 个答案:

答案 0 :(得分:0)

尝试使用撇号'在数值前面或将其中一个字符串值作为第一行(在列标题之后)。

您也可以从OLEDB切换到NuGet中的一个XML Excel文件阅读器。

答案 1 :(得分:0)

关注此comment of the accepted answer后:

  • 在您的连接字符串中,将HDR=YES的值更改为HDR=NO

我更改了在DataTable变量中获取Excel信息的方式,以便使用DataTable的第一行作为Excel文件中列的名称。

这是我用它的代码:

// Add columns to "tbl_result" DataTable.
for (int colCount = 0; colCount < tbl_excel.Columns.Count; colCount++)
{
    tbl_result.Columns.Add(new DataColumn()
    {
        DataType = tbl_excel.Columns[colCount].DataType,
        ColumnName = tbl_excel.Rows[0][colCount].ToString(),
        AllowDBNull = true
    });
}

// Remove row "which is actually the header  in the Excel file".
tbl_excel.Rows.RemoveAt(0);

// Set the name of the table.
tbl_result.TableName = tbl_excel.TableName;

// Import rows.
foreach (DataRow row in tbl_excel.Rows)
{
    tbl_result.Rows.Add(row.ItemArray);
}

我检查了几次Excel文件,因为我收到了这个错误:

  

数据源中String类型的给定值不能   转换为指定目标列的float类型。

我使用Excel文件使用“导入数据”功能在SQL Server数据库中创建了表,但是,我不知道的是Excel文件中的某些列具有与数据不对应的值SQL Server表中迁移的列的类型。

所以,我改变了这些列(这是有问题的列):

-- [Document No#] was float before execute this line.
ALTER TABLE Fact_TEMP ALTER COLUMN [Document No#] NVARCHAR(255)

-- [G/L Account No#] was float before execute this line.
ALTER TABLE Fact_TEMP ALTER COLUMN [G/L Account No#] NVARCHAR(255)

再次尝试上传Excel文件(有40340行)后,上传工作没有任何问题。

TL; DR 版本为:

  • 将连接字符串中HDR=YES的值更改为HDR=NO
  • 检查Excel文件的值以检查是否包含无效数据(即具有NULL或其他DataType值的浮点列)
  • 检查SQL Server数据库表的DataType是否具有相同的DataType。