如何用Python Openpyxl提取单元格'/'后日期写入H列并解决报错
报错根因
- 索引起始值错误:openpyxl的行、列序号均从1开始计数,原有代码用
range(len(ws['A']))生成行号,第一个迭代值为0,调用ws.cell(row=0, column=1)时就会抛出参数不合法的错误。 - 正则逻辑失效:原有正则表达式存在大量多余空格、分隔符匹配规则混乱,就算索引正确也无法正确提取完整日期,仅能捕获日期的日段内容。
实现方案
你提到的「提取'/'后10个字符作为目标值」的逻辑实现简单、运行效率高,只要A列数据格式固定(/后紧跟10位标准日期),完全可以满足需求,参考代码如下:
from openpyxl import load_workbook # 替换为本地Excel文件的实际路径 wb = load_workbook(r'你的文件路径.xlsx') ws = wb.active # 行号从1开始遍历,覆盖A列所有有数据的行 for row_num in range(1, len(ws['A']) + 1): a_val = ws.cell(row=row_num, column=1).value # 跳过A列空单元格 if not a_val: continue a_str = str(a_val) # 定位/的位置,截取后面10位内容写入H列 if '/' in a_str: target_date = a_str.split('/')[-1][:10] ws.cell(row=row_num, column=8, value=target_date) # 保存为新文件,避免覆盖原文件导致数据丢失 wb.save(r'处理完成_输出文件.xlsx')
如果需要对提取的内容做日期格式校验,可以把截取逻辑替换为正则匹配版本,替换对应判断段即可:
import re # 替换上述代码中if '/' in a_str: 对应的判断逻辑 match_res = re.search(r'\d{4}[-./]\d{1,2}[-./]\d{1,2}', a_str.split('/')[-1]) if match_res: ws.cell(row=row_num, column=8, value=match_res.group())
注意点
- 代码里的文件路径替换为本地实际路径,保存时建议用新文件名,不要直接覆盖原文件。
- 代码对A列值做了字符串转换,兼容A列是数值、时间等非字符串类型的单元格场景,不会抛出类型错误。
- 如果A列单元格存在多个/的情况,
split('/')[-1]会取最后一个/后面的内容,符合常规数据存储的格式逻辑。
内容的提问来源于stack exchange,提问作者Lote_marsk_chozey
相关产品推荐
相关产品推荐

