OfficeをPythonで(1)
Excelドキュメントの場合

2022年6月1日

どもです。

最近、Microsoft OfiiceのExcelを使っていて、とあることが気になるようになり始めました。
それは…

ファイルを開いたときに表示されるシート、セルの位置、倍率、表示形式がバラバラ

ということです。

特段Excelファイルを開いた際に、「このように表示されていなければならない!」ということを強要する気は全くありません。
しかし、それでも、ファイルを開いた際にはテーブルの先頭が表示される方が親切なのかな、と考えます。

そこで今回は、Excelファイルを開いた際に、テーブルが

  • 各シートのA1セルが表示される
  • 一番左のシートが表示される
  • 表示倍率が100%
  • 表示モードが「標準」

となるように、Excelファイルを操作してみます。

0. 開発環境

今回は、以下の環境で作業を行ってみます。

開発環境
項目 python 3.10.2
ライブラリ openpyxl 3.0.9

1. シートのA1セルを選択

まずは、シートのA1セルの選択です。

1.1. 処理対象の属性(プロパティ)

openpyxlで特定のセルを選択状態に設定するために操作が必要な属性、および設定する値は以下の通りです。

属性 説明
activeCell アクティブセル アドレス(単一アドレス) 'A1’
sqref 選択範囲シーケンス
(範囲内にアクティブセルを含める)
'A1’
activeCellId アクティブセルインデックス
(アクティブセルを含む選択範囲のインデックス)
sqrefが複数の場合に有効
None

また、操作対象となるのは、openpyxlの「worksheet」属性の「selection」属性です。

1.2. コード

前述の各属性の設定を行うコードは、以下のようになります。

def FocusA1Cell(excel_file_path):
	"""Set focus on A1 cell.

	Set focus on A1 cell of each work sheet in a file.

	Args:
		excel_file_path(string):	Path to file to set focus on.

	Returns:
		None
	
	"""
	try:
		wb = openpyxl.load_workbook(excel_file_path)

		for sheet_name in wb.sheetnames:
			ws = wb[sheet_name]
			SetFocusOnA1Cell(ws)

		wb.save(excel_file_path)
	except Exception:
		print(Exception.message)
	
	def SetFocusOnA1Cell(target_sheet):
		"""Set focus on cell A1
	
		Set focus on A1 cell on a sheet.
	
		Args:
			target_sheet(worksheet):	Excel sheet object to set focus on A1 cell.
	
		Returns:
			None
	
		"""
		sv = target_sheet.sheet_view
		sv.selection[0].activeCell = 'A1'
		sv.selection[0].sqref = 'A1'
		sv.selection[0].activeCellId = None

前述のテーブルで示した属性への値の設定は、「SetFocusOnA1Cell」関数で操作しています。

なお、本エントリの内容の本質とは少しズレますが、処理対象のシート(worksheetオブジェクト)は、以下のコードで選択しています。

ws = wb[sheet_name]

ここで、workbookオブジェクトのsheetnames属性は、Excelのシート名を配列で返します。
この配列を「for ~ in」文で回して「SetFocusOnA1Cell」関数を実行することで、Excelの全シートを「A1」セルが選択された状態に設定できます。

2. 一番左のシートを選択する

次に、「一番左のシートが表示される」状態に設定します。

2.1. 処理対象の属性(プロパティ)

openpyxlで特定のシートを選択状態にする際に操作するプロパティは、下表の通りです。

属性 説明
tabSelected タブ(シートのこと)の選択有無 False
active アクティブシート 先頭のworksheetオブジェクト

tabSelected属性はsheet_view属性、active属性はworkbookオブジェクトの属性になります。

2.2. コード

このテーブルのプロパティを設定するコードは、以下の通りです。

def ActivateLeftMostSheet(excel_file_path):
	"""Activate the leftmost sheet in a file.

	Activate the leftmost in a file and inactivate the selected sheet
	when the opening file.
	If the sheet is the leftmost one, there will be no change.
	
	Args:
		excel_file_path(string):	Path to file to chagne.

	Returns:
		None

	"""
	wb = openpyxl.load_workbook(excel_file_path)

	#Inactivate all sheet
	for sheet_item in wb.worksheets:
		sheet_item.sheet_view.tabSelected = False

	#Activate leftmost sheet in a file.
	wb.active = wb.worksheets[0]

	wb.save(excel_file_path)

