为什么文件损坏了?

时间:2018-12-10 07:06:58

标签: python excel vba python-3.x excel-vba

这是我的python脚本,用于将数据写入excel文件并添加宏。该宏将启动Adobe Reader。

import xlsxwriter
from win32com.client import Dispatch
import os

Filename = "Failure_Analysis_Report_2.xlsm"
directory = "C:\\Users\\Avik\\Desktop\\"

workbook = xlsxwriter.Workbook( directory + Filename )
worksheet = workbook.add_worksheet()

header = [] #my header row
format_header = workbook.add_format({'bold': True , 'size' : 16 , 'bg_color' : '#F8CBAD' , 'border' : 5})

for i in range(5):
    worksheet.write ( 0 , i , header[i] , format_header)

worksheet.set_column(0 , 0 , 15 )
worksheet.set_column(1 , 1 , 60 )
worksheet.set_column(2 , 2 , 35 )
worksheet.set_column(3 , 3 , 50 )
worksheet.set_column(4 , 4 , 15 )

xl_inp = [[,,,]] #my list of lists to input

wrap = workbook.add_format()
wrap.set_text_wrap()

a = 1

for x in xl_inp :
    b = 0
    for y in x :
        worksheet.write ( a , b , y , wrap)
        b += 1
    a += 1

worksheet.insert_button ( 'C7' , {'macro' : 'Auto_Open', 'caption' : 'Acrobat' , 'width' : 135} )

workbook.close()

com_instance = Dispatch("Excel.Application")
com_instance.Visible = False
objworkbook = com_instance.Workbooks.Open( directory + Filename )
xlmodule = objworkbook.VBProject.VBComponents.Add(1)
sCode = '''Sub Auto_Open()
    Dim x As Variant
    Dim Path As String

    Path = "C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe"

    x = Shell(Path, vbNormalFocus)
    End Sub'''
xlmodule.CodeModule.AddFromString(sCode)
objworkbook.SaveAs( os.path.join ( directory , Filename ) )
del com_instance

在运行此脚本时,出现以下共享的错误。该文件已损坏,我不知道为什么,任何帮助将不胜感激。

此外,如果我删除宏并将其另存为* .xlsx,它的效果很好。 即使我不删除宏并将其另存为* .xlsx,它仍然可以正常工作,尽管它会提示我在没有VB宏的情况下进行保存,这不是问题。

我的问题是它无法以* xlsm格式(包含或不包含数据)保存数据

感谢您的帮助。谢谢。

Traceback (most recent call last):
  File "C:\Users\Avik\Desktop\trying_xl_2.py", line 43, in <module>
objworkbook = com_instance.Workbooks.Open( directory + Filename )
  File "C:\Users\Avik\AppData\Local\Temp\gen_py\3.6\00020813-0000-0000-C000-000000000046x0x1x9\Workbooks.py", line 78, in Open
, Converter, AddToMru, Local, CorruptLoad)
pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, 'Microsoft Excel', "Excel cannot open the file 'Failure_Analysis_Report_2.xlsm' because the file format or file extension is not valid. Verify that the file has not been corrupted and that the file extension matches the format of the file.", 'xlmain11.chm', 0, -2146827284), None)

1 个答案:

答案 0 :(得分:1)

完成了。

就像@jmcnamara建议的那样,我将原始内容保存在.xlsx文件中

Filename = "Failure_Analysis_Report_2.xlsx"

使用另一个变量:

Filename_2 = "Failure_Analysis_Report_2.xlsm" 

使用 Dispatch 打开工作簿,并相应地添加了VBA代码和模块,并使用以下语法保存了工作簿:

objworkbook.SaveAs( os.path.join ( directory , Filename_2 ) , 52 )

52 参数有助于将其保存为 .xlsm 格式 以前,我没有提供任何参数,因此它试图保存在.xlsx本身中,因此在将其保存到宏时遇到问题。

我还必须添加:

objworkbook.Close()
com_instance.Application.Quit()

之后

objworkbook.SaveAs( os.path.join ( directory , Filename_2 ) , 52 )

之前

del com_instance

没有这两种语法,'Excel.Application'在后台运行,必须手动关闭。

有关参数值的更多详细信息,请遵循此:

https://docs.microsoft.com/en-us/office/vba/api/excel.xlfileformat

希望此解决方案将来对您有所帮助。干杯!