因此,我有Excel文件,每个文件中有几个工作表,我正在编写脚本,该脚本将从选定的工作表中收集数据,如果文件中存在这些数据,并将其合并到一个大工作表中。通常情况下,它正在工作,通过文件迭代,如果所需的工作表存在,它会找到包含数据的单元格范围,并将其附加到数据框中。我现在需要做的事情是添加标题行(列名)到Dataframe,但在工作表中这些是多行标题。
为了使它看起来相同的 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
问题是cell_range返回一个元组,最后得到错误消息:
属性错误:'tuple'对象没有属性'value'在下面您可以看到调试期间的screencap,它显示传入每个变量的值。
Debugger running
6条答案
按热度按时间oxiaedzo1#
按索引访问通常会返回元组的元组,除非您尝试获取单个单元格或行。对于编程访问,应使用
iter_rows()
或iter_cols()
您可能想花一些时间来了解一下
utils
模块。1zmg4dgp2#
其他答案的问题
关于@Charlie Clark的选定答案和使用http://thequickblog.com/merge-unmerge-cells-openpyxl-in-python中代码的其他答案,您可以更容易地取消合并单元格,而无需处理
range_boundaries
和那些转换。我也得到了问题与选定的答案,其中一些合并的单元格将取消合并,但其他不会,一些未合并的单元格将填补与数据,我想要的,但其他不会。
问题是
worksheet.merged_cells.ranges
是一个迭代器,这意味着它是延迟求值的,因此当调用worksheet.unmerge_cells()
时,对象worksheet.merged_cells
会发生变化,并且在再次迭代合并的单元格范围时会出现副作用。更好的解决方案
在我的例子中,我希望像这样取消合并单元格,同时复制边框、字体和对齐信息:
对于当前最新版本的
openpyxl==3.0.9
,我发现以下几点最适合我:浓缩溶液
以下是一个较短的版本,没有注解,也没有复制样式:
ctrmrzij3#
下面的代码来自http://thequickblog.com/merge-unmerge-cells-openpyxl-in-python/是为我工作。
jv2fixgn4#
之前的答案都不管用,所以我精心设计了这个答案,测试了一下,它对我很有效。
@Дмитр о о олександ р ович几乎是正确的,但我不得不修改一些东西来修正他的答案:
1.你会得到一个
AttributeError: 'MergedCell' object attribute 'value' is read-only
错误,因为你需要在改变它们的值之前取消合并合并单元格。https://foss.heptapod.net/openpyxl/openpyxl/-/issues/1228)1.你不能直接在ws.merged_cells.ranges上迭代,因为在python中迭代一个'ranges'列表对象并改变它(例如用一个
unmerge_cells
函数或一个pop
函数)将导致只改变一半的对象(见这里:https://foss.heptapod.net/openpyxl/openpyxl/-/issues/1085)。您需要创建一个不同的列表并对其进行迭代。kuhbmx9i5#
在我执行以下操作之前,我一直收到错误和弃用警告:
e3bfsja26#
所有以前的解决方案都给了我某种错误,可能是由于openpyxl的不同版本,在当前版本(3.0.10)中,我发现这个解决方案对我来说是有效的: