在使用 python 转换 xls 格式到 xlsx 我遇到了下列情况
1.有开启密码保护
2.唯读密码保护
3.有开启密码保护+唯读密吗保护
4.档案含有vba
每当 python 遇到前三项, 都会出现一个视窗等待输入密码
但不见得所有的密码都一样, 或是遇到恶意设定的开启密码保护, 此时需要跳过有开启密码保护的档案,
而唯读密码比较没有关係, 然后还要检查档案内是否含有 vba, 存档时以正确的格式存档
相信版上也有很多大神都能顺利解决这些问题, 但对我们这些入门者却是很困扰, 顺便让我自己记录一下
以下方式可以把每个检测功能写成 def , 这部份我就不多写了, 因为我是使用 win32com , 所以参数请自行参考微软的 win32com 手册
好像 openpyxl 更简单一点
目前我试过的方式如下
"""检测 xls 是否有开启密码保护workbooks.open()文件请参考:[https://learn.microsoft.com/en-us/office/vba/api/excel.workbooks.open](https://learn.microsoft.com/en-us/office/vba/api/excel.workbooks.open)"""import osimport win32com.client#档案路径自请自行修改FILE_NAME = r"D:\xls2xlsx\testFile\开启密码.xls"READ_ONLY = FalseEXCEL_FILE = win32com.client.Dispatch("Excel.Application")try: WORK_BOOK = EXCEL_FILE.Workbooks.Open(FILE_NAME, False, True, None, "", "", True, None, None, False, False, None, True) print("档案没有开启密码保护")except: READ_FILE = True print("档案有开启密码保护")finally: #try 结束的动作 WORK_BOOK.Close() EXCEL_FILE.Quit()
"""检测 xls 是否有唯读密码workbooks.open()文件请参考:[https://learn.microsoft.com/en-us/office/vba/api/excel.workbooks.open](https://learn.microsoft.com/en-us/office/vba/api/excel.workbooks.open)"""import osimport win32com.client#档案路径自请自行修改FILE_NAME = r"D:\xls2xlsx\testFile\唯读密码.xls"READ_ONLY = FalseEXCEL_FILE = win32com.client.Dispatch("Excel.Application")try: WORK_BOOK = EXCEL_FILE.Workbooks.Open(FILE_NAME, False, False, None, "", "", False, None, None, True, False, None, True) print("档案没有唯读密码")except: READ_FILE = True print("档案有唯读密码")finally: #try 结束的动作 WORK_BOOK.Close() EXCEL_FILE.Quit()
"""检测 xls 是否有VBAworkbooks.open()文件请参考:[https://learn.microsoft.com/en-us/office/vba/api/excel.workbooks.open](https://learn.microsoft.com/en-us/office/vba/api/excel.workbooks.open)"""import osimport win32com.client#档案路径自请自行修改FILE_NAME = r"D:\xls2xlsx\testFile\唯读密码.xls"READ_ONLY = FalseIS_VBA = FalseEXCEL_FILE = win32com.client.Dispatch("Excel.Application")WORK_BOOK = EXCEL_FILE.Workbooks.Open(FILE_NAME, False, False, None, "", "", False, None, None, True, False, None, True)IS_VBA = WORK_BOOK.hasVBProjectSEC_VALUE = WORK_BOOK.Application.AutomationSecurityWORK_BOOK.Application.AutomationSecurity = 1 if IS_VBA: print("另存成 xlsm")else: print("# 另存成 xlsx")WORK_BOOK.Application.AutomationSecurity = SEC_VALUEWORK_BOOK.Close()EXCEL_FILE.Quit()