扩展 openpyxl 工作簿 class
Extending openpyxl workbook class
我想用自定义方法扩展 openpyxl 工作簿的现有功能 class。我知道通常我会根据原始 class
定义我自己的 class
class WorkbookExtended(openpyxl.Workbook):
def added_method(self):
print("Do some special stuff here")
到目前为止一切顺利,但我现在的问题是我获取 Excel 工作簿的方式是调用 load_workbook(file)不是工作簿 class 的一部分,而是 returns 一个完全实例化的工作簿对象。另一方面,Workbook class 似乎没有提供一种基于现有对象实例化新对象的方法。
所以问题是:如何扩展 class that
- 是另一个函数的结果并且
- 不提供基于现有对象初始化或复制自身的方法
编辑:
更具体地说,我加载了一个现有的工作簿,并想添加一个方法来搜索给定范围和 sheet 内的给定值。我希望能够搜索完全匹配或包含搜索词的单元格值。现在我可以使用 openpyxl 中的现有函数完成所有这些工作,但我想做的是将它添加到工作簿 class 因为这似乎是此类函数最自然的地方。
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
尽管有这个更具体的问题描述,但我仍然对解决该问题的一般方法感到好奇。 IE。即使有工作簿或工作sheet 函数执行类似的操作,原始问题仍然存在。
在类似的情况下,我使用了实例变量而不是扩展 class。在您的情况下,为工作簿创建一个实例变量并在需要使用 openpyxl 中的函数时引用该变量,并在需要使用自定义函数时引用您的 class 实例。
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
或者,如果您总是要使用 class 加载现有工作簿,那么您可以将 load_workbook
放入 class 初始化函数中。
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")
我想用自定义方法扩展 openpyxl 工作簿的现有功能 class。我知道通常我会根据原始 class
定义我自己的 classclass WorkbookExtended(openpyxl.Workbook):
def added_method(self):
print("Do some special stuff here")
到目前为止一切顺利,但我现在的问题是我获取 Excel 工作簿的方式是调用 load_workbook(file)不是工作簿 class 的一部分,而是 returns 一个完全实例化的工作簿对象。另一方面,Workbook class 似乎没有提供一种基于现有对象实例化新对象的方法。 所以问题是:如何扩展 class that
- 是另一个函数的结果并且
- 不提供基于现有对象初始化或复制自身的方法
编辑: 更具体地说,我加载了一个现有的工作簿,并想添加一个方法来搜索给定范围和 sheet 内的给定值。我希望能够搜索完全匹配或包含搜索词的单元格值。现在我可以使用 openpyxl 中的现有函数完成所有这些工作,但我想做的是将它添加到工作簿 class 因为这似乎是此类函数最自然的地方。
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
尽管有这个更具体的问题描述,但我仍然对解决该问题的一般方法感到好奇。 IE。即使有工作簿或工作sheet 函数执行类似的操作,原始问题仍然存在。
在类似的情况下,我使用了实例变量而不是扩展 class。在您的情况下,为工作簿创建一个实例变量并在需要使用 openpyxl 中的函数时引用该变量,并在需要使用自定义函数时引用您的 class 实例。
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
或者,如果您总是要使用 class 加载现有工作簿,那么您可以将 load_workbook
放入 class 初始化函数中。
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")