扩展openpyxl工作簿类

问题描述 投票:0回答:1

我想用定制方法扩展openpyxl工作簿类的现有功能。我知道通常我可以通过基于原始类定义自己的类来做到这一点

class WorkbookExtended(openpyxl.Workbook):
    def added_method(self):
        print("Do some special stuff here")

到目前为止还不错,但是现在我的问题是,获取Excel工作簿的方式是通过调用load_workbook(file),它不是工作簿类的一部分,但返回一个完全实例化的Workbook对象。另一方面,Workbook类似乎没有提供一种基于现有对象实例化新对象的方法。所以问题是:如何扩展一个

  • 是另一个函数的结果,并且
  • 不提供基于现有对象进行初始化或复制的方法

编辑:更具体地说,我加载了一个现有的工作簿,并希望添加一种在给定范围和工作表中搜索给定值的方法。我希望能够搜索完全匹配或包含搜索词的单元格值。现在,我可以使用openpyxl中的现有功能来完成所有操作,但是我想做的就是将其添加到Workbook类中,因为这似乎是此类功能最自然的地方。

from openpyxl import Workbook, load_workbook

class WorkbookExtended(Workbook):
    def locate_value(self, value, range, sheet="active", strict=True):
        pass # perform the search and return a list of cells

wb = load_workbook("test.xlsx")
wbe = WorkbookExtended(wb) # does not work because Workbook class doesn't
                           # take a workbook object as __init__ parameter
result = wbe.locate_value("foo", "A2:B10") # result contains a list of cells 
                                           # that have "foo" as value

尽管有更具体的问题描述,但我仍然对解决该问题的一般方法感到好奇。即即使有一个工作簿或工作表函数执行类似的操作,原始问题仍然存在。

python class openpyxl extending-classes
1个回答
0
投票

在类似情况下,我使用实例变量而不是扩展类。在您的情况下,为工作簿创建一个实例变量,并在需要使用openpyxl中的函数时进行引用,并在需要使用自定义函数时引用您的类实例。

from openpyxl import Workbook, load_workbook

class WorkbookExtended():
    def __init__(self):
        self.workbook = None

    def locate_value(self, value, range):
        ws = self.workbook.active
        cells_with_value = [cell.coordinate for row in ws[range] for cell in row if cell.value == value]
        return cells_with_value

wb = load_workbook("test.xlsx")
wbe = WorkbookExtended()
wbe.workbook = wb
wbe.locate_value("foo", "A2:B10")

# reference the instance variable for openpyxl functions where necessary
wbe.workbook.sheetnames

或者如果您总是要使用您的类来加载现有工作簿,则可以将load_workbook放在类init函数中。

class WorkbookExtended():
    def __init__(self, file_path):
        self.workbook = load_workbook(file_path)

    def locate_value(self, value, range):
        ws = self.workbook.active
        cells_with_value = [cell.coordinate for row in ws[range] for cell in row if cell.value == value]
        return cells_with_value

wbe = WorkbookExtended("test.xlsx")
wbe.locate_value("foo", "A2:B10")
© www.soinside.com 2019 - 2024. All rights reserved.