首页 新闻 会员 周边 捐助

C# 读取Excel数据到DataTable的问题

0
悬赏园豆:50 [已解决问题] 解决于 2013-05-08 17:52

文件是excel  但是格式非OLE2 格式

对于读取excel的内容 很简单,一般用ado连接直接读取,但是非OLE2 格式 ado是无法打开读取的,包括npoi;GemBox.Spreadsheet这些第三方也无法读取。

 

我只能使用Microsoft.Office.Interop.Excel com方式来读取了,不过出现了点问题 暂时无法解决 请继续往下面看

格式如下 里面内容是

 

用excel打开后可以识别(不得不佩服微软的软件智能)

 

问题:

我通过Microsoft.Office.Interop.Excel 的方式进行了读取 DataTable里面也有了数据 但是里面的值就有些问题

DataTable显示的如下:

 

问题来了,看出来了吗?和excel显示的不一样

 

 

时间字段变成了double 我很纳闷 我希望它默认为string; google了下通过设置单元格格式成字符串

excelCell.NumberFormatLocal = "@";

但是不起作用 如图:

 

本来想通过判断类型来解决,但是 我觉得 这样效率极低 

求高手给个解决之道

华北峰的主页 华北峰 | 初学一级 | 园豆:9
提问于:2013-05-08 16:19
< >
分享
最佳答案
0

可以搜索一下C# CSV,园子里就有相关的文章。

收获园豆:40
I,Robot | 大侠五级 |园豆:9783 | 2013-05-08 17:43

多谢!

http://blog.csdn.net/weizhiai12/article/details/7099823

虽然我的问题可以换成这个处理

但是那个datetime变成double还没解决,遗憾

华北峰 | 园豆:9 (初学一级) | 2013-05-08 17:51

@Rainier-Soft.Com:

@Diose:

 

无意间看到别人的代码    解决了  我日。。。

先设置 worksheet.Columns.EntireColumn.AutoFit(); 让列自动适应内容

通过 ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[r, c]).Text 获取文本 这里没有改变格式 excel上面显示的是什么 取出来就是什么。

华北峰 | 园豆:9 (初学一级) | 2013-05-09 12:07

@Diose: 不错,解决了就好

I,Robot | 园豆:9783 (大侠五级) | 2013-05-09 18:22
其他回答(2)
0

FileStream才是最正确的解决方案,你这文件并不是真正的Excel格式。

收获园豆:5
呆呆蚁 | 园豆:231 (菜鸟二级) | 2013-05-08 16:37

感谢你的回答:) 

如果通过代码分析文件来构造一个DataTable的话,这样做 我感觉说是不安全的。出错的可能性较多。(我没有把握写一个较为完善的函数来处理)

好吧 如果我换成一个真正的OLE2 格式 的excel文件 ,也会出现这个时间格式变 double的问题

借住 Microsoft.Office.Interop.Excel 强大功能来起到一个转换作用,是一个可行性 安全性较高 的方法。

数据已经到DataTable里了  我只是在问 如何在Microsoft.Office.Interop.Excel放到DataTable之前把单元格都设置为字符串呢。

支持(0) 反对(0) 华北峰 | 园豆:9 (初学一级) | 2013-05-08 16:56

@Diose: 凭直觉,你用错了属性,你试试excelCell.Text属性,再试试TextToColumns()方法。如果是标准的Excel,最好是用OleDb来读取。

支持(0) 反对(0) 呆呆蚁 | 园豆:231 (菜鸟二级) | 2013-05-08 17:41
0

应该是excel列的数据类型导致的。尝试excel中单元格格式设置为文本.看是否出现这个现象。

看你的调试例子中.时间类型都变成double类型..尝试转化看看.应该是转换成了时间戳类型,即从一个起始时刻到当前的天数、描述之类的

收获园豆:5
邢少 | 园豆:10926 (专家六级) | 2013-05-08 16:51

感谢你的回答:) 

 

转换我目前还无法下手 因为格式比较乱 而且我也不确定那些列是什么类型 我只想干一件事,就是通过Microsoft.Office.Interop.Excel来处理, 因为excel上面显示的是正确的,为什么通过代码处理之后就是double了呢。。关键是这个问题

NumberFormatLocal = "@";

支持(0) 反对(0) 华北峰 | 园豆:9 (初学一级) | 2013-05-08 16:59

@Diose:非OLE2格式 指的什么

支持(0) 反对(0) 邢少 | 园豆:10926 (专家六级) | 2013-05-08 17:14

@邢少: 标准的office 文件格式 规则

支持(0) 反对(0) 华北峰 | 园豆:9 (初学一级) | 2013-05-08 17:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册