UiPath如何获取GenericValue实际类型 解决Excel数值分隔符异常
现有Excel表格中的数值采用.作为千位分隔符、,作为浮点分隔符;当数值小于1000时,仅存在,浮点分隔符。在UiPath中使用Read Range活动读取数据并存入DataTable时,小于1000的数值会被UiPath识别为浮点型,自动将分隔符,替换为.;大于等于1000的数值则被识别为字符串类型,原有分隔符保持不变。
读取效果示例
+───────────+───────────────+─────────+ | Input | UiPath Value | Type | +───────────+───────────────+─────────+ | 4.381,14 | 4.381,14 | String | | 5.677,50 | 5.677,50 | String | | 605,27 | 605.27 | Double | +───────────+───────────────+─────────+
需要遍历DataTable对每个值执行业务逻辑处理,由于单元格值存在不同数据类型,因此将值赋值给GenericValue类型变量存储。但分隔符,被自动替换为.会导致数值含义完全错误,因此需要先判断GenericValue中存储值的实际数据类型,以便还原正确的数值分隔符。
尝试调用GetType().ToString()方法获取变量类型,但返回结果仅为UiPath.Core.GenericValue,无法获取变量实际存储的底层数据类型(如String、Double)。
核心原因
GenericValue是UiPath封装的兼容类型,直接对变量调用GetType()返回的是封装类本身的类型,而非内部存储的实际值类型。要获取底层类型,需要访问其Value属性后再做判断。
方案1:针对现有逻辑补全类型判断
如果不想调整现有读取流程,直接通过以下逻辑判断GenericValue的实际存储类型即可,假设存储单元格值的GenericValue变量名为cellVal:
- 先做空值校验:若
cellVal Is Nothing或cellVal.Value Is Nothing,按空值规则处理 - 底层类型判断:调用
cellVal.Value.GetType()即可拿到真实存储类型,对应处理逻辑参考:
If cellVal.Value.GetType() Is GetType(String) Then ' 字符串类型为≥1000的原始格式数值,按欧洲数字格式解析为数值即可 Dim parseResult As Double = Double.Parse(cellVal.ToString(), New Globalization.CultureInfo("de-DE")) ElseIf cellVal.Value.GetType() Is GetType(Double) Then ' Double类型为<1000被UiPath自动转换的数值,分隔符已经适配系统数值规则,可直接使用 Dim parseResult As Double = CDbl(cellVal) End If
注意:不要通过ToString()后判断是否包含./,来区分类型,遇到整数类边界值时会出现判断错误,直接取Value属性判断类型稳定性最高。
方案2:从读取环节规避类型不一致(推荐)
不需要后续遍历做类型判断,修改Read Range活动配置即可从源头解决分隔符识别混乱问题,开启配置后所有单元格值会按Excel中显示的原始文本格式存入DataTable,不会自动做数值类型转换,所有数值都会保留原有的.千分位、,小数位分隔符,后续统一用德国区域格式解析为数值即可,完全避免类型不一致问题。
不同版本活动的配置路径:
- 现代版Read Range:找到属性面板的
Format Options,将Preserve Format设为启用状态 - 经典版Read Range:勾选属性面板的
PreserveFormat选项
统一解析代码如下:
' 所有值均为原始字符串格式,无需分类型判断 Dim finalValue As Double = Double.Parse(currentRow("目标列名").ToString(), New Globalization.CultureInfo("de-DE"))
内容的提问来源于stack exchange,提问作者toffler

