PythonでExcelファイル(.xls)を作成!xlwtライブラリ徹底解説 📝

Python

古い形式のExcelファイル(.xls)をPythonで生成するための定番ライブラリxlwtの使い方を基礎から応用まで詳しく解説します。

xlwtは、PythonプログラムからExcelファイルを作成するためのライブラリです。特に、Excel 97-2003形式のファイル、つまり拡張子が .xls のファイルを作成することに特化しています。

⚠️ 重要な注意点

xlwtは .xls形式のファイルのみ をサポートしており、Excel 2007以降の標準形式である .xlsx形式のファイルを作成することはできません。 もし.xlsx形式のファイルを扱いたい場合は、openpyxlxlsxwriter といった他のライブラリを利用する必要があります。また、xlwtは書き込み専用であり、既存のExcelファイルを読み込んだり、変更したりすることはできません。読み込みには姉妹ライブラリである xlrd を使用します(ただし、xlrdも主に.xls形式の読み込み用です)。

xlwtの主な特徴は以下の通りです:

  • .xls形式のExcelファイルを新規作成できる
  • セルへの値(文字列、数値、日付、数式)の書き込み
  • セルの書式設定(フォント、色、罫線、背景、表示形式など)
  • セルの結合
  • 行の高さや列の幅の調整
  • 複数シートの操作
  • Python標準ライブラリ以外に依存関係がない(Pure Python)
  • Windowsだけでなく、macOSやLinuxなど、Pythonが動作する様々なプラットフォームで利用可能

主に、古いシステムとの連携や、.xls形式での出力が要件となっている場合に役立ちます。また、シンプルなExcelファイルを高速に生成したい場合にも選択肢の一つとなり得ます。

ただし、2015年にPython 3対応が行われ、2017年頃にいくつかの修正が行われていますが、それ以降、活発な開発やメンテナンスが行われている様子は限定的です。そのため、新しい機能の追加や、将来的なPythonバージョンへの追従については注意が必要です。

xlwtライブラリはpipを使って簡単にインストールできます。ターミナルやコマンドプロンプトで以下のコマンドを実行してください。

pip install xlwt

これで、Pythonスクリプトからxlwtをインポートして使用する準備が整いました。

import xlwt

xlwtを使ってExcelファイルを作成する基本的な流れを見ていきましょう。

1. Workbook(ブック)の作成

まず、Excelファイル全体を表すWorkbookオブジェクトを作成します。

import xlwt

# Workbookオブジェクトを作成
book = xlwt.Workbook()

2. Worksheet(シート)の追加

次に、Workbookオブジェクトのadd_sheet()メソッドを使って、ワークシートを追加します。引数にはシート名を指定します。

# 'Sheet1'という名前のシートを追加
sheet1 = book.add_sheet('Sheet1')

# 別のシートも追加可能
sheet2 = book.add_sheet('データ一覧')

3. セルへの書き込み

作成したWorksheetオブジェクトのwrite()メソッドを使って、特定のセルに値を書き込みます。

write()メソッドの基本的な引数は以下の通りです。

  • r: 行インデックス(0始まり)
  • c: 列インデックス(0始まり)
  • label: 書き込む値(文字列、数値、日付オブジェクト、xlwt.Formulaオブジェクトなど)
  • style: セルに適用するスタイル(xlwt.XFStyleオブジェクト、後述)
# 1行目、1列目 (A1セル) に文字列を書き込む
sheet1.write(0, 0, 'こんにちは')

# 1行目、2列目 (B1セル) に数値を書き込む
sheet1.write(0, 1, 123.45)

# 2行目、1列目 (A2セル) に日付を書き込む (datetimeオブジェクトを使用)
import datetime
sheet1.write(1, 0, datetime.datetime.now()) # 現在の日時

# 3行目、3列目 (C3セル) に数式を書き込む (A3+B3)
# Formulaオブジェクトを使用
sheet1.write(2, 2, xlwt.Formula('A3+B3'))
sheet1.write(2, 0, 10) # A3セルに値を入れる
sheet1.write(2, 1, 20) # B3セルに値を入れる

