在Excel中,单元格的值读取为####。

3

我正在使用命名范围从Excel中读取单元格值,但有时列宽比单元格中存在的值要小,因此当它是一个巨大的数字时,它会显示为#####。

当我从C#中读取它时,它会读取为#####。有什么解决方法吗?

示例代码:

Excel.Application.get_Range(strRange, Type.Missing).Text.ToString() //If i make it 
Excel.Application.get_Range(strRange, Type.Missing).Value2.ToString() //and read any date string i get 40390

你能展示文件的一些样例吗?至少几行? - Pavel Nikolov
Excel.Application.get_Range(strRange, Type.Missing).Text.ToString() 可以改为 Excel.Application.get_Range(strRange, Type.Missing).Value2.ToString(),这样如果读取任何日期字符串将得到40390。 - SSK
除非您更改正在读取的范围,否则您将始终获得相同的值。 - Ian
3个回答

3
没有任何代码可读,我猜你正在阅读一个显示字符串或类似的内容,Excel将在每次行宽度变化时更新它。
你可能需要阅读更原始的值。

是的,目前我将其读取为.Text而不是.Value2,因为当我读取日期时,我得到整数值。有没有什么办法解决这个问题? - SSK
这是因为Excel中存储的日期是以整数形式存储的。而日期时间则以浮点数形式存储。这种格式被称为OLE日期。要确定值是否为日期,您还需要检查单元格的格式。 - Ian

2

.Text会给你看到在Excel渲染层面上格式化的内容(所以如果列太小会出现####)。 .Value2会给你底层的Excel值。

在Excel中,日期/时间是作为数字内部存储的,表示自1900年1月0日以来的天数加上一个十进制部分表示时间的24小时的一部分,所以你的日期将以整数形式呈现。

如果要将数字转换回日期,可以使用格式:例如format(40390,"ddmmyyyy")或format(40390,"dd/mmm/yyyy")


或者您可以将双精度数转换为日期: DateTime date = DateTime.FromOADate(d) - Mathias

0

你是否尝试导入负日期?Excel 对此处理不佳,通常将日期作为双精度浮点数处理可以解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接