我读过openpyxl,xlwt,xlrd,xlutils,xlsxwriter的文档。我找不到在Excel工作簿中移动工作表的方法。测试在末尾添加了一个工作表。
具体来说,我有各种日历,['JAN','FEB',...,'DEC']
,我需要在需要时更换几个月。
如果不移动它们,如何在Excel工作簿中订购工作表?您可以在指定的工作表之后或之前插入工作表吗?
只有一个post I can find on SO使用win32com
和Book.Worksheets.Add(After=Sheet)
;似乎很奇怪这些模块都不会有这种方法。
默认似乎在工作簿的末尾添加工作表。我可以复制目标文件,直到达到更新的工作表,插入新工作表,然后继续原始复制到最后。 (灵感来自this post)
我有两个问题。第一个问题是在给定位置插入一张纸。第二个问题是移动一张纸。由于我主要处理较新的Excel文件xlsx
,那么我将使用openpyxl。
各种来源表明新的纸张被添加到最后。我希望每次都需要这样做,然后移动工作表。我问了一个问题“(如何)移动工作表......”认为这样可以解决这两个问题。
最终,第一个问题很容易,一旦我终于找到了一个示例,其中显示workbook.create_sheet()
方法采用可选的index
参数在给定的零索引位置插入新工作表。 (我真的要学会查看代码,因为answer was here):
def create_sheet(self, title=None, index=None):
"""Create a worksheet (at an optional index)
[...]
下一个。事实证明,您可以通过重新排序工作簿容器_sheets
来移动工作表。所以我做了一个小助手功能来测试这个想法:
def neworder(shlist, tpos = 3):
"""Takes a list of ints, and inserts the last int, to tpos location (0-index)"""
lst = []
lpos = (len(shlist) - 1)
print("Before:", [x for x in range(len(shlist))])
# Just a counter
for x in range(len(shlist)):
if x > (tpos - 1) and x != tpos:
lst.append(x-1)
elif x == tpos:
lst.append(lpos)
else:
lst.append(x)
return lst
# Get the sheets in workbook
currentorder = wb.sheetnames
# move the last sheet to location `tpos`
myorder = neworder(currentorder)
>>>Before: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]
>>>After : [0, 1, 2, 17, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
# get each object instance from wb._sheets, and replace
wb._sheets = [wb._sheets[i] for i in myorder]
一旦我意识到它做了什么,第一个答案就不难发现在openpyxl文档中。只是有点惊讶更多的博客没有提到移动床单。
这是我想出的(使用openpyxl)
def move_sheet(wb, from_loc=None, to_loc=None):
sheets=wb._sheets
# if no from_loc given, assume last sheet
if from_loc is None:
from_loc = len(sheets) - 1
#if no to_loc given, assume first
if to_loc is None:
to_loc = 0
sheet = sheets.pop(from_loc)
sheets.insert(to_loc, sheet)