我在寻找一种使用openpyxl使合并的单元格可过滤的方法。
例如,在下面的工作簿中对名字"John“进行过滤:
应该返回前三行:
而不是只返回顶部行(默认的excel行为):
问题是,默认情况下,合并范围仅包含范围的左上角单元格中的值:默认合并单元格值。
使用openpyxl是否可以覆盖合并单元格中的None值,从而使它们有效地进行过滤?所需合并单元格值
作为参考,您可以使用宏或手动格式化创建可过滤的合并单元格,如下所示:https://stackoverflow.com/a/49817670/14251756
我已经尝试过用下面的脚本覆盖none值,但是得到了错误AttributeError:'MergedCell‘对象属性'value’是只读的
import openpyxl
wb = openpyxl.load_workbook("Workbook")
ws = wb['Worksheet']
#Get list of ranges of merged cells
merged_cell_ranges = ws.merged_cells.ranges
merged_cell_ranges = list(map(str,merged_cell_ranges))
#Iterate through ranges and write top merged cell value to empty cells
for merged_range in merged_cell_ranges:
for row in ws[merged_range]:
for cell in row:
cell.value = ws[merged_range.split(':')[0]].value
发布于 2021-06-01 07:13:15
远非理想,但我通过修改openpyxl源代码实现了预期的结果。
要修改的函数位于以下位置:https://foss.heptapod.net/openpyxl/openpyxl/-/blob/branch/3.0/openpyxl/worksheet/worksheet.py#L586
您可以简单地添加一个参数来选择这些单元格是否成为合并的单元格,并为此“清除”。
修改后的函数现在如下所示:
def merge_cells(self, range_string=None, start_row=None, start_column=None, end_row=None, end_column=None, clean=True):
""" Set merge on a cell range. Range is a cell range (e.g. A1:E1) """
if range_string is None:
cr = CellRange(range_string=range_string, min_col=start_column, min_row=start_row,
max_col=end_column, max_row=end_row)
range_string = cr.coord
mcr = MergedCellRange(self, range_string)
self.merged_cells.add(mcr)
if clean:
self._clean_merge_range(mcr)
else:
mcr.format()
只需添加clean=False来保留这些值。
ws.merge_cells('A2:A9', clean=False)
https://stackoverflow.com/questions/64961153
复制相似问题