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

XLSX转CSV时数值异常变更的Python技术求助

解决Excel转CSV时数值异常变更的问题

嘿,我看你遇到的问题是因为xlrd在读取Excel时自动转换了单元格类型,加上欧洲格式的逗号小数点被错误解析导致的,这俩问题凑一块就出现了那些奇怪的数值。我来给你拆解下解决方案:

问题根源

  1. 小数点格式不兼容:你的Excel用逗号(,)作为小数点分隔符(欧洲地区常用格式),但xlrd默认按美式格式(.)解析,导致数值被错误转换。
  2. 单元格类型误识别:像2,25这类内容,xlrd可能把它当成了日/月的日期格式,自动转换成了Excel的日期序列号(就是你看到的43344这类数字),完全偏离了原始数值。

修复后的代码

解决核心是直接读取单元格的原始显示文本,而不是让xlrd自动转换值。这里用cell_text()方法代替原来的cell().value,同时加上formatting_info=True确保能正确获取格式信息:

import xlrd
import csv

def csv_from_excel_max():
    # 打开工作簿时保留格式信息,确保能读取原始文本
    wb = xlrd.open_workbook("Pricelist.xlsx", formatting_info=True)
    sh = wb.sheet_by_name("EUR")
    
    # 用with语句自动管理文件,避免忘记关闭
    with open("result_file.csv", "wb") as result_file:
        wr = csv.writer(result_file, delimiter=";")
        # 用for循环更简洁
        for rownum in range(sh.nrows):
            # 处理服务名称,清理特殊字符
            service_name = str(sh.cell_text(rownum, 3)).replace(u"\xa0", "").replace(u"\u2122", "")
            # 直接读取采购价的原始文本,避免自动转换
            our_price = sh.cell_text(rownum, 9)
            client_price = sh.cell_text(rownum, 10)
            
            # 可选:如果后续程序需要用点作为小数点,取消下面两行注释
            # our_price = our_price.replace(',', '.')
            # client_price = client_price.replace(',', '.')
            
            # 写入行并编码为utf-8
            wr.writerow([service_name.encode("utf-8"), our_price.encode("utf-8"), client_price.encode("utf-8")])

关键修改点说明

  • cell_text():直接获取单元格显示的原始文本,完全保留你Excel里的数值格式(比如1798,20、2,25),不会被xlrd乱转换。
  • formatting_info=True:确保xlrd读取时保留单元格的格式信息,某些情况下没有这个参数可能无法正确获取文本。
  • with语句:自动处理文件关闭,比手动调用close()更安全可靠。

这样转换后的CSV就能完全保留你Excel里的原始数值了,不会再出现奇怪的数字。

内容的提问来源于stack exchange,提问作者Rivena

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:36:31