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
相关产品推荐
相关产品推荐

