2016-05-31 452 views
0

這可能是一項簡單的任務,但對於我而言,我找不到解決方案。我有一個有表格的excel文檔。該表中的列都應用了自動篩選器。我想要做的就是能夠選擇該自動過濾器中的所有條目(第9列)並將其存儲在數組中。我正在使用Win32Com。Python-如何在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

你會得到什麼異常/錯誤? –

+0

嗨拉斐爾,與此特定的代碼,我收到此錯誤: TypeError:'instancemethod'對象不可迭代。 但很有可能我沒有使用正確的方法來實現我的目標。也快速更新我改變了自動過濾器爲自動過濾器:) –

回答

0
+0

你是否錯過了第17行的尾部括號:.AutoFilter()而不是.AutoFilter – jeremyforan

+0

嘿傑里米謝謝你的提示。是的,我忘記了()。我認爲我的概念是有缺陷的,因爲我現在得到這個錯誤「Range類失敗的AutoFilter方法」。我試圖將自動篩選器應用到預先存在的表格(已經過濾了列),所以也許這是掛斷。或者我可能無法按照我編碼的方式迭代autofilter()。感謝您的幫助,但;我可能會從這些鏈接中偷取一些東西 –

+0

您最好的選擇是讀取現有工作表,然後將過濾器作爲python代碼運行,並將結果輸出到新的Excel工作表。根據我的經驗,閱讀很容易,寫作很容易,但讀寫同一個複雜的excel文件具有挑戰性 – jeremyforan

0

你試圖遍歷方法參考Autofilter,而不是它的返回值(一個或多個)Autofilter()。通過添加括號,您可以調用該方法。沒有括號,你只需要引用該方法。

+0

嘿拉斐爾,謝謝你的帖子。是的,我忘記了()。然而,現在我遇到了一個不同的錯誤(Range類的AutoFilter方法失敗),所以我相信我以這種方式迭代autofilter的概念是不正確的。我試圖過濾的列已經有一個預先存在的過濾器(它是表格的一部分),所以如果我只需點擊過濾器並提取完成我的目標的標準即可! –

0

我想出了任何有興趣的人。發現我想訪問的列被引用以及數據透視表中的數據透視字段。因此,一旦我能夠讀取該pivotfield的內容,我就可以將其轉換爲數組(然後使用該數組來打印pdf發票)。有一些編碼古怪,但用setdefaultcoding函數解決了這個問題。這裏是代碼:

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!"