OLEDB连接不读取string值C#

我的要求是从本地文件夹读取一个excel文件并导入到DataTable中。 如果第一行包含string值,则导入工作正常。如果前三行中的值为int,则列的数据types变为Integer,并忽略string值。 我想读一个值。 我试图插入一行string值,但由于int数据types,它不允许。 Plz帮助..我在一个很大的麻烦。 我试图用连接stringIMEX = 1,但没有去

string Extension = ".xlsx"; string conStr = ""; switch (Extension) { case ".xls": //Excel 97-03 conStr = ConfigurationManager.ConnectionStrings["Excel03ConString"].ConnectionString; break; case ".xlsx": //Excel 07 conStr = ConfigurationManager.ConnectionStrings["Excel07ConString"].ConnectionString; break; } conStr = String.Format(conStr, strPath); oledbConn = new OleDbConnection(conStr); if (oledbConn.State != ConnectionState.Open) oledbConn.Open(); OleDbCommand cmd = new OleDbCommand(); ; OleDbDataAdapter oleda = new OleDbDataAdapter(); DataTable dt = new DataTable(); dt.Columns.Add("Store", typeof(string)).DefaultValue = strPath.Substring(18, 3); var sheets = oledbConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); cmd.Connection = oledbConn; cmd.CommandType = CommandType.Text; cmd.CommandText = " SELECT * FROM [" + sheets.Rows[0]["TABLE_NAME"].ToString() + "] "; oleda = new OleDbDataAdapter(cmd); //oleda.FillSchema(dt, SchemaType.Source); dt.TableName = strPath.Substring(18, 3); oleda.Fill(dt); 

这不幸的是,使用Jet或ACE引擎从Excel(和其他文件types)导入时使用的registry设置。 引擎将扫描前N行数据(由名为TypeGuessRows的registry值控制,默认值为8),并使用它来确定它认为每列的数据types是什么。 如果在电子表格的第一个TypeGuessRows行中检测到多个types,那么它将使用ImportMixedTypes设置(其唯一有效值是TextMajorityType ,而Text是你想要的)。

这里最简单的select可能是增加TypeGuessRows设置。 但是,如果您需要处理的电子表格包含成千上万的行,那么您将遇到问题,因为我认为它不会采样超过16,384行。 如果它不认为一个特定的列是混合types,那么它不会考虑应用ImportMixedTypes设置(所以如果你有20,000行,并且第一个17000都是int,那么这个列保持int,即使最后的3000不是整数,你会得到空位)。 在Excel中格式化列将不起作用,也不会指定目标数据types。

您可能需要在多个位置更改设置,具体取决于连接string和Excel版本或安装的Access Connectivity Engine的版本。 例如,在Windows 7 64位上,registry中Jet设置的位置是HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Jet \ 4.0 \ Engines \ Excel。

根据Excel的版本,使用ACE引擎也有类似的位置。 更多的信息在这里 ,旧的博客文章和最近的评论。

基本上,使用Jet / ACE从文件导入可能是一个痛苦的经历,有些时候甚至可能没有注意到有问题。