【问题标题】:Is there a way to make merged cells filterable in excel using Openpyxl?有没有办法使用 Openpyxl 使合并的单元格在 excel 中可过滤?
【发布时间】:2021-03-05 17:44:48
【问题描述】:

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

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

应该返回前三行: 而不是只返回第一行(默认的 excel 行为):

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

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

作为参考,您已经可以按照此处的答案使用宏或手动格式化创建可过滤的合并单元格:https://stackoverflow.com/a/49817670/14251756

我已经尝试使用下面的脚本覆盖 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

【问题讨论】:

    标签: python python-3.x excel openpyxl


    【解决方案1】:

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

    【讨论】:

    • 像魅力一样工作!非常感谢您的回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    • 2021-06-14
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    相关资源
    最近更新 更多