PythonでExcelを操作する:xlrdとxlwtモジュールの実装と注意点

xlrd と xlwt の概要

xlrd および xlwt は、PythonでExcelファイルを扱うための第三方ライブラリです。特徴としては、 xlrd が既存の Excel ファイル(.xls 形式)の読み込みを担当し、 xlwt が新しい Excel ファイルの作成・書き込みを担当します。これらは互いに補完し合う関係にあります。

xlwt の基本操作

モジュールのインポート

import xlwt

ワークブックとシートの作成

# 新規ワークブック作成(UTF-8エンコーディング指定)
wb = xlwt.Workbook(encoding='utf-8')

# 新規シート追加
sheet = wb.add_sheet('sample_sheet')

ファイルの保存

# 保存パス(絶対パス推奨、バックスラッシュは2重化またはraw文字列で記述)
output_path = r'C:\output\sample_output.xls'
wb.save(output_path)

注意:既に存在する Excel ファイルを.same pathで上書き保存しようとすると、権限エラーが発生する可能性があります。新規作成のみ可能である点に留意してください。

Excelデータ構造と Python の対応

Excel のデータ構造はモデルとしての「行×列」の二次元構造であり、これは Python における「リストのリスト」(2次元配列)と正確に対応します。

  • 行:外側のリスト要素
  • 列:各内側リストの要素数
# ヘッダーと2次元データの例
headers = ['Name', 'Age', 'City']
rows = [
    ['田中', 28, '東京'],
    ['佐藤', 32, '大阪'],
]

xlwt を使ったデータ書き込み実装

import xlwt

def write_excel_demo(file_path):
    wb = xlwt.Workbook(encoding='utf-8')
    ws = wb.add_sheet('出力シート')

    # ヘッダー書き込み
    headers = ['A列', 'B列', 'C列']
    for idx, val in enumerate(headers):
        ws.write(0, idx, val)

    # データ書き込み(1行ずつ)
    data = [
        ['X1', 'Y1', 'Z1'],
        ['X2', 'Y2', 'Z2'],
        ['X3', 'Y3', 'Z3']
    ]
    for r_index, row in enumerate(data):
        for c_index, value in enumerate(row):
            ws.write(r_index + 1, c_index, value)

    # ファイル保存
    wb.save(file_path)

# 実行例
write_excel_demo(r'C:\temp\xlwt_output.xls')

保存時の注意事項

  • 出力形式はxlims互換の .xls 限定(.xlsx / .xlsm は非対応)
  • パス指定には raw文字列またはエスケープ済み文字列で明示すること
  • 書き込みは一行ずつcell単位で実行するため、大量データ処理時はパフォーマンスに注意

xlrd を使った Excel 読み込み

インストール確認とモジュール読込

xlwtと異なり、xlrdは明示的なインストールが必要です(pip/conda どちらでも可)。バージョン確認やエラー回避のためには以下を行います。

# インストール確認(conda例)
conda list xlrd

# インストール
pip install xlrd

基本的な読み込み手順

import xlrd

# Excelブックを開く
workbook = xlrd.open_workbook(r'C:\data\sample_input.xls')

# シート一覧の取得
sheets = workbook.sheets()           # Sheetオブジェクトリスト
names = workbook.sheet_names()       # シート名リスト(文字列)

print(f'総シート数: {len(sheets)}')
print(f'シート名: {names}')

# 特定シートの取得方法(3通り)
sheet1 = sheets[0]                   # インデックス経由
sheet2 = workbook.sheet_by_index(1)  # インデックス指定
sheet3 = workbook.sheet_by_name('Sheet1')  # 名前指定

シート情報とセルデータの取得

# 行数・列数の取得
row_count = sheet1.nrows
col_count = sheet1.ncols  # 注意:ncolumnsは存在しない

print(f'シート「{sheet1.name}」は {row_count} 行 × {col_count} 列')

# セル単位のデータアクセス
# format: sheet.cell_value(rowx, colx)
first_cell = sheet1.cell_value(0, 0)

# データ取得のループ例(全セル読み取り)
for r in range(row_count):
    row_data = []
    for c in range(col_count):
        row_data.append(sheet1.cell_value(r, c))
    print(f'行 {r + 1}: {row_data}')

読込・書込の統合例

以下は、既存の Excel を読み込んで、加工して新規保存する一連の流れです。

def process_excel(input_path, output_path):
    import xlrd, xlwt

    # 読み込み
    rd_wb = xlrd.open_workbook(input_path)
    rd_sheet = rd_wb.sheet_by_index(0)
    rows = rd_sheet.nrows
    cols = rd_sheet.ncols

    # 書き込み準備
    wt_wb = xlwt.Workbook()
    wt_sheet = wt_wb.add_sheet('加工シート')

    # 処理とコピー
    for r in range(rows):
        for c in range(cols):
            original_value = rd_sheet.cell_value(r, c)
            # カスタム処理(例:数値のみ2倍)
            if isinstance(original_value, (int, float)):
                processed_value = original_value * 2
            else:
                processed_value = original_value
            wt_sheet.write(r, c, processed_value)

    # 保存
    wt_wb.save(output_path)

# 使用例
process_excel(r'C:\data\input.xls', r'C:\data\output.xls')

タグ: xlrd xlwt Excel操作 Pythonデータ処理 .xls

7月28日 21:23 投稿