Uzz*_*zzy 3 python excel openpyxl
因此,我有 Excel 文件,每个文件中都有几张工作表,我正在编写脚本,该脚本将从选定的工作表中收集数据(如果它们存在于文件中)并将其合并到一张大工作表中。一般来说,它正在工作,迭代文件,如果存在所需的工作表,它会找到包含数据的单元格范围并将其附加到数据框。我现在需要做的是将标题行(列名)添加到 Dataframe 中,但在工作表中这些是多行标题。
为了使其在数据框中看起来相同,我需要取消合并顶部标题行中的单元格,并将值从第一个单元格复制到之前合并的范围内的其余单元格)。
我正在使用 OpenPyXL 来访问 Excel 工作表。我的函数接收工作表作为唯一参数。它看起来像这样:
def checkForMergedCells(sheet):
merged = ws.merged_cell_ranges
for mergedCell in merged:
mc_start, mc_stop = str(mergedCell).split(':')
cp_value = sheet[mc_start]
sheet.unmerge_cells(mergedCell)
cell_range = sheet[mergedCell]
for cell in cell_range:
cell.value = cp_value
Run Code Online (Sandbox Code Playgroud)
问题是 cell_range 返回一个元组,最终收到错误消息:
AttributeError: 'tuple' 对象没有属性 'value' 下面您可以在调试过程中看到屏幕截图,其中显示了每个变量中传递的值。
按索引访问通常会返回元组的元组,除非您尝试获取单个单元格或行。对于编程访问,您应该使用iter_rows()或iter_cols()
您可能想花一些时间查看该utils模块。
from openpyxl.utils import range_boundaries
for group in ws.merged_cell_ranges:
min_col, min_row, max_col, max_row = range_boundaries(group)
top_left_cell_value = ws.cell(row=min_row, column=min_col).value
for row in ws.iter_rows(min_col=min_col, min_row=min_row, max_col=max_col, max_row=max_row):
for cell in row:
cell.value = top_left_cell_value
Run Code Online (Sandbox Code Playgroud)