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

使用openpyxl保存Walmart模板XLSX文件后表头异常的问题

Walmart模板文件处理后上传失败问题

问题背景

我使用Walmart商品批量上传模板,由于模板最多支持10000行内容,需要将原文件拆分为多个副本。操作步骤如下:

  1. 用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)
  1. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 21:46:16