使用 Python 从 Excel sheet 的 ListObject 打开并获取数据
Open and Fetch data from a ListObject of an Excel sheet with Python
问题:
从 y python 环境中打开一个 Excel 文件的 ListObject (excel table)。
原因:
在 python 中打开 excel 文件有多种解决方案。从 pandas 开始:
import pandas as pd
mysheetName="sheet1"
df = pd.read_excel(io=file_name, sheet_name=mysheetName)
这会将 sheet1 传递到 pandas 数据帧中。
到目前为止一切顺利。
其他更详细的解决方案是使用特定的库。这是一个堆栈溢出问题的代码。
from openpyxl import load_workbook
wb2 = load_workbook('test.xlsx')
print wb2.get_sheet_names()
['Sheet2', 'New Title', 'Sheet1']
worksheet1 = wb2['Sheet1'] # one way to load a worksheet
worksheet2 = wb2.get_sheet_by_name('Sheet2') # another way to load a worksheet
print(worksheet1['D18'].value)
到目前为止还不错。
但是:
如果您在 sheet 中有一个 ListObject (excel table),我没有找到任何方法来访问 Listobject 的数据。
Excel 的高级用户经常使用 ListObjects;最重要的是在 VBA 中编写宏时。非常方便,可以看作是 Excel 中的 pandas dataframe 的等价物。在 Excel Listobject 和 pandas 数据框之间架起桥梁似乎非常合乎逻辑。尽管如此,到目前为止我还没有找到任何解决方案、库或解决方法。
问题。
有谁知道一些 python lybrary/solution 可以直接从 Excel sheets 中提取 Listobjects 吗?
注意 1:不是很好的解决方案
当然知道 Listobject 的 "placement" 可以引用开始和最后一个单元格,但这是一个非常糟糕的解决方案,因为不允许您修改 excel 文件中的 Listobject( python 必须立即修改)。一旦 ListObject 的位置发生变化,或者 listobject 本身变大,python 代码就会被破坏。
注意2:我目前的解决方案:
我将 listObject 从 excel(使用宏)导出到 JSON 文件并从 python 读取它。但是额外的工作是显而易见的。 VBA 代码、额外文件等等
最后评论:如果有人对此问题感兴趣,但仍然不知道 excel 中的 ListObject 是什么 click,请参阅此处:
詹姆斯是对的:
https://openpyxl.readthedocs.io/en/stable/worksheet_tables.html
https://openpyxl.readthedocs.io/en/stable/api/openpyxl.worksheet.table.html
openpyxl中有一个class读取tables。同样通过 id:
class openpyxl.worksheet.table.Table(id=1,...
id=1 表示工作表的第一个 table。
请始终记住 Excel 中的 ListObjects 称为 Table。这很奇怪(与 VBA 一样)。如果您使用 VBA,您可能会忘记 ListObject=Table.
用xlwings也是可以的。 API有点不同:
import xlwings as xw
wb = xw.Workbook.active()
xw.Range('TableName[ColumnName]').value
或者要获取包含 header 和总计行的列,您可以这样做:
xw.Range('TableName[[#All], [ColumnName]]').value
问题: 从 y python 环境中打开一个 Excel 文件的 ListObject (excel table)。
原因: 在 python 中打开 excel 文件有多种解决方案。从 pandas 开始:
import pandas as pd
mysheetName="sheet1"
df = pd.read_excel(io=file_name, sheet_name=mysheetName)
这会将 sheet1 传递到 pandas 数据帧中。 到目前为止一切顺利。
其他更详细的解决方案是使用特定的库。这是一个堆栈溢出问题的代码。
from openpyxl import load_workbook
wb2 = load_workbook('test.xlsx')
print wb2.get_sheet_names()
['Sheet2', 'New Title', 'Sheet1']
worksheet1 = wb2['Sheet1'] # one way to load a worksheet
worksheet2 = wb2.get_sheet_by_name('Sheet2') # another way to load a worksheet
print(worksheet1['D18'].value)
到目前为止还不错。
但是: 如果您在 sheet 中有一个 ListObject (excel table),我没有找到任何方法来访问 Listobject 的数据。 Excel 的高级用户经常使用 ListObjects;最重要的是在 VBA 中编写宏时。非常方便,可以看作是 Excel 中的 pandas dataframe 的等价物。在 Excel Listobject 和 pandas 数据框之间架起桥梁似乎非常合乎逻辑。尽管如此,到目前为止我还没有找到任何解决方案、库或解决方法。
问题。 有谁知道一些 python lybrary/solution 可以直接从 Excel sheets 中提取 Listobjects 吗?
注意 1:不是很好的解决方案 当然知道 Listobject 的 "placement" 可以引用开始和最后一个单元格,但这是一个非常糟糕的解决方案,因为不允许您修改 excel 文件中的 Listobject( python 必须立即修改)。一旦 ListObject 的位置发生变化,或者 listobject 本身变大,python 代码就会被破坏。
注意2:我目前的解决方案: 我将 listObject 从 excel(使用宏)导出到 JSON 文件并从 python 读取它。但是额外的工作是显而易见的。 VBA 代码、额外文件等等
最后评论:如果有人对此问题感兴趣,但仍然不知道 excel 中的 ListObject 是什么 click,请参阅此处:
詹姆斯是对的:
https://openpyxl.readthedocs.io/en/stable/worksheet_tables.html
https://openpyxl.readthedocs.io/en/stable/api/openpyxl.worksheet.table.html
openpyxl中有一个class读取tables。同样通过 id:
class openpyxl.worksheet.table.Table(id=1,...
id=1 表示工作表的第一个 table。
请始终记住 Excel 中的 ListObjects 称为 Table。这很奇怪(与 VBA 一样)。如果您使用 VBA,您可能会忘记 ListObject=Table.
用xlwings也是可以的。 API有点不同:
import xlwings as xw
wb = xw.Workbook.active()
xw.Range('TableName[ColumnName]').value
或者要获取包含 header 和总计行的列,您可以这样做:
xw.Range('TableName[[#All], [ColumnName]]').value