Dựa trên đề xuất được cung cấp bởi @ikeoddy, điều này sẽ đặt các mảnh lại với nhau:
Làm thế nào để mở tệp excel được bảo vệ bằng mật khẩu bằng Python?
# Import modules
import pandas as pd
import win32com.client
import os
import getpass
# Name file variables
file_path = r'your_file_path'
file_name = r'your_file_name.extension'
full_name = os.path.join[file_path, file_name]
# print[full_name]
Nhận nhập mật khẩu dòng lệnh trong Python
# You are prompted to provide the password to open the file
xl_app = win32com.client.Dispatch['Excel.Application']
pwd = getpass.getpass['Enter file password: ']
Sách bài tập.Open Phương pháp [Excel]
xl_wb = xl_app.Workbooks.Open[full_name, False, True, None, pwd]
xl_app.Visible = False
xl_sh = xl_wb.Worksheets['your_sheet_name']
# Get last_row
row_num = 0
cell_val = ''
while cell_val != None:
row_num += 1
cell_val = xl_sh.Cells[row_num, 1].Value
# print[row_num, '|', cell_val, type[cell_val]]
last_row = row_num - 1
# print[last_row]
# Get last_column
col_num = 0
cell_val = ''
while cell_val != None:
col_num += 1
cell_val = xl_sh.Cells[1, col_num].Value
# print[col_num, '|', cell_val, type[cell_val]]
last_col = col_num - 1
# print[last_col]
Câu trả lời của Ikeoddy:
content = xl_sh.Range[xl_sh.Cells[1, 1], xl_sh.Cells[last_row, last_col]].Value
# list[content]
df = pd.DataFrame[list[content[1:]], columns=content[0]]
df.head[]
Python win32 com đóng cửa sổ làm việc excel
xl_wb.Close[False]
Nếu bạn đang cố gắng sử dụng gấu trúc để đọc tệp excel được mã hóa mật khẩu và nhận được thông báo sau:
xlrd.biffh.XLRDError: Can't find workbook in OLE2 compound document
Sau đó, bạn đã đến đúng nơi! Thông báo này có nghĩa là chúng tôi đang cố gắng đọc một tệp được mã hóa mật khẩu mà không cung cấp mật khẩu. Trong hướng dẫn ngắn này, tôi sẽ chỉ cho bạn cách đọc tệp Excel được mã hóa bằng mật khẩu vào gấu trúc.
Thư viện
Giải pháp tốt nhất mà tôi đã tìm thấy cho đến nay là thư viện MSOFFCRYPTO. Mặc dù tên của nó, thư viện này không liên quan gì đến tiền điện tửmsoffcrypto library. Despite its name, this library has nothing to do with cryptocurrency…
Chúng tôi sẽ sử dụng PIP để cài đặt nó, lưu ý tên cài đặt msoffcrypto-tool:msoffcrypto-tool:
pip install msoffcrypto-tool
Đọc tệp excel được mã hóa trực tiếp vào gấu trúc
Thư viện MSOFFCRYPTO có phương thức load_key [] để chuẩn bị mật khẩu cho tệp excel. Sau đó, phương thức giải mã [] mở khóa tệp và lưu nó vào đĩa.msoffcrypto library has a method load_key[] to prepare password for the Excel file. Then the decrypt[] method unlocks the file and saves it to disk.
Vì chúng tôi muốn đọc tệp excel được mã hóa trực tiếp vào gấu trúc, việc lưu vào đĩa sẽ không hiệu quả. Do đó, chúng ta có thể viết nội dung tệp tạm thời vào bộ đệm trong bộ nhớ [RAM]. Để làm điều này, chúng tôi sẽ cần sử dụng thư viện IO.io library.
import msoffcrypto
import io
import pandas as pd
temp = io.BytesIO[]
IO.Bytesio [] cho phép viết nội dung cho buff trong bộ nhớ [RAM]. Điều này giúp xử lý tệp nhanh hơn nhiều so với ghi vào đĩa.io.BytesIO[] allows writing contents to an in-memory buff [RAM]. This helps process the file much faster than writing to the disk.
Trong ví dụ của chúng tôi, mật khẩu là ‘1234, hãy đảm bảo thay thế nó bằng mật khẩu của riêng bạn khi bạn kiểm tra mã này. Đoạn mã dưới đây mở tệp Excel được mã hóa Secret Secret.xlsx, ở định dạng nhị phân bằng chế độ ‘RB, mở khóa tệp, sau đó lưu nội dung [tệp Excel] vào vị trí bộ đệm trong bộ nhớ [RAM] được gọi là TEMP.temp.
with open['secret.xlsx', 'rb'] as f:
excel = msoffcrypto.OfficeFile[f]
excel.load_key['1234']
excel.decrypt[temp]
Bây giờ, nhiệt độ này là tệp Excel Target của chúng tôi với mật khẩu bị tước. Chúng ta có thể tiến hành với pd.read_excel [] bình thường để đọc nó!temp is our target Excel file with password stripped. We can proceed with the normal pd.read_excel[] to read it!
Đặt nó lại với nhau
Ở đây bạn có nó, một tập lệnh ngắn và ngọt ngào để đọc các tệp excel được mã hóa trực tiếp vào gấu trúc, lưu ý chúng tôi chưa sửa đổi tệp excel gốc cũng như không tạo các tệp không cần thiết trên đĩa trong quá trình!
import msoffcrypto
import io
import pandas as pd
temp = io.BytesIO[]
with open['secret.xlsx', 'rb'] as f:
excel = msoffcrypto.OfficeFile[f]
excel.load_key['1234']
excel.decrypt[temp]
df = pd.read_excel[temp]
del temp