合并/拆分 Excel?Python、VBA轻松自动化
时间:2022-07-26
本文章向大家介绍合并/拆分 Excel?Python、VBA轻松自动化,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
当你收集了 n 个人的 EXCEL 记录表,需要将它们汇成一个总表时你会怎么做呢? 如果不通过技术手段,要一个个打开再复制粘贴也太麻烦了吧! 此时就需要一个通过几秒钟的点击就能完成合并的工具。
最终成品
合并 EXCEL
VBA 实现合并
不套路,下面直接放出 VBA 代码(来源于网络,经过了我修改):
Sub 合并当前目录下所有工作簿的全部工作表()
Dim MyPath, MyName, AWbName
Dim Wb As Workbook, WbN As String
Dim G As Long
Dim Num As Long
Dim BOX As String
Application.ScreenUpdating = False
MyPath = ActiveWorkbook.Path
MyName = Dir(MyPath & "" & "*.xls")
AWbName = ActiveWorkbook.Name
Num = 0
Do While MyName <> ""
If MyName <> AWbName Then
Set Wb = Workbooks.Open(MyPath & "" & MyName)
Num = Num + 1
With Workbooks(1).ActiveSheet
.Cells(.Range("B200000").End(xlUp).Row + 2, 1) = Left(MyName, Len(MyName) - 4)
For G = 1 To Sheets.Count
Wb.Sheets(G).UsedRange.Copy .Cells(.Range("B200000").End(xlUp).Row + 1, 1)
Next
WbN = WbN & Chr(13) & Wb.Name
Wb.Close False
End With
End If
MyName = Dir
Loop
Range("B1").Select
Application.ScreenUpdating = True
MsgBox "共合并了" & Num & "个工作薄下的全部工作表。如下:" & Chr(13) & WbN, vbInformation, "提示"
End Sub
看不懂没关系,不用再学 VBA,直接跑就完事儿了。那么该如何使用呢?
如下目录中放着 3 个待合并的 EXCEL 表,每个表中数据不同;
新建一个 EXCEL 文件后打开它,用于存放合并后的数据;
通过快捷键 Alt + F11 打开 VBA 界面;
打开Sheet1,将上面的代码复制粘贴到其中,按 F5 运行;
即将同目录下其他 3 个 EXCEL 文件中的数据合并至此;
办公自动化有着各种各样的手段,下面让我们来看看万能的 Python 又是如何实现这个功能的。
Python 实现合并
直接上代码,说明见注释:
def merge_excel(dir):
print('--- 执行合并 ---')
filename_excel = [] # 存表名
frames = [] # 存表内容
d = dir.replace('/','\\') # 因pandsa读取路径为双斜杠,需转换
if d.endswith('\\') == False: # 若为磁盘根目录则路径结尾自带\,若为文件夹则无,需添加\
d = d + '\\'
print("路径是:",d,"n有以下文件:")
for files in os.listdir(path=dir): # 遍历目录下的文件
print(files)
if 'xlsx' in files or 'xls' in files : # 搜索xlsx/xls后缀文件
filename_excel.append(files)
df = pd.read_excel(d+files) # 读取一个表内容存入一个DataFrame
frames.append(df)
if len(frames)!= 0: # 若存在EXCEL表则合并保存
result = pd.concat(frames) # 上下连接多个df
result.to_excel(d+"合并结果表.xlsx")
merge_excel("D:/某文件夹")
拆分 EXCEL
分久必合,合久必分(这句话不是这么引用的吧)。那么如果是要分配工作,比如把一个大表按行数分成多份小表该如何实现呢?我们还是先来看看 VBA 版本。
VBA 实现拆分
Sub ChaiFenSheet()
Dim r, c, i, WJhangshu, WJshu, bt As Long
r = Range("A" & Rows.Count).End(xlUp).Row
b = InputBox("请输入分表行数")
If IsNumeric(b) Then
WJhangshu = Int(b)
Else
MsgBox "输入错误", vbOKOnly, "错误"
End
End If
c = Cells(1, Columns.Count).End(xlToLeft).Column
bt = 1 '标题行数
'WJhangshu = 50 '每个文件的行数
WJshu = IIf(r - bt Mod WJhangshu, Int((r - bt) / WJhangshu), Int((r - bt) / WJhangshu) + 1)
'------
Set fs = CreateObject("Scripting.FileSystemObject") '
For i = 0 To WJshu
Workbooks.Add
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "" & Format(i + 1, String(Len(WJshu), 0)) & "." & fs.GetExtensionname(ThisWorkbook.FullName) '扩展名
Application.DisplayAlerts = True
ThisWorkbook.ActiveSheet.Range("A1").Resize(bt, c).Copy ActiveSheet.Range("A1")
ThisWorkbook.ActiveSheet.Range("A" & bt + i * WJhangshu + 1).Resize(WJhangshu, c).Copy _
ActiveSheet.Range("A" & bt + 1)
ActiveWorkbook.Close True
Next
End Sub
与合并表类似,先打开要拆分的大表,按 Alt + F11 进入 VBA 界面,再按 F5 运行代码即可。如下图所示,将一个表中的 15 个任务拆分到了 3 个新的表中
Python 实现拆分
拆分部分的源码由笔者的同事 yang 编写:
def split_excel(path,num):
# print("--- 执行拆分 ---")
p = path.replace('/', '\\') # 传入pd库read_excel方法的路径,含文件名
dir = p[ : p.rfind('\') + 1 ] # 输出被拆分表的目录,不含文件名
sheetname = path[ path.rfind('/') + 1 :].strip('.xlsx').strip('.xlx') # 无后缀的文件名
data = pd.read_excel(p) # 数据
nrows = data.shape[0] # 获取行数
split_rows = num # 自定义要拆分的条数,即分隔成多少行一份
count = int(nrows/split_rows) + 1 # 拆分的份数
# print("应当拆分成%d份"%count)
begin = 0
end = 0
for i in range(1,count+1):
sheetname_temp = sheetname+str(i)+'.xlsx' # 拆分后的每个表名
if i == 1:
end = split_rows
elif i == count:
begin = end
end = nrows
else:
begin = end
end = begin + split_rows
print(sheetname_temp)
data_temp = data.iloc[ begin:end , : ] # [ 行范围 , 列范围 ]
data_temp.to_excel(dir + sheetname_temp)
# print('拆分完成')
split_excel("test.xlsx",5)
作为 PyQt5 和画图爱好者,笔者又把这两段代码丢进界面里打包成一个小玩意儿。
exe 文件的图标是笔者绘制的字母 X 和 L 的组合画(因为 XL 速读即为 EXCEL )。
合并和拆分功能图标也很形象(一本正经的卖瓜 自夸)。
exe和完整源码已上传,欢迎下载使用(2种方式)!
- 奶牛快传(不限速):https://alltodata.cowtransfer.com/s/7ec265ff021d43
- github:https://github.com/SeonPan/xltools
- 帝国cms栏目别名如何调用?
- 数据库安全·保护表字段
- 【实践】伪造名人的脸—做一个小示例了解生成式对抗网络
- Spring 常见问题与解决方法
- 如何通过css控制内容显示顺序 第二行的内容优先显示
- 杨廷琨 - 用SQL解析神奇的扑克牌魔术
- Spring boot with Spring security
- Spring RestFul and RestTemplate
- Spring boot with Velocity template
- Oracle 11g R2 RAC 高可用连接特性 – SCAN 详解
- Spring boot · 链接池配置
- Linux下命令行图片格式转换
- 用SQL解一道有趣的数学题:Gauss和Poincare
- OpenSSL 转换证书格式
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- django-URL转换器(四)
- 【猫狗数据集】加载保存的模型进行测试
- 【猫狗数据集】划分验证集并边训练边验证
- 【猫狗数据集】使用学习率衰减策略并边训练边测试
- 面试题系列第2篇:new String()创建几个对象?有你不知道的
- spring之整合struts2
- django-URL之include函数(五)
- springmvc之使用ModelAttribute避免不允许被修改的值更新时为空
- 【colab pytorch】使用tensorboard可视化
- django-URL别名的作用(六)
- springmvc之如何确定目标方法Pojo类型的参数?
- 【colab pytorch】使用tensorboardcolab可视化
- 实用,完整的HTTP cookie指南
- django-URL之从URL中获取关键字(七)
- springmvc之使用POJO作为参数