2017-01-29 4 views
-2

openpyxl로 작업 할 때 스프레드 시트 파일 끝까지 도달했는지 쉽게 알 수 있습니까? 아니면 누군가 파이썬 3에서이 작업을 코딩하는 방법을 쉽게 알 수 있습니까? 나는 행을 반복하는 프로그램에 대해 작업하고 있는데, &은 특정 데이터를 다시 씁니다. 처음에 숫자를 입력 할 필요없이 프로그램 자체에서 루프 밖으로 벗어날 수 있기를 바랍니다.스프레드 시트에서 파일 끝 찾기

현재, 난 그냥 다음 루프를 사용하고 있지만이 파일이 라인 49에서 끝 알고 있기 때문에에만 작동합니다

while i <=50: 

내가 행에 여러 개의 빈 줄을 확인 무언가를 고려하고, 이 코드 조각처럼 루프를 시작하지만 매우 불완전 보인다합니다 :

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로를 열고 내가 정규식을 사용하여 각각의 시트에서 원하는 데이터를 잡아 경향이있다. 나를 위해 잘 작동합니다.

다음은 예제입니다. 그것은 일년 내내 작업 표가 들어있는 xlsx 파일에서 다른 프로젝트에서 작업 한 시간을 추출합니다. 하나의 작업 일을 나타내는 모든 시트에 대해 특정 셀 범위에서 프로젝트 번호와 시간을 추출해야합니다.

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()"는 간단한 카운터에 설정 한 것과 동일한 값을 필요로합니다. 나는 프로그램이 그 가치가 무엇인지 스스로 결정할 수있는 방법을 찾으려고 노력하고있다. 또한이 스프레드 시트를받는 방식이 형식화되어 있으므로 모든 행을 살펴보고 싶지는 않습니다. 간단한 카운터 루프를 늘리면 원하지 않는 것들을 피할 수 있습니다. 그래서 전 제 문제를 해결할 때가 아닙니다. – Reuben

관련 문제