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

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所示的始末。能够发现第1个字段中为“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行),把占多的连串作为其处理项目。例如要是数字占多,那么任何富含字母等文件的数量项就会置空;相反假如文本居多,纯数字的数目项就会被置空。 
  现具体分析在第壹节程序代码Extended
Properties项中的HD昂科拉和IMEX所表示的含义。HD景逸SUV用来设置是不是将Excel表中首先行作为字段名,“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设得再大,例如一千,假诺数据表有1001行,某列前一千行全为纯数字,该列的第⑦01行又是3个文本,ISAM驱动的那种体制依然让那列的多少变成空。 
   
4
化解方法 
  从上述的解析中能够得知,当某列数据中包蕴混合类型时,在.NET中应用Microsoft.Jet.OLEDB.4.0来读取Excel文件造成数据丢失是不可转败为胜的,要消除这几个难点不得不考虑接纳任何数据读取方法。 
  在.NET中读取Excel文件的此外一种艺术是回去使用守旧COM组件,那种措施在重重技艺术小学说或舆论中都有涉嫌,本文不作赘述。需求提议的是,使用COM组件来读取Excel文件数量的功用较低,在作释放的时候有恐怕境遇不可预见的一无可取,尤其开发Web应用的主次应该慎重使用。 

1
引言 
  在应用程序的筹划中,平时索要读取Excel数据或将Excel数据导入转换来其它数据载体中,例如将Excel数据通过应用程序导入SQL
Sever等数据库中以备使用。小编在开发“汽车产业链ASP协同商务平台”中相见了近似需要。某小车整车生产公司索要将其车辆发车音讯表露到小车产业链平台上去,其数据为内部E中华VP系统生成的Excel数据表,用户率先将该数据表上传至汽车产业链平台,平台将此Excel数据读取导入到平台之中的SQL
Sever数据库中,以供别的应用使用。汽车产业链平台的支付使用的开发工具为VS.NET,使用的言语是C#,在付出的经过中窥见使用Microsoft.Jet.OLEDB.4.0读取数据晤面世当某一字段内分别包涵文本和数字的犬牙相制数据时,某一门类的数量会产生丢失。本文就对此难题发生的来源进行了分析并提交了相应的解决格局。 
2
难题讲述 
  Excel是Microsoft公司的电子表格处理软件,在现世办公及同盟社音信化的选取中接纳非平时见,正因如此,在先后设计中大家平常要通过访问Excel文件来收获数据,但Excel文件不是标准数据库[1]。 
  ASP.NET也是Microsoft公司的成品,作为.NET
FrameWork框架中的3个要害组成都部队分,其首要用以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所示的剧情。可以窥见第3个字段中为“1042”的七个数据项变为空。 
  表2 DataGrid1所出示的数据内容 
  有程序设计人士将上述代码奥莱DbConnection连接字符串中的Extended
Properties一项作了如下改变,Extended Properties=’Excel
8.0;HDPAJERO=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安德拉和IMEX所表示的意义。HDQX56用来设置是还是不是将Excel表中率先行作为字段名,“YES”代表是,“NO”代表不是即也为数量内容;IMEX是用来报告驱动程序使用Excel文件的形式,其值有0、一 、2三种,分别代表导出、导入、混合方式。当我们设置IMEX=1时将强制混合数据转换为文本,但但是那种设置并不牢靠,IMEX=三只保险在某列前8行数据至少有1个是文本项的时候才起效果,它只是把查找前8行数据中数据类型占优选取的一颦一笑作了多少的变动。例如某列前8行数据全为纯数字,那么它仍旧以数字类型作为该列的数据类型,随后行里的包括文本的数量如故变空。 
  另二个革新的主意是IMEX=1与登记表值TypeGuessRows同盟使用,TypeGuessRows
值决定了ISAM
驱动程序在此以前几条数据采集样品明确数据类型,私下认可为“8”。能够因此改动“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel”下的该注册表值来改变采集样品行数。不过那种革新要么没有向来上化解难点,就算大家把IMEX设为“1”,
TypeGuessRows设得再大,例如一千,假诺数据表有1001行,某列前一千行全为纯数字,该列的第九01行又是3个文件,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文件也足以用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数据的情状12分常见,本文以在.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的难点

       昨天赶上2个题材必要想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驱动的那种机制依然让那列的数目变成空。

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行数据全为纯数字,那么它如故以数字类型作为该列的数据类型,随后行里的带有文本的数目依旧变空。 

  另3个改良的章程是IMEX=1与登记表值TypeGuessRows合营使用,TypeGuessRows
值决定了ISAM
驱动程序此前几条数据采样明显数据类型,私下认可为“8”。能够通过修改“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft
\Jet\4.0\Engines\Excel”下的该注册表值来改变采集样品行数。不过那种革新要么尚未一直上化解难点,尽管我们把IMEX设为“1”,
TypeGuessRows设得再大,例如一千,借使数据表有1001行,某列前1000行全为纯数字,该列的第九01行又是一个文件,ISAM驱动的那种体制依然让那列的多少变成空。

相关文章