Pythonのお勉強:OpenPyXLでEXCELのワークブックの内容を修正する

OpenPyXl

前の記事「【OpenPyXl】Tutorial:Create a Workbok」でOpenPyXlを使用して作成した下記掲載のExcelファイル「Creatte_a_workbook.xls」を読み込んで内容修正するサンプルプログラム「Fix_the_workbook.py」を作成してみました。

修正前のExcelファイル「Creatte_a_workbook.xls」

  • OpenPyXlを使用したプログラムで新規作成した’myws_2′, ‘myws_0’, ‘myws_3’, ‘myws_1’という名前の4枚のシートがあるブックで、各シートの1’A1’セルに説明文が入っています。

修正後のExcelファイル「Creatte_a_workbook.xls」

  • 修正前のExcelファイルに以下の処理を行って作成しました。
    • ①myws_0シートを削除しました
    • ②myws_1シートを先頭に移動しました
    • ③各シートのセルに実施内容を書き込みました
    • ↓ 下記のハイパーリンク作成も行いました ↓
      • myws_1へ移動
      • myws_2へ移動
      • myws_3へ移動
    • ④シートセルのサイズ調整を行いました
    • ⑤シートセルの表示位置調整を行いました

「Tutorial:Fix_the_workbook」の自作サンプルプログラム (「Fix_the_workbook.py」)

上記の処理を行ったサンプルプログラムを以下に記載します。

  • 「Fix_the_workbook.py」
    from openpyxl import load_workbook
    from openpyxl.styles.alignment import Alignment
    
    load_filename = 'Creatte_a_workbook.xlsx'
    wb = load_workbook(filename = load_filename)
    
    # シートの配列順を表示
    print(wb.sheetnames)
    # ['myws_2', 'myws_0', 'myws_3', 'myws_1']
    
    # シートを変数に格納
    myws_2 = wb.worksheets[0]
    myws_0 = wb.worksheets[1]
    myws_3 = wb.worksheets[2]
    myws_1 = wb.worksheets[3]
    
    # 'myws_0'シートを削除
    wb.remove(myws_0)
    print(wb.sheetnames)
    # ['myws_2', 'myws_3', 'myws_1']
    # シートを変数に再格納
    myws_2 = wb.worksheets[0]
    myws_3 = wb.worksheets[1]
    myws_1 = wb.worksheets[2]
    
    # 'myws_1'シートを先頭「offset=-2」に移動
    wb.move_sheet(myws_1,offset=-2)
    print(wb.sheetnames)
    # ['myws_1', 'myws_2', 'myws_3']
    myws_1 = wb.worksheets[0]
    myws_2 = wb.worksheets[1]
    myws_3 = wb.worksheets[2]
    
    # 全シートのセルに【今回の修正内容】を書き込む
    for ws in wb.worksheets:
        print(ws.title)
    
        # セルに書き込み
        ws['A3'] = '【サンプルプログラムの実施内容】'
        ws['A4'] = '-------------------------------'
        ws['A5'] = '①' 
        ws['B5'] = 'myws_0シートを削除しました'
        ws['A6'] = '②' 
        ws['B6'] = 'myws_1シートを先頭に移動しました'
        ws['A7'] = '③'  
        ws['B7'] = '各シートのセルに実施内容を書き込みました'
        ws['B8'] = '↓ 下記のハイパーリンク作成も行いました ↓'
        # ハイパーリンクの作成
        if ws.title=='myws_1':
            ws['A9'] = '*'
        else:
            ws['A9'] = ''
        ws['B9'] = '=HYPERLINK(”#myws_1!B9”,”myws_1へ移動”)'
    
        if ws.title=='myws_2':
            ws['A10'] = '*'
        else:
            ws['A10'] = ''
        ws['B10'] = '=HYPERLINK(”#myws_2!B10”,”myws_2へ移動”)'
    
        if ws.title=='myws_3':
            ws['A11'] = '*'
        else:
            ws['A11'] = ''
        ws['B11'] = '=HYPERLINK(”#myws_3!B11”,”myws_3へ移動”)'
        ws['A12'] = '④' 
        ws['B12'] = 'シートセルのサイズ調整を行いました'
        ws['A13'] = '⑤'  
        ws['B13'] = 'シートセルの表示位置調整を行いました'
    
        # シートセルのサイズ調整
        # 列幅の変更
        for col_no in range(ord('A'),ord('Z')+1):
            ws.column_dimensions[chr(col_no)].width = 5
        # 行高さの変更
        for row_no in range(1,15):
            ws.row_dimensions[row_no].height = 21
    
        # シートセルの表示位置調整
        # シートセル全体の水平方向を左寄せ、高さ方向を中央揃え
        for col in ws:
            for cell in col:
                cell.alignment = Alignment(horizontal='left',vertical='center')
        # シートセル範囲'A5:A15'の水平方向を右寄せ、高さ方向を中央揃え
        for row in ws['A5:A15']:
            for cell in row:
                cell.alignment = Alignment(horizontal='right',vertical='center') 
    
    # 修正したファイルを別名で保存
    save_filename = 'Fixed_Workbook.xlsx'
    wb.save(filename = save_filename)
    wb.close()
    

