办公软件的宏病毒是最常见的计算机病毒之一。有些宏病毒不破坏文件本身,而是远程下载、执行恶意程序,感染更多办公文件。清除这类病毒只需删除文件中的宏代码。然而,许多宏病毒会对代码加密,比如删除代码时需要输入密码。此时,将文件另存为 XLSX 等不含宏的普通格式是最佳解决方法,可自动清除宏代码。
以下代码将输入目录下所有含宏的 XLSM 文件自动转换为 XLSX 格式,并保持转换后文件的修改时间与原文件一致。该功能通过 Windows 环境下 Win32 软件的 COM 接口实现批量自动化处理,因此在运行前系统中必须装有 WPS。
Office 同样支持此功能,但其接口命令细节可能略有不同,后续测试完成后将在楼中补充。
运行环境
源代码
from os import walk, path, stat, utime
from time import localtime, strftime
from win32com.client import DispatchEx
wps = DispatchEx('ket.Application')
# ket 指金山WPS的电子表格(Kingsoft Et)
wps.Visible = False
wps.DisplayAlerts = False
wps.EnableEvents = False
# WPS 界面全程静默,并且忽略警告对话框,否则程序会被阻塞
DIR_PATH = input('输入待转换文件所的目录:').strip()
for root, dirs, files in walk(DIR_PATH):
for file in files:
filename, ext = path.splitext(file)
ext = ext.lstrip('.').upper()
if ext == 'XLSM':
file_path = path.join(root, file)
file_path_new = file_path.replace('.xlsm', '.xlsx')
try:
workbook = wps.Workbooks.Open(file_path)
workbook.SaveAs(file_path_new, FileFormat=51)
workbook.Close()
except:
print('文件转换失败:', file_path)
print('')
else:
print('文件转换完毕:', file_path_new)
status = stat(file_path)
utime(file_path_new, (status.st_atime, status.st_mtime))
# 将转换后表格文件的修改时间改为和原文件相同
print( '修改日期:', strftime('%Y/%m/%d %H:%M', localtime(status.st_mtime)) )
print( '访问日期:', strftime('%Y/%m/%d %H:%M', localtime(status.st_atime)) )
print('')
wps.Application.Quit()
# 关闭 WPS 进程