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

使用openpyxl时数据全部写入单列而非多列的问题求解

问题解决方法

你的代码核心问题是数据插入逻辑错误:现在你把每条数据的每个字段单独作为一行插入Excel,而不是将一条数据的所有字段合并成一行插入。另外还有两处次要问题:sheet创建重复、表格范围固定导致不匹配随机行数。

关键修改点:

  1. 修正数据插入方式:
    遍历每条数据时,不要逐个字段插入,而是按表头对应的字段顺序,把当前数据的所有值整理成一个列表,一次性插入为一行。
  2. 动态设置表格范围:
    表格的ref不能写死成A1:F7,要根据实际数据行数动态计算,用ws.max_row获取最后一行行号。
  3. 修复重复sheet创建:
    原来的循环会把默认sheet改名后又创建同名sheet,导致重复,调整成只创建需要的sheet即可。

修改后的完整代码:

import random
from openpyxl import Workbook
from openpyxl.worksheet.table import Table, TableStyleInfo

wb = Workbook()
names = ['name1', 'name2', 'name3', 'name4']
fruits = ['Apple', 'Banana', 'Peach', 'Orange']

# 处理默认sheet,然后创建其他sheet,避免重复
ws = wb.active
ws.title = names[0]
for name in names[1:]:
    wb.create_sheet(name)

# 切换回第一个sheet(name1)来写入数据
ws = wb[names[0]]

data = []
# 生成随机行数的数据集(1到19行数据)
for n in range(random.randint(1, 19)):
    data.append({
        'madeup': f'p{random.randint(1, 4)}x23',
        'fruit': random.choice(fruits),
        'price2021': random.randint(100, 500),
        'price2022': random.randint(100, 500),
        'price2023': random.randint(100, 500),
        'price2024': random.randint(100, 500),
    })

# 写入表头
headers = ["Madeup Name", "Fruit", "2021", "2022", "2023", "2024"]
ws.append(headers)

# 按表头顺序整理每条数据,插入为一行
for row in data:
    # 对应表头的字段键顺序
    row_values = [
        row['madeup'],
        row['fruit'],
        row['price2021'],
        row['price2022'],
        row['price2023'],
        row['price2024']
    ]
    ws.append(row_values)

# 动态计算表格范围:A1到F列最后一行
table_ref = f"A1:F{ws.max_row}"
tab = Table(displayName="Table1", ref=table_ref)

# 设置表格样式
style = TableStyleInfo(
    name="TableStyleMedium9",
    showFirstColumn=False,
    showLastColumn=False,
    showRowStripes=True,
    showColumnStripes=True
)
tab.tableStyleInfo = style
ws.add_table(tab)

wb.save("sample.xlsx")

效果说明:

修改后,每条数据的所有字段会在同一行的对应列中显示,和你预期的输出一致;同时表格会自动适配随机生成的数据行数,不会出现范围不匹配的问题。

内容的提问来源于stack exchange,提问作者Saeed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 15:34:51