サンプルプログラム作成で得られた知見

  • OpenPyXLを用いて既存のエクセルファイルを読み込む場合は、「load_workbook」を指定してインポートする。
    from openpyxl import load_workbook
    
  • シートセルの表示位置調整を行うためには、「Alignment」関数をインポートする。
    from openpyxl.styles.alignment import Alignment
    
  • 既存ファイル「Creatte_a_workbook.xlsx’」は、Workbookクラスのload_workbookメソッドにExcelファイル(PATH含む)を指定して Workbookオブジェクト(wb)を取得する。
    load_filename = 'Creatte_a_workbook.xlsx'
    wb = load_workbook(filename = load_filename)
    
  • Workbookオブジェクト(wb)のシート削除は、Workbookクラスのremoveメソッドにシート名を指定して行う。
    wb.remove(myws_0)
    
  • Workbookオブジェクト(wb)のシート移動は、Workbookクラスmove_sheetメソッドにワークシート名とオフセット値を指定して行う。
    wb.move_sheet(myws_1,offset=-2)
    
  • 以下の「for文」でWorkbookオブジェクト(wb)内にある全てのワークシートオブジェクト(ws)が取得できる。
    for ws in wb.worksheets:
    
  • セルにExcelのHYPERLINK関数を書き込んで、別ワークシートへのリンクが作成できる。
    ws['B9'] = '=HYPERLINK(”#myws_1!B9”,”myws_1へ移動”)'
    
  • 以下の「for文」で、列範囲(例ではAからZ列)を指定してワークシート列幅の変更ができる。
    for col_no in range(ord('A'),ord('Z')+1):
        ws.column_dimensions[chr(col_no)].width = 5
    
  • 以下の「for文」で、行範囲(例では1行から14行)を指定してワークシート行高さの変更ができる。
    for row_no in range(1,15):
        ws.row_dimensions[row_no].height = 21
    
  • 以下の「for文」で、ワークシートセル全体の表示位置調整ができる。
    from openpyxl.styles.alignment import Alignment
    :
    for col in ws:
        for cell in col:
            cell.alignment = Alignment(horizontal='left',vertical='center')
    
  • 以下の「for文」で、ワークシートセル範囲(以下では’A5:A15’)の表示位置調整ができる。
    for row in ws['A5:A15']:from openpyxl.styles.alignment import Alignment
    :
        for cell in row:
            cell.alignment = Alignment(horizontal='right',vertical='center')
    
  • 修正したExcelファイルは、Workbookクラスのsaveメソッドにファイル名を指定して別名でファイル保存ができる。
    save_filename = 'Fixed_Workbook.xlsx'
    wb.save(filename = save_filename)
    

管理人がPythonの勉強のために購入した本

コメント