python - 如何将多行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 | 服务名称| 服务计划名称| 中央处理器 | 内存 | 网卡 | 驱动器 |
解决方案
老实说,我认为您已经设法对数据结构感到困惑,并想出了比您需要的复杂得多的东西。
一种适合的方法是为每个服务使用 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])
请注意如何在不使用计数器的情况下完成所有操作。
推荐阅读
- java - 如何按私有字段对列表进行排序?
- c# - 将 VPN 与 Web API 一起使用时出现问题
- java - 如何在没有页面工厂(@FindBy 使用)但在动态页面中使用 HTML 元素 yandex qa 工具 selenium 包装器
- openmp - 避免openmp中线程之间的冲突
- java - 检查 repo 中是否存在所有 id
- angular - 如何在使用 ngFor Angular5 时对对象数据进行运行时操作
- linux - 抓取失败
: SSL 错误 - 系统调用失败 - javascript - 在 Js 或 Jquery 中选择已滚动到 Window 顶部的元素
- javascript - 如何在不重新加载页面的情况下多次运行相同的代码段?
- javascript - 来自 Promise 的 Vue 动态组件