Worksheetオブジェクトからrow()メソッドを使って特定の行オブジェクトを取得し、その行オブジェクトのwrite()メソッドを使うこともできます。これは、同じ行に連続して値を書き込む場合に便利です。

# 4行目 (インデックス3) を取得
row_obj = sheet1.row(3)

# 4行目の1列目 (A4) から5列目 (E4) まで値を書き込む
row_obj.write(0, 'データA') # A4
row_obj.write(1, 100)      # B4
row_obj.write(2, 200)      # C4
row_obj.write(3, 300)      # D4
row_obj.write(4, 400)      # E4

4. ファイルの保存

最後に、Workbookオブジェクトのsave()メソッドを使って、Excelファイルとして保存します。引数にはファイル名を指定します。拡張子は.xlsにする必要があります。

# 'sample.xls' という名前で保存
book.save('sample.xls')

# 既存のファイルパスを指定すると上書きされるため注意が必要
# book.save('existing_file.xls')

基本的なコード全体像

import xlwt
import datetime

# 1. Workbookオブジェクトを作成
book = xlwt.Workbook(encoding='utf-8') # エンコーディングを指定すると日本語等の文字化けを防ぎやすい

# 2. Worksheetを追加
sheet1 = book.add_sheet('基本操作シート')

# 3. セルに書き込み
# 直接指定
sheet1.write(0, 0, '項目')
sheet1.write(0, 1, '値')
sheet1.write(1, 0, '文字列')
sheet1.write(1, 1, 'サンプルテキスト')
sheet1.write(2, 0, '数値')
sheet1.write(2, 1, 9876)
sheet1.write(3, 0, '日付')
sheet1.write(3, 1, datetime.date(2023, 10, 26)) # 日付のみ
sheet1.write(4, 0, '日時')
sheet1.write(4, 1, datetime.datetime(2023, 10, 26, 15, 30, 0)) # 日付と時刻

# 行オブジェクト経由
row5 = sheet1.row(5) # 6行目
row5.write(0, '連続データ1')
row5.write(1, 10)
row5.write(2, 20)
row5.write(3, 30)

# 数式
sheet1.write(6, 0, '合計')
sheet1.write(6, 1, xlwt.Formula('SUM(B6:D6)')) # B6からD6の合計

# 4. ファイルを保存
try:
    book.save('basic_example.xls')
    print("ファイル 'basic_example.xls' が正常に保存されました。🎉")
except Exception as e:
    print(f"ファイルの保存中にエラーが発生しました: {e} 😢")

💡 TIPS: 文字化け対策

xlwt.Workbook() を作成する際に encoding='utf-8' のようにエンコーディングを指定すると、日本語などのマルチバイト文字が正しく書き込まれやすくなります。

xlwtでは、セルの見た目を細かく設定できます。スタイルはxlwt.XFStyleオブジェクトとして定義し、write()メソッドの第4引数に渡します。

スタイルの設定には、個別のスタイルオブジェクト(Font, Borders, Pattern, Alignment, Protection)を組み合わせてXFStyleオブジェクトを作成する方法と、easyxfというヘルパー関数を使う方法があります。

easyxf を使った簡単なスタイル設定

easyxf関数は、CSSのような文字列形式でスタイルを指定できるため、直感的で便利です。基本的な書式は '項目名1: 設定値1; 項目名2: 設定値2, 設定値3;' のようになります。

import xlwt
import datetime

book = xlwt.Workbook(encoding='utf-8')
sheet = book.add_sheet('スタイル適用シート')

# --- スタイルの定義 (easyxfを使用) ---

# フォント: 太字、赤色
style_bold_red = xlwt.easyxf('font: bold on, color red;')
sheet.write(0, 0, '太字・赤', style_bold_red)

# フォント: イタリック、Times New Roman
style_italic_font = xlwt.easyxf('font: name "Times New Roman", italic on;')
sheet.write(1, 0, 'イタリック・Times', style_italic_font)

