Excel openpyxl 的命名范围

Excel named range for openpyxl

我有一个 excel 文件,其中有多个 sheet、Unit_1、Unit_2... sheet 的形式相同但数据各不相同。在每个 sheet 上,都有一个名为“SIGNALS”的命名范围,它定义了区域“A1:C4。我想在循环遍历 sheet 时通过引用命名范围来访问数据。

我正在使用此处的函数作为访问数据的基础,但是当我尝试定义 sheet 时,命名范围引用也不起作用。

如果我将 range_name 定义为“SIGNALS”,我会从 Unit_1 sheet 获取数据,因为它默认处于活动状态。

如果我将其定义为“Unit_2!A1:C4”,我会按预期从 Unit_2 sheet 获取数据。

如果我将其定义为“Unit_1!SIGNALS”,我会收到一个 ValueError:SIGNALS 不是有效的坐标或范围。

我应该如何在某些sheet中引用命名范围?

例如,table 对应“Unit_1”sheet。

在 openpyxl 上,您似乎无法通过引用 sheet 和命名范围轻松引用命名范围。命名范围仅适用于活动 sheet 但更改活动 sheet 似乎也相当麻烦。

我从 修改了 Mathias Fripp 的函数以更好地满足我的需要,尽管它可能不是最优雅的方式。

首先,使用 sheet、单元格和来自 excel 的命名范围数据构造一个数据框,然后根据该数据,单元格范围被 sheet 名称和“命名范围”-名称。

def dataframe_from_xlsx(xlsx_file, range_name):
""" Get a single rectangular region from the specified file.
range_name can be a standard Excel reference ('Sheet1!NAMED_RANGE')."""
wb = openpyxl.load_workbook(xlsx_file, data_only=True, read_only=True)

# get named range definitions from excel
named_ranges = wb.defined_names.definedName
data = []
for range in named_ranges:
    sheet, cells = range.value.split("!")
    data.append([sheet, cells, range.name, ])
named_ranges = pd.DataFrame(data, columns=['sheet', 'cells', 'name'])

ws_name, reg = range_name.split('!')

if ws_name.startswith("'") and ws_name.endswith("'"):
    ws_name = ws_name[1:-1]

# get the cell range by masking
mask = (named_ranges['sheet'] == ws_name) & (named_ranges['name'] == reg)
cell_reg = named_ranges[mask]['cells'].iloc[0]
region = wb[ws_name][cell_reg]

df = pd.DataFrame([cell.value for cell in row] for row in region)
return df