使用openpyxl时数据全部写入单列而非多列的问题求解
问题解决方法
你的代码核心问题是数据插入逻辑错误:现在你把每条数据的每个字段单独作为一行插入Excel,而不是将一条数据的所有字段合并成一行插入。另外还有两处次要问题:sheet创建重复、表格范围固定导致不匹配随机行数。
关键修改点:
- 修正数据插入方式:
遍历每条数据时,不要逐个字段插入,而是按表头对应的字段顺序,把当前数据的所有值整理成一个列表,一次性插入为一行。 - 动态设置表格范围:
表格的ref不能写死成A1:F7,要根据实际数据行数动态计算,用ws.max_row获取最后一行行号。 - 修复重复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
相关产品推荐
相关产品推荐

