使用openpyxl保存Walmart模板XLSX文件后表头异常的问题
Walmart模板文件处理后上传失败问题
问题背景
我使用Walmart商品批量上传模板,由于模板最多支持10000行内容,需要将原文件拆分为多个副本。操作步骤如下:
- 用
shutil复制原文件:
newWMFile = 'c:\\Users\\Admin\\AppData\\Local\\Programs\\Python\\Python312\\'+'walmart-test-save.xlsx' shutil.copyfile('c:\\Users\\Admin\\AppData\\Local\\Programs\\Python\\Python312\\walmart.xlsx', newWMFile)
- 用
openpyxl打开新文件,未做任何修改直接保存:
workbook = load_workbook(newWMFile) worksheet = workbook.active workbook.save(newWMFile) workbook.close()
异常现象
用Excel查看文件外观无异常,但上传至Walmart平台时提示文件错误。排查发现:"Product Content And Site Exp"工作表中,合并单元格表头"SKU"的内容丢失一行——原文件复制后显示两行"SKU",经openpyxl保存后仅保留一行,导致平台校验不通过。
原因分析
openpyxl处理合并单元格时,仅会保留合并区域左上角单元格的内容,合并范围内其他单元格的内容会被自动清除。原模板的"SKU"表头合并单元格内两行都有内容,openpyxl保存时会移除非左上角单元格的内容,破坏了Walmart模板要求的格式。
解决方案
方案1:修复合并单元格内容
遍历目标工作表的合并单元格区域,找到"SKU"对应的合并范围,为范围内所有单元格重新设置内容:
from openpyxl import load_workbook import shutil # 复制原文件 newWMFile = 'c:\\Users\\Admin\\AppData\\Local\\Programs\\Python\\Python312\\walmart-test-save.xlsx' shutil.copyfile('c:\\Users\\Admin\\AppData\\Local\\Programs\\Python\\Python312\\walmart.xlsx', newWMFile) # 加载工作簿并定位目标工作表 wb = load_workbook(newWMFile) ws = wb["Product Content And Site Exp"] # 遍历所有合并单元格 for merged_range in ws.merged_cells.ranges: # 获取合并区域左上角单元格的值 top_left_cell = ws.cell(row=merged_range.min_row, column=merged_range.min_col) if top_left_cell.value == "SKU": # 为合并区域内所有单元格设置"SKU"内容 for row_num in range(merged_range.min_row, merged_range.max_row + 1): for col_num in range(merged_range.min_col, merged_range.max_col + 1): ws.cell(row=row_num, column=col_num).value = "SKU" # 保存并关闭 wb.save(newWMFile) wb.close()
方案2:避免用openpyxl修改格式
如果仅需拆分文件行,可使用pandas结合openpyxl引擎处理数据,同时保留原模板格式:
import pandas as pd import shutil # 复制原文件 newWMFile = 'c:\\Users\\Admin\\AppData\\Local\\Programs\\Python\\Python312\\walmart-test-save.xlsx' shutil.copyfile('c:\\Users\\Admin\\AppData\\Local\\Programs\\Python\\Python312\\walmart.xlsx', newWMFile) # 读取数据(跳过表头行,根据实际情况调整) df = pd.read_excel(newWMFile, sheet_name="Product Content And Site Exp", header=[0,1]) # 拆分数据为10000行以内的块(示例拆分为前9999行数据) split_df = df.iloc[:9999] # 保存拆分后的数据,保留原格式 with pd.ExcelWriter(newWMFile, engine='openpyxl', mode='a', if_sheet_exists='replace') as writer: split_df.to_excel(writer, sheet_name="Product Content And Site Exp", index=False)
内容的提问来源于stack exchange,提问作者kenvu
相关产品推荐
相关产品推荐

