2017-01-29 4 views
-2

openpyxlを使用しているときにスプレッドシートファイルの終わりに達したことを通知する簡単な方法はありますか?あるいは誰かがPython3でこのタスクをどのようにコーディングするのかを簡単に知ることができますか?私は行を反復するプログラムに取り組んでいます。&は特定のデータを書き換えます。私は、最初に数字を入力しなくても、プログラムをループから飛び越えることができるようにしたい。スプレッドシートでのファイルの終わりの検索

while i <=50: 

私は行のいくつかの空白行をチェックすると何かを検討していた、:現在、私は、次のループを使用していますが、私は、ファイルが行49で終了知っているので、それだけで動作します

、コードのこの作品のようなループを開始するが、非常に不完全なようだ:

while sheet["A"+str(i)].value!=0 and sheet["A"+str(i+1)].value!=0 and sheet["A"+str(i+2)].value!=0: 

任意の提案が参考になります。

おかげ


は簡単な答えは次のとおりです。

lastrow=sheet.max_row

ループカウンタは、その後lastrowで終了するように設定することができます。

入力いただきありがとうございます。

残念ながら、私が利用しているopenpyxlのドキュメントには、この機能がリストされていません、Charlie。

+0

これは、APIを使用する最も確実な方法ではありません。 openpyxlのドキュメントを読んでもう少し時間をかけてください。 –

答えて

1

openpyxl.worksheet.Worksheet.iter_rows()またはopenpyxl.worksheet.Worksheet.iter_columns()メソッドを使用してワークシートを反復処理できます。

openpyxl.worksheet.Worksheet.rowsまたはopenpyxl.worksheet.Worksheet.columsプロパティを使用することもできます。これらは、ファイル全体を処理するはずのイテレータです。


しかしxlsxファイルを読み込むの私自身の限定された目的のために、私はちょうどZipFileとしてそれらを開いて、私は正規表現を使用して個々のシートから必要なデータをつかむ傾向にあります。私のためにうまく動作します。

以下は例です。 1年間のタイムシートを含むxlsxファイルからさまざまなプロジェクトで作業した時間を抽出します。すべてのシート(1つの勤務日を表す)に対して、私はプロジェクト番号と時間を特定の範囲のセルから抽出する必要があります。

from collections import defaultdict 
from zipfile import ZipFile 
import os.path 
import re 
import sys 

__version__ = '1.1.0' 


if len(sys.argv) == 1: 
    binary = os.path.basename(sys.argv[0]) 
    print("{} ver. {}".format(binary, __version__), file=sys.stderr) 
    print("Usage: {} [file ...]".format(binary), file=sys.stderr) 
    sys.exit(0) 
del sys.argv[0] # delete the name of the script. 
# Real work starts here. 
projects = defaultdict(int) 
wbre = re.compile('<sheet name="[0-9]{4}-?[0-9]{1,2}-?[0-9]{1,2}' 
       '".*?"rId([0-9]{1,3})"/>') 
Anum = re.compile('<c r="A([0-9]{1,2})" s="[^"]+"><v>(.*?)</v></c>') 
Astr = re.compile('<c r="A([0-9]{1,2})" s="[^"]+" t="s"><v>(.*?)</v></c>') 
shre = re.compile('<t[^>]*>(.*?)</t>') 
Fre = re.compile('<c r="F([0-9]{1,2})" s="[^"]+"><f.*?><v>(.*?)</v></c>') 
for fn in sys.argv: 
    z = ZipFile(fn) 
    # Create a list of the shared strings. 
    with z.open('xl/sharedStrings.xml') as sstr: 
     ssdata = sstr.read().decode('utf-8') 
    shstr = shre.findall(ssdata) 
    # Create a list of worksheet numbers. The name of the workheets matches 
    # NNNN-NN-NN where N is in 0--9. 
    with z.open('xl/workbook.xml') as wb: 
     wbdata = wb.read().decode('utf-8') 
    matches = wbre.findall(wbdata) 
    for shnum in matches: 
     with z.open('xl/worksheets/sheet{}.xml'.format(shnum)) as ws: 
      wsdata = ws.read().decode('utf-8') 
     # Extract the data from column A, rows 4 - 22. 
     A = {int(k): v for k, v in Anum.findall(wsdata) if 3 < int(k) < 23} 
     As = {int(k): shstr[int(v)] for k, v in Astr.findall(wsdata) 
      if 3 < int(k) < 23} 
     A.update(As) 
     # Extract the data from column F, rows 4 - 22. 
     F = {int(k): float(v) for k, v in Fre.findall(wsdata) 
      if 3 < int(k) < 23} 
     idxA, idxF = set(A.keys()), set(F.keys()) 
     # Cross-reference project numbers and hours. 
     for k in idxA & idxF: 
      projects[A[k]] += F[k] 
     for k in idxF - idxA: 
      projects['geen'] += F[k] 
    z.close() 
    t = sorted([(k, v) for k, v in projects.items()], key=lambda x: x[1], 
      reverse=True) 
    total = sum(d[1] for d in t) 
    for k, v in t: 
     print('{:5}: {:.1f} uur ({:.1f}%)'.format(k, v, 100*v/total)) 
    print('totaal: {:.0f} uur'.format(sum(projects.values()))) 

このコードを開発するために、私はXLSXファイルを解凍し、それらを人間が読みやすくするためにxmllint --formatでそれでXMLファイルをリストされています。

+0

実際には、これも動作していません。 "iter_rows()"には、単純なカウンタに設定したのと同じ値が必要です。私は、プログラムがそれらの値が何であるかを決める方法を見つけようとしています。また、これらのスプレッドシートがフォーマットされている方法は、私はすべての行を見たいとは思わない&簡単なカウンタループをincremeting私は私がしたくないものを避けることができます。だから、私は以前よりも私の問題を解決することに本当に近いです。 – Reuben

関連する問題