2016-05-31 8 views
0

これは簡単な作業ですが、私の人生では解決策を見つけることができません。私はテーブルを持つ優れた文書を持っています。この表の列には、すべてオートフィルタが適用されています。私がしたいのは、そのオートフィルター(9番目の列)のすべての項目を選択して配列に格納できることだけです。私はWin32Comを使用しています。Python - Excel AutoFilterで選択項目を表示する方法

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

Raphaelこんにちは、この特定のコードで、私はこのエラーが表示されます: TypeError: 'instancemethod'オブジェクトはiterableではありません。 しかし、目標を達成するために正しい方法を使用していない可能性が高いです。また、私は自動フィルタをAutoFilterに変更しました:) –

答えて

0

私は私の最初のスクリプトを覚えて....

あなたは、Win32と結婚していますか?

https://mail.python.org/pipermail/python-list/2011-October/613213.html

Python - How to turn-on Excel Auto Filter on cells in non-first row?

+0

17行目の末尾に括弧がありません:.AutoFilterの代わりに.AutoFilter() – jeremyforan

+0

こんにちはジェレミーさんに感謝します。うん、私は忘れてしまった。私は私のコンセプトに欠陥があると思うが、私は今このエラー "Rangeクラスのオートフィルタメソッドが失敗した"を取得しているからだ。私は既存のテーブル(すでにフィルタリングされたカラムを持つ)にオートフィルタを適用しようとしています。これはおそらくハングアップです。あるいは、私がコーディングしている方法でオートフィルター()を繰り返し処理することができません。しかし、助けてくれてありがとう。私はそれらのリンクからいくつかのものを盗むことができるかもしれない –

+0

あなたの最善の策は、既存のシートの読み取りを行い、Pythonコードとしてフィルタを実行し、新しいExcelシートに結果を出力することです。私の経験では、読書は簡単ですが、書いても簡単ですが、同じ複合語を読み書きすることは難しいです。 – jeremyforan

0

あなたはメソッド参照Autofilterはなく、その戻り値(S)Autofilter()を反復しようとしています。角括弧を追加すると、メソッドが呼び出されます。角かっこがなければ、そのメソッドへの参照があります。

+0

ラファエルは、この投稿に感謝します。うん、私は忘れてしまった。私は今、別のエラーに遭遇しますが(RangeクラスのAutoFilterメソッドは失敗しました)、私はこのような方法でオートフィルタを反復するという私の考え方は間違っていると思います。私がフィルタリングしようとしている列には、既存のフィルタ(テーブルの一部です)があります。そのフィルタをタップして目標を達成するための基準を抽出するだけです。 –

0

私は興味を持った人のためにそれを理解しました。私がアクセスしたいと思った列がピボットテーブルのピボットフィールドと同様に参照されていることがわかります。だから私はピボットフィールドの内容を読み取ることができた後、私はそれを配列に(そして、その配列を使用して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!" 
関連する問題