如何在 Python 中将 Excel 工作表复制到另一个工作簿

2025-04-10 09:45:00
admin
原创
24
摘要:问题描述:我有一个带有源文件路径的字符串和另一个带有目标文件路径的字符串,它们都指向 Excel 工作簿。我想取出源文件的第一张表并将其作为新选项卡复制到目标文件(无论目标文件中的什么位置),然后保存它。找不到简单的方法来xlrd执行xlwt此xlutils操作。我遗漏了什么吗?解决方案 1:解决方案 1使用...

问题描述:

我有一个带有源文件路径的字符串和另一个带有目标文件路径的字符串,它们都指向 Excel 工作簿。

我想取出源文件的第一张表并将其作为新选项卡复制到目标文件(无论目标文件中的什么位置),然后保存它。

找不到简单的方法来xlrd执行xlwtxlutils操作。我遗漏了什么吗?


解决方案 1:

解决方案 1

使用该包的仅限 Python 的解决方案openpyxl。仅复制数据值。

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)

解决方案 2

使用包将复制操作委托给 Excel 应用程序的解决方案pywin32。数据值、格式和工作表中的所有其他内容都将被复制。注意:此解决方案仅适用于安装了 MS Excel 的 Windows 计算机。

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

解决方案 3

使用包将复制操作委托给 Excel 应用程序的解决方案xlwings。Xlwings 本质上是 (大多数,但不是全部) pywin32/ appscriptexcel API 函数的智能包装器。数据值、格式和工作表中的所有其他内容都会被复制。注意:此解决方案仅适用于安装了 MS Excel 的 Windows 或 Mac 计算机。

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

解决方案 2:

如果你不反对使用 Pandas,这可能会有所帮助

import pandas as pd

#change xxx with the sheet name that includes the data
data = pd.read_excel(sourcefile, sheet_name="xxx")

#save it to the 'new_tab' in destfile
data.to_excel(destfile, sheet_name='new_tab')

希望有帮助

解决方案 3:

您也可以尝试xlwings。

import xlwings as xw
wb = xw.Book(r'C:path    oile.xlsx')
sht = wb.sheets['Sheet1']
new_wb = xw.Book(r'C:
ew_path    oile.xlsx')
new_wb.sheets['name'] = sht

解决方案 4:

解决方案 1 是唯一适用于 Linux 的方法,因此适合服务器自动化。然而,Openpyxl 仅保留包含模板中数据的单元格的格式。

因此,openpyxl 需要在模板中进行一些调整:用空格(“ ”)填充模板中所有可能稍后填充的单元格。对数百万行执行此操作将使 Excel 爆炸,但处理数千行的数据变化效果相当好。并且“ ”在大多数情况下是不可见的,如果填充的行较少,则不会引起任何问题。相比之下,其他虚拟数据可能会。

解决方案 5:

我只是尝试了一下,因为我们的场景有 2 个单独的工作表。但我们也可以将此代码片段用于其他场景,例如创建新工作表,然后将数据也提供给新工作表。

def sheet_copy(source_file, target_file, sheet_idx):
    wb1 = openpyxl.load_workbook(filename=source_file)
    ws1 = wb1.worksheets[sheet_idx]

    wb2 = openpyxl.load_workbook(filename=target_file)
    ws2 = wb2.create_sheet(ws1.title)

    for row in ws1:
        for cell in row:
           ws2[cell.coordinate].value = cell.value

    wb2.save(source_file)

现在,创建方法后,我们也可以将任何所需的工作表从源工作簿添加到目标工作簿。

sheet_copy(base_file_path, output_file, 0)

base_file_path是我们要从中提取所需工作表的源文件。output_file是我在此操作之前创建的文件。因此,在确认源和目标之后,我们需要添加将被复制的工作表索引。所以索引在0这里。

解决方案 6:

此功能的工作方式类似于将工作表移动至其他工作簿。

from openpyxl import load_workbook, Workbook
from copy import copy

def copy_worksheet(source_path, source_sheet_name, destination_path):
    """
    Copies a worksheet from a source workbook to a destination workbook, including row heights, merged cells, 
    and only pasting values for formula cells, with gridlines removed in the destination sheet.
    
    Parameters:
    - source_path: Path to the source workbook (str).
    - source_sheet_name: Name of the sheet to copy from the source workbook (str).
    - destination_path: Path to the destination workbook (str).
    """
    # Load the source workbook and the specified sheet
    source_workbook = load_workbook(source_path, data_only=True)  # Load formulas as values
    source_sheet = source_workbook[source_sheet_name]

    # Load or create the destination workbook
    try:
        destination_workbook = load_workbook(destination_path)
    except FileNotFoundError:
        destination_workbook = Workbook()

    # Create a new sheet in the destination workbook with the same title as the source sheet
    destination_sheet = destination_workbook.create_sheet(title=source_sheet.title)
    destination_sheet.sheet_view.showGridLines = False  # Remove gridlines in the copied sheet

    # Copy cell values, styles, row heights, and merged cells from the source sheet to the destination sheet
    for row in source_sheet.iter_rows():
        # Set row height
        destination_sheet.row_dimensions[row[0].row].height = source_sheet.row_dimensions[row[0].row].height
        
        for cell in row:
            # Copy value only (not formula)
            new_cell = destination_sheet.cell(row=cell.row, column=cell.column, value=cell.value)
            
            # Copy each cell's style attributes safely
            if cell.has_style:
                new_cell.font = copy(cell.font)
                new_cell.border = copy(cell.border)
                new_cell.fill = copy(cell.fill)
                new_cell.number_format = cell.number_format
                new_cell.protection = copy(cell.protection)
                new_cell.alignment = copy(cell.alignment)

    # Copy merged cells
    for merged_range in source_sheet.merged_cells.ranges:
        destination_sheet.merge_cells(str(merged_range))

    # Save the changes to the destination workbook
    destination_workbook.save(destination_path)
    print(f"Worksheet '{source_sheet_name}' copied from '{source_path}' to '{destination_path}'")

# Example usage
copy_worksheet('source_workbook.xlsx', 'Sheet1', 'destination_workbook.xlsx')

解决方案 7:

经过一番苦战,终于找到了答案。来自 xlwings 源代码:https://github.com/xlwings/xlwings/pull/1216/files

source_sheet.range.copy(destination_sheet.range)

换句话说:

wb.sheets['Sheet1'].range('A1:A6').copy(wb.sheets['Sheet2'].range('A1:A6'))
  • 它也可以从一个工作簿运行到另一个工作簿。

  • 必须提供单元格范围。只需确保范围足够大以覆盖整个工作表即可。

  • 复制功能可复制/粘贴单元格范围内的所有内容(值、单元格格式、超链接、单元格类型等)

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2482  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1533  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   0  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   0  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用