Search code examples
pythonxlwt

How to copy over an Excel sheet to another workbook in Python


I have a string with a sourcefile path and another string with a destfile path, both pointing to Excel workbooks.

I want to take the first sheet of the sourcefile and copy it as a new tab to the destfile (doesn't matter where in the destfile), then save it.

Couldn't find an easy way in xlrd or xlwt or xlutils to do this. Am I missing something?


Solution

  • Solution 1

    A Python-only solution using the openpyxl package. Only data values will be copied.

    import openpyxl as xl
    
    path1 = 'C:\\Users\\Xukrao\\Desktop\\workbook1.xlsx'
    path2 = 'C:\\Users\\Xukrao\\Desktop\\workbook2.xlsx'
    
    wb1 = xl.load_workbook(filename=path1)
    ws1 = wb1.worksheets[0]
    
    wb2 = xl.load_workbook(filename=path2)
    ws2 = wb2.create_sheet(ws1.title)
    
    for row in ws1:
        for cell in row:
            ws2[cell.coordinate].value = cell.value
    
    wb2.save(path2)
    

    Solution 2

    A solution that uses the pywin32 package to delegate the copying operation to an Excel application. Data values, formatting and everything else in the sheet is copied. Note: this solution will work only on a Windows machine that has MS Excel installed.

    from win32com.client import Dispatch
    
    path1 = 'C:\\Users\\Xukrao\\Desktop\\workbook1.xlsx'
    path2 = 'C:\\Users\\Xukrao\\Desktop\\workbook2.xlsx'
    
    xl = Dispatch("Excel.Application")
    xl.Visible = True  # You can remove this line if you don't want the Excel application to be visible
    
    wb1 = xl.Workbooks.Open(Filename=path1)
    wb2 = xl.Workbooks.Open(Filename=path2)
    
    ws1 = wb1.Worksheets(1)
    ws1.Copy(Before=wb2.Worksheets(1))
    
    wb1.Close(SaveChanges=False)
    wb2.Close(SaveChanges=True)
    xl.Quit()
    

    Solution 3

    A solution that uses the xlwings package to delegate the copying operation to an Excel application. Xlwings is in essence a smart wrapper around (most, though not all) pywin32/appscript excel API functions. Data values, formatting and everything else in the sheet is copied. Note: this solution will work only on a Windows or Mac machine that has MS Excel installed.

    import xlwings as xw
    
    path1 = 'C:\\Users\\Xukrao\\Desktop\\workbook1.xlsx'
    path2 = 'C:\\Users\\Xukrao\\Desktop\\workbook2.xlsx'
    
    wb1 = xw.Book(path1)
    wb2 = xw.Book(path2)
    
    ws1 = wb1.sheets(1)
    ws1.api.Copy(Before=wb2.sheets(1).api)
    wb2.save()
    wb2.app.quit()