如何使用win32com.client将xls重新保存到xlsx时禁用/ autoanswer关于宏/ VB项目的对话框?

时间:2016-05-12 20:34:51

标签: python excel win32com

使用此代码时:

import win32com.client as win32

input_files = os.listdir(parent_dir)
input_files = [parent_dir + i for i in input_files if i.endswith('.xls') and not i.endswith('.xlsx')]
for input_file in input_files:
    if not os.path.isfile(input_file.replace('.xls', '.xlsx')):
        excel = win32.gencache.EnsureDispatch('Excel.Application')
        wb = excel.Workbooks.Open(input_file)
        wb.SaveAs(input_file + "x", FileFormat=51)  # FileFormat = 51 is for .xlsx extension
        wb.Close()  # FileFormat = 56 is for .xls extension
        excel.Application.Quit()

在包含一些宏/ VB项目的excel文件上,通常messagebox会显示警告,所有宏/ VB项目都会丢失,我想以某种方式自动回答它,例如"是",或者可能有一些SaveAs功能参数或

设置

win32.gencache.EnsureDispatch(' Excel.Application&#39)

现在我可以使用FileFormat = 51将文件重新保存为xlsm,但由于某些安全原因我不想这样做,我真的不需要在我的文件中使用这些宏/ VB项目。 / p>

尝试过excel.DisplayAlerts = False - 没有帮助。

还考虑像pywinauto这样的东西,但也许它有点过分,也许有更优雅的解决方案?

2 个答案:

答案 0 :(得分:0)

使用

wb.Close(True) #if you need to save .xls file also

或使用

wb.Close(False) # if you not decide to save .xls file

另一方面,它可能已打开其他文件,因此当您使用excel.Application.Quit()并且这些文件未保存时,excel将在关闭前显示确认对话框。

答案 1 :(得分:0)

好吧,有趣的是,如果保存在xlsm中而不是xlsx中,Excel不会询问有关包含宏/ VB项目的问题,并且可以像在xlsm中一样在openpyxl中打开xlsm,因此,如何在xlsm中重新保存: / p>

def resave_xls_file_as_xlsx_or_xlsm(in_xls_file_path, out_excel_file_type='xlsm'):
    excel = win32.gencache.EnsureDispatch('Excel.Application')
    wbxls = excel.Workbooks.Open(in_xls_file_path)
    in_xls_file_path = in_xls_file_path.replace('/', '\\')
    out_xlsx_or_xlsm_file_path = in_xls_file_path + out_excel_file_type[-1]
    # FileFormat = 51 is for .xlsx extension, 52 for xlsm, no questions about containing VB script for xlsm
    if out_excel_file_type == 'xlsm':
        excel_file_format = 52
    elif out_excel_file_type == 'xlsx':
        excel_file_format = 51
    else:
        excel_file_format = 52  # or do some error corrections:
        # print('ERROR, wrong excel file type:', out_excel_file_type)
        # return None # sys.exit ('taihen taihen') # raise cthulhu
    wbxls.SaveAs(out_xlsx_or_xlsm_file_path, FileFormat=excel_file_format)
    wbxls.Close()
    excel.Application.Quit()
    return out_xlsx_or_xlsm_file_path

此外,有时我们有某种损坏的xlsx文件,Excel开始大喊它,脚本停止,要自动恢复它,您可以使用此代码,请注意xlsx文件路径,例如,该路径不会在这种情况下不起作用:

resaved_xlsx_on_disk ='c:/this_wont_work/2.xlsx'#通常有效,但不适用于win32.client

corrupted_xlsx_on_disk = 'c:\\fyi_if_you_dont_use_two_backslashes_and_use_slashes_in_path_it_will_not_open\\1.xlsx'
resaved_xlsx_on_disk = r'c:\you_can_also_use_this\2.xlsx'
xl = win32.gencache.EnsureDispatch('Excel.Application')
# xl.Visible = True # otherwise excel is hidden (btw if corrupted it anyway show some message, but autoclose it)
wb = xl.Workbooks.Open(corrupted_xlsx_on_disk, CorruptLoad=1)
xl.SendKeys("{Enter}", Wait=1)
xl.DisplayAlerts = 0
wb.SaveAs(resaved_xlsx_on_disk)  # You can try wb.Save(), but I can't get it to work :-(
wb.Close()
xl.Application.Quit()