在 xlwings 中创建和命名表

sim*_*sim 4 python excel xlwings

我试图xlwings从我的一些 Python 代码中使用Excel 接口,但不幸的是,只找到了有关访问/重新格式化现有Excel 表格的stackoverflow 线程或文档,而不是从头开始创建新表格。

编辑:根据 David Zemen 的回答添加的解决方案(此处提供了 ListObject 属性的其他 getter 和 setter 。

import xlwings

df = ... # initialising some pandas DataFrame

book = xlwings.Book()
ws = book.sheets.active
ws.range("A1").options(index=False).value = df

# TODO: Create table
# downside: does not seem to be possible to define multiple tables
#           within a Sheet (based on explicit ranges)
tbl = ea_sheet.api.ListObjects.Add(1) 


# TODO: Set the name/formatting of the table
tbl.DisplayName = "tabname"  # sets the tablename
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用扩展范围选择ws.range("A1").expand('table')并且知道我可以使用.name范围的属性将它们定义为命名范围。

但是,xlwings 是否提供了从某个范围创建表格的任何方法(类似于在 Excel UI 中使用 Home - Format as Table)?

Dav*_*ens 5

我不确定 xlwings 是否直接支持 ListObjects 的创建,但由于它公开了api,您可以尝试以下操作:

xlSrcRange = 1
xlYes = 1
ws.range("A1").options(index=False).value = df
tbl_range = ws.range("A1").expand('table')
ws.api.ListObjects.Add(xlSrcRange, tbl_range, xlListObjectHasHeaders=xlYes)
Run Code Online (Sandbox Code Playgroud)

不幸的是,这似乎不起作用并且默默地失败了。

import xlwings as xw
import pandas as pd
import numpy as np
# creating a dummy dataframe
data = np.array(np.random.randint(0,100,(3,4)))
columns = ['A','B','A','C']
index = ['Row 1', 'Row 2', 'Row 3']
frame = pd.DataFrame(data, index=index, columns=columns)
book = xw.Book()
ws = book.sheets.active
ws.range("A1").options(index=False).value = frame
tbl_range = ws.range("A1").expand('table')
ws.api.ListObjects.Add(1, tbl_range)  ## This line fails, but no error is raised. 
Run Code Online (Sandbox Code Playgroud)

我怀疑将 xlwings 范围作为第二个参数传递给该Add方法存在一些问题。

我尝试了其他一些事情,如果我们省略 range 参数,则该ws.api调用在我运行时似乎可以工作(但需要注意的是,当前的 ActiveCell/选择必须在表区域/使用范围内):

ws.api.ListObjects.Add(1)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

最后,我能够让它使用该ListObjects.Add方法,但使用.api传递有效的 Excel 范围而不是 xlwings 范围:

ws.api.ListObjects.Add(1, ws.api.Range(tbl_range.address))
Run Code Online (Sandbox Code Playgroud)