はじめに
Pythonを使って、エクセルの表をPDFファイルに変換する方法は、インターネットで簡単に見つけることができました。ただ、表が複数ページにまたがる場合、最初の2行(タイトル行)をすべてのページに表示させる方法については悩みました。そこで、この問題の解決策をメモとして残すことにしました。
印刷設定してからpdfファイル
例えば、次のようなエクセルの表があります。行は1から491まであります。この表を何も設定せずにPDF化すると、複数のページに分割された表が作成されますが、タイトル行(例:銘柄コードなど)は最初のページにしか印刷されません。どうすればいいのかと悩みましたが、最初に印刷設定を行ってから、PDFファイルに変換すればよいことに気づき、プログラムを作ることにしました。
印刷設定は、次の記事で紹介されており、参考にさせていただきました。
ソースコード
from openpyxl import load_workbook
import win32com.client
#pdfファイルにしたいエクセルファイルを開く
file_name="C:\\○○○\\○○○\\○○○.xlsx"
wb=load_workbook(file_name) #エクセルファイルの読み込み
ws_list = [ws.title for ws in wb.worksheets] #各シートをpdfファイルにするために、リストを作る。
#シート分だけ印刷設定を変更する
for i, ws in enumerate(wb.worksheets):
ws.print_title_rows='1:2' #ページの先頭にタイトル行をいれる場合、ここで設定する。
ws.oddHeader.center.text=str(ws_list[i])
wps=ws.page_setup
wps.fitToWidth=1
wps.fitToHeight=0
ws.sheet_properties.pageSetUpPr.fitToPage = True
wb.save(file_name) #エクセルファイルを保存(上書き)
wb.close()
#ここからpdf化
excel = win32com.client.Dispatch("Excel.Application")
file = excel.Workbooks.Open(file_name)
for j, ww in enumerate(ws_list):
file.WorkSheets(j+1).Select()
file.ActiveSheet.ExportAsFixedFormat(0,"C:\\○○○\\○○○\\○○○_"+ww+".pdf")
file.Close()
結果
このようなタイトル行が全部のページに入ったpdfファイルができました。
最初のページ
その他
プログラムを作っているとき、
PermissionError: [Errno 13] Permission denied:
というエラーが出る時がありました。
エクセルが開かれていると思われる状態であるにもかかわらず、実際には開いていない場合があります。このような場合、次の手順を試してみてください。
- タスクマネージャーを開きます(Ctrl+Alt+Deleteを押します)。
- プロセスタブを選択し、エクセルのプロセスが実行中かどうかを確認します。
- エクセルのプロセスを見つけたら、それを選択し、Deleteキーを押してプロセスを終了させてください。
これにより、不要にエクセルが起動している場合、それを終了させることができます。