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

Python读取Excel时如何保留日期、货币等单元格类型

保留Excel单元格类型的Python解决方案

嘿,这个问题我之前踩过坑!Pandas的pd.read_excel默认会把带格式的单元格转成基础数据类型——比如把带货币符号的“50 USD”变成纯数字50,日期格式也会被转成datetime对象但丢失原单元格的格式标记。不过有几个靠谱的方法能帮你保留这些类型信息:

方法1:用openpyxl直接操作单元格(推荐)

openpyxl是处理xlsx文件的利器,它能完整保留单元格的样式、格式和类型信息。关键是要设置data_only=False(保留格式而非仅计算后的值)和values_only=False(获取单元格对象而非纯值):

from openpyxl import load_workbook

# 加载Excel文件,保留格式信息
wb = load_workbook('your_file.xlsx', data_only=False)
ws = wb.active

# 遍历行(从第二行开始,假设第一行是表头)
for row in ws.iter_rows(min_row=2, values_only=False):
    for cell in row:
        cell_value = cell.value
        cell_format = cell.number_format
        
        # 判断是否为货币格式
        if '$' in cell_format:
            # 提取货币符号(比如USD、EUR)
            currency_symbol = cell_format.split('$')[-1].strip() or 'USD'
            print(f"带货币格式的值: {cell_value} {currency_symbol}")
        # 判断是否为日期格式
        elif any(fmt in cell_format for fmt in ['yyyy', 'mm/dd', 'dd/mm']):
            # 按原格式输出日期
            print(f"日期格式的值: {cell_value.strftime('%Y-%m-%d')}")
        else:
            # 其他类型直接输出
            print(cell_value)

这个方法的优势是不需要提前知道列的类型,能自动识别单元格的格式,处理起来非常灵活。

方法2:用xlrd处理xls文件(仅支持旧版xls)

如果你的文件是xls格式(不是xlsx),可以用xlrd的旧版本(2.0+版本不再支持xlsx),通过formatting_info=True来获取格式信息:

import xlrd

# 加载xls文件,开启格式信息读取
wb = xlrd.open_workbook('your_file.xls', formatting_info=True)
ws = wb.sheet_by_index(0)

# 遍历行和列
for row_idx in range(1, ws.nrows):
    for col_idx in range(ws.ncols):
        cell = ws.cell(row_idx, col_idx)
        fmt_idx = cell.xf_index
        fmt = wb.xf_list[fmt_idx]
        
        # 解析格式字符串
        if fmt.format_key in wb.format_map:
            format_str = wb.format_map[fmt.format_key].format_str
            if '$' in format_str:
                currency_symbol = format_str.split('$')[0].strip() or 'USD'
                print(f"{cell.value} {currency_symbol}")
            elif 'yyyy' in format_str:
                # 把xlrd的日期值转成datetime
                date_val = xlrd.xldate_as_datetime(cell.value, wb.datemode)
                print(date_val.strftime('%Y-%m-%d'))
        else:
            print(cell.value)

注意:xlrd对xlsx的支持已经停止,所以如果是xlsx文件优先用openpyxl。

方法3:Pandas自定义转换器(适合已知列类型的场景)

如果你已经明确知道哪些列是货币或日期类型,可以用Pandas的converters参数自定义转换逻辑,但这个方法需要预先了解列的格式:

import pandas as pd

def currency_converter(value):
    # 假设该列是USD货币,给数值加上符号
    return f"{value} USD"

# 指定需要转换的列
df = pd.read_excel('your_file.xlsx', converters={'currency_column': currency_converter})

这个方法的局限性是不够灵活,无法自动识别未知格式的单元格,但如果你的数据结构固定,用起来会很方便。

总的来说,openpyxl是处理这类需求的最优解,它能完整保留Excel的单元格格式和类型信息,应对多种复杂场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 11:47:52