月次レポートや部署別の売上データなどでは、複数のExcelファイルを後から一つにまとめたいケースがあります。
例えば、各部署から提出された売上ファイルを集約したり、月ごとのデータを一つのブックに整理したりする場合、手作業でコピー&ペーストを繰り返す方法では時間がかかります。また、ファイル数が増えるほど、コピー漏れや貼り付け範囲のミスといった問題も発生しやすくなります。
Excelファイルをまとめる方法には、主に以下のようなパターンがあります。
- 複数のExcelファイルを一つのブックにまとめる
- 特定のシートだけ別のブックへコピーする
- 同じブック内でシートを複製する
目的に応じて処理方法を使い分けることで、必要なデータだけを効率よく整理できます。
この記事では、Pythonと Spire.XLS for Python を使って、Excelファイルやシートを結合する方法を紹介します。
環境準備
今回は Spire.XLS for Python を使用します。
Excelブックの読み込みやシート操作に対応しており、Workbook と Worksheet を使ってシートのコピーや移動などを実行できます。
インストールは以下のコマンドで行います。
pip install Spire.XLS
インストール後、必要なモジュールを読み込みます。
from spire.xls import *
from spire.xls.common import *
以降のサンプルでは、Workbook オブジェクトを使ってExcelファイルを操作します。
※Excelファイルの読み書きだけであれば openpyxl でも対応できますが、本記事ではシート単位のコピーや書式保持を含めた操作を行うため、Spire.XLS for Pythonを使用しています。
複数のExcelファイルを一つにまとめる
複数のExcelファイルを一つのブックにまとめたい場合は、Worksheets.AddCopy() を利用します。
元のファイルを順番に読み込み、各シートを新しいブックへコピーすることで、複数ファイルをまとめたExcelブックを作成できます。
from spire.xls import *
from spire.xls.common import *
outputFile = "MergeExcelFiles.xlsx"
files = [
"./Data/MergeExcelFiles-1.xlsx",
"./Data/MergeExcelFiles-2.xls",
"./Data/MergeExcelFiles-3.xlsx"
]
# 結合先のブックを作成
newbook = Workbook()
newbook.Version = ExcelVersion.Version2013
# 初期状態のシートを削除
newbook.Worksheets.Clear()
# 各ファイルのシートをコピー
tempbook = Workbook()
for file in files:
tempbook.LoadFromFile(file)
for sheet in tempbook.Worksheets:
newbook.Worksheets.AddCopy(
sheet,
WorksheetCopyType.CopyAll
)
# 保存
newbook.SaveToFile(outputFile, ExcelVersion.Version2010)
newbook.Dispose()
tempbook.Dispose()
ここでポイントになるのが newbook.Worksheets.Clear() です。
Workbook() で新しいブックを作成すると、初期状態で空のシートが含まれています。そのままコピーすると不要な空シートが残るため、先に削除しています。
また、WorksheetCopyType.CopyAll を指定すると、セルの値だけでなく、数式や書式、画像なども含めてコピーできます。
複数ファイルを処理する場合は、読み込み用の tempbook を毎回作り直すのではなく、ループ外で作成して使い回すことで、処理時のメモリ使用量を抑えられます。
特定のシートを別のExcelファイルへコピーする
すべてのシートではなく、必要なシートだけを別のブックへ移したい場合は、CopyFrom() を利用します。
コピー先となるシートを作成し、そのシートへ元の内容をコピーします。
from spire.xls import *
from spire.xls.common import *
inputFile1 = "./Data/ReadImages.xlsx"
inputFile2 = "./Data/sample.xlsx"
outputFile = "CopyWorksheet.xlsx"
# コピー元のブック
sourceWorkbook = Workbook()
sourceWorkbook.LoadFromFile(inputFile1)
srcWorksheet = sourceWorkbook.Worksheets[0]
# コピー先のブック
targetWorkbook = Workbook()
targetWorkbook.LoadFromFile(inputFile2)
# コピー先のシートを作成
targetWorksheet = targetWorkbook.Worksheets.Add("added")
# シート内容をコピー
targetWorksheet.CopyFrom(srcWorksheet)
# 保存
targetWorkbook.SaveToFile(outputFile, ExcelVersion.Version2013)
targetWorkbook.Dispose()
CopyFrom() を使う場合は、先にコピー先となるシートを用意しておく必要があります。
この方法では、セルの値だけでなく、数式、書式、列幅、ページ設定などもまとめてコピーできます。
例えば、年度別や部署別のデータを整理する場合は、コピー時にシート名を変更しておくと管理しやすくなります。
同じExcelブック内でシートを複製する
同じブック内で既存シートを複製したい場合は、Copy() メソッドを使用します。
この方法では、シート全体だけでなく、指定したセル範囲だけをコピーすることもできます。
from spire.xls import *
from spire.xls.common import *
inputFile = "./Data/Template_Xls_4.xlsx"
outputFile = "CopySheetWithinWorkbook.xlsx"
# Excelファイルを読み込み
workbook = Workbook()
workbook.LoadFromFile(inputFile)
# コピー元とコピー先のシート
sheet = workbook.Worksheets[0]
sheet1 = workbook.Worksheets.Add("MySheet")
# 使用範囲を取得
sourceRange = sheet.AllocatedRange
# コピー
sheet.Copy(
sourceRange,
sheet1,
sheet.FirstRow,
sheet.FirstColumn,
True
)
# 保存
workbook.SaveToFile(outputFile, ExcelVersion.Version2013)
workbook.Dispose()
AllocatedRange を使うと、そのシートで実際に使用されている範囲だけを取得できます。
不要な空白セルまでコピーする必要がないため、効率よく処理できます。
Copy() の最後の引数を True にすると、フォントや背景色、罫線などの書式も一緒にコピーできます。
よくある追加処理
表示中のシートだけをコピーする
Excelブックには、計算用や一時保存用として非表示にしているシートが含まれている場合があります。
このようなシートまでコピーすると、不要な情報を共有してしまう可能性があります。
Visibility を確認して、表示中のシートだけを対象にすることで必要なデータだけを取得できます。
from spire.xls import *
from spire.xls.common import *
inputFile = "./Data/CopyVisibleSheets.xlsx"
outputFile = "CopyVisibleSheets.xlsx"
workbook = Workbook()
workbook.LoadFromFile(inputFile)
# コピー先のブック
workbookNew = Workbook()
workbookNew.Version = ExcelVersion.Version2013
workbookNew.Worksheets.Clear()
# 表示中のシートだけコピー
for sheet in workbook.Worksheets:
if sheet.Visibility == WorksheetVisibility.Visible:
workbookNew.Worksheets.AddCopy(sheet)
workbookNew.SaveToFile(outputFile, ExcelVersion.Version2013)
workbook.Dispose()
workbookNew.Dispose()
sheet.Visibility が WorksheetVisibility.Visible の場合だけコピーすることで、非表示シートを除外できます。
社内資料などを外部へ共有する場合は、コピー対象のシートを確認しておくことが重要です。
シート結合時に確認したいポイント
複数のExcelファイルをまとめる場合、シート名の重複には注意が必要です。
例えば、複数の部署がそれぞれ「売上」という名前のシートを持っている場合、結合後に同じような名前のシートが並び、管理しづらくなります。
結合前に sheet.Name を確認し、必要に応じて以下のように名前を変更しておくと整理しやすくなります。
売上_東京
売上_大阪
売上_福岡
また、数式を含むシートを別ブックへコピーした場合、参照先が変わるケースがあります。
特に外部ファイルを参照している数式については、結合後に結果を確認しておくことをおすすめします。
まとめ
Pythonを使うと、複数のExcelファイルやシートを効率よくまとめることができます。
Spire.XLS for Pythonでは、ブック全体の結合だけでなく、特定シートのコピーや同じブック内での複製にも対応しています。
実際の業務で利用する場合は、シート名の重複や非表示シートの扱い、コピー後の数式などを確認しながら、自分の用途に合わせた結合処理を組み込むとよいでしょう。