openpyxl设置活动表

时间:2017-01-09 20:28:27

标签: python-2.7 openpyxl

http://openpyxl.readthedocs.io/en/default/_modules/openpyxl/workbook/workbook.html?highlight=set%20active%20sheet

文档显示Workbook对象具有active属性

@property
def active(self):
    """Get the currently active sheet"""
    return self._sheets[self._active_sheet_index]

@active.setter
def active(self, value):
    """Set the active sheet"""
    self._active_sheet_index = value

如果调用wb = openpyxl.Workbook()的{​​{1}}给出了wb.active的默认第一个工作表的标题。 假设我创建另一个工作表Sheet,如何“设置”这是活动工作表?

文档显示有一个活动的“setter”也称为active。它需要一个额外的参数,一个整数索引值。

ws1 = wb.create_sheet('another sheet')怎么办?我没有用

调用函数

6 个答案:

答案 0 :(得分:3)

这是通过sheetname在工作簿中设置活动工作表的另一种方法。有类似的答案(openpyxl get sheet by name 例如涉及打开一个已关闭的文件),而其他人没有足够的细节让我理解这个功能。

Manipulating a workbook in memory教程是开始的地方,在我使用本教程的答案下,演示没有活动工作表名称,它实际上是活动索引处的工作表。如果添加或删除工作表会在索引位置更改工作表,则其他工作表将变为活动状态。

最初我认为.create_sheet使纸张处于活动状态但后来我意识到我只在活动纸张索引处创建了纸张,该索引恰好为0.索引可以设置为大于纸张数量的值并且文档还包含一个注释“如果隐藏的工作表被隐藏,则返回下一个可见工作表或无”。

详细的简短回答

for s in range(len(wb.sheetnames)):
    if wb.sheetnames[s] == 'charlie':
        break
wb.active = s

随意改善这个答案。

<强>示范

(base) C:\Users\User>python
Python 2.7.14 |Anaconda, Inc.| (default, Nov  8 2017, 13:40:45) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> # http://openpyxl.readthedocs.io/en/2.5/tutorial.html#create-a-workbook
...
>>> from openpyxl import Workbook
>>> wb = Workbook()
>>> print(wb.sheetnames)
[u'Sheet']
>>>
>>> print(wb.active)
<Worksheet "Sheet">
>>> ws = wb.active
>>> ws.title = "alpha"
>>>
>>> ws = wb.create_sheet('bravo')
>>> print(wb.sheetnames)
[u'alpha', u'bravo']
>>> print(wb.active)
<Worksheet "alpha">
>>>
>>> ws = wb.create_sheet('charlie',0)  # insert at index 0
>>> print(wb.sheetnames)
[u'charlie', u'alpha', u'bravo']
>>> print(wb.active)
<Worksheet "charlie">
>>>
>>>
>>> wb.active = 1
>>> print(wb.active)
<Worksheet "alpha">
>>>
>>> wb.active = 2
>>> print(wb.active)
<Worksheet "bravo">
>>>
>>> wb.active = 0
>>> print(wb.active)
<Worksheet "charlie">
>>>
>>> wb.active = 3
>>> print(wb.active)
None
>>>
>>> ws = wb.create_sheet(index=0)  # insert at index
>>> print(wb.active)
<Worksheet "bravo">
>>> print(wb.sheetnames)
[u'Sheet', u'charlie', u'alpha', u'bravo']
>>>
>>>
>>> ws_active = wb.get_sheet_by_name('charlie')
__main__:1: DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]).
>>> ws_active = wb['charlie']
>>> print(wb.active)
<Worksheet "bravo">
>>> ws4 = wb["charlie"] # from https://stackoverflow.com/a/36814135/4539999
>>> print(wb.active)
<Worksheet "bravo">
>>>
>>>
>>> for s in range(len(wb.sheetnames)):
...     if wb.sheetnames[s] == 'charlie':
...         break
...
>>>
>>> wb.active = s
>>>
>>>
>>> print(wb.active)
<Worksheet "charlie">
>>>

答案 1 :(得分:2)

我不熟悉整个getter和setter的事情。但是,我想出了答案。现在它让我感到非常困惑,为什么它以这种方式工作 - 因为它看起来不像典型的函数调用。无论如何,使用“setter”你会写

wb.active(1)

呃“吃掉”1 =)并更改活动表。只是写下这个想法,至少有一个人可能会问类似的东西。

答案 2 :(得分:1)

sheets = wb.get_sheet_names()
for i in sheets:
    if i == 'xyz':
        wb.active = i

或者你可以简单地做

xyz_sheet = wb.get_sheet_by_name('xyz')
wb.active = xyz_sheet

工作簿(即 wb)的 xyz 工作表现在处于活动状态

答案 3 :(得分:0)

作为参考,这是另一种有用的方式-尤其是当您想通过工作表名称来调用工作表时:

wb = openpyxl.load_workbook(path/to/your/spreadsheet)
worksheet_names = wb.sheetnames # this variable is presented as a list, so we can manipulate it accordingly, but finding the index number using the name.
sheet_index = worksheet_names.index(<name of your target sheet>) # this will return the index number where your worksheet resides.  It should be mentioned that this sheet name must exist in the worksheet_names list variable
wb.active = sheet_index # this will activate the worksheet by index

您现在应该在自己选择的工作表中工作,但是这样做的好处是您可以通过姓名而不是电话号码来调用工作表。这就是我提供此附加答案的原因。

答案 4 :(得分:0)

如果你知道标签的名称,你可以写一行:

book.active = book.sheetnames.index('YourSheetName')

答案 5 :(得分:0)

这是按名称设置活动工作表的最简单方法:

active_sheet = wb['sheet name']