29

ワークブックを保存する前に、列の幅を自動設定または自動調整できる Excel ワークブックを作成しようとしています。

xlrd をエミュレートする xlwt の関数 ( 、 、 、 など...) を見つけることを期待して、Python-Excel チュートリアルを読んでいsheet_names()ますcellname(row, col)cell_typeたとえばcell_value、次のようなものがあるとします。

from xlwt import Workbook    
wb = Workbook()
sh1 = wb.add_sheet('sheet1' , cell_overwrite_ok = True)    
sh2 = wb.get_sheet(0)

wb.get_sheet(0)rb.sheet_by_index(0)xlrd で提供される機能に似ていますが、前者ではコンテンツを変更できる点が異なります (ユーザーが設定した場合cell_overwrite_ok = True) 。

xlwt DOES が私が探している機能を提供すると仮定すると、すべてのワークシートをもう一度確認する予定でしたが、今回は特定の列で最も多くのスペースを占めるコンテンツを追跡し、それに基づいて列幅を設定します。もちろん、シートに書き込むときに特定の列の最大幅を追跡することもできますが、すべてのデータが既に書き込まれた後に幅を設定する方がきれいだと思います.

私がこれを行うことができるかどうか誰かが知っていますか? そうでない場合、列幅を調整するために何をすることをお勧めしますか?

4

6 に答える 6

48

入力した項目の幅を追跡するラッパー クラスを実装しました。それはかなりうまくいくようです。

import arial10

class FitSheetWrapper(object):
    """Try to fit columns to max size of any entry.
    To use, wrap this around a worksheet returned from the 
    workbook's add_sheet method, like follows:

        sheet = FitSheetWrapper(book.add_sheet(sheet_name))

    The worksheet interface remains the same: this is a drop-in wrapper
    for auto-sizing columns.
    """
    def __init__(self, sheet):
        self.sheet = sheet
        self.widths = dict()

    def write(self, r, c, label='', *args, **kwargs):
        self.sheet.write(r, c, label, *args, **kwargs)
        width = arial10.fitwidth(label)
        if width > self.widths.get(c, 0):
            self.widths[c] = width
            self.sheet.col(c).width = width

    def __getattr__(self, attr):
        return getattr(self.sheet, attr)

すべての魔法はJohn Yeung のarial10モジュールにあります。これは、既定の Excel フォントである Arial 10 に適した幅です。style他のフォントを使用してワークシートを書きたい場合は、理想的には に渡される引数を考慮して、fitwidth 関数を変更する必要がありますFitSheetWrapper.write

于 2012-02-04T02:30:13.603 に答える
5

xlwt には、これに対する自動機能はありません。書いているときに最大幅を追跡し、すべてのデータを見た後、ワークブックを保存する前に、最後に列幅を設定するという、説明した一般的なパターンに従う必要があります。

これ、Excel ファイルを処理する場合に利用できる最もクリーンで効率的な方法であることに注意してください。「データが既に書き込まれた後」という概念が、セルの値を既にコミットした後 (「書き込み」)、実際にワークブックを保存する前を意味する場合、上記の方法はまさにこれを行っています。ワークブックを既に保存した後である場合は、ワークブックを再度読み込んで最大幅を取得し、新しい列幅で再度保存します。、これははるかに遅くなり、xlwt と xlrd の両方を使用する必要があります (場合によっては xlutils も使用します)。また、正規の Microsoft Excel を使用している場合、ファイルを「更新」するという概念はありません。ユーザーの観点からはそのように思えるかもしれませんが、保存を行うたびに、Excel が既存のファイルを吹き飛ばし、まったく新しいファイルを最初から書き込んでいることが、舞台裏で起こっています。

于 2011-11-03T03:44:46.023 に答える
1

FitSheetWrapper は 3.3.4 の xlwt3 で少し変更する必要があります

19行目:

変化する:

width = arial10.fitwidth(label)

に:

width = int(arial10.fitwidth(label))  

理由: \Python\3.3.3\Lib\site-packages\xlwt3\biffrecords.py

1624 def __init__(self, first_col, last_col, width, xf_index, options):
1625        self._rec_data = pack('<6H', first_col, last_col, width, xf_index, options, 0)

幅は整数でなければなりません。

于 2014-05-30T04:04:45.017 に答える
1

私はこの方法を使用します:

wb = Workbook()
ws = wb.add_sheet('Sheet1')
columnwidth = {}
row = 0
for rowdata in data:
    column = 0
    for colomndata in rowdata:
        if column in columnwidth:
            if len(colomndata) > columnwidth[column]:
                columnwidth[column] = len(colomndata)
        else:
            columnwidth[column] = len(colomndata)
        ws.write(row, column, colomndata, style0)
        column = column + 1
    row = row + 1
for column, widthvalue in columnwidth.items():
    ws.col(column).width = (widthvalue + 4) * 367
于 2016-09-13T12:44:15.173 に答える