本帖最后由 人二 于 2021-9-9 17:26 编辑
起因
- 由于工作原因,需要批量处理大量的excel表格,删除表格中多余的sheet表
思路
-
可以用vba来做,首选获取活动的sheet名(因为一般关闭都会从有数据那张sheet关闭,当然也可以判定工作簿的单元格是否有内容),对比将不符合的表单进行删除。
-
可以用python来做,结果发现openxl不支持读取xls后缀的表格,遂百度找到win32com,结合vba上的知识简直秒变办公达人,vba上的代码摇身一变就能写在python中,就是python中没有提示太恼火了,只有在vba里看看工作簿的属性。
部分代码解释
- 代码对比,打开活动sheet表并判断表中是否有值(非第一个sheet表)
"vba代码"
Do While myFile <> ""
If myFile <> ThisWorkbook.Name Then '排除自己
Workbooks.Open myPath & myFile
sheetName = ActiveWorkbook.ActiveSheet.Name '获取活动表名
flag = ActiveSheet.Cells(2, 1).Value '再次判断标志
If flag <> "" Then
deleteSheet (sheetName)
Else
For Each sht In ActiveWorkbook.Worksheets
If Cells(2, 1).Value = "" Then
deleteSheet (sht.Name)
End If
Next
End If
ActiveWorkbook.Save
ActiveWorkbook.Close
End If
myFile = Dir '下一个文件
Loop
"python代码"
import win32com.client
from win32com.client import Dispatch
xlApp = win32com.client.Dispatch('Excel.Application')
xlBook = xlApp.Workbooks.Open("文件地址") #打开的excel文件
sheetName = xlBook.ActiveSheet.Name
flag = xlBook.ActiveSheet.Cells(2, 1).Value #再次判断标志
if flag != None:
for sht in xlBook.Worksheets:
if sht.Name != sheetName:
sht.Delete()
else:
for sht in xlBook.Worksheets:
if sht.Cells(2, 1).Value == None:
sht.Delete()
xlBook.Save()
xlBook.Close()
- 以上代码可以看到vba与python其实对象调用的方法或属性其实差不多,python中主要是调用win32com.client.Dispatch('Excel.Application')来实现与vba代码互通的,当然能看懂源码的大佬可以去深究 (或者你有更多的文档参考资料请告知我,谢谢!)。
完整代码下载
- 见附件,前段时间搞了个500的悬赏缺币啊,求支持!!!
|