excel openpyxl从格式化表格中删除行/引用表格时出错

mrwjdhj3  于 2023-01-21  发布在  其他
关注(0)|答案(2)|浏览(324)

我正尝试使用delete_rows()方法从Excel中的格式化表格中删除行。但是,这并不会删除行,而只会删除单元格的内容。
作为一个信息,您可以使用openpyxl将一个范围格式化为表格,如文档中所述:https://openpyxl.readthedocs.io/en/latest/worksheet_tables.html
我在工作表 * Sheet1 * 中有一个名为 * Table5 * 的格式化表格:

要从第5行删除2行,我使用以下命令:

import openpyxl as xl
wb = xl.load_workbook('data.xlsx')
ws = wb['Sheet1']
ws.delete_rows(5, 2) # this is the delete command
wb.save('data.xlsx')

使用命令delete_rows(),格式化表格的范围保留到第6行,而当我在Excel中直接删除行时,它会缩小。

问题是:如何正确删除数据和带格式的区域?
推论说明:
另外,当我插入数据时,表区域不会扩展。例如:

for i in range(4, 9):
    ws.cell(row=i, column=1).value = i - 1
    ws.cell(row=i, column=2).value = (i - 1) * 100

范围保持不变,即直到第6行,而通过手动将数据插入Excel,范围会自动扩展。

eivgtgni

eivgtgni1#

如果您跟踪了链接的文档,则必须具有:
1.添加数据到Worksheet
1.创建了涵盖数据的Table示例(ref=A1:B6
1.已使用ws.add_tableTable示例添加到工作表中。
以后添加或删除行时,这不会影响ref=A1:B6中保留的表。
您需要更改Table示例的ref以适应新的数据布局。

# access your table (subsitute <Table> for the name of your table)
tab = ws.tables[<Table>]

# change the ref
tab.ref = "A1:B4"

# and save
wb.save('data.xlsx')

NB.tables的接口自版本3.0.0起已更改,此代码已针对3.0.10进行了测试,请查阅文档以了解之前/进一步的更改。

9wbgstp7

9wbgstp72#

在下面,我通过 ljmc(我已经接受了)扩展了答案,其中包含了openpyxl的较新版本和较旧版本的两种方法。
升级到openpyxl==3.0.10后,只需使用属性.tables引用工作表中的表名即可更改格式化表的引用。示例:在工作表 Sheet1 中有一个名为 Table5 的格式化表格:

import openpyxl as xl
wb = xl.load_workbook('data.xlsx')
ws = wb['Sheet1']
ws.delete_rows(5, 2) # this is the delete command
ws.tables['Table5'].ref = "A1:B4" # change the reference
wb.save('data.xlsx')

就这么简单:因为ws.tables['Table5']包含格式化的表。
在升级(openpyxl==3.0.0)之前,您使用._tables属性的方法引用格式化表格,但您需要的是索引,而不是名称 Table5

ws.delete_rows(5, 2) # this is the delete command
ws._tables[0].ref = "A1:B4" # change the reference

仅当工作表中有一个格式化的表格,或者 Table5 是table对象中的第一个表格时,才能使用[0]
正确的Python方法是首先确定 Table5 在table对象中的索引:

ws.delete_rows(5, 2) # this is the delete command
ix = next(i for i, t in enumerate(ws._tables) if t.displayName == "Table5")
ws._tables[ix].ref = "A1:B4"  # change the reference

相关问题