2013-03-08 15 views
6

mogę otworzyć pliku chronionego hasłem Excel z tym:Od chronionego hasłem pliku programu Excel do Pandy DataFrame

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 

nie jestem pewien, choć jak przenieść informacje do dataframe pandy. Czy muszę czytać komórki jeden po drugim i czy istnieje dogodna metoda, aby tak się stało?

+0

Czy 'xlws' ma' Row' i 'RowCount' (lub jakkolwiek są one nazywane) - jeśli tak, to przeprowadź pętlę przez liczbę wierszy i zbuduj listę list ... Następnie użyj' pandas.DataFrame "w tym ... (przepraszam - nie korzystaj z okien - więc nie mogę tego zrobić samemu) –

Odpowiedz

1

Zakładając, że można zapisać zaszyfrowany plik z powrotem na dysk przy użyciu interfejsu API win32com (co, jak sobie samemu zdaję, może pokonać cel), można natychmiast wywołać funkcję pandy najwyższego poziomu read_excel. Najpierw należy zainstalować połączenie xlrd (dla programu Excel 2003), xlwt (także dla 2003) i openpyxl (dla programu Excel 2007). Here to dokumentacja do czytania w plikach Excel. Obecnie pandy nie zapewniają obsługi interfejsu API win32com do odczytu plików Excel. Jeśli chcesz, możesz open up a GitHub issue.

+0

Nie mogę tego przetestować, ponieważ obecnie nie pracuję w środowisku, które pozwala mi to zrobić . Zaznaczę tę lub inną odpowiedź jako zaakceptowaną, jeśli podasz przykładowy kod i zapewnisz mnie, że działa. : 7) – dmvianna

+0

Nie wiem, jak korzystać z interfejsu API win32com, więc musiałbyś sam to rozgryźć, ale jeśli spojrzysz na dokumentację, do której dałem odnośnik, zawiera ona instrukcje dotyczące wykonywania dokładnie tego, co chcesz. Nie ma potrzeby replikowania kodu przykładowego tutaj, ponieważ można go po prostu tam przeczytać. –

2

Zakładając komórkę wyjścia jest podane jako (StartRow, StartCol) i komórka kończąc podana jest jako (EndRow, EndCol), znalazłem następujący pracował dla mnie:

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

Uwaga: Excel komórka B5 podana jako wiersz 5, kolumna 2 w win32com. Ponadto potrzebujemy listy (...) do konwersji z krotki krotek na listę krotek, ponieważ nie ma konstruktora pandas.DataFrame dla krotki krotek.