如何将工作表复制到不同的工作表(而不是作为附加工作表)

时间:2018-04-20 18:19:15

标签: python excel

我尝试将工作表从一个excel文件复制到另一个excel文件上的工作表。但问题是它是将其添加为附加工作表而不粘贴现有工作表并覆盖工作表。我知道我使用的是Before = wb2.Worksheets(1),它在现有工作表之前添加了新工作表,但是粘贴到现有工作表上的参数是什么?

import time, os.path, os
from win32com.client import Dispatch

path1 = 'C:\\example.xlsx'
path2 = 'C:\\Todolist2.xlsx'
path3 = 'C:\\example2.xlsx'

xl = Dispatch("Excel.Application")
xl.Visible = True

wb1= xl.Workbooks.Open(Filename=path1)
wb2= xl.Workbooks.Open(Filename=path2)

ws1 = wb1.Worksheets(1)
ws1.Copy(Before=wb2.Worksheets(1))

3 个答案:

答案 0 :(得分:1)

如何将工作表从一个 Excel 文件复制到另一个?

from openpyxl import load_workbook
from copy import copy

def copySheet(target, source):
    for (row, col), source_cell in source._cells.items():
        target_cell = target.cell(column=col, row=row)
        target_cell._value = source_cell._value
        target_cell.data_type = source_cell.data_type

        if source_cell.has_style:
            target_cell.font = copy(source_cell.font)
            target_cell.border = copy(source_cell.border)
            target_cell.fill = copy(source_cell.fill)
            target_cell.number_format = copy(source_cell.number_format)
            target_cell.protection = copy(source_cell.protection)
            target_cell.alignment = copy(source_cell.alignment)
        
        if source_cell.hyperlink:
            target_cell._hyperlink = copy(source_cell.hyperlink)

        if source_cell.comment:
            target_cell.comment = copy(source_cell.comment)
        
    for attr in ('row_dimensions', 'column_dimensions'):
        src = getattr(source, attr)
        trg = getattr(target, attr)
        for key, dim in src.items():
            trg[key] = copy(dim)
            trg[key].worksheet = trg

    target.sheet_format = copy(source.sheet_format)
    target.sheet_properties = copy(source.sheet_properties)
    target.merged_cells = copy(source.merged_cells)
    target.page_margins = copy(source.page_margins)
    target.page_setup = copy(source.page_setup)
    target.print_options = copy(source.print_options)


"copy to"
wb1 = load_workbook(path_to)
target = wb1.create_sheet("lol")
"copy from"
wb2 = load_workbook(path_from)
source = wb2.active

copySheet(target=target, source=source)

wb1.save("fusion.xlsx")

答案 1 :(得分:0)

一种方法是使用openpyxl库。如果单元格有样式,我们也可以将它复制到新表格。

import openpyxl as xl
from copy import copy

path1 = 'C:\\example.xlsx'
path2 = 'C:\\Todolist2.xlsx'

wb1 = xl.load_workbook(filename=path1)
ws1 = wb1.worksheets[0]

wb2 = xl.load_workbook(filename=path2)
ws2 = wb2.worksheets[0]

for row in ws1:
    for cell in row:
        ws2[cell.coordinate].value = cell.value
        if cell.has_style:
            ws2[cell.coordinate].font = copy(cell.font)
            ws2[cell.coordinate].border = copy(cell.border)
            ws2[cell.coordinate].fill = copy(cell.fill)
            ws2[cell.coordinate].number_format = copy(cell.number_format)
            ws2[cell.coordinate].protection = copy(cell.protection)
            ws2[cell.coordinate].alignment = copy(cell.alignment)

wb2.save(path2)

然后你会看到你的sheet2被sheet1取代。

答案 2 :(得分:0)

@tomcy

代码如下。我真正想要完成的是能够继续将数据重写到Todolist2.xlsx。我真的想在Windows中的excel应用程序中打开Todolist2.xlsx,并在有新数据时让它更新工作表。到目前为止,我已经找到了两种方法。一个是使用openpyxl帮助我的代码。这样做我认为我必须将数据写入Todolist2然后打开。然后使用新数据,在将数据写入之前必须关闭。然后再次重新打开它。以下是我到目前为止的情况。使用10睡眠让我有机会更新example.xlsx,以便模拟将新数据写入Todolist2。它第一次运行,但在第二次,它让我拒绝了Todolist2。

import openpyxl as xl
from copy import copy
import time

path1 = 'C:\\example.xlsx'
path2 = 'C:\\Todolist2.xlsx'

wb1 = xl.load_workbook(filename=path1)
ws1 = wb1.worksheets[0]

wb2 = xl.load_workbook(filename=path2)
ws2 = wb2.worksheets[0]

while True:
    for row in ws1:
        for cell in row:
            ws2[cell.coordinate].value = cell.value
            if cell.has_style:
                ws2[cell.coordinate].font = copy(cell.font)
                ws2[cell.coordinate].border = copy(cell.border)
                ws2[cell.coordinate].fill = copy(cell.fill)
                ws2[cell.coordinate].number_format = 
                copy(cell.number_format)
                ws2[cell.coordinate].protection = copy(cell.protection)
                ws2[cell.coordinate].alignment = copy(cell.alignment)
    wb2.save(path2)
    wb2.close()
    time.sleep(10)     #during this time I will modify example.xlsx and 
                       #save, so on the next go around it rewrites the 
                       #new data to Todolist1.xlsx

我试图解决这个问题的第二种方法是使用win32com。这允许我在窗口中保持Todolist2在excel中打开,同时从示例,example1,然后是example2写入它。但问题是,它不会写在活动表上,它会不断添加其他工作表。所以在这个问题上,如果我能找到一种方法来重写Todolist2中的活动工作表,或者在添加附加工作表之后,如果我只能删除一张工作表,那我就是金色。

import time, os.path, os
from win32com.client import Dispatch

path1 = 'C:\\example.xlsx'
path2 = 'C:\\Todolist2.xlsx'
path3 = 'C:\\example2.xlsx'
path4 = 'C:\\example3.xlsx'


xl = Dispatch("Excel.Application")
xl.Visible = True

wb1= xl.Workbooks.Open(Filename=path1)
wb2= xl.Workbooks.Open(Filename=path2)

ws1 = wb1.Worksheets(1)
ws1.Copy(Before=wb2.Worksheets(1))

time.sleep(5)

wb3= xl.Workbooks.Open(Filename=path3)
ws3 = wb3.Worksheets(1)

ws2 = wb2.Worksheets(3)      #it seems by using (3) is the only way it 
                             #allows me to delete one sheet before it 
                             #adds another.
ws2.Delete()
ws3.Copy(Before=wb2.Worksheets(1))

time.sleep(5)

wb4= xl.Workbooks.Open(Filename=path4)
ws4 = wb4.Worksheets(1)

ws2.Delete()            #I got into trouble here, and throws error even 
                        #though it does the delete and copy
ws4.Copy(Before=wb2.Worksheets(1))