我正在尝试使用xlwings从我的某些Python代码中连接Excel,不幸的是,仅找到了关于访问/重新设置现有Excel表的stackoverflow线程或文档,而不是从头开始创建新表。

编辑:基于David Zemen的答案添加的解决方案(ListObject属性的其他获取器和设置器在here中可用。

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


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

但是,xlwings是否提供任何方法来从某个范围创建表(类似于在Excel UI中使用“首页-格式为表”)?

最佳答案

我不确定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)


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

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.


我怀疑将xlwings范围作为第二个参数传递给Add方法时会出现问题。

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

ws.api.ListObjects.Add(1)


python - 在xlwings中创建和命名表-LMLPHP

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

ws.api.ListObjects.Add(1, ws.api.Range(tbl_range.address))

08-05 15:03