OfficeをPythonで(1)
Excelドキュメントの場合
どもです。
最近、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のコードを参照していただければと思います。
ディスカッション
コメント一覧
まだ、コメントがありません