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 파일을 나열.
이것은 API 사용 방법이 아닙니다. openpyxl 문서를 읽는 데 조금 더 시간을 할애하십시오. –