タグ: openpyxl

  • 【雑談】プログラミング学習初期に困ったこと

    今回はプログラミングを学ぶ上で最初につまづいたことを話していきます。


    まず自分は普段業務で扱っているExcelを自動化したいと思い、学習を始めました。


    少し調べると、Pythonはマイクロソフトのツールやスクレイピングなど、出来ることの幅が広く情報も多いと出てきたので、PythonでExcel操作が出来るopenpyxlから手をつけました。


    そこでややこしいと感じたのが大文字・小文字、スペース・インデント、’ ‘(シングルクォート)・” “(ダブルクォート)が入り混じっていることでした。


    書き方のルールがあったり、どちらを使っても構わなかったりしますが、初めはそれらのルールをあまり知らなかったのでエラーばかりでした。


    ただ大文字・小文字の違いはイチイチ覚えていたら挫折しそうだったので、エラーが出たら都度調べて段々と慣れていきました。


    最初にopenpyxlを勉強した時は、ファイルの新規作成はWorkbook、
    既存ファイルのロードはload_workbookと
    「w」が違うところに苦労しました。

     

    このエラーはサイトで調べても、そもそもサイトに書いてあるのがどちらなのか分かり難く混乱しました。

    その他に苦労したのが、保存する際のファイルパスの書き方です。


    ロードや保存の方法を調べると多くのサイトは同じディレクトリに保存するからと、ファイル名のみの記載でした。


    ファイルパスはどのフォルダにあるのか確認する程度の認識しかなかったので、調べた時に階層の区切りが「/」、「\」、「¥」のどれを使えばいいのか分からず、記載しているサイトも少なかったのでひたすらトライ&エラーを繰り返しました。


    プログラミングを学習した当初はこれらのエラーにかなり時間を費やしましたが、何度も経験してきたおかげで今ではエラーの内容で原因が分かるようになってきました。


    これを見てくださっていて学習に挫折しそうな方がいたら、ほとんどみんな同じ思いを経験しているんだな、もう少し頑張ってみるかと考えてくれると嬉しいです。

  • 【サンプル】日付けの取得と表示方法

    日々の業務でExcelを使っていると、作成日を入力することもあるかと思います。
    今回は日付けの取得方法、またいくつかの表示方法を紹介します。

    1.日付けの取得

    日付けを取得するには「datetime」をインポートして、
     変数 = datetime.date.today( )
    で実行時の年月日が得られます。

    この際、表示形式は「2025-1-1」のように取得され、あまりこの形のまま使う方はいないと思いますので、次で表示形式の変更方法を紹介します。

    2.表示形式の変更

    from openpyxl import load_workbook
    import openpyxl, datetime
    
    
    wb = load_workbook('C:/Users/1/Desktop/python/Excel/日時.xlsx')
    ws = wb['Sheet1']
    
    
    a=datetime.date.today()     #日時取得
    b=str(a).replace('-','')     #-(ハイフン)→空白へ置き換え
    c=str(a).replace('_','/')    #-(ハイフン)→/(スラッシュ)へ置き換え
    
    
    取得・置き換えデータの書き出し
    ws.cell(row = 1, column = 2).value = a
    ws.cell(row = 2, column = 2).value = b
    ws.cell(row = 3, column = 2).value = c
    ws.cell(row = 4, column = 2).value = a
    ws.cell(row = 4, column = 2).number_format = 'yy"年"m"月"d"日"'  #表示形式の変更
    
    
    wb.save('C:/Users/1/Desktop/python/Excel/日時'+b+'.xlsx')

    実行結果

    3.終わりに

    今回は日付の取得・表示方法を紹介しました。作成日などは資料の種類を問わず使う機会が多いので、覚えておくとよく使用すると思います。

  • 【サンプル】ファイルの数だけ繰り返し処理

    業務をしていると複数のファイルに同じ処理を行うこともあると思います。
    今回はデータを繰り返し処理する場合のコードを紹介します。

     

    1.アウトプット

    繰り返し処理を行うといったらfor文またはwhile文を考えると思います。
    ファイルの数が分かっているのであれば回数を数字で指示すれば済みますが、処理するファイルが何個か分からない、毎回変動するといったことも多いと思います。

    そこでここではfor文を使い、フォルダの中のファイル数を数え、その数だけ繰り返し処理をして以下2通りの種類の条件でファイルを保存します。

    • ファイルと同じ階層に「結果」フォルダを作りその中へ保存
    • ファイル名の頭に「別名_」と付けてファイルと同じ階層に保存

     

    2.コードの紹介

    上記の内容を実行する場合のコードは次のようになります。

    from openpyxl import load_workbook
    import glob, os
    
    
    folder_path = 'C:/Users/1/Desktop/python/繰返し処理'
    pattern = '*.xlsx'
    search_path = os.path.join(folder_path, pattern)
    file_list = glob.glob(search_path)
    
    
    for i in file_list:
        wb = load_workbook(i)
        dir = os.path.dirname(i)   #対象ファイルの1つ上の階層までのパス取得
        name = os.path.basename(i)  #対象ファイルの名前のみ取得
        
      wb.save(dir+'/別名_'+name)  #ファイル名を変えるパターン
        wb.save(dir+'/結果/'+name)  #他のフォルダに保存するパターン

    各コードは次のような役割をしています。

    import glob, os
    glob:特定のファイルを取得するライブラリ
    os:フォルダやファイルを操作するライブラリ


    folder_path = ‘C:/Users/1/Desktop/python/繰返し処理’:対象ファイルが入っているフォルダのパス
    pattern = ‘*.xlsx’:操作したいファイルの指定
    search_path = os.path.join(folder_path, pattern):フォルダパス+ファイル名
    file_list = glob.glob(search_path):指定したパスのファイルすべてをリストへ追加


    for i in file_list; :リストに入れたファイルを1つずつ処理


    このように対象ファイルのパスをファイルの手前とファイル名で区切り、「*」で指定の拡張子ファイルをすべて取得してリストに加えることで、1つ1つのファイルを処理するようにします。

    ファイル名を変えずに上書き保存する場合は「wb.save(dir+name)でいいですが、今回のように元データを残しておきたい場合は名前を変えたり、別のフォルダに保存します。

     

    3.終わりに

    今回はフォルダ内のファイル数だけ繰り返し処理を行う説明のため、処理自体は保存をする単純なものでしたが、for文の中に処理を加えることで同じように複数ファイルを編集できます。
    毎日大量のファイルに同じ処理を行う業務をしている場合は大幅な時間削減ができるのでぜひ試してみてください。

  • 【サンプル】指定範囲のコピペ

    openpyxlで1セルに対してのコピペ方法は紹介しましたが、今回は行も列も複数ある表の値を丸ごとコピペする方法を紹介します。またファイルをただコピーするだけでなく、事前にフォーマットデータを用意してそこへコピーした値を貼付けるといった状況を想定したコードを紹介します。

     

     

    1.アウトプット

    Excelファイルをそのままコピーするだけであれば、いくらファイル数が多いといっても、フォルダ内のファイルを一括選択→まとめてコピーをするなど、わざわざプログラミングにする魅力を感じにくいと思うので、自分がプログラミング使用した際に感じたメリットを書きます。

    • 自分で用意した表題などを書き加えたフォーマットに必要なデータを書き込める
    • 保護してあるデータをパスワード入力無しでコピーできる

    今回はコピー元の表データを、表題を入れたフォーマットデータにコピペしていきます。これは過去に自分が作成した、「他部署の共有フォルダにあるデータを崩さないように自分のフォルダにコピーする」といった作業の簡易版になります。

     

    2.コードの紹介

    アウトプットとしては次のように「サンプル.xlsx」の内容を「フォーマット.xlsx」の書式に書き込んだ「完成.xlsx」が出来ます。

    コードは次のようになります。

    import openpyxl
    from openpyxl import load_workbook
    
    
    
    #サンプルファイルのサンプルシートをロード
    wb1 = openpyxl.load_workbook('C:/Users/1/Desktop/python/openpyxl/サンプル.xlsx')
    ws1 = wb1['サンプル']
    
    
    
    #フォーマットファイルのフォーマットシートをロード
    wb2 = openpyxl.load_workbook('C:/Users/1/Desktop/python/openpyxl/フォーマット.xlsx')
    ws2 = wb2['フォーマット']
    
    
    
    #iに行、jに列の範囲を指定
    for i in range(1,7):
        for j in range(1,7):
            copy = ws1.cell(row = i, column = j).value
            ws2.cell(row = i+2, column = j, value = copy)
            j += 1
        i += 1
    
    
    
    #フォーマットに書き込んだデータを完成.xlsxと名前を付けて保存
    wb2.save('C:/Users/1/Desktop/python/openpyxl/完成.xlsx')

    表の読み込み・書き込みはfor文を使い、1行目の情報を「for j in range(1,7):」で1列ごとに処理して、
    その処理を「for i in range(1,7):」で指定した行数分繰り返しています。

    また今回フォーマットデータには表題が入っていて2行ずらしたいので、取得したvalueを書き込む際に「i+2」としています。

     

    3.終わりに

    Excelの表データを別Excelに書き写すコードを紹介しました。
    今後このコードを使って、「複数ファイルのデータをつなげて1つの表にする」、「条件に当てはまった行だけを抽出して表にする」など更に条件を加えたものを紹介しようと思います。

  • 【一覧】セルの書式設定オプション

    セルの書式設定では基本的なコードの書き方について紹介しましたが、ここでは引数がExcel設定画面のどこに対応しているか、どんな種類があるかを紹介します。ご自身でコードを書かれる際の引数確認用としてご活用ください。

    1.フォントオプション

    まずはフォントオプションについてです。フォントオプションは引数が多いので、各引数が書式設定画面のどこに対応するのか、次の画像でご確認ください。

    ⑤underlineには4種類あり、それぞれ下図のように定数が割り振られています。

    また色コードは「色の設定」から調べることが出来ますが、次に紹介する塗りつぶし設定も同じ方法になります。

    フォントオプション設定例:
    ws[“A1”].font = Font(name=’HGPゴシックE’, size=14, bold=True, italic=True, underline=’double’, strike=True, color=’00FF0000′)

    2.塗りつぶしオプション

    セルを単色塗りつぶしに設定する際は、patternTypeにsolidを設定し、fgColorで先ほどと同じように設定したい色コードを調べて定義します。

    塗りつぶしオプション設定例:
    ws[“A2”].fill = PatternFill(patternType=’solid’, fgColor=’00FF0000′)

    3.配置オプション

    配置:Alignmentの基本構造と定数は以下のようになっています。

    配置オプション設定例:
    ws[“A3”].alignment = Alignment(horizontal=’right’, vertical=’top’, wrap_text=True)

    4.終わりに

    今回は使用頻度の多いセルの書式設定オプションの適応箇所、種類を紹介しました。罫線の設定は選択肢が多いので、別の記事で改めて紹介していこうと思います。

  • 【サンプル】表の書式

    Excelで作成した表の書式設定について紹介しましたが、ここではいくつか書式を変えてみようと思います。枠線に関してはそれだけでコードが長くなるため別記事で紹介しているのでそちらをごらんください。


    1.アウトプット

    まずは今回紹介する表とコードを紹介します。画像左側のように文字と枠線が引かれている状態から2行目の書式を変更します。

    from openpyxl import load_workbook
    from openpyxl.styles import Font, PatternFill, Alignment
    
    wb = load_workbook('C:/Users/1/Desktop/python/openpyxl/表作成.xlsx')
    ws = wb["表"]
    
    
    #B2~F2の表題を水色で塗りつぶし
    for col in range(2,7):
        ws.cell(row=2, column=col).fill = PatternFill(patternType='solid', fgColor='B8CCE4')
    
    
    #B2を太文字
    ws["B2"].font = Font(bold=True)
    
    
    #C2~F2を赤文字
    for col in range(3,7):
        ws.cell(row=2, column=col).font = Font(color='00FF0000')
    
    
    #C2~F2の左右位置を真ん中揃え
    for col in range(3,7):
        ws.cell(row=2, column=col).alignment = Alignment(horizontal='center', vertical='center')
    
    
    wb.save('C:/Users/1/Desktop/python/openpyxl/表作成.xlsx')

    2.コードの説明

    今回自分が普段よく使う書式設定を紹介しましたが、他の書式も設定で変えられます。ここでは一連のコードの流れを理解してもらえればと思います。

    縦一列、横一列をまとめて書式を適用させる場合はfor文を利用しています。
    また表の中身のように縦横複数の範囲に適用させる場合は、for文の中にfor文を入れることでまとめて適用させることができます。

    3.終わりに

    今回は表の書式を設定するコードのサンプルを紹介しました。1つ1つ設定のコードを書くため全体のボリュームは多いですが、それぞれの設定方法は単純なので、このページで書き方につまずくことが無くなる人が増えたら嬉しいです。

  • 【サンプル】表の枠線

    Excelで表を作成する際に枠線に一部に基本の枠線以外を使うと意外と面倒だったりするので、数種類の線種を含めた表作成のコードを紹介します。
    いつも作る表の形が決まっている方は参考にしてください。


    1.アウトプット

    まずは今回紹介する表とコードを紹介します。自分が良く使う外枠を太線、1行目の下線を二重線にした形で作りました。

    from openpyxl import Workbook
    from openpyxl.styles import Border, Side
    
    Workbook()
    wb = Workbook()
    ws = wb.active
    
    
    #列(col)、行(row)の始点、終点の定義(以下はB2~F7までを指定)
    col_start = 2
    col_end = 6
    row_start = 2
    row_end = 7
    
    #-------線種定義-------
    
    #パターンA:4辺全て細線
    thin_border = Border(left=Side(style='thin'), right=Side(style='thin'), top=Side(style='thin'), bottom=Side(style='thin'))
    
    
    #パターンB:1辺だけ太線のセルを左辺、右辺、上辺、下辺それぞれ作成
    thick_left = Border(left=Side(style='thick'), right=Side(style='thin'), top=Side(style='thin'), bottom=Side(style='thin'))
    thick_right = Border(left=Side(style='thin'), right=Side(style='thick'), top=Side(style='thin'), bottom=Side(style='thin'))
    thick_top = Border(left=Side(style='thin'), right=Side(style='thin'), top=Side(style='thick'), bottom=Side(style='double'))
    thick_bottom = Border(left=Side(style='thin'), right=Side(style='thin'), top=Side(style='thin'), bottom=Side(style='thick'))
    
    
    #パターンC:角2辺が太線のセルを左上、右上、左下、右下それぞれ作成
    thick_ltop = Border(left=Side(style='thick'), right=Side(style='thin'), top=Side(style='thick'), bottom=Side(style='double'))
    thick_rtop = Border(left=Side(style='thin'), right=Side(style='thick'), top=Side(style='thick'), bottom=Side(style='double'))
    thick_lbottom = Border(left=Side(style='thick'), right=Side(style='thin'), top=Side(style='thin'), bottom=Side(style='thick'))
    thick_rbottom = Border(left=Side(style='thin'), right=Side(style='thick'), top=Side(style='thin'), bottom=Side(style='thick'))
    
    
    #-------表作成-------
    #パターンAを使い全て細線の表作成
    for row in range(row_start, row_end+1):
            for col in range(col_start, col_end+1):
                cell = ws.cell(row=row, column=col)
                cell.border = thin_border
    
    
    #パターンBを使い外枠の左辺、右辺が太線の表作成
    for row in range(row_start, row_end+1):
        ws.cell(row=row, column=col_start).border = thick_left
        ws.cell(row=row, column=col_end).border = thick_right
    
    
    #パターンBを使い外枠の上辺、下辺が太線の表作成
    for col in range(col_start, col_end+1):
        ws.cell(row=row_start, column=col).border = thick_top
        ws.cell(row=row_end, column=col).border = thick_bottom
    
    
    #パターンCを使い外枠の2辺が太線の作成
    ws.cell(row=row_start, column=col_start).border = thick_ltop
    ws.cell(row=row_start, column=col_end).border = thick_rtop
    ws.cell(row=row_end, column=col_start).border = thick_lbottom
    ws.cell(row=row_end, column=col_end).border = thick_rbottom
    
    
    wb.save('C:/Users/1/Desktop/python/openpyxl/表作成.xlsx')

    2.表作成の工程

    見た目は簡単な表ですが、ずいぶんと長いコードになってしまいました。コードが長いので表作成の工程を説明すると、
    細線のグラフ作成→外枠の左右、上下の辺を太線→四隅の角を太線
    の手順で作成した表を重ねていくことで目的の形を作っています。

    範囲指定の定義や関数化することでもっとスッキリしたコードにできるかもしれませんが、定義する範囲をセル番号をそのまま書き出せば良かったり、表を分解してそれぞれの線種を定義することで形を変えやすかったりと

    メリット
     ・作りが単純
     ・カスタマイズが容易
    デメリット
     ・コードが長い

    と言った特徴があります。ただし、表作成の頻度が少ない自分としてはカスタマイズが簡単な方が毎回作り方を調べて理解しなくていいので、この形をテンプレートとして利用しています。

    3.終わりに

    今回は表を作成するコードのサンプルを紹介しました。コードが長く手間なので、たまに表を作成する人がコードを調べると逆に時間がかかるかもしれないので、今回紹介したコードを活用してもらえると嬉しいです。

  • 【基本】グラフ作成:折れ線グラフ

    1.アウトプットイメージ

    まずはイメージを掴んでもらうため、完成グラフとコードを紹介します。

    import openpyxl
    
    #折れ線グラフ、適応範囲、軸の最大・最小値を設定するのに必要なクラスのインポート
    from openpyxl.chart import LineChart, Reference
    from openpyxl.chart.axis import Scaling
    
    
    #グラフの基となるデータファイルのロード
    wb = openpyxl.load_workbook('C:/Users/1/Desktop/python/openpyxl/折れ線グラフ作成.xlsx')
    ws = wb['折れ線グラフ']
    
    
    #軸の参照データを指定
    item_x = Reference(ws, min_col=1, min_row=2, max_row=7)
    item_y = Reference(ws, min_col=2, min_row=1, max_row=7)
    
    
    #グラフのプロパティ設定
    chart = LineChart()
    chart.height =10; chart.width = 15
    chart.y_axis.scaling = Scaling(min =100, max = 200)
    chart.y_axis.majorUnit = 25
    chart.title = '上期売上'
    
    
    #グラフの値を追加
    chart.add_data(item_y, titles_from_data=True)
    chart.set_categories(item_x)
    ws.add_chart(chart, 'E3')
    
    wb.save('C:/Users/1/Desktop/python/openpyxl/折れ線グラフ作成.xlsx') 

    2.コードの説明

    ※コード説明前の注意事項
    本記事ではopenpyxl 3.1.2の環境で実行しています。
    以前3.1.5で実行した際にx軸、y軸の数字が表示されないなど、意図通りに動かないことがありましたので、必要に応じて3.1.2をインストールしてください。
    pip uninstall openpyxl:現在のopenpyxlをアンインストール
    pip install openpyxl==3.1.2:3.1.2のインストール

    ここからコードの説明です。
    from openpyxl.chart import LineChart, Reference

    折れ線グラフ作成と参照範囲を指定する際に必要なクラスです。基本的に棒グラフを作成する際は使用します。

     

    from openpyxl.chart.axis import Scaling

    グラフ軸の範囲を指定する際に必要なクラスです。

     

    item_x = Reference(ws, min_col=1, min_row=2, max_row=7)
    item_y = Reference(ws, min_col=2, min_row=1, max_row=7)

    それぞれx軸、y軸の参照範囲を示しています。x軸がA2~A7、y軸がB1~B7のデータを参照しています。(col=列、row=行)

     

    chart = LineChart() :変数chartに折れ線グラフを定義。
    chart.height =10; chart.width = 15 :グラフのサイズを高さ10、幅15に指定。
    chart.y_axis.scaling = Scaling(min =100, max = 200) :y軸の表示範囲を100~200の範囲に指定。
    chart.y_axis.majorUnit = 25 :y軸の目盛の表示単位を25に指定。
    chart.title = ‘上期売上’ :グラフタイトルを定義。

     

    chart.add_data(item_y, titles_from_data=True)
    :取得した各月の値を追加。”titles_from_data=True”でB1行をグラフの値でなく表題と定義。
    chart.set_categories(item_x) :取得した月を横軸に登録。
    ws.add_chart(chart, ‘E3’) :グラフの左上をE3に設定。

    3.複数の折れ線グラフ

    棒グラフの種類の指定を変えることで積み上げグラフにすることもできます。

    コードは
    “item_y = Reference(ws, min_col=2, max_col=3, min_row=1, max_row=7)”
    と”max_col=3″を加えてy軸の参照範囲をB列~C列までに拡げるだけです。

     

    4.終わりに

    openpyxlでの折れ線グラフ作成のしかたを紹介しました。自分はグラフ作成のプログラムをたまにしか書かず、その度にうまくいかずに色々なサイトで調べていたので、同じような境遇の人がこの記事で問題解決できれば嬉しいです。

  • 【基本】グラフ作成:円グラフ

     

    1.アウトプットイメージ

    まずはイメージを掴んでもらうため、完成グラフとコードを紹介します。

    import openpyxl
    
    #円グラフ、適応範囲を設定するのに必要なクラスのインポート
    from openpyxl.chart import PieChart, Reference
    
    
    #グラフの基となるデータファイルのロード
    wb = openpyxl.load_workbook('C:/Users/1/Desktop/python/openpyxl/円グラフ作成.xlsx')
    ws = wb['円グラフ']
    
    aria = Reference(ws, min_col=1, min_row=2, max_row=8)
    num = Reference(ws, min_col=2, min_row=2, max_row=8)
    
    chart = PieChart()
    
    chart.height =10; chart.width = 15
    chart.title = '対象人数'
    chart.add_data(num)
    chart.set_categories(aria)
    ws.add_chart(chart, 'E3')
    
    wb.save('C:/Users/1/Desktop/python/openpyxl/円グラフ作成.xlsx') 

    2.コードの説明

    ※コード説明前の注意事項
    本記事ではopenpyxl 3.1.2の環境で実行しています。
    以前3.1.5で実行した際にx軸、y軸の数字が表示されないなど、意図通りに動かないことがありましたので、必要に応じて3.1.2をインストールしてください。
    pip uninstall openpyxl:現在のopenpyxlをアンインストール
    pip install openpyxl==3.1.2:3.1.2のインストール

    ここからコードの説明です。

    from openpyxl.chart import PieChart, Reference

    円グラフ作成と参照範囲を指定する際に必要なクラスです。基本的に円グラフを作成する際は使用します。

    aria = Reference(ws, min_col=1, min_row=2, max_row=8)
    num = Reference(ws, min_col=2, min_row=2, max_row=8)

    それぞれA列、B列の参照範囲を示しています。”aria”がA2~A8、”num”がB2~B8のデータを参照しています。(col=列、row=行)

     

    chart = BarChart() :変数chartに円グラフを定義。
    chart.height =10; chart.width = 15 :グラフのサイズを高さ10、幅15に指定。
    chart.title = ‘対象人数’ :グラフタイトルを定義。

    chart.add_data(num) :取得したB列の値を追加。
    chart.set_categories(aria) :取得した月を横軸に登録。
    ws.add_chart(chart, ‘E3’) :グラフの左上をE3に設定。

    3.終わりに

    openpyxlでの円グラフ作成のしかたを紹介しました。基本的な円グラフ作成のコードは短いですが設定できる項目は色々あるので、そちらは別途一覧として紹介したいと思います。

  • 【基本】グラフ作成:棒グラフ

    1.アウトプットイメージ

    まずはイメージを掴んでもらうため、完成グラフとコードを紹介します。

    import openpyxl
    
    #棒グラフ、適応範囲、軸の最大・最小値を設定するのに必要なクラスのインポート
    from openpyxl.chart import BarChart, Reference
    from openpyxl.chart.axis import Scaling
    
    
    #グラフの基となるデータファイルのロード
    wb = openpyxl.load_workbook('C:/Users/1/Desktop/python/openpyxl/棒グラフ作成.xlsx')
    ws = wb['棒グラフ']
    
    
    #軸の参照データを指定
    item_x = Reference(ws, min_col=1, min_row=2, max_row=13)
    item_y = Reference(ws, min_col=2, max_col=3, min_row=1, max_row=13)
    
    
    #グラフのプロパティ設定
    chart = BarChart()
    chart.height =10; chart.width = 15
    chart.y_axis.scaling = Scaling(min =0, max = 200)
    chart.y_axis.majorUnit = 50
    chart.title = '月別売上'
    chart.legend = None
    
    
    #グラフの値を追加
    chart.add_data(item_y, titles_from_data=True)
    chart.set_categories(item_x)
    ws.add_chart(chart, 'E3')
    
    wb.save('C:/Users/1/Desktop/python/openpyxl/棒グラフ作成.xlsx') 

    2.コードの説明

    ※コード説明前の注意事項
    本記事ではopenpyxl 3.1.2の環境で実行しています。
    以前3.1.5で実行した際にx軸、y軸の数字が表示されないなど、意図通りに動かないことがありましたので、必要に応じて3.1.2をインストールしてください。
    pip uninstall openpyxl:現在のopenpyxlをアンインストール
    pip install openpyxl==3.1.2:3.1.2のインストール

    ここからコードの説明です。
    from openpyxl.chart import BarChart, Reference

    棒グラフ作成と参照範囲を指定する際に必要なクラスです。基本的に棒グラフを作成する際は使用します。

     

    from openpyxl.chart.axis import Scaling

    グラフ軸の範囲を指定する際に必要なクラスです。

     

    item_x = Reference(ws, min_col=1, min_row=2, max_row=13)
    item_y = Reference(ws, min_col=2, max_col=3, min_row=1, max_row=13)

    それぞれx軸、y軸の参照範囲を示しています。x軸がA2~A13、y軸がB1~C13のデータを参照しています。(col=列、row=行)

     

    chart = BarChart() :変数chartに棒グラフを定義。
    chart.height =10; chart.width = 15 :グラフのサイズを高さ10、幅15に指定。
    chart.y_axis.scaling = Scaling(min =0, max = 200) :y軸の表示範囲を0~200の範囲に指定。
    chart.y_axis.majorUnit = 50 :y軸の目盛の表示単位を50に指定。
    chart.title = ‘月別売上’ :グラフタイトルを定義。
    chart.legend = None :凡例表示を無効。

    chart.add_data(item_y, titles_from_data=True)
    :取得した各月の値を加えています。”titles_from_data=True”でB1行をグラフの値でなく表題と定義しています。

    chart.set_categories(item_x) :取得した月を横軸に登録。
    ws.add_chart(chart, ‘E3’) :グラフの左上をE3に設定。

    3.積み上げ棒グラフにするには

    棒グラフの種類の指定を変えることで積み上げグラフにすることもできます。

    コードは”chart = BarChart()”の下に
    chart.grouping = ‘stacked’
    chart.overlap = 100
    と追加するだけです。
    また積み上げると数値が200を超えるので、y軸の範囲を0~350にしています。

    ・chart.grouping = ‘stacked’
    グラフの表示形式を積み上げ方式にする。この記載がないと先ほどの集合縦棒方式になります。

    ・chart.overlap = 100
    グラフ青塗り部分とオレンジ部分のラップ(重なり)の%を0~100の範囲で指定。100で縦並びに、0で下図のようにズレた積み上げグラフになります(デフォルト0)。

     

    4.終わりに

    openpyxlでの棒グラフ作成のしかたを紹介しました。グラフ作成時に設定できる項目は他にもありますが、他の形のグラフと共通しているものが多いので、そちらは別途一覧として紹介したいと思います。