OfficeをPythonで(2)
Excelドキュメントの場合 其の2
どもです。
今回も前回のエントリに続き、Pythonとopenpyxlを使ってMicrosoft OfficeのExcelをいじってみます。
なお、今回の「いじってみる」内容は以下の通りです。
- ページレイアウトを設定する
(特に1ページ x 1ページ) - シート数をカウントする
0. 開発環境
今回は、以下の環境で作業を行ってみます。
項目 | python 3.10.2 |
---|---|
ライブラリ | openpyxl 3.0.9 |
1. ページレイアウトを設定する
まずは、シートのページレイアウトの設定です。
Excel上では、リボンの「拡大縮小印刷」の「横」または「縦」への値の設定が該当します。
また、「ページ設定」ダイアログの「次のページ数に合せて印刷」の設定も、該当します。
1.1. 処理対象の属性(プロパティ)
openpyxlでページのレイアウトを設定するたに操作が必要な属性、および設定する値は以下の通りです。
属性 | 説明 | 値 |
---|---|---|
page_setup.fitToHeight | 縦方向のページ数 | 0:自動 1~:ページ数 |
page_setup.fitToWidth | 横方向のページ数 | 0:自動 1~:ページ数 |
sheet_properties.pageSetUpPr.fitToPage | 「ページ数に合せて印刷する」オプションの有効/無効設定 | 0:無効 1:有効 |
これらの設定の詳細は、openpyxlおよびopenXmlの公式サイトが参考になるかと思います。
リンクを貼っておくので、見てみてください。
属性 | oepnpyxl | openXml |
---|---|---|
page_setup.fitToHeight page_setup.fitToWidth |
Link | Link |
sheet_properties.pageSetUpPr.fitToPage | Link | Link |
1.2. コード
実際に、前述のテーブルに記載した属性を操作するコードは、以下になります。
def _SetupPrintAreaInASheet(sheet:worksheet, v_page:int, h_page:int) -> None:
"""Set print area of a sheet.
Setup the vertical and horizontal print range of a sheet to the specified values by the argument.
Args:
sheet(worksheet): Worksheet to setup the print area.
v_page(int): The number of page in vertical direction.
h_page(int): The nubmer of apge in horizontal direction.
"""
page_setup = sheet.page_setup
page_setup.fitToHeight = v_page
page_setup.fitToWidth = h_page
sheet_property = sheet.sheet_properties
sheet_property.pageSetUpPr.fitToPage = True
コードの末尾で「fitToPage」属性に値を設定しています。
しかし、これは先頭で実施しても問題ありません。
また、「fitToPage」属性の値を「False」に設定した場合、「ページ設定」ダイアログの「拡大縮小印刷」の設定は、「拡大/縮小」が選択されます。
2. シート数をカウントする
次に、エクセルファイルのシート数をカウントします。
これは、実に簡単です。
2.1. 処理対象の属性
なし!
以上!!
2.2. コード
シート数をカウントする処理は、以下になります。
def GetSheetCount(path:str) -> int:
"""Get a number of sheet.
Get a number of sheets in a file specified by argument path.
Args:
path(str): Path to Excel file whose extention is xlsx to check the number of sheet.
Retunrs:
The number of sheets the excel file has.
"""
wb = openpyxl.load_workbook(path)
sheet_num = len(wb.worksheets)
wb.close()
return sheet_num
この処理において、openpyxlが関係するのは「load_workbook」関数のみです。
それ以外は、pythonの基本的な処理で対応可能です。
3. まとめ
今回も、前回に引き続きpython/openpyxlを使用して、Excelを操作してみました。
操作対象は、ページの表示/印刷範囲の設定という基本的な内容です。
ところが、複数のファイルに対してこの設定を行おうとすると、それなりの手間になってしまいます。
それを自動化できれば、作業の手間を省くことができるかと思います。
今回記載した内容が、だれかの助けになれば幸いです。
ではっ!
ex.公開しています
本エントリで紹介したコードは、GitHubで公開しています。
本文中に記載しきれなかった部分もありますので、細かい内容はGitHubのコードを参照していただければと思います。
ディスカッション
コメント一覧
まだ、コメントがありません