Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将工作表复制到其他工作表上(不作为附加工作表)_Python_Excel - Fatal编程技术网

Python 如何将工作表复制到其他工作表上(不作为附加工作表)

Python 如何将工作表复制到其他工作表上(不作为附加工作表),python,excel,Python,Excel,我正在尝试将工作表从一个excel文件复制到另一个excel文件上的工作表。但问题是,它将其添加为附加工作表,而不是粘贴到现有工作表上并覆盖该工作表。我知道我使用的是Before=wb2.Worksheets(1),它将新工作表添加到现有工作表之前,但要粘贴到现有工作表上的参数是什么 import time, os.path, os from win32com.client import Dispatch path1 = 'C:\\example.xlsx' path2 = 'C:\\Todo

我正在尝试将工作表从一个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))

一种方法是使用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替换。

@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。这允许我在windows中的excel中保持Todolist2打开,同时它从示例1、示例2写入。但问题是,它不会写在activesheet上,而是不断添加其他工作表。所以在这一次,如果我能找到一种方法,在Todolist2中的活动工作表上,或者在它添加了额外的工作表之后,继续重写它,如果我只能删除一个工作表,我就是golden

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))

如何将工作表从一个excel文件复制到另一个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")

谢谢你,真管用!但是如何复制格式,例如每个单元格的颜色和字体大小?这复制了格式设置,谢谢。如果我想引入第三个工作簿wb3/ws3并再次将其复制到ws2中,再次覆盖其中的内容,该怎么办?我获得了对路径2的拒绝许可。我尝试在第一次复制之后添加wb2.close(),但没有成功。我只是打开另一个工作表,使用相同的代码从ws3复制到ws2。它起作用了。您可能在运行文件时没有关闭该文件?因此必须关闭该文件才能使第二个副本正常工作?我需要让ws2始终处于打开状态,基本上只需将工作表复制到ws2(每次都覆盖工作表)。对不起,我是新来的。我是否必须在每次拷贝后首先关闭wb2?我试过wb2.close()。用python打开文件就可以了。但不能在excel或其他应用程序中打开它。你应该和我分享你当前的代码,我会知道问题出在哪里。另外,如果你不介意的话,你可以将我的解决方案标记为正确的。你应该将其作为另一个问题发布。“我的意思是它的不同版本,与原来的版本没有关系。”汤姆西我刚刚转载。你能帮我看看吗?谢谢