此代码示例使用Xlwings模块基本上复制您在Excel中执行的步骤,以将工作表复制/粘贴到新工作簿,正如您在帖子中详细介绍的那样.
正如它所指出的那样,Xlwings就像Python中的Excel收件箱.鉴于它确实打开Excel应用程序来执行步骤,因此Xlwings可能会被认为很慢.然而,与其他方法相比,最终可能更快.
使用Openpyxl需要大量单元格复制值和样式数据.它的速度取决于工作表中的数据量,数据越多,样式设置越多,要复制的单元格和单元格的设置就越多(请注意,Openpyxl api"复制工作表"仅在同一工作簿中起作用).
原始工作簿"source_wb"保留原始工作表,因为该工作簿在此代码示例中未更改(或保存).
当然,您可以在复制这些工作表时从源工作簿中删除这些工作表,并在最后保存源工作簿(如果需要).或者,如果复制所有所需的工作表后不再需要源工作簿,则只需删除源工作簿.
All Workbooks & Sheets copy.
源工作簿中的所有工作簿及其工作表都将复制到"新"工作簿中.
如果"新"工作簿不存在,则会创建该工作簿,否则仅相对于默认工作表或所选工作表的位置添加工作表.
表格可以复制到现有表格的"之前"或"之后".在代码示例中,使用单个默认工作表,并且所有工作表都复制在此工作表之前,因此每张新工作表的顺序应该与从源工作簿读取的顺序相同.默认情况下,新创建的工作簿将有一个名为"Sheet 1"的默认工作表(我重命名了它,这样它不太可能导致复制的工作表重命名,请参阅下面的注释).如果源工作簿已经存在,其中包含您不想移动的工作表,则可以仅为此位置添加新工作表.
还可以包括条件判断,以便如果需要,只从源复制那些匹配的表.
如果复制的工作表与现有工作表具有相同的名称,Note Excel将用数字重命名工作表,例如,复制"Sheet 1"(当它已经存在时)将导致其命名为"Sheet 1(2").因此,如果您希望以不同的方式命名,则需要在复制表格时判断名称.
import os
import xlwings as xw
from os.path import exists
wb_target = 'NewWorkBook.xlsx'
excel_dir = '<path to>/<ExcelFiles>/'
with xw.App(visible=False) as app:
### Open target workbook or create it if not already exists
if not exists(wb_target):
wb_target = xw.Book()
ws_target_default = wb_target.sheets.active
# A name that should not clash with sheets in the source workbooks
ws_target_default.name = "tobedeleted"
else:
wb_target = xw.Book(wb_target)
### Select active Sheet as default
ws_target_default = wb_target.sheets.active
### Or use an existing specified Sheet e.g. 'Existing1'
# ws_target_default = wb_target.sheets('Existing1')
### Or create a new Sheet (called 'tobedeleted') as the last sheet in the workbook
# ws_target_default = wb_target.sheets.add('tobedeleted', after=wb_target.sheet_names[len(wb_target.sheet_names)-1])
for excel_file in os.listdir(excel_dir):
if excel_file.endswith(".xlsx"):
excel_path = os.path.join(excel_dir, excel_file)
### Open source Workbook
wb_source = xw.Book(excel_path)
for sheet in wb_source.sheets:
### Select and move each Sheet in source workbook to new workbook
ws_source = wb_source.sheets[sheet]
# use 'before' to maintain sheet order
ws_source.copy(before=ws_target_default)
wb_source.close() # Close the source workbook after Sheets copied
### Delete the "tobedeleted" default Sheet if its created
if ws_target_default.name == "tobedeleted":
ws_target_default.delete() # Remove the position Sheet if exists
### Save the new workbook
wb_target.save('NewWorkBook.xlsx')