Следующий скрипт работает для файлов .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'
Я уверен, что есть более эффективные способы сделать то, что я написал, но он работает достаточно хорошо для этой конкретной задачи, пока не появятся пароли. Заранее спасибо за помощь.