OLDB读取excel的数据类型不匹配的解决方案(ZT)

OLEDB 连接EXCEL的连日字符串 IMEX的难题

       昨天蒙受三个标题亟需想EXCEL表中写多少,折腾了久久才意识是IMEX惹得祸,所以记录下提醒本人,也可望大家不要出一致的错。 

碰着问题:使用语句 "insert into [Sheet1$] (大类) values ('test')" 不可能插入 。 

原因:Provider=Microsoft.Jet.OLEDB.4.0;Data Source='2008-08.xls'; Extended Properties='Excel 8.0;HDR=Yes;IMEX=1' 

消除措施: 去掉IMEX=1 

补充: 
       向EXCEL插入数据时 数据类型是由前8行数据中数据类型占优选取比方:分数一列前前8行为空值 插入5为字符串格式,固然前8作为数字格式 插入5为数字格式关于IMEX的资料: 

       IMEX是用来报告驱动程序使用Excel文件的情势,其值有0、1、2二种,分别表示导出、导入、混合方式。当大家设置IMEX=1时将仰制混合数据调换为文本,但但是这种装置并不牢靠,IMEX=1只保险在某列前8行数据起码有一个是文件项的时候才起作用,它只是把查找前8行数据中数据类型占优选用的表现作了多少的改观。例如某列前8行数据全为纯数字,那么它依旧以数字类型作为该列的数据类型,随后行里的盈盈文本的数据依然变空。 

  另三个更进一竿的主意是IMEX=1与注册表值TypeGuessRows同盟使用,TypeGuessRows 值决定了ISAM 驱动程序在此以前几条数据采集样品分明数据类型,默感觉“8”。能够透过修改“HKEY_LOCAL_MACHINESOFTWAREMicrosoft Jet4.0EnginesExcel”下的该注册表值来改动采集样品行数。不过这种立异要么尚未根本上解决难题,即便我们把IMEX设为“1”, TypeGuessRows设得再大,举例一千,倘使数据表有1001行,某列前壹仟行全为纯数字,该列的第1001行又是三个文件,ISAM驱动的这种机制依旧让这列的数据形成空。

本文提议别的一种选取读取CSV纯文本格式化解此难点的点子。 
  (1)在读取Excel的.xls类型的文本数据在此之前,先将其退换为.csv格式,在Excel中一贯另存为这种格式就足以高达调换的指标。CSV文件又叫做逗号分隔的文件,是一种纯文本文件,它以“,”分隔数据列,本文表1的数目表用CSV格式存款和储蓄后用纯文本编辑器张开的表现方式如表3所示。 
  表3 采纳CSV格式保存的表1数据 
  须要建议的是,CSV文件也足以用OleDB或ODBC的法子读取,不过倘使使用这个艺术读取其数额又会回来错失数据的套路上,ISAM机制同样会发挥作用。 
  (2)选用日常的读取文本文件的不二诀窍展开文件,读取第一行,用“,”作为分隔符获得各字段名,在DataTable中成立对应的各字段,字段的体系能够统一成立成“String”。 
   
本文原作 
  (3)逐行读取数据行, 用“,”作为分隔符得到某行各列的数目并填入DataTable相应的字段中。 
  达成的简化代码如下: 
  String line; 
  String [] split = null; 
  DataTable table=new DataTable("auto"); 
  DataRow row=null; 
  StreamReader sr=new StreamReader("c:/auto.csv",System.Text.Encoding.Default); 
  //成立与数据源对应的数据列 
  line = sr.ReadLine(); 
  split=line.Split(','); 
  foreach(String colname in split){ 
  table.Columns.Add(colname,System.Type.GetType("System.String")); } 
  //将数据填充数据表 
  int j=0; 
  while((line=sr.ReadLine())!=null){ 
   j=0; 
   row = table.NewRow(); 
   split=line.Split(','); 
   foreach(String colname in split){ 
   row[j]=colname; 
   j++;} 
   table.Rows.Add(row);} 
   sr.Close(); 
  //展现数据 
  dataGrid1.DataSource=table.DefaultView; 
  dataGrid1.DataBind(); 
   
5 结语 
  在应用程序的筹算中,需求访谈Excel数据的场所十三分广阔,本文以在.NET中对拜访含有混合类型数据的Excel表格拟选择的点子开展追究。当然,借使不设有混合类型的多寡应用Microsoft.Jet.OLEDB为较佳方案。对于不是使用.NET开荒的图景,本诗歌的分析和所提供的议程能够参谋。

