2017-01-09 24 views
2

pythonのサードパーティ製のopenpyxlを使用してデータを表にするためにテーブルを作成しようとしています。 コードの最初のforステートメントはセル 'A5'からセル 'E5'への行線を描画します 2番目のforステートメントはセル 'A6'からセル 'E6'に別の行線を描画します3番目のforステートメントは列を描画しますセル 'C5'からセル 'C9'への線 第4のforステートメントは、セル 'F5からセル'に別の列を描画するF9 'Openpyxl別の境界線との交差点で境界線が破損する

ただし、セル' C5 'から' C9 'セル 'A5から' E5 'と' A6 'から' E6 'までの行線と交差すると、 は' C5 'ではなく' C7 'で描画を開始します。

セル 'F5': 'F9'から描画された列の境界線は完全に正常に機能しましたが、 (私は作成されているテーブルの画像を投稿しましたが、10未満の評判を持っています) どこかに間違っていますか?

from openpyxl import Workbook 
from openpyxl.styles import Border, Side 
wb = Workbook() 
ws = wb.active 
ws.sheet_view.showGridLines = False 

column_border = Border(left=Side(style='thin')) 
row_border = Border(top=Side(style='thin')) 

for col in ws['C5:C9']: 
    for cell in col: 
     cell.border = column_border 
for col in ws['F5:F9']: 
    for cell in col: 
     cell.border = column_border 

for row in ws['A5:E5']: 
    for cell in row: 
     cell.border = row_border 
for col in ws['A6:E6']: 
    for cell in col: 
     cell.border = row_border 

wb.save('a.xlsx') 

答えて

1

問題は、交差するセルのBorderオブジェクトを上書きしてしまうことです。最初の2つのループは、セルの境界線オブジェクトを左側の細い線に設定します。次の2つのループは、セルの境界オブジェクトをTopのThin Lineに設定しますが、これは最上部の行を作成した元のBorderオブジェクトを削除します。

私がお勧めしたいのは、境界オブジェクトを追加する2つのメソッドを作成することです。このメソッドは、境界線がすでに存在するかどうかをチェックします。もしそうなら、それを置き換えるのではなく、それを増やすだろう。次に、直接割り当てを行うのではなく、ループ内でこれらのメソッドを呼び出します。

このコードは機能しないかもしれません。私の現在のシステムにはOpenPyXLがインストールされていないため、インストールするには管理者権限が必要です。

def add_row_boarder(row_cell): 
    if row_cell.border = None: 
     row_cell.border = row_border 
    else: 
     row_cell.border.top = Side(style='thin') 
    return row_cell 

def add_col_boarder(col_cell): 
    if col_cell.border = None: 
     col_cell.border = col_border 
    else: 
     col_cell.border.left = Side(style='thin') 
    return col_cel 
+0

ありがとう。最初の声明は私に問題の理解を与えました、私は本当に交差していました - 罫線 – Qudus

1

Robノートでは、一部のセルの境界を上書きしています。セルの範囲をフォーマットする一般的なアプローチはdocumentationで提供されていますが、基本的にはスタイルを組み合わせるだけです。cell.border = cell.border + row_border

+0

スタイルの組み合わせはうまくいきました。ありがとう – Qudus

関連する問題