Dataiku × openpyxl で業務効率化!テンプレートExcelを自動生成する方法

本記事では、Dataikuでデータを整え、openpyxlを使ってテンプレート通りのExcelファイルを自動生成する方法をご紹介します。

目次

はじめに

日々の業務で「同じフォーマットのExcelファイルを複数作成する」作業に時間を取られていませんか?

店舗別の売上報告書、部署ごとの月次レポート、顧客向けの請求書など、内容は異なってもレイアウトは共通 ― そんな定型資料はどの職場にも存在します。

手作業でコピー&ペーストを繰り返していると、ヒューマンエラーのリスクが高まるうえ、作業時間も膨れ上がります。

そこで本記事では、Dataikuでデータを整え、openpyxlを使ってテンプレート通りのExcelファイルを自動生成する方法をご紹介します。

一度仕組みを作ってしまえば、数百ファイルでも数分で出力可能になり、業務効率が大幅に向上します。

使用ツールの紹介

Dataiku

ノーコード/ローコードでデータ処理や分析ができるプラットフォームです。SQLやPythonに不慣れでも直感的にデータを加工でき、またPythonレシピを使えば高度な処理も柔軟に組み込めます。本記事では Excel出力用のデータを整形する役割 を担います。

openpyxl

Python で Excel(.xlsx)を読み書きできるライブラリです。セルの値の更新はもちろん、書式・罫線・フォントなどテンプレートのレイアウトを保持したまま編集できる点が強みです。今回は 既存のテンプレートを利用して複数ファイルを自動生成する役割 を担います。

今回作成するもの

今回作成する成果物と読み込むテンプレートは以下の通りです。

成果物

テンプレート

実装手順

  1. Dataikuにログインし、「+NEW PROJECT」で新しいプロジェクトを作成してください。
  2. 「+Dataset」から「Folder」をクリックしてください。
  3. 任意のラベル(Folder名)を付けて、store intoを「filesystem_folders」にしてください。
  4. 作成したFolderにテンプレートとなるExcelファイルをアップロードしてください。
  5. 次にopenpyxlが使用できるようにしていきます。

      a . Adminstrationを選択してください

      b . Code EnvsからNEW PYTHON ENVを選択し、新しい仮想環境を作成しましょう。(もともと仮想環境がある人はそちらを選択してください。)

      c . Packages to installを選択し、xlsxwriterを追加してください。

      b . フロー上に戻り、タブのSettingsを選択し、Code env selectionのPython code envを先ほど追加したものに変更してください。

    1. Pythonレシピを選択し、Inputに先ほど作成したテンプレートFolder、Outputに任意の名前を入力し、「CREATE RECIPE」を選択してください。
    2. 以下のコードを参考に、Pythonレシピ内にコードを記載してください。
      import dataiku
      import pandas as pd, numpy as np
      from dataiku import pandasutils as pdu
      from openpyxl import load_workbook,Workbook
      
      # テンプレートフォルダの宣言
      template_folder_id = "template_folder" # フォルダIDを設定する
      template_folder = dataiku.Folder(template_folder_id)
      
      # エクセルファイルの読み込み
      excel_file_path = os.path.join(template_folder.get_path(), "ブログ用エクセル.xlsx")
      wb = load_workbook(excel_file_path)
      ws = wb.active
      
      # ---- Excel内に値を挿入 --------------------
      values_list = [1000, 2000, 1500, 1500, 3000, 500, 2000]
      
      start_row, start_col = 3, 2 # B5 が (row=5, col=2)
      percentage = 0.1
      total_sum = 0
      
      for i in range(len(values_list)):
        # B列にvalues_listの値を挿入
        value_b = values_list[i]
        ws.cell(row=start_row + i, column=start_col, value=value_b)
      
        # C列にB列の10%の金額を挿入
        value_c = value_b * percentage
        ws.cell(row=start_row + i, column=start_col + 1, value=value_c)
      
        # D列にB列とC列の合計を挿入
        value_d = value_b + value_c
        ws.cell(row=start_row + i, column=start_col + 2, value=value_d)
      
      # Excel_Folder に保存
      def save_wb_to_folder(wb, folder_id, excel_name):
        folder = dataiku.Folder(folder_id)
        if folder.get_path(): # ローカル接続
          wb.save(os.path.join(folder.get_path(), excel_name))
      
      save_wb_to_folder(wb, "output_folder", "output.xlsx")
    3. output_folderの中のoutput.xlsxの中身を確認してみましょう。

     output.xlsx

    成果物と同じものを作成することができました。

    複数のファイルを出力する方法

    先ほどのコードを以下のように変えることで複数のシートを持つエクセルファイルにすることも可能です。

    import dataiku
    import pandas as pd
    import numpy as np
    from dataiku import pandasutils as pdu
    from openpyxl import Workbook
    
    # テンプレートフォルダの宣言
    template_folder_id = "template_folder" # フォルダIDを設定する
    template_folder = dataiku.Folder(template_folder_id)
    
    # エクセルファイルの読み込み
    wb = Workbook()
    values_list = [1000, 2000, 1500, 1500, 3000, 500, 2000]
    percentage = 0.1
    
    def insert_data_into_sheet(ws, values_list, start_row, start_col):
      for i in range(len(values_list)):
        # B列にvalues_listの値を挿入
        value_b = values_list[i]
        ws.cell(row=start_row + i, column=start_col, value=value_b)
    
        # C列にB列の10%の金額を挿入
        value_c = value_b * percentage
        ws.cell(row=start_row + i, column=start_col + 1, value=value_c)
    
        # D列にB列とC列の合計を挿入
        value_d = value_b + value_c
        ws.cell(row=start_row + i, column=start_col + 2, value=value_d)
    
    # シート1にデータを挿入
    ws1 = wb.active
    ws1.title = "Sheet1"
    insert_data_into_sheet(ws1, values_list, start_row=3, start_col=2)
    
    # シート2にデータを挿入
    ws2 = wb.create_sheet(title="Sheet2")
    insert_data_into_sheet(ws2, values_list, start_row=3, start_col=2)
    
    # シート3にデータを挿入
    ws3 = wb.create_sheet(title="Sheet3")
    insert_data_into_sheet(ws3, values_list, start_row=3, start_col=2)
    
    # Excelファイルを保存する関数
    def save_wb_to_folder(wb, folder_id, excel_name):
      output_folder = dataiku.Folder(folder_id)
      if output_folder.get_path(): # ローカル接続
        wb.save(os.path.join(output_folder.get_path(), excel_name))
    
    # Excelファイルを指定したフォルダに保存
    save_wb_to_folder(wb, "output_folder", "output.xlsx")

    今回は一つのテンプレートしか読み込んでいないですが、複数のテンプレートがある場合でも、同じようにシートごとに処理をすることが可能です。

    まとめ

    本記事では、Dataiku と openpyxl を組み合わせて テンプレート通りのExcelファイルを自動生成する仕組み を紹介しました。

    手作業では数時間かかる作業を自動化することで、時間の節約だけでなく、人為的なミスを防ぎ、より価値の高い分析や意思決定に集中できるようになるでしょう。

    CTA
    • URLをコピーしました!
    • URLをコピーしました!
    この記事を書いた人
    目次