在Excel中,我可以手动:

  • 打开源工作簿
  • Select 我要复制的工作表
  • 单击左上角的" Select 全部"按钮
  • Ctrl-C
  • 打开目标工作簿
  • 使用底部的选项卡插入新表格
  • Select 新工作表的A1单元格
  • Ctrl-V

我有一本书和另一本书的相同副本,包括格式、 colored颜色 、边框、公式、尺寸和作品.

我需要在数千个目标工作簿上自动化此过程.

我try 过使用openpyxl,但我找到的所有解决方案都明确复制了仅具有少数属性的单个单元格,而不是整个工作表.例如,大多数实现都会忽略列宽和行高.此外,Excel功能,例如折叠行.

是否有Python库(或者其他语言的库)可以使这成为可能?

推荐答案

此代码示例使用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')

Python相关问答推荐

在Windows上启动新Python项目的正确步骤顺序

如何将Matplotlib的fig.add_axes本地坐标与我的坐标关联起来?

从DataFrame.apply创建DataFrame

在Pandas 日历中插入一行

理解Python的二分库:澄清bisect_left的使用

max_of_three使用First_select、second_select、

如何使用根据其他值相似的列从列表中获取的中间值填充空NaN数据

用NumPy优化a[i] = a[i-1]*b[i] + c[i]的迭代计算

如何从数据库上传数据到html?

为什么NumPy的向量化计算在将向量存储为类属性时较慢?'

Scrapy和Great Expectations(great_expectations)—不合作

如果满足某些条件,则用另一个数据帧列中的值填充空数据帧或数组

从嵌套的yaml创建一个嵌套字符串,后面跟着点

合并与拼接并举

干燥化与列姆化的比较

mdates定位器在图表中显示不存在的时间间隔

当输入是字典时,`pandas. concat`如何工作?

Pandas:将值从一列移动到适当的列

对数据帧进行分组,并按组间等概率抽样n行

如何将一个文件的多列导入到Python中的同一数组中?