はじめに

ファイルやフォルダの階層構造をエクセルファイルにエクスポートするためのプログラムを解説します。
作成したプログラムでは、フォルダ名に「/」を追加し、フォントを変更することで視覚的な整理を行います。これにより、フォルダ名は太字で表示され、階層構造が一目で把握しやすくなります。

下記の画像は、実際に作成されるエクセルファイルのイメージです。

前提条件(検証時のPCの状態)

  • OS: macOS Sonoma
  • Python: ver3.7.4 (バージョンに細かな指定がありませんが、Pythonが実行できる環境が必要です)
  • Homebrew: ver4.2.1 (バージョンに細かな指定がありませんが、treeコマンドとjqコマンドがインストール可能な環境が必要です)

① 必要なパッケージのインストール

treeコマンドのインストール

brew install tree

treeコマンドは、ディレクトリやフォルダ階層化して表示するコマンドです

jqコマンドのインストール

brew install jq

jqコマンドは、JSONデータの処理と操作を行うためのコマンドです

OpenPyXLのダウンロード

pip install openpyxl

OpenPyXLは、PythonでExcelファイルを操作するためのライブラリです。
このライブラリを使用すると、Excelファイルの作成、読み込み、編集、保存などを行うことができます。

② Pythonプログラムの作成

以下のプログラムを directory_hierarchy_exporter.py として保存します。

# coding: utf-8
import json
import sys
from openpyxl import Workbook
from openpyxl.styles import Font

INDENT = '\t'

# 再帰的にコンテンツを解析し、Excelシートに書き込む関数
def parse_content(sheet, depth, content):
    name = content.get('name', '')

    # フォルダの場合は名前の末尾に「/」を追加し、フォントを設定する
    if content.get('type') == 'directory':
        name += '/'  # フォルダ名の場合は末尾に「/」を追加
        font = Font(bold=True, size=14)  # フォルダ名のフォントサイズを14、かつ太字に設定
    else:
        font = Font(size=11)  # ファイル名のフォントサイズを11に設定

    # インデントと名前をシートに追加する行の形式に変換
    row = [''] * depth + [name]
    sheet.append(row)  # シートに行を追加

    # 追加したセルにフォントを適用する
    cell = sheet.cell(row=sheet.max_row, column=len(row))
    cell.font = font

    # フォルダの場合は再帰的に内容を解析
    if content.get('type') == 'directory':
        for c in content.get('contents', []):
            parse_content(sheet, depth + 1, c)

# JSONをExcelに変換する関数
def json_to_excel():
    try:
        contents = json.load(sys.stdin)  # 標準入力からJSONデータを読み込む
    except Exception as e:
        print(e)  # 例外が発生した場合はエラーメッセージを表示
        return  

    # 新しいExcelブックを作成し、アクティブなシートを設定
    wb = Workbook()
    sheet = wb.active
    sheet.title = 'シート1'  # シート名を設定

    # コンテンツを解析してExcelに書き込む
    for content in contents:
        parse_content(sheet, 0, content)

    wb.save('output.xlsx')  # Excelファイルを保存

    print("Excel file 'output.xlsx' created successfully.")

# メイン処理
if __name__ == '__main__':
    json_to_excel()


③ Pythonを呼び出すシェルスクリプトの作成

以下のプログラムを directory_hierarchy_exporter.sh として、②のPythonプログラムと同じフォルダに保存します。

#!/bin/bash
tree "$1" -J | jq . -c | python3 directory_hierarchy_exporter.py

④ シェルスクリプトの権限変更

以下のコマンドを使用して、directory_hierarchy_exporter.sh の権限を変更します。

chmod +rx ./directory_hierarchy_exporter.sh

以上ののコマンドは、directory_hierarchy_exporter.sh に対して読み取りと実行の権限を追加するコマンドです。

⑤ フォルダ階層をエクセルファイルにエクスポートする

②・③で作成したファイルのフォルダまで移動し、以下のコマンドの「エクスポートしたいフォルダのパス」を出力するフォルダのパスに修正して実行します。

 ./directory_hierarchy_exporter.sh エクスポートしたいフォルダのパス

これにより、output.xlsx という名前のエクセルファイルが作成されます。

参考にした記事

treeコマンドの罫線をタブにする (Linux, Mac, Windows対応) – Qiita

openpyxlでフォントを設定する – Qiita