Python调用VBA实现保留原始样式的表格合并方法
作者:小小明-代码实体 发布时间:2022-10-18 02:40:45
标签:Python,VBA,合并
之前我在《各类Excel表格批量合并问题的实现思路与案例》一文中演示了各种常见的表格合并的需求,但VBA复制粘贴的需求却没有演示,今天我演示一个基于VBA复制粘贴来实现表格合并的案例。
有一个Excel表有很多sheet:
现在我们需要在保留所有样式的情况下,将所有sheet合并到一个sheet中。我的实现思路如下:
创建一个新的sheet,将第一个sheet完整合并进去
将后面的sheet除了表头外都复制粘贴到新建的sheet中(排除掉不需要参与合并的sheet)
上面的操作人工进行操作会非常容易理解,下面我们看看如何用代码实现呢?
首先我们打开目标文件:
import win32com.client as win32 # 导入模块
import os
excel_app = win32.gencache.EnsureDispatch('Excel.Application')
# 可以看到打开的Excel软件
excel_app.Visible = True
# vba只支持传入绝对路径
filename = os.path.abspath("车辆运营日报表2月份.xlsx")
wb = excel_app.Workbooks.Open(filename)
可以查看一个全部的sheet名称:
sheet_names = [sh.Name for sh in wb.Sheets]
print(sheet_names)
['2月6日', '2月8日', '2月9日', '2月10日', '2月11日', '2月12日', '2月14日', '2月15日', '2月16日', '无', '2月17日', '2月18日', '2月19日', '2月20日', '2月21日', '2月22日', '2月23日', '2月24日', '2月25日', '2月26日', '2月27日', '2月28日']
然后开始进行批量合并:
start_num, dest_name = 5, "2月合并"
dest = wb.Sheets.Add(After=wb.Sheets(wb.Sheets.Count))
dest.Name = dest_name
pos = start_num
for i, sheet in enumerate(wb.Sheets):
if sheet.Name in ("无", dest_name):
continue
print(sheet.Name)
max_rows = sheet.Range("A65535").End(-4162).Row
max_cols = sheet.UsedRange.Columns.Count
print(max_rows, max_cols)
sheet.Activate()
n = 1 if i == 0 else start_num
rng = sheet.Range(sheet.Cells(n, 1), sheet.Cells(max_rows, max_cols))
rng.Select()
excel_app.Selection.Copy()
dest.Activate()
dest.Range(f"A{pos}").Activate()
dest.Paste()
pos += max_rows-n+1
可以看到已经顺利的实现了批量合并:
然后我们只需要手工或者代码修改一个日期即可:
dest.Range("M2").Value = dest.Range("M2").Value[:-2]
最后就可以保存并退出了:
wb.SaveAs(os.path.abspath(f"{filename}_合并.xlsx"))
wb.Close()
excel_app.Quit()
最终完整代码为:
import win32com.client as win32 # 导入模块
import os
excel_app = win32.gencache.EnsureDispatch('Excel.Application')
# 可以看到打开的Excel软件
excel_app.Visible = True
# vba只支持传入绝对路径
filename = "车辆运营日报表2月份.xlsx"
wb = excel_app.Workbooks.Open(os.path.abspath(filename))
start_num, dest_name, filter_names = 5, "2月合并", ("无",)
excel_app.ScreenUpdating = False
dest = wb.Sheets.Add(After=wb.Sheets(wb.Sheets.Count))
dest.Name = dest_name
pos = 1
for i, sheet in enumerate(wb.Sheets):
if sheet.Name in (dest_name, *filter_names):
continue
max_rows = sheet.Range("A65535").End(-4162).Row
max_cols = sheet.UsedRange.Columns.Count
print(sheet.Name, max_rows, max_cols)
sheet.Activate()
n = 1 if i == 0 else start_num
rng = sheet.Range(sheet.Cells(n, 1), sheet.Cells(max_rows, max_cols))
rng.Select()
excel_app.Selection.Copy()
dest.Activate()
dest.Range(f"A{pos}").Activate()
dest.Paste()
pos += max_rows-n+1
# 自动列宽调整
excel_app.Selection.EntireColumn.AutoFit()
# 修改日期
dest.Range("M2").Value = dest.Range("M2").Value[:-2]
excel_app.ScreenUpdating = True
# 保存并退出
wb.SaveAs(os.path.abspath(f"{filename}_合并.xlsx"))
wb.Close()
excel_app.Quit()
然后根据自己的实际需求修改上述代码即可。
来源:https://xxmdmst.blog.csdn.net/article/details/124391653


猜你喜欢
- 本文实例讲述了codeigniter发送邮件并打印调试信息的方法。分享给大家供大家参考。具体如下:这里的codeigniter代码实现发送邮
- python3的编码问题。打开python开发工具IDLE,新建‘codetest.py'文件,并写代码如下:import sysp
- 这篇文章主要介绍了基于python3实现倒叙字符串,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可
- imadjust简介imadjust是一个计算机函数,该函数用于调节灰度图像的亮度或彩色图像的颜色矩阵。在matlab的命令窗口中键入: d
- 目录前言第一步:查看所有 SSH-Key第二步:生成一个 ssh-key,用于配置公司的 GitLab第三步:Github 生成一个 SSH
- 今天有个脚本需要遍历获取某指定文件夹下面的所有文件,我记得很早前也实现过文件遍历和目录遍历的功能,于是找来看一看,嘿,不看不知道,看了吓一跳
- 如下所示:from osgeo import gdalimport numpy as npdef read_tiff(inpath): &n
- 在很多项目启动的时候都需要连接到数据库,因此判断数据库服务器是否启动就十分必要了,如何判断数据库服务器是否启动呢?可以通过判断数据库服务是否
- 实例的背景说明假定一个个人信息系统,需要记录系统中各个人的故乡、居住地、以及到过的城市。数据库设计如下:Models.py 内容如下:&nb
- SQL Server中误删除数据的恢复本来不是件难事,从事务日志恢复即可。但是,这个恢复需要有两个前提条件:1. 至少有一个误删除之前的数据
- 日期和时间类型MySQL有多个表示各种日期和时间值的数据类型, 比如YEAR和DATE. MySQL存储时间的最精确粒度是秒。 然而, 能做
- 1.事件简介事件(event)是MySQL在相应的时刻调用的过程式数据库对象。一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理
- 内容摘要:asp使用最多的就是ACCESS数据库和ms sql server数据库,本文列出了asp连接这两个数据库的方
- 尾递归简介尾递归是函数返回最后一个操作是递归调用,则该函数是尾递归。递归是线性的比如factorial函数每一次调用都会创建一个新的栈(la
- import httplibimport osimport timedef check_http(i):
- Mysql my.ini 配置文件详解 #BEGIN CONFIG INFO #DESCR: 4GB RAM, 只使用InnoDB, ACI
- 一、前言 需求是获取某个时间范围内每小时数据和上小时数据的差值以及比率
- 例如:preds = to_numpy(preds)#preds是[2985x16x2]preds = preds.transpose(2,
- 在python开发的过程中,经常会遇到需要打印各种信息。海量的信息堆砌在控制台中,就会导致信息都混在一起,降低了重要信息的可读性。这时候,如
- 简介本文主要给大家介绍了关于go语言安装使用protobuf的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。pr