XLSX转CSV时数值异常变更的Python技术求助
解决Excel转CSV时数值异常变更的问题
嘿,我看你遇到的问题是因为xlrd在读取Excel时自动转换了单元格类型,加上欧洲格式的逗号小数点被错误解析导致的,这俩问题凑一块就出现了那些奇怪的数值。我来给你拆解下解决方案:
问题根源
- 小数点格式不兼容:你的Excel用逗号(
,)作为小数点分隔符(欧洲地区常用格式),但xlrd默认按美式格式(.)解析,导致数值被错误转换。 - 单元格类型误识别:像
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
相关产品推荐
相关产品推荐

