pythonでエクセル操作をChatGPTに聞いてみた（罫線、スタイル）


エクセルの操作で、
指定した範囲の「外側」に罫線を設定したかったので
色々調べながら自力でやろうとしましたが挫折。。。

ChatGPTに作ってもらいました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638856/2cf7f7e5-c875-f14f-f136-1b8654a7f732.png)

ただ下記の質問をするまでにopenxlsxに関する質問を色々していたので
まっさらな状態からこれだけでちゃんとした答えは返ってこないかも？
```ChatGPT.質問
X,YからN行M列の範囲に枠線を設定する関数。
ただし
X行のtop
X+N行のbottom
Y列のleft
Y+M列のreght
を設定
複数条件当てはまるセルは線を追加
また、線のスタイル、色も指定できるように
```

ついでに一律スタイル操作についても聞いた
```ChatGPT.質問
指定した範囲の枠線(上下左右は同じ条件)、塗りつぶし、フォント色、太字を設定する関数
```

最終的にこっちでまとめたものがこれ
```xlsx_sty.py
from openpyxl import Workbook
from openpyxl.styles import Border, Side, PatternFill, Font

def set_cell_style(ws, start_row, start_col, num_rows, num_cols,
                   border_style="thin", fill_color="FFFFFF", font_color="000000", bold=False):
    """
    指定した範囲のセルに枠線、塗りつぶし、フォント色、太字を設定する関数。

    Args:
        ws: 操作対象のワークシート
        start_row: 範囲の開始行
        start_col: 範囲の開始列
        num_rows: 行数
        num_cols: 列数
        border_style: 枠線のスタイル（デフォルトは"thin"）
        fill_color: 塗りつぶしの色（デフォルトは白）
        font_color: フォントの色（デフォルトは黒）
        bold: フォントを太字にするかどうか（デフォルトはFalse）
    """
    # 枠線の設定
    border = Border(
        left=Side(border_style=border_style, color="000000"),
        right=Side(border_style=border_style, color="000000"),
        top=Side(border_style=border_style, color="000000"),
        bottom=Side(border_style=border_style, color="000000"),
    )

    # 塗りつぶしの設定
    fill = PatternFill(start_color=fill_color, end_color=fill_color, fill_type="solid")

    # フォントの設定
    font = Font(color=font_color, bold=bold)

    # セル範囲にスタイルを適用
    for row in range(start_row, start_row + num_rows):
        for col in range(start_col, start_col + num_cols):
            cell = ws.cell(row=row, column=col)
            cell.border = border
            cell.fill = fill
            cell.font = font
#enddef set_cell_style




def set_outerborder(ws, start_row, start_col, num_rows, num_cols, 
                top_style=None, bottom_style=None, left_style=None, right_style=None):
    """
    指定した範囲のセルの外側に枠線を設定する関数。

    Args:
        ws: 操作対象のワークシート
        start_row: 範囲の開始行
        start_col: 範囲の開始列
        num_rows: 行数
        num_cols: 列数
        top_style: 上側の枠線のスタイル（Noneでデフォルト）
        bottom_style: 下側の枠線のスタイル（Noneでデフォルト）
        left_style: 左側の枠線のスタイル（Noneでデフォルト）
        right_style: 右側の枠線のスタイル（Noneでデフォルト）
    """
    # 枠線の設定
    top = Side(border_style=top_style, color="000000") if top_style else None
    bottom = Side(border_style=bottom_style, color="000000") if bottom_style else None
    left = Side(border_style=left_style, color="000000") if left_style else None
    right = Side(border_style=right_style, color="000000") if right_style else None

    # セル範囲に枠線を設定
    for row in range(start_row, start_row + num_rows):
        for col in range(start_col, start_col + num_cols):
            cell = ws.cell(row=row, column=col)
            cell.border = Border(
                left=left if col == start_col else cell.border.left,
                right=right if col == start_col + num_cols - 1 else cell.border.right,
                top=top if row == start_row else cell.border.top,
                bottom=bottom if row == start_row + num_rows - 1 else cell.border.bottom
            )
#enddef set_borders

# 使用例
wb = Workbook()
ws = wb.active

# 例としてデータを入力
for i in range(1, 6):
    for j in range(1, 4):
        ws.cell(row=i, column=j, value=f"セル({i}, {j})")

"""
hair:極細
thin:通常の太さ
medium:通常と太線の中間
thick:太線
double:二重線
dashDot
dashDotDot
dotted
"""

# B3からD6の範囲にスタイルを設定
set_cell_style(ws, 2, 2, 5, 3, border_style="dashDot", fill_color="FFFF00", font_color="FF0000", bold=True)

# B3からD6の範囲の外側枠線を設定
set_outerborder(ws, 2, 2, 5, 3, top_style="double", bottom_style="double", left_style="thick", right_style="thick")

# Excelファイルを保存
wb.save("set_borders_example.xlsx")

```