Pythonのお勉強:OpenPyXLでPDFファイルのリスト(EXCEL)を作成する

OpenPyXl

PythonPRGフォルダ直下にあるフォルダ(./pdf)内に保管しているPDFファイルの一覧(「Pdf_List.xlsx」)を取得するサンプルプログラムを作成してみました。サンプルプログラム確認用のPDFファイルは、以下に記載したネットで公開されている大学のPythonの学習教材を使用しました。

PDFがネット公開されている大学のPythonの学習教材

PDFリストを作製する自作サンプルプログラム (「Make_a_Pdf_List.py」)

今回作成したサンプルプログラムを以下に記載します。

  • 「Make_a_Pdf_List.py」
    import openpyxl
    import pathlib
    from openpyxl.styles.alignment import Alignment
    from openpyxl.styles import PatternFill
    from openpyxl.styles import Font
    
    wb = openpyxl.Workbook()
    ws = wb.active
    ws.title = "pdf_list"
     
    sd = './pdf'  # sd => 探査ディレクトリ
    pdf_name=list() # pdfファイル名の格納用リスト
    max_length = 0  # pdfファイル名の最大バイト数格納用変数
     
    # pdfファイル名のリスト作成 fp => ファイルのパス
    for fp in pathlib.Path(sd).iterdir():
        if fp.is_file() and fp.suffix == '.pdf':
            pdf_name.append(fp.name)
            # 表示列の幅変更用のpdfファイル名最大バイト数
            if len(fp.name.encode()) > max_length:
                max_length = len(fp.name.encode())
     
    # EXCELファイルへの表示位置
    start_row = 1 # 表示開始列
    start_col = 1 # 表示開始行
     
    # タイトルセルの名前を設定
    ws.cell(start_col,start_row).value='PDF filename'
     
    # タイトルセルの表示幅を変更
    ws.column_dimensions['A'].width = max_length
     
    # タイトルセルの色を変更 fil_obj(水色 塗り潰し)
    fil_obj = PatternFill(fgColor='00ffff' , patternType='solid')
    ws.cell(start_col,start_row).fill = fil_obj
     
    # セルにPDFファイル名とHYPERLINK先を書き込む
    for i in range(0,len(pdf_name)):
        # 現在の行(cur_col)と列(cur_row)を変数に格納
        cur_col = i+start_col+1
        cur_row = start_row
         
        # PDFファイル名 => hpdf_name / HYPERLINK先 => hlnk_str
        hpdf_name = pdf_name[i]
        hlnk_str = sd + '/' + hpdf_name
        ws.cell(cur_col,cur_row).value = hpdf_name
        ws.cell(cur_col,cur_row).hyperlink = hlnk_str
        # ハイパーリンクの書式設定 fnt_obj(色:青 シングルアンダーライン)
        fnt_obj = Font(color='0000FF', u='single')
        ws.cell(cur_col,cur_row).font = fnt_obj
     
        # シートセル全体の水平方向を左寄せ、高さ方向を中央揃え
        for col in ws:
            for cell in col:
                cell.alignment = Alignment(horizontal='left',vertical='center')
     
        # シートセルの行高さ変更
        for i in range(len(pdf_name)+2):
            ws.row_dimensions[i].height = 21
     
    # 作成したファイルを名前を付けて保存
    save_filename = 'Pdf_List.xlsx'
    wb.save(filename = save_filename)
    wb.close()
    

サンプルプログラムで作成したExcelファイル(「Pdf_List.xlsx」)

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

  • Pythonの標準ライブラリ「pathlib」を使用すると、フォルダ名やファイル名等を簡単に取得することが出来る。
    import pathlib
    
    sd = 'pdf'  # sd => 探査ディレクトリ
    pdf_name=list() # pdfファイル名の格納用リスト
    
    # pdfファイル名のリスト作成 fp => ファイルのパス
    for fp in pathlib.Path(sd).iterdir():
        if fp.is_file() and fp.suffix == '.pdf':
            pdf_name.append(fp.name)
    
  • Pythonには、VBAの配列に相当するリスト型があり、list() で空のリスト型の変数を作成し、そこにappendメソッドでリストに要素を追加することができる。
    pdf_name=list() # pdfファイル名の格納用リスト
    :
            pdf_name.append(fp.name)
    
  • PatternFill()を使用して作成したオブジェクト(fil_obj)をCellオブジェクトのfillプロパティに代入することによりセルの塗り潰し色を変更することができる。
    from openpyxl.styles import PatternFill
    :
    fil_obj = PatternFill(fgColor='00ffff' , patternType='solid')
    ws.cell(start_col,start_row).fill = fil_obj
    
  • セルのhyperlink属性にハイパーリンク先を書き込むことによりEXCELファイルのセルにハイパーリンクを設定することが出来る
       # シート'A'列にpdfファイル名とHYPERLINKを書き込む
        hpdf_name = pdf_name[i]
        hlnk_str = sd + '/' + hpdf_name
        ws.cell(cur_col,cur_row).value = hpdf_name
        ws.cell(cur_col,cur_row).hyperlink = hlnk_str
    
  • Font()を使用して作成したオブジェクト(fnt_obj)をCellオブジェクトのfontプロパティに代入することにより、リンク文字列の色やアンダーラインを変更することができる。
    from openpyxl.styles import Font
    :
        # ハイパーリンクの書式設定 fnt_obj(色:青 シングルアンダーライン)
        fnt_obj = Font(color='0000FF', u='single')
        ws.cell(cur_col,cur_row).font = fnt_obj
    

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

コメント