8

パンダのデータフレームを取得して数百のチャンクに分割し、各チャンクを個別のExcelファイルとして保存するスクリプトがあります。各チャンクの列数は同じですが、行数は異なります。openpyxlを使用して、これらのファイルに他のすべての必要なフォーマットを適用する方法を理解しましたが、境界線を適用する最速の方法をまだ決定していません。また、以下のコード(各セルを個別にループする必要はないと思われる)は境界線を適用しないため、境界線を正しく適用していないと思います。

from openpyxl.style import Border

wb = load_workbook(filename = _fname)
ws = wb.worksheets[0]  
for _row in ws.range('A1:L'+str(ws.get_highest_row() ) ):
    for _cell in _row:
            _cell.style.borders.left.border_style = Border.BORDER_THIN
            _cell.style.borders.right.border_style = Border.BORDER_THIN
            _cell.style.borders.top.border_style = Border.BORDER_THIN
            _cell.style.borders.bottom.border_style = Border.BORDER_THIN
wb.save(_fname)

したがって、このコードは機能しますが、私が期待する境界線(Excelのデフォルトの境界線)は適用されず、私が望むよりもはるかに多くの手順が必要になります。私の期待は、私がこのようなことをすることができるはずだということです:

from openpyxl.style import Border

wb = load_workbook(filename = _fname)
ws = wb.worksheets[0]

_range = ws.some_range_func('A1:L'+str(ws.get_highest_row() ) ):
    _range.style.borders.all_borders = Borders.BORDER_THIN

この機能は存在しますか?そうでない場合は、この少し太い境界線ではなく、デフォルトの境界線スタイルを適用する方法を少なくとも説明してくれる人がいますか?Border.BORDER_THICK、Border.BORDER_MEDIUM、Border.BORDER_THIN、Border.BORDER_HAIRのいずれも正しくないようです。

ありがとう!

4

9 に答える 9

8

これは便利かもしれません:

from openpyxl.reader.excel import load_workbook
from openpyxl.style import Border

def set_border(ws, cell_range):
    rows = was[cell_range]
    for row in rows:
        row[0].style.borders.left.border_style = Border.BORDER_THIN
        row[-1].style.borders.right.border_style = Border.BORDER_THIN
    for c in rows[0]:
        c.style.borders.top.border_style = Border.BORDER_THIN
    for c in rows[-1]:
        c.style.borders.bottom.border_style = Border.BORDER_THIN

#usage example:
ws = load_workbook('example.xlsx').get_active_sheet()
set_broder(ws, "C3:H10")

それはかなり速く実行されます。

于 2013-10-08T09:23:40.273 に答える
7

openpyxl==3.0.5 のより Pythonic な方法:

from openpyxl.styles import Border, Side

def set_border(ws, cell_range):
    thin = Side(border_style="thin", color="000000")
    for row in ws[cell_range]:
        for cell in row:
            cell.border = Border(top=thin, left=thin, right=thin, bottom=thin)

set_border(worksheet, 'A5:C10') 
于 2020-11-25T01:40:02.620 に答える
1

パンダのExcelデータフレームのスタイリング(境界線...)が必要な場合、フォークがマスターにマージされました https://github.com/pydata/pandas/pull/2370#issuecomment-10898427

あなたは国境の問題です。すべての境界線を一度に設定しても、openpyxl では動作しません。

In [34]: c.style.borders.all_borders.border_style = openpyxl.style.Border.BORDER_THIN

In [36]: c.style
'Calibri':11:False:False:False:False:'none':False:'FF000000':'none':0:'FFFFFFFF':'FF000000':'none':'FF000000':'none':'FF000000':'none':'FF000000':'none':'FF000000':'none':'FF000000':0:'thin':'FF000000':'none':'FF000000':'none':'FF000000':'none':'FF000000':'none':'FF000000':'general':'bottom':0:False:False:0:'General':0:'inherit':'inherit'

設定は個別に機能します ('thin':'FF000000')

In [37]: c.style.borders.top.border_style = openpyxl.style.Border.BORDER_THIN

In [38]: c.style
Out[38]: 'Calibri':11:False:False:False:False:'none':False:'FF000000':'none':0:'FFFFFFFF':'FF000000':'none':'FF000000':'none':'FF000000':'thin':'FF000000':'none':'FF000000':'none':'FF000000':0:'thin':'FF000000':'none':'FF000000':'none':'FF000000':'none':'FF000000':'none':'FF000000':'general':'bottom':0:False:False:0:'General':0:'inherit':'inherit'

おそらくopenpyxlのバグです。しかし、大したことはありませんが、関数内で設定のbottom、top、left、rightをラップするだけです

于 2012-11-30T18:36:58.710 に答える
-1

このタスクには組み込みがないようで、次のように自分でいくつかの手順を実行する必要があります。

#need make conversion from alphabet to number due to range function
def A2N(s,e):
    return range(ord(s), ord(e)+1)
#B1 is the border you defined
#Assume you trying border A1-Q1 ... A3-Q3
X = A2N('A','Q')
#print X    
your_desired_sheet_range_rows = range(1,4)
#need two loop to go through cells
for row in your_desired_sheet_rows:
    for col in X:
        ca = chr(col)
        sheet[ca+str(row)].border=B1
于 2017-09-26T03:10:46.033 に答える