前書き
データ処理では、表の行と列を入れ替えたいという場面がよくあります。元の横方向の表を縦方向に変換したり、縦方向の指標表を横方向の集計表に変換したりするケースです。手作業でコピー&ペーストして転置する方法は、データ量が多い場合や、自動化して繰り返し実行する必要がある場合に非常に非効率です。
Pythonエコシステムには、Excelを処理するさまざまな方法があります。本記事では、無料ライブラリのFree Spire.XLS for Pythonを使って行と列の転置を実現する方法を紹介します。このライブラリの利点は、ローカル環境にMicrosoft Excelをインストールすることなく、.xlsx/.xlsファイルを直接読み書きでき、単なるプレーンテキストデータだけでなく、セルのスタイルや書式も保持できることです。
⚠️ 説明:無料版は一般に中小規模のレポート自動化に適しています。使用前に制限事項を確認してください。大規模な業務用途では、事前に制限を評価する必要があります。
環境準備
Pythonのバージョン要件:Python 3.6以上
pipで無料版パッケージをインストールします:
pip install Spire.Xls.Free
必要なモジュールをインポートします:
from spire.xls import Workbook, FileFormat
実装方針
行と列の転置の本質は行列の転置です。元の表のi行j列のデータを、新しい領域のj行i列に書き込みます。
実装手順:
- Excelファイルを読み込み、対象のワークシートを取得する
- 使用済みデータ領域を取得し、有効な行数と列数を求める
- 元の領域を走査し、セルの値とスタイルをキャッシュする
- ワークシートの空白領域に転置後のデータを書き込み、セルスタイルも同時にコピーする
- ファイルを保存し、リソースを解放する
💡 2つの選択肢:
① 同じワークシートの空白領域に転置結果を書き込む;
② 新しいワークシートを作成して転置後のデータを保存する。
以下の例では、同じワークシートを使う方法を示します。シートを切り替えて確認する必要がなく、数式から元の領域を参照するのも便利です。
完全なコード例
from spire.xls import Workbook, FileFormat
def transpose_excel(file_path: str, output_path: str):
# ワークブックを読み込む
wb = Workbook()
wb.LoadFromFile(file_path)
sheet = wb.Worksheets[0]
# 現在のワークシートの使用済み範囲を取得
used_range = sheet.AllocatedRange
row_count = used_range.Rows.Count
col_count = used_range.Columns.Count
# 転置先の空白領域の開始位置
start_row = row_count + 2
start_col = col_count + 2
# 元の領域を走査して行と列を転置し、セルのスタイルもコピーする
for r in range(1, row_count + 1):
for c in range(1, col_count + 1):
src_cell = sheet.Range[r, c]
# 転置:元のr行c列 → 転置先(start_row + c - 1, start_col + r - 1)行/列
dest_row = start_row + c - 1
dest_col = start_col + r - 1
dest_cell = sheet.Range[dest_row, dest_col]
dest_cell.Value = src_cell.Value
# セルのスタイル(フォント、罫線、背景色など)をコピー
dest_cell.Style = src_cell.Style
# 出力ファイルを保存
wb.SaveToFile(output_path, FileFormat.Version2016)
# リソースを解放
wb.Dispose()
print(f"転置が完了しました。ファイルの出力先:{output_path}")
if __name__ == "__main__":
transpose_excel("source.xlsx", "transposed_result.xlsx")
コードの重要ポイント解説
- AllocatedRange:ワークシートが実際に使用しているセル領域を取得します。これにより、大量の空白セルを走査せずに済み、実行効率が向上します。
-
セルスタイルのコピー:
dest_cell.Style = src_cell.Style。これは多くの軽量ライブラリにはない機能で、元の表の罫線、背景色、フォントの書式を保持できます。 -
リソースの解放
wb.Dispose():このライブラリは基盤としてアンマネージドリソースを使用しているため、スクリプト終了時に明示的に解放し、ファイルハンドルが占有されたままになるのを避けることを推奨します。
テスト結果
スクリプト実行後の transposed_result.xlsx のプレビュー:

拡張:純粋なデータのみを転置する(スタイルをコピーしないため、より高速)
from spire.xls import Workbook, FileFormat
def transpose_excel_data_only(file_path: str, output_path: str):
wb = Workbook()
wb.LoadFromFile(file_path)
sheet = wb.Worksheets[0]
used_range = sheet.AllocatedRange
row_count = used_range.Rows.Count
col_count = used_range.Columns.Count
# 二次元配列を読み取る
data = []
for r in range(1, row_count + 1):
row_data = []
for c in range(1, col_count + 1):
row_data.append(sheet.Range[r, c].Value)
data.append(row_data)
# 行列を転置
transposed_data = list(zip(*data))
# 元の領域の直下の空白領域に書き込む
start_row = row_count + 2
for tr, row in enumerate(transposed_data, start=start_row):
for tc, val in enumerate(row, start=1):
sheet.Range[tr, tc].Value = val
wb.SaveToFile(output_path, FileFormat.Version2016)
wb.Dispose()
✅ pandasを使う方法との比較
-
pandas:データの転置は簡単(
df.T)ですが、出力時にワークシートが再構築されるため、元の書式(セルの色、罫線、列幅など)は保持できません。純粋なデータ分析向けであり、文書の書式を忠実に保持する用途には向きません。 - Free Spire.XLS:独立したコンポーネントで、Officeのインストールは不要です。セルスタイルのコピーをネイティブにサポートします。レポートに複雑な書式、罫線、背景色があり、それらを保持する必要がある場合は、この方法のほうが手間が少なく済みます。
まとめ
本記事では、Free Spire.XLS for Pythonを使ってExcelの行と列の転置を実装し、特にスタイルを保持するケースを中心に示しました。レポート自動化やデータ整理スクリプトの開発に適しています。中心となる考え方は行列の転置であり、セルを走査して(r, c)を(c, r)にマッピングします。