有关 OpenPyXL 中表操作的文档非常简单(请参阅此处)。
如何向表中添加新行?
到目前为止我发现的方法包括添加数据、删除表并重新创建它。
有没有更有效的方法?而且,这样做会丢失表格的样式(并且当我重新创建表格时无法成功添加样式)。
谢谢
import re
from copy import deepcopy
from pathlib import Path
from openpyxl import load_workbook
from openpyxl.worksheet.table import Table, TableStyleInfo
TABLE_NAME = "People"
xls_dir = Path("e:/AnsysDev/tfs_scripts/its")
wb = load_workbook(xls_dir / "MyExcel.xlsx")
ws = wb.active
tb = ws.tables[TABLE_NAME]
max_row = ws.max_row
curr_ref = tb.ref
style = deepcopy(tb.tableStyleInfo)
data = [["Jack", 39]]
for row in data:
max_row += 1
ws.append(row)
new_ref = re.sub(r"\d+$", str(max_row), curr_ref)
del ws.tables[TABLE_NAME]
tb.tableStyleInfo = style
tb = Table(displayName=TABLE_NAME, ref=new_ref)
ws.add_table(tb)
new_xlsx = xls_dir / "New_Excel.xlsx"
wb.save(new_xlsx)
实际上,它没有记录,但您只需添加数据并使用新引用设置属性
ref
您的代码可以简化为:
...
max_row = ws.max_row
curr_ref = tb.ref
data = [["Jack", 39]]
for row in data:
max_row += 1
ws.append(row)
tb.ref = re.sub(r"\d+$", str(max_row), curr_ref) # <= We extend the table here!
new_xlsx = xls_dir / "New_Excel.xlsx"
wb.save(new_xlsx)
您可以使用 OpenPyXL 内部函数将范围转换为元组,然后将其返回为范围字符串,而不是使用正则表达式 (re
) 来修改引用。
from openpyxl.utils import range_boundaries, get_column_letter
...
coord = list(range_boundaries(tb.ref))
data = [["Jack", 39]]
for row in data:
coord[-1] += 1 # <= No need to use max_row, just add one line!
ws.append(row)
tb.ref = f"{get_column_letter(coord[0])}{coord[1]}:{get_column_letter(coord[2])}{coord[3]}"