用户率先将该数据表上传至小车产业链平台,用户率先将该数据表上传至小车产业链平台

1
引言 
  在应用程序的筹划中,平时索要读取Excel数据或将Excel数据导入转换来别的数据载体中,例如将Excel数据经过应用程序导入SQL
Sever等数据库中以备使用。作者在开发“汽车产业链ASP协同商务平台”中相遇了就好像必要。某汽车整车生产同盟社急需将其车辆发车消息披露到小车产业链平台上去,其数量为内部E奇骏P系统生成的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;HD途达=NO;IMEX=1’,认为能够化解此题材。由于在开发“汽车产业链联手商务平台”中蒙受过类似难题,作了大气的测试后意识,添加IMEX=1后没有实质上缓解此难点。表现为:若是某字段前8条记下中全部为纯数字来说,那么在该字段随后的记录中包含字母或汉字的项将如故变为空,可是只要该字段前8条记下中有一条不为纯数字,将能收获预期想要的结果。 
   
3
难点浅析 
  发生那种题材的源于与Excel ISAM[3](Indexed Sequential Access
Method,即索引顺序存取方法)驱动程序的限定有关,Excel ISAM
驱动程序通过检查前几行中实际值显然多少个 Excel
列的品类,然后采用可以代表其样本中大部分分值的数据类型[4]。也即Excel
ISAM查找某列前几行(私自认同情形下是8行),把占多的连串作为其拍卖项目。例如假使数字占多,那么其余富含字母等文件的数额项就会置空;相反即使文本居多,纯数字的多少项就会被置空。 
  现具体分析在第2节程序代码Extended
Properties项中的HDENVISION和IMEX所表示的意义。HD奥迪Q5用来设置是还是不是将Excel表中第三行作为字段名,“YES”代表是,“NO”代表不是即也为多少内容;IMEX是用来报告驱动程序使用Excel文件的形式,其值有0、① 、2三种,分别代表导出、导入、混合格局。当我们设置IMEX=1时将强制混合数据转换为文本,但仅仅那种装置并不牢靠,IMEX=二只保障在某列前8行数据至少有一个是文件项的时候才起效果,它只是把查找前8行数据中数据类型占优选用的行事作了有些的转移。例如某列前8行数据全为纯数字,那么它还是以数字类型作为该列的数据类型,随后行里的涵盖文本的数据如故变空。 
  另八个立异的章程是IMEX=1与登记表值TypeGuessRows协作使用,TypeGuessRows
值决定了ISAM
驱动程序以前几条数据采样鲜明数据类型,暗许为“8”。可以由此修改“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel”下的该注册表值来改变采样行数。不过那种革新要么不曾根本上缓解难点,即便大家把IMEX设为“1”,
TypeGuessRows设得再大,例如壹仟,即便数据表有1001行,某列前一千行全为纯数字,该列的第⑧01行又是一个文件,ISAM驱动的那种体制如故让那列的数额变成空。 
   
4
化解办法 
  从以上的辨析中得以摸清,当某列数据中含有混合类型时,在.NET中接纳Microsoft.Jet.OLEDB.4.0来读取Excel文件造成数据丢失是不可翻盘的,要消除这些标题不得不考虑动用其余数据读取方法。 
  在.NET中读取Excel文件的其它一种办法是回来使用古板COM组件,那种艺术在无数技艺小说或舆论中都有涉及,本文不作赘述。需求指出的是,使用COM组件来读取Excel文件数量的成效较低,在作释放的时候有恐怕碰着不可预感的荒唐,特别开发Web应用的主次应该慎重使用。 

1
引言 
  在应用程序的安顿性中,日常索要读取Excel数据或将Excel数据导入转换来其他数据载体中,例如将Excel数据经过应用程序导入SQL
Sever等数据库中以备使用。我在付出“小车产业链ASP协同商务平台”中相见了接近必要。某小车整车生产集团须要将其车辆发车音讯公布到小车产业链平台上去,其数据为内部EEscortP系统生成的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;HD中华V=NO;IMEX=1’,认为可以缓解此题材。由于在支付“小车产业链联手商务平台”中相遇过类似难题,作了汪洋的测试后发觉,添加IMEX=1后尚未实质上解决此难题。表现为:如若某字段前8条记下中全体为纯数字来说,那么在该字段随后的记录中含有字母或汉字的项将如故变为空,不过一旦该字段前8条记下中有一条不为纯数字,将能获取预期想要的结果。 
   
3
难题浅析 
  爆发那种题材的来源于与Excel ISAM[3](Indexed Sequential Access
Method,即索引顺序存取方法)驱动程序的限定有关,Excel ISAM
驱动程序通过检查前几行中实际值显然三个 Excel
列的种类,然后接纳可以代表其样本中多数分值的数据类型[4]。也即Excel
ISAM查找某列前几行(暗中认同意况下是8行),把占多的品类作为其拍卖项目。例如假若数字占多,那么其余富含字母等文件的数码项就会置空;相反假如文本居多,纯数字的数额项就会被置空。 
  现具体分析在第3节程序代码Extended
