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

我正在使用下面的代码从Excel文件中获取一个DataTablevariables与工作表的信息:

// 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#”的列,这个代码表示的是floattypes,但是这个列的值不是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 

而不是float型的值在tbl_temporalvariables中被删除。

还有哪些其他方法可以解决这种情况,而不会导致用户更新Excel文件中列的types(默认为General


我必须分享的一些信息:

  • Excel文件有一个“.xlsx”扩展名,并有40340行。
  • Excel文件不能修改。 这个Excel文件是由一个用户将他/她的Excelfile upload到我们的系统,我们的系统必须解决这个问题,它不应该修改模式或数据。

尝试在数字值前面加一个撇号,或者将其中一个string值作为第一行(在列标题之后)。

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

按照接受的答案的这个评论 :

  • 在连接string中,将HDR=YES的值更改为HDR=NO

我已经改变了获取DataTablevariables中的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文件检查,因为我得到这个错误:

来自数据源的Stringtypes的给定值不能转换为指定目标列的floattypes。

我使用Excel文件中的“导入数据”function在SQL Server数据库中创build了表,但是,我不知道的是,Excel文件中的某些列的值与数据types不匹配在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版本是:

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