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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 14:36:40