1 引言 
  在应用程序的规划中,平时索要读取Excel数据或将Excel数据导入调换成别的数据载体中,举例将Excel数据经过应用程序导入SQL Sever等数据库中以备使用。小编在开垦“汽车行业链ASP协同商务平台”中遇到了就像是须求。某小车整车生产同盟社索要将其车辆发车消息揭露到小车行当链平台上去,其数据为当中ERP系统生成的Excel数据表,客商率先将该数据表上传至小车行业链平台,平台将此Excel数据读取导入到平台南间的SQL Sever数据库中,以供其他应用使用。汽车行当链平台的开垦应用的开荒工具为VS.NET,使用的语言是C#,在开拓的进程中发觉使用Microsoft.Jet.OLEDB.4.0读取数据会出现当某一字段内各自包括文本和数字的混合数据时,某一门类的数码会时有爆发错过。本文就对此难点爆发的根源实行了深入分析并付出了相应的化解情势。 
2 难题叙述 
  Excel是Microsoft集团的钟表格处理软件,在当代办公室及集团新闻化的选择中选择十一分分布,正因如此,在程序设计中大家日常要经过访问Excel文件来获得数量,但Excel文件不是正式数据库[1]。 
  ASP.NET也是Microsoft集团的制品,作为.NET FrameWork框架中的贰个关键组成部分,其主要性用来Web设计。大家在.NET中做客读取Excel数据时经常选用Microsoft.Jet.OLEDB.4.0[2]。现以读取七个Excel文件auto.xls中sheet1工作表为例,工作表的剧情如表1所示。 
  表1 sheet1表的数额内容 
  现将该表的数据内容读取并出示到到DataGrid中,简化的代码如下: 
  String ConnStr = " Provider = Microsoft.Jet.OLEDB.4.0; DataSource=c:/auto.xls;Extended Properties='Excel 8.0;HDR=YES';"; 
  OleDbConnection Conn=new OleDbConnection(ConnStr); 
  Conn.Open(); 
  string SQL="select * from [sheet1$]"; 
  OleDbDataAdapter da=new OleDbDataAdapter(SQL,ConnStr); 
  DataSet ds=new DataSet(); 
  da.Fill(ds); 
  DataGrid1.DataSource=ds; 
  DataGrid1.DataBind(); 
  Conn.Close(); 
  不过运转以上代码的结果并非指望的,它将映现为表2所示的源委。能够窥见第三个字段中为“1042”的多个数据项变为空。 
  表2 DataGrid1所显示的多少内容 
  有前后相继设计人士将以上代码奥莱DbConnection连接字符串中的Extended Properties一项作了之类改动,Extended Properties='Excel 8.0;HDGL450=NO;IMEX=1’,以为能够缓和此主题材料。由于在开垦“小车行当链联手商务平台”中相见过类似主题材料,作了大气的测验后开掘,增加IMEX=1后不曾实质上缓和此难点。表现为:若是某字段前8条记下中全体为纯数字来讲,那么在该字段随后的笔录中包罗字母或汉字的项将依然变为空,可是只要该字段前8条记下中有一条不为纯数字,将能获得预期想要的结果。 
   
3 难题浅析 
  爆发这种难题的来源与Excel ISAM[3](Indexed Sequential Access Method,即索引顺序存取方法)驱动程序的限定有关,Excel ISAM 驱动程序通过检查前几行中实际值明确二个 Excel 列的档案的次序,然后选择能够代表其样本中大多分值的数据类型[4]。也即Excel ISAM查找某列前几行(暗中认可景况下是8行),把占多的品种作为其处理项目。比如假使数字占多,那么任何包涵字母等文件的数码项就能够置空;相反要是文本居多,纯数字的多少项就能够被置空。 
  现具体剖析在第三节程序代码Extended Properties项中的HD福特Explorer和IMEX所代表的意义。HDEvoque用来设置是不是将Excel表中率先行作为字段名,“YES”代表是,“NO”代表不是即也为数据内容;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驱动的这种体制依旧让那列的数码变成空。 
   
4 消除办法 
  从上述的分析中可以识破,当某列数据中含有混合类型时,在.NET中采纳Microsoft.Jet.OLEDB.4.0来读取Excel文件变成数据遗失是不可逆袭的,要缓和这么些主题素材不得不思虑选拔另外数据读取方法。 
  在.NET中读取Excel文件的别的一种办法是回来使用古板COM组件,这种艺术在非常多技艺小说或舆论中都有提到,本文不作赘述。要求建议的是,使用COM组件来读取Excel文件数量的频率异常低,在作释放的时候有十分大希望际遇不可预感的荒谬,非常开采Web应用的前后相继应该慎重使用。 

本文由开元棋牌发布于数据库,转载请注明出处:OLDB读取excel的数据类型不匹配的解决方案(ZT)

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。