Openpyxl:加载Excel“表”作为变量。 `ValueError:名称为 Membership 的表已存在`

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

我最近一直在处理Excel文档,并且很难掌握“表格”。我认为一些混乱源于这样一个事实:一些在线资源将工作表中的值数组称为表,而我对处理表对象(Excel 中的“插入表”)感兴趣。

上一个问题,我感觉到“表”可以被openpyxl识别,它似乎能够读取一个表并像操作csv等一样操作它。然而,我在加载工作表时遇到错误我的脚本中的变量:

VBS_Metrics_Report_dir = "path to .xlsx file"
VBS_Metrics_Report = openpyxl.load_workbook(os.path.join(VBS_Metrics_Report_dir, "VBS_Metrics_Report.xlsx"))
VBS_Membership_ws = VBS_Metrics_Report['Membership']
VBS_Membership_table = VBS_Membership_ws.tables['Membership']

---> 192 VBS_Metrics_Report = openpyxl.load_workbook(os.path.join(VBS_Metrics_Report_dir, "VBS_Metrics_Report.xlsx"))

ValueError: Table with name Membership already exists

首先,我很困惑,因为据说错误所在的行甚至没有尝试访问表或名为“Membership”的工作表,这发生在以下几行中。

其次,这个错误在哪里声明该表已经存在?考虑到即使重新启动 python 内核后也会发生错误,它不可能已经作为我的工作区中的变量存在。即使确实如此,我应该能够覆盖变量否?

如果问题是该表已存在于我尝试访问的工作簿中,那么是的,它当然已经存在,这就是我尝试访问它的原因。为了利用我知道它包含的数据。在这种情况下,我一定是误解了

load_workbook
函数的用法。

我意识到这个问题基本上已经被问到了这里,但它还没有真正得到回答,我想我会添加一些想法。

如果有人可以帮助我解决这个问题,或者对如何处理 Excel“表格”有深入的了解,以便让我更好地理解,请告诉我。我们将不胜感激!

谢谢。

python excel openpyxl xlsx
1个回答
0
投票

这是有关错误原因的一些附加信息,可能会有所帮助。

ValueError: “名为 Membership 的表已存在” 是在 Openpyxl 工作表文件中的“add_table()” 函数中生成的。 即错误文本仅存在于该函数中,因此只有在调用该函数时才会发生。

当您在代码中将表添加到工作表时,会调用此函数 'add_table()',例如创建表“TABLE1”,然后添加到工作表

VBS_Membership_ws.table_add(TABLE1)

但是,如果工作簿包含任何具有至少一个表格的工作表,它也会被
load_workbook
调用。
在 load_workbook 上,代码将检查工作簿中的每个工作表,如果存在表,则调用 'ws.add_table(table)
for each table in the Sheet where table is the name of the table.<br> This is why the error is raised on the code line
VBS_Metrics_Report = openpyxl.load_workbook(os.path.join(VBS_Metrics_Report_dir, "VBS_Metrics_Report.xlsx"))`

当调用 add_table 时,它将运行重复的表名检查,如果返回 True,则会引发 ValueError。

def add_table(self, table):
    ...
    if self.parent._duplicate_name(table.name):
        raise ValueError("Table with name {0} already exists".format(table.name))

在 _duplicate_name 函数中,测试很简单;

if name == t.lower():

哪里
'name' 是要检查的表的名称
't' 是现有表的名称

这里没有针对工作表名称(标题)进行检查,因此拥有与工作表同名的表不会返回 true 并引发错误。

t 列表显示为累积的,就像检查每个表名称时将其添加到 t 列表中以对照下一个表进行检查一样。

例如;
如果我在一张名为“Table1”、“Table2”和“Table3”的工作表上有 3 个表格,那么

  1. '表1'; t 为空,因此不会检查任何内容,“Table1”已添加到列表中,“t”现在包含“Table1”
  2. '表2';针对“Table1”进行检查,然后将“Table2”添加到列表中,因此“t”现在包含“Table1”和“Table2”
  3. '表3';对照“Table1”和“Table2”进行检查

    注意“t”列表累积将跨所有工作表,因为唯一的命名是跨工作簿的。因此,如果有另一个带有表格的工作表,则“t”将包含下一个工作表的三个表名称,其中第一个表将根据“Table1”、“Table2”和“Table3”进行检查。

因此,我只能看到实际上两个表命名相同时发生的错误,而在进行此检查的情况下,这是不可能在 Excel 或 Openpyxl 中创建的。 然而,最终正如前面提到的,如果没有实际的工作簿本身,很难准确确定发生了什么,但您可以自己调试代码以查看这些点发生了什么。

© www.soinside.com 2019 - 2024. All rights reserved.