使用openpyxl通过表头设置Excel日期格式及批量处理问题
解决方法
首先修正表头到列字母的映射逻辑,之前的错误在于把列索引(数字)存在字典里,但单元格引用需要的是列字母(如A、B、C)。然后针对多个日期列批量处理:
步骤1:正确构建表头与列字母的映射
用openpyxl.utils.get_column_letter把列索引转成字母,确保字典里存的是可直接用于单元格引用的列标识:
from openpyxl import load_workbook from openpyxl.utils import get_column_letter workbook = load_workbook('path\\filename.xlsx') worksheet = workbook['Sheet1'] # 构建表头到列字母的映射 col_name_to_letter = {} for col_idx, col in enumerate(worksheet.iter_cols(min_row=1, max_row=1), start=1): header_value = col[0].value if header_value: col_name_to_letter[header_value] = get_column_letter(col_idx)
步骤2:批量处理日期列格式
遍历你的DateColumns列表,对每个列的所有数据行(从第2行开始)设置日期格式:
DateColumns = ['Start_Date', 'End_Date', 'Birthday'] target_format = 'yyyy-mm-dd;@' for col_name in DateColumns: # 先确认表头存在,避免KeyError if col_name not in col_name_to_letter: print(f"警告:未找到表头 {col_name}") continue col_letter = col_name_to_letter[col_name] # 遍历数据行设置格式 for row in range(2, worksheet.max_row + 1): cell = worksheet[f"{col_letter}{row}"] cell.number_format = target_format # 保存修改后的文件 workbook.save('path\\updated_filename.xlsx')
错误原因说明
- KeyError: "Start_Date":要么是表头拼写和代码里的不一致(注意大小写),要么是遍历列时没正确获取表头值。上面的代码加了判断,避免直接报错。
- AttributeError: 'tuple' object has no attribute 'number_format':之前用列索引数字拼接单元格引用(比如
01),这不是合法的单元格地址,导致获取到的不是单个单元格对象,而是元组,自然没有number_format属性。用get_column_letter转成字母后,就能正确获取单元格对象。
内容的提问来源于stack exchange,提问作者HlmlVrlrn
相关产品推荐
相关产品推荐

