[英]In Python, is there a library to set/update the value of one Excel cell based on its name?
我有一个包含几个命名单元的 Excel 文件。 我想用新值更新这些单元格。 而不是使用坐标: worksheet["D3"] = "New Excel Value"
。 我想用它的命名值设置它: worksheet["cell name"] = "New Excel Value"
。
我所看到的是xlwings有一个 function 来根据其命名值设置单元格。 但是xlwings需要在机器上安装Excel,我们的机器不是这样。 因此我在看openpyxl。 我已经看到了有效的解决方案,例如1和2 。 两者都需要额外的 function 和一些手动步骤来检索单个命名单元。 我希望以与带有方括号的法线坐标相同的方式查看检索。 这让我觉得我错过了文档中的某些内容。
因此我想知道,设置命名单元格值的最佳方法是“ Is there a way to save data in named Excel cells using Python? openpyxl
中提出的解决方案?
- 编辑 -
我能想到的最好的就是下面的代码片段。 我会把它贴在这里,以防它对任何人有帮助:
def _set_value_for_excel_named_cell(self, cell_name: str, value: Any) -> None:
"""Sets a value for the Excel cell based on its name."""
worksheet_title, cell_coordinates = list(
self._workbook.defined_names[cell_name].destinations
)[0]
self._workbook[worksheet_title][cell_coordinates] = value
您可以创建自己的 class 并使用setitem和getitem方法通过包装 openpyxl 自己创建该接口。 使用您已经链接到的资源,我创建了一个工作示例来帮助您入门。
from openpyxl import load_workbook
filename = "test.xlsx"
class XLWrap:
def __init__(self, wb):
self.wb = wb
def __getitem__(self, key):
# Returns the value for cells given set name
return [
self.wb[sheet][cell].value
for sheet, cell in list(self.wb.defined_names[key].destinations)
]
def __setitem__(self, key, dat):
# Sets the value for cells in workbook given set name
cells = self.wb.defined_names[key].destinations
for sheet, cell in cells:
ws = self.wb[sheet]
ws[cell] = dat
self.save()
def save(self):
self.wb.save(filename)
wb = load_workbook(filename)
xlw = XLWrap(wb)
print(xlw["test"])
xlw["test"] = "named_cell_val_after"
print(xlw["test"])
Output:
['named_cell_val_before']
['named_cell_val_after']
以上不适用于一系列单元格。 可以为文档中注明的命名范围创建一个包装器来处理不同类型的 output。
它们的定义非常松散。 它们可能包含一个常数、一个公式、一个单元格引用、一个单元格区域或跨不同工作表的多个单元格区域。 或以上所有。
所以相关的实现将取决于你如何使用它们。 对于单元格范围,我有这个快速而肮脏的工作示例,如果您有单个单元格定义,它很快就会崩溃:
def __getitem__(self, key):
# Returns the value for cells given set name
sheets = [
self.wb[sht][rng]
for sht, rng in list(self.wb.defined_names[key].destinations)
]
values = []
for sheet in sheets:
for row in sheet:
for cell in row:
values.append(cell.value)
return values
def __setitem__(self, key, dat):
# Sets the value for cells in workbook given set name
sheets = [
self.wb[sht][rng]
for sht, rng in list(self.wb.defined_names[key].destinations)
]
for sheet in sheets:
for row in sheet:
for cell in row:
cell.value = dat
self.save()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.