# フォント: 高さ 16pt (1pt = 20 twips)
style_large_font = xlwt.easyxf('font: height 320;') # 16 * 20 = 320
sheet.write(2, 0, '大きな文字', style_large_font)

# 背景色: 黄色 (yellow)
style_bg_yellow = xlwt.easyxf('pattern: pattern solid, fore_colour yellow;')
sheet.write(3, 0, '背景黄色', style_bg_yellow)

# 罫線: 上下左右に細い実線 (thin)
style_border_thin = xlwt.easyxf('border: top thin, bottom thin, left thin, right thin;')
sheet.write(4, 0, '四方罫線(細)', style_border_thin)

# 罫線: 下二重線 (double)
style_border_double = xlwt.easyxf('border: bottom double;')
sheet.write(5, 0, '下二重線', style_border_double)

# 配置: 右寄せ (right)、中央揃え (centre)
style_align_right_center = xlwt.easyxf('align: horiz right, vert centre;')
sheet.write(6, 0, '右・中央寄せ', style_align_right_center)
sheet.row(6).height_mismatch = True # 行の高さを自動調整しない場合に設定
sheet.row(6).height = 20 * 30 # 行の高さを設定 (単位: twips)

# 配置: 折り返して全体を表示 (wrap on)
style_wrap_text = xlwt.easyxf('align: wrap on;')
long_text = "これは非常に長いテキストです。セルの幅に合わせて自動的に折り返されるべきです。"
sheet.write(7, 0, long_text, style_wrap_text)
sheet.col(0).width = 256 * 30 # 列幅を設定 (単位: 文字'0'の幅 * 256)

# 数値表示形式: 通貨 ($#,##0.00)
style_num_currency = xlwt.easyxf(num_format_str='$#,##0.00')
sheet.write(8, 0, 12345.67, style_num_currency)

# 日付表示形式: YYYY/MM/DD
style_num_date = xlwt.easyxf(num_format_str='YYYY/MM/DD')
sheet.write(9, 0, datetime.date(2024, 5, 1), style_num_date)

# 組み合わせ: 太字、背景黄色、中央揃え
style_combined = xlwt.easyxf('font: bold on; pattern: pattern solid, fore_colour yellow; align: horiz centre;')
sheet.write(10, 0, '複合スタイル', style_combined)

book.save('styling_example.xls')
print("ファイル 'styling_example.xls' が正常に保存されました。🎨")

easyxfで指定できる主な項目と値は以下の通りです(詳細はxlwtのドキュメントやソースコードを参照)。

  • font: name 'フォント名', bold on/off, italic on/off, underline on/off, color 色名/color_index 番号, height ポイント数*20 など
  • pattern: pattern solid/fine_dots/etc, fore_colour 色名, back_colour 色名 など (fore_colourが背景色になります)
  • border: top/bottom/left/right/diag 線種 (線種: no_line, thin, medium, dashed, dotted, thick, double など)
  • align: horiz left/centre/right/general/etc, vert top/centre/bottom/etc, wrap on/off など
  • protection: locked on/off, hidden on/off

また、easyxfの第二引数 num_format_str で数値や日付の表示形式を指定できます。Excelの「セルの書式設定」の「表示形式」で使われる書式文字列と同様のものが使えます。

個別のスタイルオブジェクトを使った設定

より詳細な制御を行いたい場合や、プログラムで動的にスタイルを生成したい場合は、個別のスタイルオブジェクト(Font, Borders, Pattern, Alignment, Protection)を作成し、それらをXFStyleオブジェクトの属性として設定します。

import xlwt

book = xlwt.Workbook(encoding='utf-8')
sheet = book.add_sheet('個別スタイル設定シート')

# --- フォント設定 ---
font1 = xlwt.Font()
font1.name = 'Arial'
font1.bold = True
font1.italic = True
font1.colour_index = xlwt.Style.colour_map['blue'] # 色名からインデックスを取得

