11

これでパスワードで保護されたExcelファイルを開くことができます:

import sys
import win32com.client
xlApp = win32com.client.Dispatch("Excel.Application")
print "Excel library version:", xlApp.Version
filename, password = sys.argv[1:3]
xlwb = xlApp.Workbooks.Open(filename, Password=password)
# xlwb = xlApp.Workbooks.Open(filename)
xlws = xlwb.Sheets(1) # counts from 1, not from 0
print xlws.Name
print xlws.Cells(1, 1) # that's A1

情報をパンダのデータフレームに転送する方法はわかりません。セルを1つずつ読み取る必要がありますか、それともこれを行うための便利な方法がありますか?

4

6 に答える 6

6

開始セルが(StartRow、StartCol)として指定され、終了セルが(EndRow、EndCol)として指定されていると仮定すると、次のように機能することがわかりました。

# Get the content in the rectangular selection region
# content is a tuple of tuples
content = xlws.Range(xlws.Cells(StartRow, StartCol), xlws.Cells(EndRow, EndCol)).Value 

# Transfer content to pandas dataframe
dataframe = pandas.DataFrame(list(content))

注:ExcelセルB5は、win32comの行5、列2として指定されています。また、タプルのタプル用のpandas.DataFrameコンストラクターがないため、タプルのタプルからタプルのリストに変換するにはlist(...)が必要です。

于 2017-01-25T16:31:32.010 に答える
6

デビッドハマンのサイトから(すべてのクレジットは彼に行きます) https://davidhamann.de/2018/02/21/read-password-protected-excel-files-into-pandas-dataframe/

xlwingsを使用します。ファイルを開くと、最初にExcelアプリケーションが起動するため、パスワードを入力できます。

import pandas as pd
import xlwings as xw

PATH = '/Users/me/Desktop/xlwings_sample.xlsx'
wb = xw.Book(PATH)
sheet = wb.sheets['sample']

df = sheet['A1:C4'].options(pd.DataFrame, index=False, header=True).value
df
于 2018-04-28T20:59:57.513 に答える
2

win32com APIを使用して暗号化されたファイルをディスクに保存できると仮定すると(これは目的に反する可能性があると思います)、すぐに最上位のpandas関数を呼び出すことができますread_excelxlrdただし、最初に( Excel 2003の場合)、xlwt(2003の場合も)、およびopenpyxl(Excel 2007の場合)の組み合わせをインストールする必要があります。これは、Excelファイルを読み取るためのドキュメントです。現在、パンダは、win32comAPIを使用してExcelファイルを読み取るためのサポートを提供していません。必要に応じて、GitHubの問題を開いてください。

于 2013-06-20T16:26:44.303 に答える
2

@ikeoddyによって提供された提案に基づいて、これはピースをまとめる必要があります。

Pythonを使用してパスワードで保護されたExcelファイルを開く方法は?

# 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)

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: ')

Workbooks.Openメソッド(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)

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()

pythonwin32COMクロージングエクセルワークブック

xl_wb.Close(False)
于 2018-10-26T20:12:37.703 に答える
2

簡単な解決策

import io
import pandas as pd
import msoffcrypto

passwd = 'xyz'

decrypted_workbook = io.BytesIO()
with open(i, 'rb') as file:
    office_file = msoffcrypto.OfficeFile(file)
    office_file.load_key(password=passwd)
    office_file.decrypt(decrypted_workbook)

df = pd.read_excel(decrypted_workbook, sheet_name='abc')

pip install --user msoffcrypto-tool

各Excelのすべてのシートをディレクトリとサブディレクトリから個別のcsvファイルにエクスポートする

from glob import glob
PATH = "Active Cons data"

# Scaning all the excel files from directories and sub-directories
excel_files = [y for x in os.walk(PATH) for y in glob(os.path.join(x[0], '*.xlsx'))] 

for i in excel_files:
    print(str(i))
    decrypted_workbook = io.BytesIO()
    with open(i, 'rb') as file:
        office_file = msoffcrypto.OfficeFile(file)
        office_file.load_key(password=passwd)
        office_file.decrypt(decrypted_workbook)

    df = pd.read_excel(decrypted_workbook, sheet_name=None)
    sheets_count = len(df.keys())
    sheet_l = list(df.keys())  # list of sheet names
    print(sheet_l)
    for i in range(sheets_count):
        sheet = sheet_l[i]
        df = pd.read_excel(decrypted_workbook, sheet_name=sheet)
        new_file = f"D:\\all_csv\\{sheet}.csv"
        df.to_csv(new_file, index=False)
于 2021-08-20T19:29:14.327 に答える
1

@Mauriceの回答に追加して、範囲を指定せずにシート内のすべてのセルを取得します

wb = xw.Book(PATH, password='somestring')
sheet = wb.sheets[0] #get first sheet

#sheet.used_range.address returns string of used range
df = sheet[sheet.used_range.address].options(pd.DataFrame, index=False, header=True).value
于 2021-07-08T07:28:12.883 に答える