如何使用 Python 将 Excel 工作表复制到另一个工作簿

问题描述 投票:0回答:5

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

我想获取源文件的第一页并将其作为新选项卡复制到目标文件(与目标文件中的位置无关),然后保存它。

无法在

xlrd
xlwt
xlutils
中找到简单的方法来执行此操作。我是不是错过了什么?

python xlwt
5个回答
64
投票

解决方案1

使用

openpyxl
包的纯 Python 解决方案。仅复制数据值。

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

使用

pywin32
包将复制操作委托给 Excel 应用程序的解决方案。数据值、格式和工作表中的其他所有内容都会被复制。注意:此解决方案仅适用于安装了 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

使用

xlwings
包将复制操作委托给 Excel 应用程序的解决方案。 Xlwings 本质上是(大多数,但不是全部)
pywin32
/
appscript
excel 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()

8
投票

如果您不反对使用 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')

希望有帮助


1
投票

您也可以尝试xlwings

import xlwings as xw
wb = xw.Book(r'C:\path\to\file.xlsx')
sht = wb.sheets['Sheet1']
new_wb = xw.Book(r'C:\new_path\to\file.xlsx')
new_wb.sheets['name'] = sht

0
投票

经过一番苦战,终于得到了答案。 来自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'))
  • 它也适用于从一个工作簿到另一工作簿。
  • 必须提供一系列单元格。只需确保范围足够大以覆盖整个工作表即可。
  • 复制功能可复制/粘贴一系列单元格内的所有内容(值、单元格格式、超链接、单元格类型等)

0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.