Ошибка при прохождении через защищенные паролем файлы XLSB и XLSM в Python - PullRequest
0 голосов
/ 04 мая 2018

Следующий скрипт работает для файлов .xlsm и .xlsb, пока я не попытаюсь учесть файлы, защищенные паролем в Excel. Это существующий процесс, который я пытаюсь улучшить и проанализировать - все листы, которые я получу, защищены паролем как первые 5 символов имени файла и имеют формат .xlsb или .xlsm.

#Take xlsb Binary files, convert to csv, concatenate, keep file name
import pandas as pd
import os, glob, win32com.client


path = r'C:\Users\user\Desktop\Test Binary'
all_files_test = glob.glob(os.path.join(path, "*.xlsb"))

for file in all_files_test:
    name1 = os.path.splitext(os.path.split(file)[1])[0]
    name2 = name1[0:5]
    excel = win32com.client.Dispatch("Excel.Application")
    excel.Visible = False
    doc = excel.Workbooks.Open(file,False, False, None, name2)
    doc.Sheets(3).Select #3 for xlsm files - verify
    csv_name = os.path.basename(file).replace('xlsb','csv') #xlsb xlsm
    doc.SaveAs(Filename=os.path.join(path, 'CSV Out', csv_name),FileFormat = 6)
    doc.Close(True)
    excel.Quit()
excel.Quit()

files = glob.glob('c:/Users/user/Desktop/Test Binary/CSV Out/*.csv')

dfs = [pd.read_csv(fp).assign(orig_file_name=os.path.basename(fp)) for fp in files]
df = pd.concat(dfs, ignore_index=True)

df.head(10)
df.to_csv('c:/Users/user/Desktop/Test Binary/CSV Out/concat.csv',sep=',')
print("Done, check concatenated file.")

Скрипт работает через первый файл, но когда он попадает во второй файл, он ошибается:

Traceback (most recent call last):
  File "C:\Users\user\Desktop\xlsb_csv_concat.py", line 28, in <module>
    doc.Sheets(3).Select #3 for xlsm files - verify
AttributeError: 'NoneType' object has no attribute 'Sheets'

Я уверен, что есть более эффективные способы сделать то, что я написал, но он работает достаточно хорошо для этой конкретной задачи, пока не появятся пароли. Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 29 мая 2018

На всякий случай, если кто-нибудь наткнется на похожую ситуацию:

Изменение:

doc = excel.Workbooks.Open(file, False, False, None, name2)

до

doc = excel.Workbooks.Open(file, False, True, None, name2)

работал для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...