2016-05-31 5 views
0

Cela peut être une tâche simple mais pour la vie de moi, je ne trouve pas de solution. J'ai un document Excel qui a une table. Les colonnes de cette table ont toutes des filtres automatiques appliqués. Tout ce que je veux faire est de pouvoir sélectionner toutes les entrées dans cet autofiltre (pour la 9ème colonne) et de le stocker dans un tableau. J'utilise Win32Com.Python- Comment montrer les sélections dans un filtre automatique Excel

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

Quelle exception/erreur obtenez-vous? –

+0

Salut Raphael, avec ce code spécifique, je reçois cette erreur: TypeError: l'objet 'instancemethod' n'est pas itérable. Mais il est très probable que je n'utilise pas la bonne méthode pour essayer d'atteindre mon objectif. Aussi mise à jour rapide j'ai changé Autofilter à AutoFilter :) –

Répondre

0
+0

vous manque les parenthèses à la ligne 17: .AutoFilter() au lieu de .AutoFilter – jeremyforan

+0

Hey Jeremy merci pour le conseil. Ouais j'avais oublié le(). Je pense que mon concept est défectueux bien que je reçois maintenant cette erreur "méthode AutoFilter de classe de classe a échoué". Im essayant d'appliquer un autofilter à une table pré-existante (qui a déjà filtré les colonnes) alors peut-être que c'est le raccrochage. Ou probablement je ne suis pas capable de parcourir un autofiltre() de la façon dont je suis en train de coder. Merci pour l'aide en tout cas; Je pourrais être en mesure de voler quelques trucs à partir de ces liens –

+0

votre meilleur pari est de faire une lecture d'une feuille existante, puis exécutez les filtres en code python, et afficher les résultats dans une nouvelle feuille Excel. Dans mon expérience, la lecture est facile, l'écriture est facile, mais la lecture et l'écriture du même fichier complexe Excel est difficile – jeremyforan

0

Vous essayez de itérer sur la référence de la méthode Autofilter, et non sa valeur de retour (s) Autofilter(). En ajoutant les parenthèses, vous appelez la méthode. Sans les crochets, vous avez juste une référence à cette méthode.

+0

Hey Raphael, merci pour le poste. Ouais j'avais oublié le(). Je rencontre cependant une erreur différente (la méthode AutoFilter de la classe Range a échoué), donc je crois que mon concept d'itération à travers un autofiltre n'est pas correct. La colonne que j'essaie de filtrer a déjà un filtre pré-existant sur elle (il fait partie d'une table), donc si je peux juste puiser dans ce filtre et extraire les critères qui permettrait d'atteindre mon objectif! –

0

Je l'ai trouvé pour toute personne intéressée. Il s'avère que la colonne que j'ai voulu accéder a été référencée ainsi qu'un champ de tableau croisé dynamique dans un tableau croisé dynamique. Donc, une fois que j'ai été capable de lire le contenu de ce pivot, je pouvais ensuite l'acheminer dans un tableau (et ensuite utiliser ce tableau pour imprimer les factures PDF). Avait un peu d'étrangeté d'encodage mais résolu avec la fonction setdefaultcoding. Voici le 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!"