我正在使用以下代码从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
)的类型?
我必须分享的一些信息:
答案 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
。