OpenEdge Progress 11.7通过COM对象校验Excel小数位数异常求助
解决OpenEdge Progress读取Excel十进制数小数位数不准确的问题
我使用OpenEdge Progress 11.7编写程序验证内部用户提供的Excel文件,其中一项校验内容是确认表格中十进制数的小数位数。Excel里这些数值显示为4位小数,但调用Progress的LENGTH()函数读取数值时,返回的小数位数超过4位;尝试通过Excel COM句柄调用LEN()函数检查,结果也不理想,求可行的解决办法。
用户伪代码如下:
DEFINE VARIABLE chExcel AS COM-HANDLE. DEFINE VARIABLE chWB AS COM-HANDLE. DEFINE VARIABLE chWS AS COM-HANDLE. DEFINE VARIABLE cInFinFile AS CHARACTER NO-UNDO. cInFinFile = "N:\test.xlsx". /* create excel instance */ CREATE "Excel.Application" chExcel. ASSIGN chExcel:Visible = TRUE chExcel:screenupdating = TRUE chExcel:displayAlerts = FALSE chWB = chExcel:Workbooks:OPEN(cInFinFile). MESSAGE chExcel:Range("C5"):VALUE SKIP LENGTH(chExcel:Range("C5"):VALUE) VIEW-AS ALERT-BOX. chWB:CLOSE. RELEASE OBJECT chWB NO-ERROR. chExcel:QUIT(). RELEASE OBJECT chExcel NO-ERROR.
可行解决办法
1. 读取单元格显示文本而非原始数值
Excel的Value属性返回的是单元格存储的原始数值(可能存在浮点精度误差),而Text属性会返回用户看到的格式化显示文本,直接对应Excel界面上的4位小数内容。修改代码读取Text属性:
MESSAGE chExcel:Range("C5"):Text SKIP LENGTH(chExcel:Range("C5"):Text) VIEW-AS ALERT-BOX.
之后可对该文本按小数点分割,统计小数部分的长度,即可准确得到显示的小数位数。
2. 格式化读取的数值后校验
若需基于数值本身校验,可使用Progress的STRING()函数将数值格式化为指定的4位小数,再统计长度:
DEFINE VARIABLE dValue AS DECIMAL NO-UNDO. DEFINE VARIABLE cFormatted AS CHARACTER NO-UNDO. dValue = chExcel:Range("C5"):VALUE. cFormatted = STRING(dValue, "->>,>>9.9999") /* 强制格式化为4位小数 */ MESSAGE cFormatted SKIP LENGTH(cFormatted) VIEW-AS ALERT-BOX.
这种方式会自动对数值四舍五入到4位小数,再检查格式化后的字符串是否符合小数位数要求。
3. 结合Excel单元格格式判断
直接读取单元格的数字格式,确认是否设置为4位小数格式:
MESSAGE chExcel:Range("C5"):NumberFormat VIEW-AS ALERT-BOX.
若返回格式为0.0000或类似的4位小数格式,说明单元格显示符合要求,再结合数值校验即可完成判断。注意:该方式仅检查格式,需配合数值校验确保实际值的小数位数合规。
4. 处理浮点精度误差
部分Excel数值会因浮点精度问题,存储值与显示值存在细微差异(如存储0.1234000000001但显示为0.1234),可通过比较原数值与四舍五入到4位小数后的值是否一致来判断:
DEFINE VARIABLE dValue AS DECIMAL NO-UNDO. DEFINE VARIABLE dRounded AS DECIMAL NO-UNDO. dValue = chExcel:Range("C5"):VALUE. dRounded = ROUND(dValue, 4). /* 四舍五入到4位小数 */ IF ABS(dValue - dRounded) < 0.00005 THEN /* 误差小于0.00005,视为符合要求 */ MESSAGE "小数位数符合要求" VIEW-AS ALERT-BOX. ELSE MESSAGE "小数位数超出4位" VIEW-AS ALERT-BOX.
内容的提问来源于stack exchange,提问作者Frank Kai Hei Chan
相关产品推荐
相关产品推荐

