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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 10:57:26