VSTO 获取单元格的格式化内容作为字符串
VSTO Get formatted content of cells as strings
我有一列可以包含各种数据类型,例如日期、字符串、数字等...
例如:
我需要做的是在单独的对话框中显示此联系人 window。问题是,当我使用 cell.Value2
时,我得到的是 double 而不是可见字符串。当我尝试使用 cell.Value
并在之后检查 cell.Value.GetType().Name == "DateTime"
时 NumberFormat
字符串是否与 C# 格式不匹配;例如,我在图像中的第 5 行得到的 NumberFormat
是 m/d/yy;@
,这在 C# 中是无用的,因为 cell.Value.ToString(formatting)
将导致 0/5/20;@
.
另一个问题,在 cell.Value
和 cell.Value2
中包含时间 returns 0.43888
的单元格,我能看到可以使用的东西的唯一方法是: cell.Value(XlRangeValueDataType.xlRangeValueMSPersistXML)
或 cell.Value(XlRangeValueDataType.xlRangeValueXMLSpreadsheet);
是 time-consuming 甚至在解析它们之前。由于有时我需要读取数十万个值,所以我不能使用 XML 方法。
相关链接:
Get Formatted Cell Values efficiently
How do I check type of dynamic datatype at runtime?
https://social.msdn.microsoft.com/Forums/office/en-US/32163853-7e27-4af7-b95b-f4b53118a594/c-excel-date-issue?forum=vsto
我的问题:
将 excel 单元格的 呈现的 值获取到 C# 对象中的最快和最稳健的方法是什么 - 无需对格式进行任何更改?
Excel 将单元格的数据(值)与其显示格式分开存储。虽然单元格(通常是变体)的值不会改变,但它可能会以不同的方式显示给不同的用户(例如,具有“短日期”格式的日期对英国用户和美国用户的显示不同,即使基础值(Double)没有改变;同样不同的语言环境使用不同的千位分隔符)。您可以使用 Range.Text 属性 提取显示的项目,它 returns 一个字符串。
虽然您可以使用 Range.Value 检索范围值的二维数组,但您不能对显示的值执行相同的操作,因为 Excel 不存储它们:相反它使用 NumberFormat 来确定要显示的内容。使用 .Value 通常非常有效,因为(我认为)您直接访问基础数据:没有类似的格式访问方法。即使您可以访问 NumberFormat,正如您所发现的那样,它与 sprintf() 或其他格式化模式不匹配。此外,可能会有一些优化以节省文件大小:例如,如果列中的每个单元格都具有相同的格式,Excel 可能只为整个列保存一次该格式(我愿意对此进行更正)。
对于一个完全 free-form Excel sheet 具有未知的值和格式组合,我认为你被迫通过范围 cell-by-cell,这是痛苦的慢(特别是如果你正在跨越进程边界并使用 late-binding)。
如果您可以识别数据的模式(例如带有姓名、出生日期、地址、Phone 等的记录卡),那么您可以从第一条记录创建一个格式模板,然后将其应用到之后的所有记录。这可能会加快速度。
你可以试试OpenXml Sdk for Excel。
因为它从xml读取数据,所以比Com-API.
快多了
我有一列可以包含各种数据类型,例如日期、字符串、数字等... 例如:
我需要做的是在单独的对话框中显示此联系人 window。问题是,当我使用 cell.Value2
时,我得到的是 double 而不是可见字符串。当我尝试使用 cell.Value
并在之后检查 cell.Value.GetType().Name == "DateTime"
时 NumberFormat
字符串是否与 C# 格式不匹配;例如,我在图像中的第 5 行得到的 NumberFormat
是 m/d/yy;@
,这在 C# 中是无用的,因为 cell.Value.ToString(formatting)
将导致 0/5/20;@
.
另一个问题,在 cell.Value
和 cell.Value2
中包含时间 returns 0.43888
的单元格,我能看到可以使用的东西的唯一方法是: cell.Value(XlRangeValueDataType.xlRangeValueMSPersistXML)
或 cell.Value(XlRangeValueDataType.xlRangeValueXMLSpreadsheet);
是 time-consuming 甚至在解析它们之前。由于有时我需要读取数十万个值,所以我不能使用 XML 方法。
相关链接: Get Formatted Cell Values efficiently How do I check type of dynamic datatype at runtime? https://social.msdn.microsoft.com/Forums/office/en-US/32163853-7e27-4af7-b95b-f4b53118a594/c-excel-date-issue?forum=vsto
我的问题: 将 excel 单元格的 呈现的 值获取到 C# 对象中的最快和最稳健的方法是什么 - 无需对格式进行任何更改?
Excel 将单元格的数据(值)与其显示格式分开存储。虽然单元格(通常是变体)的值不会改变,但它可能会以不同的方式显示给不同的用户(例如,具有“短日期”格式的日期对英国用户和美国用户的显示不同,即使基础值(Double)没有改变;同样不同的语言环境使用不同的千位分隔符)。您可以使用 Range.Text 属性 提取显示的项目,它 returns 一个字符串。
虽然您可以使用 Range.Value 检索范围值的二维数组,但您不能对显示的值执行相同的操作,因为 Excel 不存储它们:相反它使用 NumberFormat 来确定要显示的内容。使用 .Value 通常非常有效,因为(我认为)您直接访问基础数据:没有类似的格式访问方法。即使您可以访问 NumberFormat,正如您所发现的那样,它与 sprintf() 或其他格式化模式不匹配。此外,可能会有一些优化以节省文件大小:例如,如果列中的每个单元格都具有相同的格式,Excel 可能只为整个列保存一次该格式(我愿意对此进行更正)。
对于一个完全 free-form Excel sheet 具有未知的值和格式组合,我认为你被迫通过范围 cell-by-cell,这是痛苦的慢(特别是如果你正在跨越进程边界并使用 late-binding)。
如果您可以识别数据的模式(例如带有姓名、出生日期、地址、Phone 等的记录卡),那么您可以从第一条记录创建一个格式模板,然后将其应用到之后的所有记录。这可能会加快速度。
你可以试试OpenXml Sdk for Excel。 因为它从xml读取数据,所以比Com-API.
快多了