Properties项中的HDPRADO和IMEX所表示的意思。HD中华V用来设置是还是不是将Excel表中第2行作为字段名,“YES”代表是,“NO”代表不是即也为数据内容;IMEX是用来报告驱动程序使用Excel文件的方式,其值有0、① 、2三种,分别代表导出、导入、混合形式。当我们设置IMEX=1时将强制混合数据转换为文本,但单单那种装置并不保证,IMEX=3头保障在某列前8行数据至少有一个是文件项的时候才起效果,它只是把查找前8行数据中数据类型占优选拔的作为作了有点的更动。例如某列前8行数据全为纯数字,那么它如故以数字类型作为该列的数据类型,随后行里的隐含文本的多寡依旧变空。 
  另一个立异的方法是IMEX=1与注册表值TypeGuessRows合营使用,TypeGuessRows
值决定了ISAM
驱动程序以前几条数据采样明确数据类型,默许为“8”。可以经过改动“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel”下的该注册表值来改变采样行数。然而那种改进要么尚未一直上缓解难点,即使大家把IMEX设为“1”,
TypeGuessRows设得再大,例如1000,如若数据表有1001行,某列前一千行全为纯数字,该列的第801行又是三个文本,ISAM驱动的那种机制依旧让那列的数额变成空。 
   
4
化解办法 
  从上述的解析中得以得知,当某列数据中包含混合类型时,在.NET中动用Microsoft.Jet.OLEDB.4.0来读取Excel文件造成数据丢失是不可幸免的,要缓解那些题材不得不考虑接纳其它数据读取方法。 
  在.NET中读取Excel文件的其余一种方法是回来使用古板COM组件,那种艺术在诸多技艺文章或舆论中都有涉及,本文不作赘述。须要提议的是,使用COM组件来读取Excel文件数量的效能较低,在作释放的时候有只怕遇见不可预知的荒谬,越发开发Web应用的次序应该慎重使用。 

正文提议别的一种选择读取CSV纯文本格式解决此难题的主意。 
  (1)在读取Excel的.xls类型的公文数据之前,先将其转移为.csv格式,在Excel中一贯另存为那种格式就可以达标转换的目标。CSV文件又叫做逗号分隔的文书,是一种纯文本文件,它以“,”分隔数据列,本文表1的多少表用CSV格式存储后用纯文本编辑器打开的表现格局如表3所示。 
  表3 拔取CSV格式保存的表1数据 
  须要指出的是,CSV文件也可以用奥莱DB或ODBC的办法读取,然而假使拔取这个格局读取其数量又会回来丢失数据的覆辙上,ISAM机制一样会发挥成效。 
  (2)接纳一般的读取文本文件的主意打开文件,读取第1行,用“,”作为分隔符拿到各字段名,在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开发的情景,本杂文的解析和所提供的艺术可以参考。

正文提出其它一种拔取读取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开发的状态,本杂文的解析和所提供的章程可以参考。

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、① 、2二种,分别代表导出、导入、混合形式。当大家设置IMEX=1时将强制混合数据转换为文本,但仅仅那种装置并不有限支撑,IMEX=一头有限帮忙在某列前8行数据至少有三个是文本项的时候才起效果,它只是把查找前8行数据中数据类型占优选取的行事作了有点的变更。例如某列前8行数据全为纯数字,那么它如故以数字类型作为该列的数据类型,随后行里的隐含文本的多少如故变空。 

  另1个纠正的方法是IMEX=1与注册表值TypeGuessRows协作使用,TypeGuessRows
值决定了ISAM
驱动程序在此从前几条数据采样显然数据类型,暗中同意为“8”。可以由此改动“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft
\Jet\4.0\Engines\Excel”下的该注册表值来改变采样行数。可是那种革新要么没有根本上解决难点,尽管大家把IMEX设为“1”,
TypeGuessRows设得再大,例如一千,即便数据表有1001行,某列前一千行全为纯数字,该列的第八01行又是三个文本,ISAM驱动的那种机制照旧让这列的数目变成空。

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、壹 、2两种,分别表示导出、导入、混合情势。当大家设置IMEX=1时将强制混合数据转换为文本,但无非那种设置并不牢靠,IMEX=二只有限援救在某列前8行数据至少有一个是文本项的时候才起功能,它只是把查找前8行数据中数据类型占优选取的一坐一起作了不怎么的更动。例如某列前8行数据全为纯数字,那么它如故以数字类型作为该列的数据类型,随后行里的涵盖文本的数量如故变空。 

  另多个改正的方法是IMEX=1与注册表值TypeGuessRows合营使用,TypeGuessRows
值决定了ISAM
驱动程序以前几条数据采样鲜明数据类型,暗中同意为“8”。能够透过修改“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft
\Jet\4.0\Engines\Excel”下的该注册表值来改变采样行数。不过这种革新要么不曾根本上缓解难题,就算大家把IMEX设为“1”,
TypeGuessRows设得再大,例如一千,假如数据表有1001行,某列前一千行全为纯数字,该列的第十01行又是三个文件,ISAM驱动的那种体制如故让那列的数目变成空。

相关文章