Почему файл поврежден? - PullRequest
       7

Почему файл поврежден?

0 голосов
/ 10 декабря 2018

Это мой скрипт на 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 голосов
/ 12 декабря 2018

Готово.

Как и предполагал @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

Надеюсь, что это разрешение поможет кому-то в будущем.Ура!

...