繁体   English   中英

在 Python 中,是否有一个库可以根据其名称设置/更新一个 Excel 单元的值?

[英]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。 我已经看到了有效的解决方案,例如12 两者都需要额外的 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 并使用setitemgetitem方法通过包装 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM