有没有一种方法可以使用 Openpyxl 在 excel 中过滤合并的单元格?

Is there a way to make merged cells filterable in excel using Openpyxl?

我正在寻找一种使用 openpyxl 使合并的单元格可过滤的方法。

例如,在以下工作簿中过滤名字“John”:

应该return前三行: 而不是 return 仅顶行(默认 excel 行为):

问题是,默认情况下,合并范围仅在范围左上角的单元格中包含一个值: Default merged cell values

使用 openpyxl 是否可以覆盖合并单元格中的 None 值,从而有效地使它们可过滤? Desired Merged cell values

作为参考,您已经可以根据此处的答案使用宏或手动格式创建可过滤的合并单元格:

我已经尝试使用以下脚本覆盖 none 值,但出现错误 AttributeError: 'MergedCell' object attribute 'value' is read-only

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

远非理想,但我通过修改 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)