用ole db读取Excel文件时有些字段出现8e-005的科学计数发表示的问题,急!

时间:2021-11-25 20:22:49
各位,我在读取Excel文件时发现所有0.00005这些五位小数的字段读取的时候得到的是科学计数格式,
如果在excel中前面加“'”,的确可以通过,但是数据量大太麻烦,所以请各位给个更好的办法!

39 个解决方案

#1


SELECT cast(cast([小数字段] as float) as char) 
FROM OPENROWSET( 'MICROSOFT.JET.OLEDB.4.0','Excel 8.0;IMEX=1;HDR=YES;DATABASE=你的excel.xls',[sheet1$])

#2


我估计你用excel打开这个文件看到的也是科学计数法显示的,excel单元格的值好像有两种,一种是
显示值,一种是单元本身的值,如果使用Excel.dll实例化excel对象来操作的话,好像可以访问这两个值的任意一个。

#3


我用Excel打开是正常的,

to  xrascal(横刀夺爱) 
你的我先试一下

#4


to  xrascal(横刀夺爱) 

你的这个现在怎么执行呀?说细点

我原先是这样做的
string strConn;
strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\item.xls;Extended Properties='Excel 8.0;HDR=yes;IMEX=1;'";
OleDbConnection conn = new OleDbConnection(strConn);
OleDbDataAdapter myCommand = new OleDbDataAdapter("SELECT * FROM [Sheet2$]",strConn);

#5


OleDbDataAdapter myCommand = new OleDbDataAdapter("SELECT * FROM [Sheet2$]",strConn);

改成:

string strSql = "SELECT cast(cast([小数字段] as float) as char) FROM [Sheet2$]";
OleDbDataAdapter myCommand = new OleDbDataAdapter( strSql,strConn);

我的意思是你在 SQL 语句里把你的那个小数的字段 cast 一下。

#6


那怎么获取sheet2的字段呢?

OleDbDataAdapter myCommand = new OleDbDataAdapter("SELECT * FROM [Sheet2$]",strConn);

IDataReader reader = myCommand.ExecuteReader();
DataTable schemaTable = reader.GetSchemaTable();
reader.Close();

这样可以吗?

#7


up

#8


我已经构造了,但是Fill进Dataset里面时有错

#9


to xrascal(横刀夺爱) 

错误是:IErrorInfo.GetDescription 因 E_FAIL(0x80004005) 而失败。

cmd的CommandText 是
"SELECT 内部货号,货品类型,料件类型,成品备案类型,商品名称,英文名称,商品规格型号,英文规格型号,ERP计量单位,ERP币制,cast(cast(单价 as float) as varchar),cast(cast(重量比例因子 as float) as varchar),申报计量单位,cast(cast(申报计量单位比例因子 as float) as varchar),海关HS商品编码,法定第一计量单位,法定第二计量单位,cast(cast(法定第一计量单位比例因子 as float) as varchar),cast(cast(法定第二计量单位比例因子 as float) as varchar),ERP产销国地,归并后料件序号,归并后成品序号,备注 FROM [Sheet2$]"


看看错误在哪呀?

#10


我也看不出错误在哪里,你把 cast 这些转换挨个去掉,检测一下是不是 cast 转换出错的缘故。

#11


是的,去掉cast就没错,加上就错了,不知道为什么

#12


用了cast就不行,各位,还有没有其他办法呀

#13


cast 转换出错的话,原因应该是你的有些数据不是数值型的。

#14


可是我的都是数值型的哟,

对于字段类型本身是decimal的,我现在这样处理了,
double mmm = Convert.ToDouble(line);//line即为科学计数发表示的值
decimal aaa =  Convert.ToDecimal(mmm);

很奇怪转换成double可以,但是转换成decimal不行,没办法,中转了一下。

但是对于那些字段类型是字符串的,就比较难办了,还请大家帮忙!

#15


你建立一个只有一行的 excel 文件测试一下?

#16


我给你测试了一下,应该改成这样:

如你的小数字段为 [num]
则 select convert(dec(10,6) ,[num])) as 小数 from [sheet2$]

#17


但是对于海关编码列,字段类型为varchar,Excel中值是85322200,格式是文本,读到的是8.53222e+007,
对于这样的列改怎么处理呢?

#18


一样的用格式转换,这次应该转换成 bitint

#19


我怎么提示convert函数没有定义呀,

#20


"SELECT 内部货号,货品类型,料件类型,成品备案类型,商品名称,英文名称,商品规格型号,英文规格型号,ERP计量单位,ERP币制,cast(cast(单价 as float) as varchar),cast(cast(重量比例因子 as float) as varchar),申报计量单位,cast(cast(申报计量单位比例因子 as float) as varchar),海关HS商品编码,法定第一计量单位,法定第二计量单位,cast(cast(法定第一计量单位比例因子 as float) as varchar),cast(cast(法定第二计量单位比例因子 as float) as varchar),ERP产销国地,归并后料件序号,归并后成品序号,备注 FROM [Sheet2$]"

#21


你说该怎么写吧,写一个例子,我这边总是有错,先谢谢啦

