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

How to avoid non-float values removed from DataTable with data from Excel file?

我使用以下代码从 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 类型的值。

还有哪些其他方法可以解决这种不涉及用户更新列类型的情况(默认为General Excel 文件?


我必须分享的一些信息:

尝试在数值前放置一个撇号 ' 或将其中一个字符串值作为第一行(在 headers 列之后)。

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

关注此 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 文件,因为我遇到了这个错误:

The given value of type String from the data source cannot be converted to type float of the specified target column.

我使用 Excel 文件使用 "Import Data" 功能在 SQL 服务器数据库中创建了 table,但是,我不知道的是一些Excel 文件中的列具有与迁移到 SQL 服务器 table.

中的列的数据类型不对应的值

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

-- [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 服务器数据库 table 的数据类型是否与预期的数据类型相同。