当用OLEDB读取Excel的时候,解决同一列中“字符串”和“数字”两种格式同时存在,读取时不能正确显示“字符串”格式的问题:
DataSet dataSet = new DataSet(); OleDbConnection oleDbConnection = null; try { oleDbConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties="Excel 8.0;IMEX=1;"");//Microsoft.Jet.OLEDB.4.0 OleDbCommand selectCommand = new OleDbCommand(); selectCommand.Connection = oleDbConnection; selectCommand.CommandText = "select * from [" + sheetName + "]"; selectCommand.CommandType = CommandType.Text; OleDbDataAdapter adapter = new OleDbDataAdapter(selectCommand); dataSet = new DataSet(); adapter.Fill(dataSet); } catch (Exception exception) { oleDbConnection.Close(); } finally { oleDbConnection.Close(); }
当我们设置IMEX=1时将强制混合数据转换 为文本,但仅仅这种设置并不可靠,IMEX=1只确保在某列前8行数据至少有一个是文本项的时候才起作用,它只是把查找前8行数据中数据类型占优选择的行 为作了略微的改变。例如某列前8行数据全为纯数字,那么它仍然以数字类型作为该列的数据类型,随后行里的含有文本的数据仍然变空。
另一个改进的措施是IMEX=1与注册表 值TypeGuessRows配合使用,TypeGuessRows 值决定了ISAM 驱动程序从前几条数据采样确定数据类型,默认为“8”。可以通过 修改“HKEY_LOCAL_MACHINESOFTWAREWOW6432NodeMicrosoftOffice12.0Access Connectivity EngineEnginesExcel”下的该注册表值来更 改采样行数。如果设置为0,将分析所有数据行。
注意:Excel表数据列是单一列数据类型还是混合列数据类型列,是由取样行决定 而不是整列数据觉定。