VSTO 获取单元格的格式化内容作为字符串

VSTO Get formatted content of cells as strings

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

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

另一个问题,在 cell.Valuecell.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.

快多了