在导入Excel时,会有一个非常有趣的现象,就是数字的识别问题,当Excel中的某一列同时存在纯文本列与纯数字列时,非常有可能出现文本能导入而数字无法导入或者数字能导入而文本无法导入,本人经过多次试验发现,主要在于Excel驱动的问题。
常规情况下,我们以如下方式操作Excel:
string conn = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source =" + filename + ";Extended Properties=Excel 8.0";
OleDbConnection thisconnection = new OleDbConnection(conn);
thisconnection.Open();
这种情况下,极易出现数字或文本无法识别的问题,主要是当Excel第一行为数字或文本时,系统会默认以下所有行都是同一种数据形式,而出现非该类数据时,无法进行强行转换最终导致数据丢失,要解决此问题,只需要连接字符串上,稍微进行改动即可:
string conn = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source =" + filename + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";
OleDbConnection thisconnection = new OleDbConnection(conn);
thisconnection.Open();
其中:
HDR=Yes,这代表第一行是标题,不做为数据使用 ,如果用HDR=NO,则表示第一行不是标题,做为数据来使用。系统默认的是YES
参数Excel 8.0
对于Excel 97以上版本都用Excel 8.0
IMEX ( IMport EXport mode )设置
IMEX 有三种模式:
0 is Export mode
1 is Import mode
2 is Linked mode (full update capabilities)
我这里特别要说明的就是 IMEX 参数了,因为不同的模式代表著不同的读写行为:
当 IMEX=0 时为“汇出模式”,这个模式开启的 Excel 档案只能用来做“写入”用途。
当 IMEX=1 时为“汇入模式”,这个模式开启的 Excel 档案只能用来做“读取”用途。
当 IMEX=2 时为“连結模式”,这个模式开启的 Excel 档案可同时支援“读取”与“写入”用途。
意义如下:
0 ---输出模式;
1---输入模式;
2----链接模式(完全更新能力)
string connstr = "Provider=Microsoft.ACE.OLEDB.12.0; Persist Security Info=False;Data Source=" + @Excfilename + "; Extended Properties=Excel 8.0;HDR=Yes;IMEX=2";
在这种情况下,有可能出现“找不到可安装的ISAM ”。
而这个问题的出现,绝大部分原因是因为我们的语句中少了点要素。
string connstr = "Provider=Microsoft.ACE.OLEDB.12.0; Persist Security Info=False;Data Source=" + @Excfilename + "; Extended Properties='Excel 8.0;HDR=Yes;IMEX=2'";
string connstr = "Provider=Microsoft.ACE.OLEDB.12.0; Persist Security Info=False;Data Source=" + @Excfilename + "; Extended Properties=/"Excel 8.0;HDR=Yes;IMEX=2/"";
改成上述两种情况都是可以解决的。
本以为这样就OK了。但在实际使用过程中,这样设置还是不行,查阅了不少资料才发现,注册表里面有一个TypeGuessRows值,预设是8,表示会先读取前8列来决定每一个栏位的型态,所以如果前8列的资料都是数字,到了第9列以后出现的文字资料都会变成null,所以如果要解决这个问题,只要把TypeGuessRows机码值改成0,就可以解这
xp:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel
Windows 7等 64 系统:
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines\Excel]
设置 TypeGuessRows 为 0 将会导致性能的下降。IMEX=1 数据内容也能出现不正常的现象,比如长数字可能会出现科学计数法的格式显示。比较好的做法是导出前,对所有单元格进行处理,在单元格内容前面加 '。