#22


cast(cast([海关编码列] as bigint)

#23


"SELECT 内部货号,货品类型,料件类型,成品备案类型,商品名称,英文名称,商品规格型号,英文规格型号,ERP计量单位,ERP币制,单价 ,重量比例因子 ,申报计量单位,申报计量单位比例因子,cast(cast([海关编码列] as bigint) as varchar) as 海关HS商品编码 ,法定第一计量单位,法定第二计量单位,法定第一计量单位比例因子,法定第二计量单位比例因子 ,ERP产销国地,归并后料件序号,归并后成品序号,备注 FROM [Sheet2$]"

老大,我这样写,错误还是一样哟,看看有什么错误

#24


SELECT 内部货号,货品类型,料件类型,成品备案类型,商品名称,英文名称,商品规格型号,英文规格型号,ERP计量单位,ERP币制,单价 ,重量比例因子 ,申报计量单位,申报计量单位比例因子,cast(cast([海关HS商品编码] as bigint) as varchar) as 海关HS商品编码 ,法定第一计量单位,法定第二计量单位,法定第一计量单位比例因子,法定第二计量单位比例因子 ,ERP产销国地,归并后料件序号,归并后成品序号,备注 FROM [Sheet2$]

是这样写的!还是错!

#25


convert(dec(20,0),[海关编码列]) as 海关编码列 

这样试试

#26


多谢哟,你好早,我去试试

#27


错误提示:
表达式中 'convert' 函数未定义

这样吧,你帮我个忙,我把excel文件发给你,你帮我试试怎么可以读的不是科学计数法就行,只要能解决,我可以另外开帖给分,你回答这么久,也够辛苦的了,先多谢罗!告诉我email吧

#28


你发到 xrascal@163.com 好了。

不辛苦不辛苦,我这两天是一心想换工作,没心上班。在csdn上瞎逛呢。

#29


喔,可以聊聊哟,qq:9117345

#30


收到没有呀,163邮箱好像有问题,不知道发出去没有

#31


没收到。。。

#32


有没有其他的呀,163好像收不到哟,我也是用163的发的,发不出去

#33


xrascal@hotmail.com

#34


发出去了,看看

#35


还是收不到

#36


hotmail的发出去两次了,163的发不出去,看看

#37


我就在 msn 上呢,没看到收到信呀。不会是 hotmail 把它当垃圾邮件,阻塞掉了吧?
163.com 的可以发信呀。我今天都用 163 的发了 n 封 email了

#38


是吧,那我登陆网站上去发好了,用个outExpress发了半天都不行

#39


to: xrascal(横刀夺爱) ( )
到这个帖去接分,没人跟帖,给你啦!
http://community.csdn.net/Expert/topic/3401/3401417.xml?temp=.6778986

#1


SELECT cast(cast([小数字段] as float) as char) 
FROM OPENROWSET( 'MICROSOFT.JET.OLEDB.4.0','Excel 8.0;IMEX=1;HDR=YES;DATABASE=你的excel.xls',[sheet1$])

#2


我估计你用excel打开这个文件看到的也是科学计数法显示的,excel单元格的值好像有两种,一种是
显示值,一种是单元本身的值,如果使用Excel.dll实例化excel对象来操作的话,好像可以访问这两个值的任意一个。

#3


我用Excel打开是正常的,

to  xrascal(横刀夺爱) 
你的我先试一下

#4


to  xrascal(横刀夺爱) 

你的这个现在怎么执行呀?说细点

我原先是这样做的
string strConn;
strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\item.xls;Extended Properties='Excel 8.0;HDR=yes;IMEX=1;'";
OleDbConnection conn = new OleDbConnection(strConn);
OleDbDataAdapter myCommand = new OleDbDataAdapter("SELECT * FROM [Sheet2$]",strConn);

#5


OleDbDataAdapter myCommand = new OleDbDataAdapter("SELECT * FROM [Sheet2$]",strConn);

改成:

string strSql = "SELECT cast(cast([小数字段] as float) as char) FROM [Sheet2$]";
OleDbDataAdapter myCommand = new OleDbDataAdapter( strSql,strConn);

我的意思是你在 SQL 语句里把你的那个小数的字段 cast 一下。

#6


那怎么获取sheet2的字段呢?

OleDbDataAdapter myCommand = new OleDbDataAdapter("SELECT * FROM [Sheet2$]",strConn);

IDataReader reader = myCommand.ExecuteReader();
DataTable schemaTable = reader.GetSchemaTable();
reader.Close();

这样可以吗?

#7


up

#8


我已经构造了,但是Fill进Dataset里面时有错

#9


to xrascal(横刀夺爱) 

错误是:IErrorInfo.GetDescription 因 E_FAIL(0x80004005) 而失败。

cmd的CommandText 是
"SELECT 内部货号,货品类型,料件类型,成品备案类型,商品名称,英文名称,商品规格型号,英文规格型号,ERP计量单位,ERP币制,cast(cast(单价 as float) as varchar),cast(cast(重量比例因子 as float) as varchar),申报计量单位,cast(cast(申报计量单位比例因子 as float) as varchar),海关HS商品编码,法定第一计量单位,法定第二计量单位,cast(cast(法定第一计量单位比例因子 as float) as varchar),cast(cast(法定第二计量单位比例因子 as float) as varchar),ERP产销国地,归并后料件序号,归并后成品序号,备注 FROM [Sheet2$]"


看看错误在哪呀?

#10


我也看不出错误在哪里,你把 cast 这些转换挨个去掉,检测一下是不是 cast 转换出错的缘故。

#11


是的,去掉cast就没错,加上就错了,不知道为什么

#12


用了cast就不行,各位,还有没有其他办法呀

#13


cast 转换出错的话,原因应该是你的有些数据不是数值型的。

#14


可是我的都是数值型的哟,

对于字段类型本身是decimal的,我现在这样处理了,
double mmm = Convert.ToDouble(line);//line即为科学计数发表示的值
decimal aaa =  Convert.ToDecimal(mmm);

很奇怪转换成double可以,但是转换成decimal不行,没办法,中转了一下。

但是对于那些字段类型是字符串的,就比较难办了,还请大家帮忙!

#15


你建立一个只有一行的 excel 文件测试一下?

#16


我给你测试了一下,应该改成这样:

如你的小数字段为 [num]
则 select convert(dec(10,6) ,[num])) as 小数 from [sheet2$]

