65

私は巨大な Excel 2007 ファイルを処理するアプリケーションに取り組んでおり、そのためにOpenPyXLを使用しています。OpenPyXL には、Excel ファイルを読み取る 2 つの異なる方法があります。1 つはドキュメント全体を一度にメモリにロードする「通常の」方法で、もう 1 つはイテレータを使用して行ごとに読み取る方法です。

問題は、反復子メソッドを使用しているときに、列幅や行/列数などのドキュメント メタデータを取得できないことです。このデータが本当に必要です。このデータは Excel ドキュメントの一番上に保存されていると想定しているため、アクセスするために 10MB のファイル全体をメモリにロードする必要はありません。

では、最初にドキュメント全体をメモリにロードせずに、行/列の数と列の幅を把握する方法はありますか?

4

6 に答える 6

128

Hubro の発言に加えて、どうやらget_highest_row()非推奨になったようです。max_rowプロパティとプロパティを使用するとmax_column、行数と列数が返されます。例えば:

    wb = load_workbook(path, use_iterators=True)
    sheet = wb.worksheets[0]

    row_count = sheet.max_row
    column_count = sheet.max_column
于 2015-09-10T22:52:10.113 に答える
17

この回答で提案されている解決策は廃止されており、機能しなくなる可能性があります。


OpenPyXL ( IterableWorksheet ) のソース コードを見てみると、イテレータ ワークシートから列と行の数を取得する方法がわかりました。

wb = load_workbook(path, use_iterators=True)
sheet = wb.worksheets[0]

row_count = sheet.get_highest_row() - 1
column_count = letter_to_index(sheet.get_highest_column()) + 1

IterableWorksheet.get_highest_column「A」、「B」、「C」など、Excel で表示される列文字を含む文字列を返します。したがって、列文字をゼロベースのインデックスに変換する関数も作成しました。

def letter_to_index(letter):
    """Converts a column letter, e.g. "A", "B", "AA", "BC" etc. to a zero based
    column index.

    A becomes 0, B becomes 1, Z becomes 25, AA becomes 26 etc.

    Args:
        letter (str): The column index letter.
    Returns:
        The column index as an integer.
    """
    letter = letter.upper()
    result = 0

    for index, char in enumerate(reversed(letter)):
        # Get the ASCII number of the letter and subtract 64 so that A
        # corresponds to 1.
        num = ord(char) - 64

        # Multiply the number with 26 to the power of `index` to get the correct
        # value of the letter based on it's index in the string.
        final_num = (26 ** index) * num

        result += final_num

    # Subtract 1 from the result to make it zero-based before returning.
    return result - 1

ただし、列のサイズを取得する方法がまだわかっていないため、アプリケーションで固定幅フォントと自動的にスケーリングされた列を使用することにしました。

于 2012-11-14T14:32:13.663 に答える
3

パイソン3

import openpyxl as xl

wb = xl.load_workbook("Sample.xlsx", enumerate)

#the 2 lines under do the same. 
sheet = wb.get_sheet_by_name('sheet') 
sheet = wb.worksheets[0]

row_count = sheet.max_row
column_count = sheet.max_column

#this works fore me.
于 2019-10-15T07:55:39.653 に答える
2

これは非常に複雑で、明らかなことを見逃している可能性がありますが、OpenPyXL が Iterable Worksheets の column_dimensions に入力されていない場合 (上記の私のコメントを参照)、すべてをロードせずに列のサイズを見つけることができる唯一の方法は、xml を直接解析することです。 :

from xml.etree.ElementTree import iterparse
from openpyxl import load_workbook
wb=load_workbook("/path/to/workbook.xlsx", use_iterators=True)
ws=wb.worksheets[0]
xml = ws._xml_source
xml.seek(0)

for _,x in iterparse(xml):

    name= x.tag.split("}")[-1]
    if name=="col":
        print "Column %(max)s: Width: %(width)s"%x.attrib # width = x.attrib["width"]

    if name=="cols":
        print "break before reading the rest of the file"
        break
于 2012-11-15T12:27:49.483 に答える