使用pyxlsb读取.xlsb文件时无法保留日期/时间及整数格式
解决pyxlsb读取.xlsb文件时日期/时间格式丢失问题
使用Python的pyxlsb库读取.xlsb格式文件并转CSV时,日期/时间单元格会被转为Excel序列号(整数/浮点数),无法保留原格式。原代码仅对所有浮点数转Decimal,未区分日期类型与普通数值,导致日期显示异常;参考方案会误将普通小数/整数转为日期,不符合需求。
原代码存在语法错误(如变量名空格、writer未赋值、if语句缺冒号等),且未处理日期类型,以下是修正后的实现:
import pyxlsb from datetime import datetime import csv from decimal import Decimal def process_excel_xlsb(excelfile_path, outputCSV_path): workbook = pyxlsb.open_workbook(excelfile_path) sheet = workbook.get_sheet('Sheet1') with open(outputCSV_path, 'w', newline='', encoding='utf-8') as csvfile: writer = csv.writer(csvfile, delimiter=';', quoting=csv.QUOTE_MINIMAL, lineterminator='\n') for rows in sheet.rows(): row_data = [] for cell in rows: cell_value = cell.v # 处理空单元格 if cell_value is None: row_data.append('') continue # 通过cell.t判断单元格类型:'d'为日期/时间,'n'为数值,其他类型直接取值 if cell.t == 'd': # 转换Excel日期序列号为datetime,可按需调整格式 date_val = pyxlsb.convert_date(cell_value) # 日期时间格式化为YYYY-mm-dd HH:MM:SS,仅日期则用'%Y-%m-%d' row_data.append(date_val.strftime('%Y-%m-%d %H:%M:%S')) elif cell.t == 'n': # 数值类型:整数转为int,小数保留Decimal避免精度丢失 if cell_value.is_integer(): row_data.append(int(cell_value)) else: row_data.append(Decimal(str(cell_value))) else: # 文本等其他类型直接取值 row_data.append(cell_value) writer.writerow(row_data) print(f'CSV created at {outputCSV_path}') excelfile_path = 'my_file.xlsb' outputCSV_path = 'new_report_CSV.csv' process_excel_xlsb(excelfile_path, outputCSV_path)
关键改动说明
- 精准区分单元格类型:利用pyxlsb Cell对象的
t属性识别类型,避免误转:'d'标记为日期/时间类型,通过pyxlsb.convert_date()将Excel序列号转为标准datetime对象,再格式化为所需字符串'n'标记为数值类型,区分整数和小数分别处理,避免出现111.0这类多余小数的整数
- 修复语法问题:修正原代码中变量名空格、赋值缺失、语句语法错误等问题
- 兼容空单元格:处理空值避免程序异常
预期转换结果
S_no;Date;Float;Date_time 111;2018-07-06;111.999;1988-07-31 01:00:00 222;2020-01-10;222.999;1986-09-22 01:00:00
若只需保留日期部分,将strftime的格式参数改为'%Y-%m-%d'即可。
内容的提问来源于stack exchange,提问作者nid101
相关产品推荐
相关产品推荐

