如何阻止openpyxl自动转换Excel长日期格式?
使用Python的openpyxl库处理Excel文件时,文件中存在长日期格式(例如01 January 2000),但读取时openpyxl会自动将其转换为datetime.datetime类型的短日期格式(如2000-01-01 00:00:00),需要保留Excel中原长日期的显示格式,禁止自动转换。
原代码:
wb = load_workbook("test.xlsx") ws = wb.worksheets[0].values header = next(ws) #get the header row my_data = [] for row in ws: my_data.append(dict(zip(header, row))) print(row)
原输出:
('300.0001.19', 'NGALULA MBUYAMBA BIBICHE', 'la troisième année de graduat', 'téchniques médicales', 'sage-femme ', None, None, 'Mikalayi', datetime.datetime(1980, 12, 10, 0, 0), 'donnant accès aux études supérieures et universitaires', 'de première et deuxième années de graduat en téchniques médicales', 'satisfaction', datetime.datetime(2019, 7, 28, 0, 0), datetime.datetime(2023, 8, 17, 0, 0), datetime.datetime(2023, 7, 31, 0, 0), 6913, 'CXC', 'B', datetime.datetime(2023, 8, 17, 0, 0), 'GRADUE')
('300.0002.19', 'DIPA MPONGO GRACIA', 'la troisième année de graduat', 'téchniques médicales', 'sage-femme ', None, None, 'Kananga', datetime.datetime(1996, 10, 5, 0, 0), 'donnant accès aux études supérieures et universitaires', 'de première et deuxième années de graduat en téchniques médicales', 'satisfaction', datetime.datetime(2019, 7, 28, 0, 0), datetime.datetime(2023, 8, 17, 0, 0), datetime.datetime(2023, 7, 31, 0, 0), 6914, 'CXC', 'B', datetime.datetime(2023, 8, 17, 0, 0), 'GRADUE')
问题出在ws.values会自动解析单元格内容为对应的数据类型(日期转datetime),要保留原显示格式,可通过以下两种方式处理:
方法一:直接读取单元格显示文本
遍历每个单元格,用cell.text获取Excel中显示的内容,直接保留原格式:
from openpyxl import load_workbook wb = load_workbook("test.xlsx") ws = wb.worksheets[0] # 获取表头行的文本 header = [cell.text for cell in ws[1]] my_data = [] # 从第二行开始遍历数据行 for row in ws.iter_rows(min_row=2): row_data = [cell.text for cell in row] my_data.append(dict(zip(header, row_data))) print(tuple(row_data))
方法二:仅格式化日期类型(保留其他数据原始值)
如果需要保留数字等类型的原始值,仅对日期类型按原格式转换:
from openpyxl import load_workbook from datetime import datetime wb = load_workbook("test.xlsx") ws = wb.worksheets[0] header = [cell.text for cell in ws[1]] my_data = [] for row in ws.iter_rows(min_row=2): row_data = [] for cell in row: # 判断单元格值是否为datetime类型 if isinstance(cell.value, datetime): # 使用单元格的原始数字格式格式化日期 formatted_date = cell.value.strftime(cell.number_format) row_data.append(formatted_date) else: # 其他类型直接保留原始值 row_data.append(cell.value) my_data.append(dict(zip(header, row_data))) print(tuple(row_data))
内容的提问来源于stack exchange,提问作者serge makasi

