2016-05-31 10 views
0

Das mag eine einfache Aufgabe sein, aber für das Leben von mir kann ich keine Lösung finden. Ich habe ein Excel-Dokument mit einer Tabelle. Die Spalten in dieser Tabelle haben alle Autofilter. Ich möchte nur alle Einträge in diesem Autofilter (für die 9. Spalte) auswählen und in einem Array speichern. Ich benutze Win32Com.Python - Wie man die Auswahlen in einem AutoFilter Excel zeigt

import win32com.client as win32 

working_dir = 'C:\\invoice\\' 
save_dir = 'C:\\test\\' 

xl = win32.gencache.EnsureDispatch("Excel.Application") 
xl.Visible = True 

template_wb = xl.Workbooks.Open(working_dir + 'Settlement report V6-EMPLATE.xlsm') 

#Worksheets 
orgdata_ws = template_wb.Sheets('Organization Data') 
masterdata_ws = template_wb.Sheets('Master Data') 

#I want to access the autofilter in column 9 and simply get the contents in the autofilter list and put them in the array 
filtercontents = [] 
thefilter = orgdata_ws.Columns(9).Autofilter 
for i in thefilter: 
    filtercontents.append(i)  ????????? 
+1

Welche Ausnahme/Fehler erhalten Sie? –

+0

Hi Raphael, mit diesem spezifischen Code erhalte ich diesen Fehler: TypeError: Objekt 'instancemethod' ist nicht iterierbar. Aber es ist sehr wahrscheinlich, dass ich nicht die richtige Methode verwende, um mein Ziel zu erreichen. Auch schnelles Update habe ich Autofilter auf AutoFilter geändert :) –

Antwort

0
+0

fehlen dir die nachlaufenden Klammern in Zeile 17: .AutoFilter() statt .AutoFilter – jeremyforan

+0

Hey Jeremy danke für den Tipp. Ja ich hatte das() vergessen. Ich denke mein Konzept ist jedoch fehlerhaft, da ich jetzt diesen Fehler bekomme "AutoFilter-Methode der Range-Klasse fehlgeschlagen". Ich versuche, einen Autofilter auf eine bereits existierende Tabelle anzuwenden (die die Spalten bereits gefiltert hat), also ist das vielleicht das Auflegen. Oder wahrscheinlich bin ich nicht in der Lage, durch einen Autofilter() in der Art, wie ich bin zu codieren. Danke für die Hilfe. Ich könnte in der Lage sein, etwas von diesen Links zu stehlen –

+0

Ihre beste Wette ist es, ein vorhandenes Blatt zu lesen und dann die Filter als Python-Code auszuführen, und die Ergebnisse in ein neues Excel-Blatt auszugeben. Meiner Erfahrung nach ist das Lesen einfach, das Schreiben ist einfach, aber das Lesen und Schreiben derselben komplexen Excel-Datei ist eine Herausforderung. – jeremyforan

0

Sie versuchen, über die Methode Referenz Autofilter, und nicht den Rückgabewert (e) Autofilter() iterieren. Indem Sie die Klammern hinzufügen, rufen Sie die Methode auf. Ohne die Klammern haben Sie nur einen Verweis auf diese Methode.

+0

Hey Raphael, danke für die Post. Ja ich hatte das() vergessen. Ich stoße jetzt jedoch auf einen anderen Fehler (AutoFilter-Methode der Range-Klasse ist fehlgeschlagen), daher glaube ich, dass mein Konzept, auf diese Weise durch einen Autofilter zu iterieren, nicht korrekt ist. Die Spalte, die ich filtern möchte, hat bereits einen vorhandenen Filter (es ist Teil einer Tabelle). Wenn ich also nur auf diesen Filter tippen und die Kriterien extrahieren kann, die mein Ziel erreichen würden! –

0

Ich fand es heraus für jeden interessierten. Es wurde festgestellt, dass auf die Spalte, auf die ich zugreifen wollte, sowie auf ein Pivot-Feld in einer Pivot-Tabelle verwiesen wurde. Sobald ich in der Lage war, den Inhalt dieses Pivotfields zu lesen, konnte ich es dann in ein Array leiten (und dann dieses Array verwenden, um PDF-Rechnungen auszudrucken). Hatte einige seltsame Codierung, aber löste das mit der setdefaultcoding-Funktion. Hier ist der Code:

import win32com.client as win32 
import sys 

reload(sys) 
sys.setdefaultencoding("UTF-8") 

working_dir = 'C:\\invoice\\' 
save_dir = 'C:\\test\\' 

xl = win32.gencache.EnsureDispatch("Excel.Application") 
xl.Visible = True 

template_wb = xl.Workbooks.Open(working_dir + 'Settlement report V6- TEMPLATE.xlsm') 

#Worksheets 
settlements_ws = template_wb.Sheets('Settlement') 
orgdata_ws = template_wb.Sheets('Organization Data') 
masterdata_ws = template_wb.Sheets('Master Data') 

settlements_ws.Activate() 

agencies = [] 

def maxrow(sheet): 
    used = sheet.UsedRange 
    nrows = used.Row + used.Rows.Count - 1 
    return nrows 

mypivot = settlements_ws.PivotTables("PivotTable2").PivotFields("AgencyName") 

for j in mypivot.PivotItems(): 
    j = str(j) 
    if j == "#N/A": 
     continue 
    else: 
     j = j.replace("\xc2\xa0","") 
     agencies.append(j) 
print agencies 

#Looping through agencies and saving PDFs 
for i in agencies: 
    settlements_ws.Cells(8,3).Value = i 
    print settlements_ws.Cells(8,3).Value 
    settlements_ws.ExportAsFixedFormat(0, save_dir + i + '.pdf') 

print "Finished!" 
Verwandte Themen