# --- 罫線設定 ---
borders1 = xlwt.Borders()
borders1.left = xlwt.Borders.THICK # 太線
borders1.right = xlwt.Borders.THICK
borders1.top = xlwt.Borders.DOTTED # 点線
borders1.bottom = xlwt.Borders.DOTTED

# --- 背景設定 ---
pattern1 = xlwt.Pattern()
pattern1.pattern = xlwt.Pattern.SOLID_PATTERN
pattern1.pattern_fore_colour = xlwt.Style.colour_map['light_green'] # 明るい緑

# --- 配置設定 ---
alignment1 = xlwt.Alignment()
alignment1.horz = xlwt.Alignment.HORZ_CENTER # 水平中央
alignment1.vert = xlwt.Alignment.VERT_CENTER # 垂直中央

# --- スタイルオブジェクト (XFStyle) の作成と適用 ---
style1 = xlwt.XFStyle()
style1.font = font1
style1.borders = borders1
style1.pattern = pattern1
style1.alignment = alignment1
style1.num_format_str = '#,##0' # 数値のカンマ区切り

sheet.write(0, 0, '個別スタイル設定', style1)
sheet.write(1, 0, 1234567, style1) # 同じスタイルを適用

book.save('detailed_styling_example.xls')
print("ファイル 'detailed_styling_example.xls' が正常に保存されました。🔧")

💡 TIPS: 色の指定

xlwtでは、色は主にcolour_indexという番号で管理されます。xlwt.Style.colour_mapディクショナリに一般的な色名とそのインデックスのマッピングが定義されているので、これを利用すると便利です (例: xlwt.Style.colour_map['red'])。カスタムRGBカラーを設定することも可能ですが、少し複雑になります。

💡 TIPS: スタイルの再利用

同じスタイルを複数のセルに適用する場合、XFStyleオブジェクトは一度だけ作成し、それを使い回すことが推奨されます。これにより、Excelファイル内のスタイル定義数が抑えられ、ファイルサイズが小さくなります。

数式の書き込み

前述の通り、xlwt.Formula()オブジェクトを使うことで、セルにExcelの数式を埋め込むことができます。

import xlwt

book = xlwt.Workbook(encoding='utf-8')
sheet = book.add_sheet('数式シート')

sheet.write(0, 0, '値1')
sheet.write(0, 1, '値2')
sheet.write(0, 2, '合計 (A+B)')
sheet.write(0, 3, '条件判定 (IF)')

# データ入力
sheet.write(1, 0, 10)
sheet.write(1, 1, 20)
sheet.write(2, 0, 5)
sheet.write(2, 1, 15)
sheet.write(3, 0, 100)
sheet.write(3, 1, -50)

# 数式入力
for row_idx in range(1, 4):
    # 合計 (例: C2セルに '=A2+B2')
    formula_sum = f'A{row_idx + 1}+B{row_idx + 1}'
    sheet.write(row_idx, 2, xlwt.Formula(formula_sum))

    # 条件判定 (例: D2セルに '=IF(A2>50, "High", "Low")')
    formula_if = f'IF(A{row_idx + 1}>50, "High", "Low")'
    sheet.write(row_idx, 3, xlwt.Formula(formula_if))

# SUM関数
sheet.write(4, 0, '総合計')
sheet.write(4, 2, xlwt.Formula('SUM(C2:C4)'))

book.save('formula_example.xls')
print("ファイル 'formula_example.xls' が正常に保存されました。🧮")

数式文字列はExcelでセルに入力するものと同じ形式ですが、先頭の=は不要です。

セルの結合

Worksheetオブジェクトのwrite_merge()メソッドを使うと、複数のセルを結合して値を書き込むことができます。

write_merge()メソッドの引数は以下の通りです。

  • r1: 結合開始行インデックス(0始まり)
  • r2: 結合終了行インデックス(0始まり)
  • c1: 結合開始列インデックス(0始まり)
  • c2: 結合終了列インデックス(0始まり)
  • label: 書き込む値
  • style: 適用するスタイル
