使用openpyxl或xl *或xlsxwriter在工作簿中移动工作表?

时间:2018-06-28 12:04:04

标签: python excel openpyxl xlsxwriter xlwt

我已阅读Here is the screenshotopenpyxlxlwtxlrdxlutils的文档。我找不到在 Excel工作簿中移动工作表的方法。测试在末尾添加了一个工作表。

具体来说,我有一个['JAN','FEB',...,'DEC']的日历,需要时我需要更换几个月。

如果不移动,如何在Excel工作簿中订购工作表?您可以在指定工作表的之后 之前插入工作表吗?

只有另一个xlsxwriter使用win32comBook.Worksheets.Add(After=Sheet);似乎很奇怪,这些模块都没有这种方法。

默认似乎在工作簿末尾添加了工作表。我可以复制目标文件,直到到达更新的图纸为止,插入新的图纸,然后将原始副本继续到末尾。 (受post I can find on SO的启发)

3 个答案:

答案 0 :(得分:1)

我有两个问题。第一个问题是在给定位置插入一张纸。第二个问题是到处移动一张纸。由于我主要处理较新的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文档中找到第一个答案。有点惊讶的是,更多的博客都没有提到移动工作表。

答案 1 :(得分:1)

这是我想出的(使用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)

答案 2 :(得分:0)

xtian解决方案的补充,可以选择将工作表从任何位置向前或向后移动到任何位置。

from pathlib import Path
from openpyxl import load_workbook


def neworder(file, fpos, tpos):
    """Takes a list of ints, and inserts the fpos (from position) int, to tpos (to position)"""
    wb = load_workbook(filename=file)
    shlist = wb.sheetnames  # get current order sheets in workbook
    lst = []
    lpos = (len(shlist) - 1) # last position
    if lpos >= fpos > tpos >= 0:  # move from a high to low position
        for x in range(lpos+1):
            if x == tpos:
                lst.append(fpos)
            elif tpos < x <= fpos:
                lst.append(x-1)
            else:
                lst.append(x)
    if lpos >= tpos > fpos >= 0:  # move from a low to high position
        for x in range(lpos+1):
            if x == tpos:
                lst.append(fpos)
            elif fpos <= x < tpos:
                lst.append(x+1)
            else:
                lst.append(x)
    wb._sheets = [wb._sheets[i] for i in lst]  # get each object instance from  wb._sheets, and replace
    wb.save(filename=file)
    return


filex = Path('C:/file.xlsx')
neworder(filex, 83, 12)  # move worksheet in 83rd position to 12th position