Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将单元格的格式化内容获取为字符串_C#_Excel_Formatting_Vsto - Fatal编程技术网

C# 将单元格的格式化内容获取为字符串

C# 将单元格的格式化内容获取为字符串,c#,excel,formatting,vsto,C#,Excel,Formatting,Vsto,我有一个列,可以包含各种数据类型,如日期、字符串、数字等。。。 例如: 我需要做的是在单独的对话框窗口中显示此联系人。问题是,当我使用cell.Value2时,我得到的是double而不是可见字符串。当我尝试使用cell.Value时,然后检查cell.Value.GetType().Name==“DateTime”字符串是否与C格式不匹配;例如,我得到的图像中第5行的NumberFormat是m/d/yy@在C#中是无用的,因为cell.Value.ToString(格式化)将导致0/5/2

我有一个列,可以包含各种数据类型,如日期、字符串、数字等。。。 例如:

我需要做的是在单独的对话框窗口中显示此联系人。问题是,当我使用cell.Value2时,我得到的是double而不是可见字符串。当我尝试使用
cell.Value
时,然后检查
cell.Value.GetType().Name==“DateTime”
字符串是否与C格式不匹配;例如,我得到的图像中第5行的
NumberFormat
m/d/yy@
在C#中是无用的,因为
cell.Value.ToString(格式化)
将导致
0/5/20@

另一个问题是,包含时间的单元格在
cell.Value
cell.Value2
中都返回
0.43888
。我看到可以使用的内容的唯一方法是:
cell.Value(XlRangeValueDataType.xlRangeValueMSPersistXML)
cell.Value(XlRangeValueDataType.xlRangeValueXMLSpreadsheet);
即使在解析它们之前也很耗时。因为有时我需要读取数十万个值,所以无法使用XML方法

相关链接:

我的问题: 在不更改格式的情况下,将excel单元格的显示值转换为C#对象的最快、最可靠的方法是什么?

excel将单元格的数据(值)与其显示格式分开存储。虽然单元格的值(通常是变量)不会更改,但可能会以不同的方式显示给不同的用户(例如,对于英国用户而言,具有“短日期”格式的日期与美国用户的日期显示方式不同,即使基础值(双精度)没有更改;类似地,不同的地区使用不同的千位分隔符)。您可以使用Range.Text属性提取显示的项,并返回字符串

虽然可以使用Range.value检索范围值的二维数组,但不能对显示的值执行相同的操作,因为Excel不存储这些值:相反,它使用NumberFormat来确定要显示的内容。使用.value通常非常有效,因为(我认为)您正在直接访问底层数据:对于格式没有类似的访问方法。即使您可以访问NumberFormat,因为您发现它与sprintf()不匹配或者其他格式模式。此外,可能需要在文件大小上进行一些优化:例如,如果列中的每个单元格都具有相同的格式,Excel可能只为整个列保存该格式一次(我愿意对此进行更正)

对于具有未知值和格式组合的完全自由格式的Excel工作表,我认为您必须逐个单元格地遍历范围,这是非常缓慢的(特别是当您跨越流程边界并使用后期绑定时)

如果您可以识别数据的模式(例如带有姓名、DOB、地址、电话等的记录卡),那么您可以从第一条记录创建一个格式模板,然后将其应用于所有后续记录。这可能会加快速度。

Excel存储数据(值)不同于其显示格式的单元格。虽然单元格的值(通常为变体)不会改变,但对不同的用户显示的结果可能不同(例如,对于英国的用户而言,带有“短日期”格式的日期与对于美国的用户而言的结果不同,即使基本值(双精度)没有更改;类似地,不同的语言环境使用不同的分隔符)。您可以使用Range.Text属性提取显示的项目,它将返回一个字符串

虽然可以使用Range.value检索范围值的二维数组,但不能对显示的值执行相同的操作,因为Excel不存储这些值:相反,它使用NumberFormat来确定要显示的内容。使用.value通常非常有效,因为(我认为)您正在直接访问底层数据:对于格式没有类似的访问方法。即使您可以访问NumberFormat,因为您发现它与sprintf()不匹配或者其他格式模式。此外,可能需要在文件大小上进行一些优化:例如,如果列中的每个单元格都具有相同的格式,Excel可能只为整个列保存该格式一次(我愿意对此进行更正)

对于具有未知值和格式组合的完全自由格式的Excel工作表,我认为您必须逐个单元格地遍历范围,这是非常缓慢的(特别是当您跨越流程边界并使用后期绑定时)

如果您可以识别数据的模式(例如带有姓名、出生日期、地址、电话等的记录卡),那么您可以从第一条记录创建一个格式模板,然后将其应用于所有后续记录。这可能会加快速度。

您可以尝试使用它。 因为它从xml读取数据,所以比Com API快得多。

您可以尝试一下。
因为它从xml读取数据,所以比Com API快得多。

在VBA中,Excel Range对象有一个.Text属性,用于以字符串形式返回显示的单元格值。也许你可以通过C#?@DS#London访问它。谢谢!这确实解决了格式问题,但在性能方面非常慢,我过去经常使用C#?@DS#London访问它通过“.Value”/“.Value2”字段(作为数组)的一列值,但“.Text”在多个单元格上不起作用,我需要逐个单元格获取列,这非常慢。有什么建议吗?恐怕没有。值起作用如此之快的原因是(我想)它直接访问Excel用于存储变量数据的基础数组。Excel不存储显示的实际文本…只是对其进行格式化的方法,并且由于范围中的每个单元格可以具有不同的格式,因此必须逐个单元格进行处理。此外,呈现给一个用户的文本可能与呈现给用户的文本不同另一个(