【发布时间】:2018-06-21 23:56:01
【问题描述】:
我正在读取 XLSX 工作表中的值并将它们放入数据表中。
我的问题是我似乎无法推断单元格的数据类型,因此我可以设置数据表的列类型。
【问题讨论】:
-
DataTable 中列的数据类型一旦填充就无法更改。
-
@AVD:我知道这一点,当我最初设置 DataColumn 时,我试图从 excel 中获取单元格类型
我正在读取 XLSX 工作表中的值并将它们放入数据表中。
我的问题是我似乎无法推断单元格的数据类型,因此我可以设置数据表的列类型。
【问题讨论】:
Excel 输入数据的方法比 C# 宽松得多。例如,数值总是双精度数。如果您使用范围对象的Value 属性(互操作中的get_Value(),如果我没记错的话),如果单元格的内容和格式与这些一致,Excel 可能会返回(装箱的)decimal 或DateTime数据类型。
如果您使用Value2 属性,货币和日期值将作为盒装双精度值返回。 (这些数字在内部都存储为双精度数,因此,由于 Excel 不需要测试是否转换它们,Value2 会稍微快一些。)
因此,您可以检查列中每个值的类型,并相应地选择数据列的类型。如果您想测试列是否可以具有更具体的数字类型(float、int、short、byte 等),那么您还需要检查该列中值的范围,并测试它们是否为整数.
【讨论】:
您也可以使用 Excel.Range 的 NumberFormat 属性,并使用它来检查格式。尽管如此,如果您只需要找出什么是字符串,什么不是 - 使用 tryParse 的解决方案更有效(我认为更漂亮!)。
这是一个 B 计划:
string format = range.NumberFormat.ToString();
if(format == "#,##0.00")
{
//Type is Number
}
我认为,如果您确定这些值可以变化的类型,我认为这个解决方案可能会更好。 从这个你可以检查格式是否包含百分比等等。
您还可以查看从 Excel 获取的整列是否在其单元格中具有相同的格式,
//If this is "" the column has different types in it
string checkFormat = range.EntireColumn.NumberFormat.ToString();
【讨论】: