如何使用openpyxl读取单元格字符串而非时间格式?
解决openpyxl读取Excel超长时长显示值的问题
当Excel单元格显示为35:00时,它实际上是用日期时间格式存储的(Excel没有独立的时长类型,超过24小时的时长会以[h]:mm的自定义格式展示,对应的存储值是1900-01-01 11:00:00——即1天+11小时)。openpyxl读取这类单元格时会返回datetime对象,要得到显示的字符串值,需要手动转换:
方法1:通过时间差计算总时长
利用Excel日期系统的起始点(修正1900年闰年bug后的1899-12-30),计算目标时间与起始点的差值,转换为总小时数后格式化:
from openpyxl import load_workbook from datetime import datetime # 加载目标Excel文件 wb = load_workbook("your_file.xlsx") ws = wb.active # 定位目标单元格(示例为第1行第1列) cell = ws.cell(row=1, column=1) if isinstance(cell.value, datetime): # 计算与Excel起始日期的时间差 time_delta = cell.value - datetime(1899, 12, 30) total_seconds = time_delta.total_seconds() # 转换为小时和分钟 total_hours = total_seconds / 3600 hours = int(total_hours) minutes = int((total_hours - hours) * 60) # 格式化为显示字符串 display_value = f"{hours}:{minutes:02d}" print(display_value) # 输出:35:00 else: # 若单元格为文本格式,直接返回原值 print(cell.value)
方法2:通过Excel序列号转换
利用value_to_excel()方法将datetime对象转回Excel的序列号(序列号的1单位=1天),乘以24得到总小时数:
from openpyxl import load_workbook wb = load_workbook("your_file.xlsx") ws = wb.active cell = ws.cell(row=1, column=1) if cell.value is not None: # 获取Excel序列号 serial_num = cell.value_to_excel(cell.value) total_hours = serial_num * 24 hours = int(total_hours) minutes = int((total_hours - hours) * 60) display_value = f"{hours}:{minutes:02d}" print(display_value)
关键说明
- Excel的
[h]:mm格式会将总小时数直接展示,而存储的是对应的日期时间值(35小时=1天+11小时,对应1900-01-01 11:00:00)。 - 两种方法都能准确还原单元格的显示值,可根据需求选择。
内容的提问来源于stack exchange,提问作者toiyovn
相关产品推荐
相关产品推荐

