2013-03-08 7 views
6

ich ein kennwortgeschützte Excel-Datei mit diesem öffnen:Von kennwortgeschützte Excel-Datei Datenrahmen Pandas

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 

Ich bin nicht sicher, obwohl, wie die Informationen an einen Pandas Datenrahmen zu übertragen. Muss ich Zellen einzeln nacheinander lesen, oder gibt es dafür eine geeignete Methode?

+0

Hat 'xlws' eine Zeile und' RowCount' (oder wie immer sie heißen) - wenn ja, dann wiederhole die Anzahl der Zeilen und erstelle eine Liste von Listen ... Verwende dann 'pandas.DataFrame 'darauf ... (sorry - benutze keine windows - also kann ich das nicht selbst ausprobieren) –

Antwort

1

Angenommen, Sie können die verschlüsselte Datei mit der win32com-API zurück auf den Datenträger speichern (was, wie ich weiß, den Zweck zunichte machen könnte), könnten Sie sofort die Top-Level-Pandas-Funktion read_excel aufrufen. Sie müssen jedoch zuerst eine Kombination von xlrd (für Excel 2003), xlwt (auch für 2003) und openpyxl (für Excel 2007) installieren. Here ist die Dokumentation zum Lesen in Excel-Dateien. Derzeit bietet Pandas keine Unterstützung für die Verwendung der win32com-API zum Lesen von Excel-Dateien. Sie können gerne open up a GitHub issue, wenn Sie möchten.

+0

Ich kann es nicht mehr testen, da ich momentan nicht in einer Umgebung arbeite, die mir das ermöglicht . Ich werde diese oder jede andere Antwort als akzeptiert markieren, wenn Sie den Beispielcode angeben und mir versichern, dass es funktioniert. : 7) – dmvianna

+0

Ich weiß nicht, wie man die win32com API benutzt, also müsste man das selbst herausfinden, aber wenn man sich die Dokumentation ansieht, zu der ich einen Link gab, gibt es Anweisungen, genau das zu tun, was man will. Sie müssen den Beispielcode hier nicht replizieren, da Sie ihn dort einfach lesen können. –

2

die Ausgangszelle Unter der Annahme gegeben als (StartRow, StartCol) und der Endung Zelle wird als (EndRow, EndCol) gegeben, fand ich die für mich gearbeitet folgende:

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

Hinweis: Excel-Zelle B5 ist gegeben als Zeile 5, Spalte 2 in win32com. Außerdem brauchen wir eine Liste (...), um vom Tupel von Tupeln zur Liste von Tupeln zu konvertieren, da es keinen pandas.DataFrame-Konstruktor für ein Tupel-Tupel gibt.