Excel文件导入到SQL,文本、数字丢失,变成NULL的处理
导入一个Excel到Sql,好方便进行数据的筛选,但是却发现,在导入后,电话字段有很多数据丢失,变成了Null,经过仔细检查,发现丢失的都是包含有字符型的(如区号与号码之间的-),再查看一下导入后的sql表,电话所在字段类型为float类型~~~难怪会有很多数据丢失了。。
将Excel中的该列单元格格式改为 文本 格式,再导入,已经不行。
搜索一番,发现有一个方法,不过这个方法只针对于完全数字格式的字段,如若想导入的是数字格式,而非字符串格式,就需要这样的做法:
1、将导入的过程存为DTS包,将此DTS包找到
2、在刚才保存的DTS包上右键,编辑包
3、在编辑器里右键单击空白处,选择“脱接属性”命令。
4、依次展开“连接”——excel的那个连接——>“OLE DB属性“,找到“Extended Properties”属性。
5、将右边的“Value”属性的值改为“Excel 8.0;HDR=YES;IMEX=1”
6、保存此包、并运行即可。
关于第五步中的IMEX设置有如下解释:
IMEX是用来告诉驱动程序使用Excel文件的模式,其值有0、1、2三种,分别代表导出、导入、混合模式。当我们设置IMEX=1时将强制混合数据转换为文本,但仅仅这种设置并不可靠,IMEX=1只确保在某列前8行数据至少有一个是文本项的时候才起作用,它只是把查找前8行数据中数据类型占优选择的行为作了略微的改变。例如某列前8行数据全为纯数字,那么它仍然以数字类型作为该列的数据类型,随后行里的含有文本的数据仍然变空。
另一个改进的措施是IMEX=1与注册表值TypeGuessRows配合使用,TypeGuessRows 值决定了ISAM 驱动程序从前几条数据采样确定数据类型,默认为“8”。可以通过修改“HKEY_LOCAL_MACHINESOFTWAREMicrosoftJet4.0EnginesExcel”下的该注册表值来更改采样行数。但是这种改进还是没有根本上解决问题,即使我们把IMEX设为“1”, TypeGuessRows设得再大,例如1000,假设数据表有1001行,某列前1000行全为纯数字,该列的第1001行又是一个文本,ISAM驱动的这种机制还是让这列的数据变成空。
但是这也仅仅是导入数字类型的字段,如果要导入为字符型的,比如说我们的电话号码形式的(010-21345678),这种做法是行不通的,但是还有另外一种很简单的方法,就是将Excel文件导出成Csv格式的文件,再将csv导入到Sql,就可以很方便的把电话号码导入进去了。这种做法也仅限于导入字符型的数据,因为CSV格式为文本格式,不包括数据类型,如果需要导入后数据为数字类型,就需要用上边的方法了。