如何用Python的gspread获取表格实际日期值而非显示值
解决gspread获取单元格实际存储日期值的问题
默认情况下,get_all_values()方法返回的是单元格格式化后的显示值(比如设置m/d格式后显示的"1/1")。要获取单元格存储的实际日期值,需要通过指定渲染选项或直接调用Sheets API来实现,以下是两种可行方案:
方案一:获取原始序列号并转换为日期
通过指定value_render_option='UNFORMATTED_VALUE'获取单元格的原始存储值(日期会以Excel/Sheets的序列号形式返回,代表从1899年12月30日起的天数),再将序列号转换为目标格式的日期字符串:
import datetime # 获取未格式化的原始值(日期返回序列号) values = workbook.worksheet(sheet_name).get_all_values(value_render_option='UNFORMATTED_VALUE') serial_number = values[1][0] # 将序列号转换为日期对象 # Sheets日期基准为1899-12-30(兼容Excel的历史bug) date_obj = datetime.datetime(1899, 12, 30) + datetime.timedelta(days=serial_number) # 格式化为"YYYY/M/D"格式(Windows用%#m,Linux/macOS用%-m去除前导零) actual_value = date_obj.strftime("%Y/%#m/%#d") print(actual_value) # 输出:2024/1/1
方案二:直接调用Sheets API获取日期格式值
利用gspread底层的API调用能力,指定valueRenderOption='DATE_TIME'直接获取标准日期格式,再转换为所需的字符串格式:
import datetime # 定义目标单元格范围(示例为第2行第1列,对应A2) spreadsheet_id = workbook.id range_name = f"{sheet_name}!A2" # 调用Sheets API获取日期格式数据 response = workbook.client.request( "get", f"https://sheets.googleapis.com/v4/spreadsheets/{spreadsheet_id}/values/{range_name}", params={"valueRenderOption": "DATE_TIME"} ) # 提取日期并格式化为目标样式 date_str = response.json()['values'][0][0] date_obj = datetime.datetime.fromisoformat(date_str) actual_value = date_obj.strftime("%Y/%#m/%#d") print(actual_value) # 输出:2024/1/1
补充:单个单元格的快速获取
如果仅需获取单个单元格的实际值,也可以使用cell()方法指定渲染选项:
import datetime cell = workbook.worksheet(sheet_name).cell(2, 1, value_render_option='UNFORMATTED_VALUE') serial_number = cell.value date_obj = datetime.datetime(1899, 12, 30) + datetime.timedelta(days=serial_number) actual_value = date_obj.strftime("%Y/%#m/%#d")
内容的提问来源于stack exchange,提问作者apricot
相关产品推荐
相关产品推荐