最後に「0番目のシート」をworkbookのactive属性に設定しています。
この「0番目のシート」が「一番左のシート」になります。

3. 表示倍率を100%に設定する

3つ目は、表示倍率を100%に設定します。

3.1. 処理対象のプロパティ

シートの表示倍率を操作する際に設定するプロパティは、下表の通りです。

属性 説明
zoomScale ズーム倍率(現在のビュー) 100
zoomScaleNormal ズーム倍率(標準ビュー) 100

「zoomScale」と「zoomScaleNormal」の違いですが、説明に記載された通り、操作対象が「現在のビュー」か「標準のビュー」かの違いです。
仮に、現在のビューが「ページレイアウト」表示になっていた場合、「zoomScale」属性を「100」に設定すると「ページレイアウト」表示の倍率が100%に設定されます。
対して「zoomScaleNormal」属性に「100」を設定した場合、「標準のビュー」の倍率が100%に設定され、「ページレイアウト」の倍率は変更されません。
少し具体的に言うと、表示形式を「ページレイアウト」かつ表示倍率が100%以外の状態で「zoomScaleNormal」属性に100を設定したとしても、見た目の表示は変更されません。

なお、今回は表示モードを「標準ビュー」に設定する都合から、「zoomScaleNormal」属性を操作しています。
仮に表示モードを「ページレイアウトビュー」や「改ページプレビュー」に設定する場合、それぞれ「zoomScalePageLayoutView」「zoomScaleSheetLayoutView」に値を設定することで、表示モード毎の表示倍率を設定することができます。

3.2. コード

表示倍率を設定するコードは、以下の通りです。

default_zoom_scale = 100

def Magnify100Percent(excel_file_path:str) -> None:
	"""Set magnification of sheets to 100 percent.

	Set the magnification in all sheets in a file specified by argument to 100 percent.

	Args:
		excel_file_path (str): Path to excel file to set the mmaginification to 100 percent.
	
	"""
	try:
		wb = openpyxl.load_workbook(excel_file_path)

		for ws in wb.worksheets:
			SetMagnification100Per(ws)

		wb.save(excel_file_path)
	except Exception:
		print(Exception.message)

def SetMagnification100Per(target_sheet) -> None:
	"""Set magnification of sheet to 100 percent

	Set maginication of a sheet specified by argument to 100 percent.

	Args:
		target_sheet(Worksheet): Sheet to handle in the method.

	"""
	sv = target_sheet.sheet_view
	sv.zoomScale = default_zoom_scale
	sv.soomScalNormal = default_zoom_scale

このコード、実は「sv.zoomScale = default_zoom_scale」は不要かもしれません。

4. 表示モードを「標準モード」に設定する

最後に、表示モードを「標準モード」に設定します。

4.1. 処理対象のプロパティ

エクセルの表示を「標準モード」に設定するために操作する属性は、下表の通りです。

属性 説明
view ビュータイプ 'normal’

標準モードを変更/設定するために操作が必要な属性は、「view」のみです。

4.2. コード

表示モードを設定するコードは、以下の通りです。

def SetViewModeOfSheet(sheet, mode:str) -> None:
	"""Set sheet mode.

	Set sheet into a mode specified by argument, mode.

	Args:
		sheet(Worksheet): Worksheet to change mode.
		mode(str): Mode to set
	
	"""
	sv = sheet.sheet_view
	sv.view = mode

def SetViewModeNormal(path:str):
	"""Set view mode 'normal'
	
	Set all sheets in a file specified by argument to 'normal' mode.

	Args:
		path(str): Path to file to set all sheets to 'normal' mode
	
	"""
	mode = 'normal'
	SetViewMode(path=path, mode=mode)

属性のテーブルでも記載していますが、シートのview属性には「文字列」になります。
モードに対応した数値が定義されているわけではない、ということに注意が必要です。

5. まとめ

今回は、python/openpyxlを使用して、Excelを操作してみました。
操作した内容は、フォーカスするセルやアクティブなシートの設定、表示倍率の設定、および表示モードの設定と、基本的な内容でした。
それでも、ファイルを開いた際に「…むぅ」と感じる回数を減らすことができ、気持ちよくExcelで作業を行えるようになるのではないかと思います。

今回記載した内容が、だれかの助けになれば幸いです。

ではっ!

ex.公開しています

本エントリで紹介したコードは、GitHubで公開しています。
本文中に記載しきれなかった部分もありますので、細かい内容はGitHubのコードを参照していただければと思います。