import xlwt

book = xlwt.Workbook(encoding='utf-8')
sheet = book.add_sheet('結合セルシート')

# スタイル: 中央揃え
style_center = xlwt.easyxf('align: horiz centre, vert centre;')

# A1からC1までを結合してタイトルを入力
sheet.write_merge(0, 0, 0, 2, '月間売上レポート', style_center)

# A2からA3までを結合
sheet.write_merge(1, 2, 0, 0, '商品カテゴリA', style_center)
sheet.write(1, 1, '商品A-1')
sheet.write(1, 2, 10000)
sheet.write(2, 1, '商品A-2')
sheet.write(2, 2, 15000)

# B4からC4までを結合
sheet.write_merge(3, 3, 1, 2, '小計', style_center)
sheet.write(3, 0, 'カテゴリA計')
sheet.write(4, 0, xlwt.Formula('C2+C3')) # 小計の計算 (便宜上ここに)

book.save('merge_cells_example.xls')
print("ファイル 'merge_cells_example.xls' が正常に保存されました。🖇️")

⚠️ 注意: 結合セルの扱い

セルを結合すると、結合範囲の左上のセル以外は隠れた状態になります。結合範囲内の他のセルにwrite()などで書き込んでも、Excel上では表示されません(データとしては保持されている可能性があります)。 また、他のライブラリ(特に読み込みライブラリ)では、結合セルの扱いに違いがある場合があるので注意が必要です。

行の高さ・列の幅の調整

行の高さや列の幅を調整するには、それぞれRowオブジェクトのheight属性、Columnオブジェクトのwidth属性を設定します。

  • 高さの単位: twips (1/20ポイント)
  • 幅の単位: 標準フォントの文字’0’の幅 × 256
import xlwt

book = xlwt.Workbook(encoding='utf-8')
sheet = book.add_sheet('サイズ調整シート')

# --- 行の高さ調整 ---
# 1行目 (インデックス0) の高さをデフォルトの2倍にする (約)
row0 = sheet.row(0)
row0.height_mismatch = True # 高さを明示的に設定することを示すフラグ
row0.height = 255 * 2 # デフォルトの高さが255 twipsの場合

sheet.write(0, 0, '高さ2倍の行')

# 2行目 (インデックス1)
sheet.write(1, 0, '標準の高さ')


# --- 列の幅調整 ---
# A列 (インデックス0) の幅を20文字分にする
col0 = sheet.col(0)
col0.width = 256 * 20

# B列 (インデックス1) の幅を5文字分にする
sheet.col(1).width = 256 * 5

sheet.write(2, 0, '幅が広い列 (A)')
sheet.write(2, 1, '幅が狭い列 (B)')


book.save('sizing_example.xls')
print("ファイル 'sizing_example.xls' が正常に保存されました。📏")

row.height_mismatch = True を設定しないと、heightを設定しても反映されないことがあるため注意が必要です。

その他

  • シートの保護: Worksheetオブジェクトのprotect属性やpassword属性を設定することで、シートの保護が可能です。
  • ウィンドウ枠の固定: Worksheetオブジェクトのset_panes_frozen()メソッドなどで、ウィンドウ枠の固定設定ができます。
  • 画像の挿入: Worksheetオブジェクトのinsert_bitmap()メソッドでビットマップ画像を挿入できますが、制約もあります。

これらの詳細については、xlwtのドキュメントやサンプルコードを参照してください。