#17


但是对于海关编码列,字段类型为varchar,Excel中值是85322200,格式是文本,读到的是8.53222e+007,
对于这样的列改怎么处理呢?

#18


一样的用格式转换,这次应该转换成 bitint

#19


我怎么提示convert函数没有定义呀,

#20


"SELECT 内部货号,货品类型,料件类型,成品备案类型,商品名称,英文名称,商品规格型号,英文规格型号,ERP计量单位,ERP币制,cast(cast(单价 as float) as varchar),cast(cast(重量比例因子 as float) as varchar),申报计量单位,cast(cast(申报计量单位比例因子 as float) as varchar),海关HS商品编码,法定第一计量单位,法定第二计量单位,cast(cast(法定第一计量单位比例因子 as float) as varchar),cast(cast(法定第二计量单位比例因子 as float) as varchar),ERP产销国地,归并后料件序号,归并后成品序号,备注 FROM [Sheet2$]"

#21


你说该怎么写吧,写一个例子,我这边总是有错,先谢谢啦

#22


cast(cast([海关编码列] as bigint)

#23


"SELECT 内部货号,货品类型,料件类型,成品备案类型,商品名称,英文名称,商品规格型号,英文规格型号,ERP计量单位,ERP币制,单价 ,重量比例因子 ,申报计量单位,申报计量单位比例因子,cast(cast([海关编码列] as bigint) as varchar) as 海关HS商品编码 ,法定第一计量单位,法定第二计量单位,法定第一计量单位比例因子,法定第二计量单位比例因子 ,ERP产销国地,归并后料件序号,归并后成品序号,备注 FROM [Sheet2$]"

老大,我这样写,错误还是一样哟,看看有什么错误

#24


SELECT 内部货号,货品类型,料件类型,成品备案类型,商品名称,英文名称,商品规格型号,英文规格型号,ERP计量单位,ERP币制,单价 ,重量比例因子 ,申报计量单位,申报计量单位比例因子,cast(cast([海关HS商品编码] as bigint) as varchar) as 海关HS商品编码 ,法定第一计量单位,法定第二计量单位,法定第一计量单位比例因子,法定第二计量单位比例因子 ,ERP产销国地,归并后料件序号,归并后成品序号,备注 FROM [Sheet2$]

是这样写的!还是错!

#25


convert(dec(20,0),[海关编码列]) as 海关编码列 

这样试试

#26


多谢哟,你好早,我去试试

#27


错误提示:
表达式中 'convert' 函数未定义

这样吧,你帮我个忙,我把excel文件发给你,你帮我试试怎么可以读的不是科学计数法就行,只要能解决,我可以另外开帖给分,你回答这么久,也够辛苦的了,先多谢罗!告诉我email吧

#28


你发到 xrascal@163.com 好了。

不辛苦不辛苦,我这两天是一心想换工作,没心上班。在csdn上瞎逛呢。

#29


喔,可以聊聊哟,qq:9117345

#30


收到没有呀,163邮箱好像有问题,不知道发出去没有

#31


没收到。。。

#32


有没有其他的呀,163好像收不到哟,我也是用163的发的,发不出去

#33


xrascal@hotmail.com

#34


发出去了,看看

#35


还是收不到

#36


hotmail的发出去两次了,163的发不出去,看看

#37


我就在 msn 上呢,没看到收到信呀。不会是 hotmail 把它当垃圾邮件,阻塞掉了吧?
163.com 的可以发信呀。我今天都用 163 的发了 n 封 email了

#38


是吧,那我登陆网站上去发好了,用个outExpress发了半天都不行

#39


to: xrascal(横刀夺爱) ( )
到这个帖去接分,没人跟帖,给你啦!
http://community.csdn.net/Expert/topic/3401/3401417.xml?temp=.6778986