首页 > 解决方案 > 如何将多行excel数据连接成一行?

问题描述

我目前面临一个问题,我需要将下图中显示的所有数据仅放入一行。

在此处输入图像描述

因此,使用 Python 和 Openpyxl,我尝试编写一个解析脚本,该脚本读取该行并且仅在值非空或不相同时将其复制到新工作簿中。

我得到超出范围的错误,并且代码不只保留我想要的数据。我已经花了几个小时,所以我想我会在这里问我是否可以解开。

我已经阅读了一些关于 Openpyxl 和关于在 python 中制作列表的文档,在 youtube 上尝试了几个视频,但没有一个完全符合我的目标。

import openpyxl
from openpyxl import Workbook

path = "sample.xlsx"
wb = openpyxl.load_workbook(path)
ws = wb.active
path2 = "output.xlsx"
wb2 = Workbook()
ws2 = wb2.active

listab = []
rows = ws.max_row
columns = ws.max_column

for i in range (1, rows+1):
   listab.append([])

cellValue = " "    
prevCell = " "

for c in range (1, rows+1):
    for r in range(1, columns+1):
        cellValue = ws.cell(row=r, column=c).value
            if cellValue == prevCell:
                listab[r-1].append(prevCell)
            elif cellValue == "NULL":
                listab[r-1].append(prevCell)
            elif cellValue != prevCell:
                listab[r-1].append(cellValue)
                prevCell = cellValue           

for r in range(1, rows+1):
    for c in range (1, columns+1):
        j = ws2.cell(row = r, column=c)
        j.value = listab[r-1][c-1]

print(listab)

wb2.save("output.xlsx")

应该有一行包含以下信息:

ods_service_id | 服务名称| 服务计划名称| 中央处理器 | 内存 | 网卡 | 驱动器 |

标签: pythonopenpyxl

解决方案


老实说,我认为您已经设法对数据结构感到困惑,并想出了比您需要的复杂得多的东西。

一种适合的方法是为每个服务使用 Python 字典,逐行更新它们。

wb = load_workbook("sample.xlsx")
ws = wb.active
objs = {}
headers = next(ws.iter_rows(min_row=1, max_row=1, values_only=True))
for row in ws.iter_rows(min_row=2, values_only=True):
    if row[0] not in objs:
        obj = {key:value for key, value in zip(headers, row)}
        objs[obj['ods_service_id']] = obj
    else:# update dict with non-None values
        extra = {key:value for key, value in zip(headers[3:], row[3:]) if value != "NULL"}
        obj.update(extra)

# write to new workbook
wb2 = Workbook()
ws2 = wb2.active
ws2.append(headers)
for row in objs.values(): # do they need sorting?
    ws2.append([obj[key] for key in headers])

请注意如何在不使用计数器的情况下完成所有操作。


推荐阅读