xlwtを使用する上で、いくつか知っておくべき注意点と制限事項があります。

  • .xls形式のみ対応: 再掲ですが、最も重要な点です。Excel 2007以降の標準形式である.xlsxファイルは作成できません。
  • 書き込み専用: 既存の.xlsファイルを読み込んだり、編集したりすることはできません。読み込みにはxlrdが必要です。
  • 行数・列数の制限: .xls形式の仕様上の制限により、作成できるワークシートは最大で65,536行256列までです。これを超えるデータは扱えません。
  • スタイルの制限: 設定できるスタイルの数にも制限があります(約4000程度)。easyxfなどでスタイルを大量に生成すると、この制限に達する可能性があります。スタイルオブジェクトを再利用することが重要です。
  • メモリ使用量: 大量のデータを書き込む場合、Workbookオブジェクトがメモリ上にデータを保持するため、メモリ使用量が増大する可能性があります。Worksheet.flush_row_data()メソッドを定期的に呼び出すことで、メモリ上のデータを一時ファイルに書き出し、メモリ消費を抑えることができますが、フラッシュされた行は後からアクセスできなくなります。
  • メンテナンス状況: 前述の通り、近年は活発な開発が行われていない可能性があります。将来的なPythonバージョンやOSとの互換性に問題が発生する可能性もゼロではありません。
  • グラフや図形の描画: 基本的にサポートされていません。これらが必要な場合は、xlsx形式を扱える他のライブラリ(openpyxl, xlsxwriter)を検討する必要があります。

🚨 重要な判断基準

新しいプロジェクトで、特別な理由がない限り、現在主流の .xlsx形式を扱える openpyxlxlsxwriter を使用することを強く推奨します。 これらのライブラリは、.xlsx形式のサポート、より豊富な機能(グラフ作成など)、活発なメンテナンスといった利点があります。xlwtは、.xls形式での出力が必須要件である場合に限定して使用を検討するのが良いでしょう。

PythonでExcelファイルを扱うライブラリは他にもあります。主なものとxlwtを比較してみましょう。

ライブラリ対応形式 (書き込み)読み込み主な機能・特徴メンテナンス状況主な用途
xlwt.xls のみ不可 (姉妹ライブラリxlrdが必要)シンプルな.xlsファイル作成、書式設定、数式、依存関係が少ない限定的 (注意が必要).xls形式が必須の場合、古いシステム連携
openpyxl.xlsx可 (.xlsx).xlsxの読み書き、豊富な書式設定、グラフ、図形、数式、条件付き書式など多機能活発.xlsx形式の読み書き全般、新規プロジェクトでの推奨
xlsxwriter.xlsx不可.xlsxの新規作成に特化、高速、豊富な書式設定、グラフ作成機能が強力、メモリ効率が良い活発大規模な.xlsxファイルの新規作成、レポート生成、グラフ多用時
pandas.xlsx, .xls (内部でopenpyxl/xlwt使用)可 (.xlsx, .xls – 内部でopenpyxl/xlrd使用)データ分析に特化、DataFrameとの連携、簡単な読み書き活発データ分析、表形式データの処理、簡単なExcel入出力
xlwings.xlsx, .xls (Excel経由も可)可 (.xlsx, .xls – Excel経由も可)Excelとの対話的操作、VBAの代替、UDF作成、pandas/numpy連携活発Excelの自動操作、対話的なデータ分析、既存Excelファイルの操作

このように、用途に応じて適切なライブラリを選択することが重要です。特にこだわりがなければ、現代的なExcelファイルを扱う場合はopenpyxlかxlsxwriterが第一候補となるでしょう。

xlwtは、Pythonで古い形式のExcelファイル(.xls)を作成するためのライブラリです。基本的なセルの書き込みから、フォント、色、罫線、表示形式などのスタイル設定、数式の埋め込み、セルの結合まで、.xlsファイルを作成する上で必要な基本的な機能を提供しています。

しかし、.xlsx形式には対応しておらず、行数や列数、スタイルの数にも制限があり、近年は活発な開発が行われていない点には注意が必要です。

.xls形式での出力が明確に要求される場合には依然として有効な選択肢ですが、それ以外の場合は、openpyxlやxlsxwriterといった、より現代的で高機能なライブラリの使用を検討することをお勧めします。

この記事が、xlwtライブラリの理解と、PythonでのExcelファイル操作の一助となれば幸いです。Happy Coding! 😊

コメント

タイトルとURLをコピーしました