xlwings读取xlsb浮点范围返回被截断Decimal类型如何解决
xlwings读取.xlsb文件浮点数精度丢失解决方案
问题根因
你遇到的是xlwings 0.23.0版本的已知bug:该版本处理.xlsb格式的公式单元格时,默认读取的是单元格显示精度而非存储精度,会直接截断到4位小数后再封装为Decimal类型,且numbers转换器对xlsb格式不生效,所以你之前尝试的三个方案都没有效果。
可行解决方案
方案1:升级xlwings版本(最推荐)
xlwings从0.25.0版本开始修复了xlsb格式的精度读取和转换器不生效问题,升级后可直接用你之前写的options语法拿到完整精度的浮点数。
- 升级命令:
pip install --upgrade xlwings>=0.25.0 - 读取代码:
# 直接返回float类型的完整精度数值,无截断 values = sheet.range("myrange").options(numbers=float).value
方案2:不升级版本,调用Excel原生Value2属性
如果受环境限制不能升级xlwings,可以直接调用Excel COM接口的Value2属性,该属性返回单元格的原始存储值,不受显示格式的小数位数限制:
import win32com.client from decimal import Decimal # 读取范围的原始值 raw_values = sheet.range("myrange").api.Value2 # 转换为float类型的二维列表 float_values = [] for row in raw_values: processed_row = [] for cell in row: if isinstance(cell, (int, float, Decimal)): processed_row.append(float(cell)) else: processed_row.append(cell) float_values.append(processed_row)
方案3:用pyxlsb库直接读取xlsb文件
如果不需要操作Excel本身的功能,只是读取数据,可以用pyxlsb库直接解析xlsb文件,不需要启动Excel进程,读取速度更快且无精度问题:
- 安装命令:
pip install pyxlsb - 读取代码:
from pyxlsb import open_workbook float_values = [] with open_workbook("你的文件路径.xlsb") as wb: with wb.get_sheet("你的工作表名称") as sheet: for row in sheet.rows(): float_values.append([cell.v for cell in row])
旧方案无效原因说明
decimal.getcontext().prec仅控制decimal模块的运算精度,xlwings读取时已经完成了数值截断,修改该配置不生效- 0.23.0版本的
options转换器对xlsb格式的公式单元格不生效,属于版本bug raw_value属性在旧版本中读取xlsb时依然走显示值逻辑,同样会被截断
内容的提问来源于stack exchange,提问作者srpythondev
相关产品推荐
相关产品推荐

