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のコードを参照していただければと思います。