xlwings赋值单元格值时小数位自动四舍五入问题求助
xlwings处理Excel货币格式数值时直接赋值与复制粘贴值的差异问题
问题描述
在处理带$符号、保留6位小数的国债价格(货币格式)时,遇到两种赋值方法结果不一致:
- 直接赋值:执行
ws1.range("A2").value = ws1.range("A3").value,新单元格数值被四舍五入到2位小数,不符合需求; - 复制粘贴值:先执行
ws1.range("B3").copy(),再执行ws1.range("B2").paste(paste="values"),可正确保留6位小数。
问题解答
1. 两种方法结果差异的原因
- 直接赋值用
.value时,xlwings默认会根据Excel的单元格格式进行数值解析:对于货币格式单元格,默认转换器会读取格式化后的显示值(而非Excel底层存储的原始高精度数值),而多数货币格式默认显示2位小数,因此赋值后只保留了2位小数。 - 复制粘贴值操作是直接调用Excel的原生功能,直接复制单元格底层存储的原始数值,完全绕过xlwings的数值转换逻辑,因此能完整保留6位小数的精度。
2. 让直接赋值保留6位小数的解决方法
有两种可靠的方式:
- 使用
.raw_value属性:该属性直接读取Excel单元格底层存储的原始数值,不经过任何格式化转换,赋值后能完整保留精度:ws1.range("A2").raw_value = ws1.range("A3").raw_value - 通过
options(raw=True)指定读取原始值:在读取单元格时显式指定不使用默认转换器,直接获取原始数值:ws1.range("A2").value = ws1.range("A3").options(raw=True).value
这两种方法都能确保你获取到Excel中存储的完整6位小数数值,避免因格式解析导致的精度丢失。
内容的提问来源于stack exchange,提问作者ThackeryW
相关产品推荐
相关产品推荐

