前回は、CSVファイルやMicrosoft Excelファイルを読み込み、それを別のMicrosoft Excelファイルに保存する方法を取り上げた。今回は、請求書ファイルを使ってファイルの読み込みと書き込みの方法を取り上げる。前回の方法では装飾データ(フォントのスタイル、セルの色、境界線など)が保持されないので、その辺りを説明する。→連載「PythonでExcel作業の効率化を図ろう」のこれまでの回はこちらを参照

請求書ファイルをダウンロード

試してみるにあたってリアルな請求書データがあった方がよい。実際に使っているMicrosoft Excelファイルを使うのがよいが、ここでは誰でも再現できるようにMicrosoftが提供しているテンプレートファイルを使う方法を取り上げる。

まず「ソーシャル メディア、ドキュメント、デザイン用の無料テンプレート | Microsoft Create」にアクセスする。このサイトにはMicrosoft 365で使用できるさまざまなファイルの無料テンプレートファイルがまとめられている。カスタマイズも可能で、使い勝手のよいサイトだ。

  • ソーシャル メディア、ドキュメント、デザイン用の無料テンプレート|Microsoft Create

    ソーシャル メディア、ドキュメント、デザイン用の無料テンプレート | Microsoft Create

「仕事効率化」を選択して、候補から使いたい請求書のテンプレートファイルをダウンロードする。

  • 請求書デザインテンプレート

    請求書デザインテンプレート

ここでは「税の計算を含むサービス請求書」をダウンロードして使う。

  • 「税の計算を含むサービス請求書」をダウンロード

    「税の計算を含むサービス請求書」をダウンロード

ダウンロードしたファイルを開くと、次のようなファイルであることを確認できる。

  • 「税の計算を含むサービス請求書」をMicrosoft Excelでオープン

    「税の計算を含むサービス請求書」をMicrosoft Excelでオープン

このファイルをPythonから編集して使えるようにしていく。

Pandasを使ってExcelファイルのオープンと保存

前回まで、Pythonライブラリ「Pandas」を使ってExcelファイルのオープンと保存を行った。これを今回ダウンロードしたファイル用に書き換えると次のようになる。

pandas_read_write_1.py

import pandas as pd

# Microsoft Excelファイルからデータフレームを作成
df = pd.read_excel('税の計算を含むサービス請求書.xlsx')

# Microsoft Excelファイルに出力
xlsx_path = 'サンプルファイル.xlsx'
df.to_excel(xlsx_path)

print(f'「{xlsx_path}」に保存しました。'

実行すると次のようになる。

  • コードを実行

    コードを実行

このコードを実行すると、「サンプルファイル.xlsx」というMicrosoft Excelファイルが生成されるわけだが、その内容は次のようになっている。

  • 「サンプルファイル.xlsx」をMicrosoft Excelでオープン

    「サンプルファイル.xlsx」をMicrosoft Excelでオープン

上のスクリーンショットを見るとわかるように、必要な装飾データがすべて消えていることがわかる。

装飾データが消えた理由は「データフレーム」

先ほどのコードの処理は次のような手順になっている。

  1. pandas.read_ecel()でExcelファイルを読み込んで「データフレーム」を得る
  2. DataFrame.to_ecel()で「データフレーム」をExcelファイルに書き出す

Microsoft Excelの中身を「データフレーム」として取得しているわけだが、データフレームはデータを保持するものであって、フォントのスタイル、セルの色、境界線などの装飾データは保持しない。つまり、この方法では元の請求書ファイルのデザインは消えてしまう。

装飾データを保持したまま扱うにはOpenPyXLを使う

では、どのようにすれば請求書データの装飾を保持したままデータの編集を行えるのかということになるが、それにはPandasではなくOpenPyXLを使う方法がある。OpenPyXLを使うと装飾データをそのままにExcelファイルの読み書きができる。今回欲しい機能はOpenPyXLで実現できる。

ただし、OpenPyXLにはPandasのような柔軟なデータ処理の機能は用意されていない。このため、通常はPandasとOpenPyXLの2つを組み合わせてMicrosoft Excelファイルの編集を行う。これで行いたい処理ができるようになる。

OpenPyXLを使ってExcelファイルのオープンと保存

では、今回はOpenPyXLを使ってExcelファイルの読み込みと書き出しを行う。次がそのサンプルコードだ。

pandas_read_write_2.py

import openpyxl

# 読み込み、および、書き込みに使うファイル名
input_xlsx_file_path = '税の計算を含むサービス請求書.xlsx'
output_xlsx_file_path = 'サンプルファイル.xlsx'

# Microsoft Excelファイルの読み込む
wb = openpyxl.load_workbook(input_xlsx_file_path)

# Microsoft Excelファイルに出力
wb.save(output_xlsx_file_path)

print(f'「{output_xlsx_file_path}」に保存しました。'

OpenPyXLでは、load_workbook()でExcelファイルの読み込みを行う。取得されるワークブックにはsave()が用意されているので、これにファイルパスを引数として与えれば新しいファイルに書き出せる。実行すると、次のようになる。

  • コードの実行

    コードの実行

出力される「サンプルファイル.xlsx」は次のようになる。

  • 「サンプルファイル.xlsx」をMicrosoft Excelでオープン

    「サンプルファイル.xlsx」をMicrosoft Excelでオープン

Pandasを使った場合は装飾データが消えていたが、今回は装飾データがそのまま保持されていることがわかる。

次のステップはPandasとOpenPyXLの組み合わせ

次は、PandasとOpenPyXLを組み合わせる。OpenPyXLでMicrosoft Excelファイルの読み書きを行い、内部のデータの書き換えにはPandasを使うという操作方法になる。Pythonはこのようにライブラリの組み合わせが日常的に発生する。

Pythonの大きな特徴は、サードパーティの提供するライブラリやモジュールを使うことでさまざまな機能拡張が可能な点にある。学習コストが低く、誰が書いても似たようなコードが生成されやすく、さまざまな分野に拡張できる。これがPythonが広く使われている理由だ。

付録: Visual Studio Codeの使い方

操作 メニュー ショートカットキー
ファイルの新規作成 その1 「File」→「New File」オススメ 「Ctrl」+「Alt」+「Win」+「N」
ファイルの新規作成 その2 「File」→「New Text File」 「Ctrl」+「N」
「File」→「Save」 「Ctrl」+「S」
ファイルの保存 「File」→「Save」 「Ctrl」+「S」オススメ
コードの実行 「Run」→「Run Without Debugging」 「Ctrl」+「F5」オススメ

付録: ライブラリセットアップ

Pandasインストール (Python 3.12 / Windows)

pip install pandas
pip install openpyxl

参考