You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 23:42:04