xls は Pythonista の敵

1日1 Python のお時間です。

今回は xls ファイルの話をするぜ。 xls ファイルを Python で編集しようとしたものの、 xls を編集することは Python にはできないことがわかったのでそれについてまとめておく。 xls も xlsx も Excel のファイル形式だが、 xls は Excel2003 までで使われていた化石のようなファイル形式だ。賢明なるみなさんは xlsx を使おう。

結論から書くと……

  • ライブラリ openpyxl: 使えない。こいつは xlsx にのみ対応しているナウいライブラリだ。
  • ライブラリ xlrd: 使えない。こいつは xls を読むためのライブラリだ。
  • ライブラリ xlwt: 使えない。こいつは「新規」 xls を作成するためのライブラリだ。「既存」 xls の更新はできない。
  • ライブラリ pandas: 使えない。こいつは xls を読むこともできるし書くこともできる。が、書くのに内部的に xlwt を使っているので、機能としては xlwt と変わりない。

過激な表題にしてしまったので一応補足しておくと、本記事で「できない」としているのは「既存 xls の編集」だ。

 

openpyxl でやろうとして失敗するところ

import openpyxl
workbook = openpyxl.load_workbook('sample.xls')
openpyxl.utils.exceptions.InvalidFileException:
    openpyxl does not support the old .xls file format,
    please use xlrd to read this file,
    or convert it to the more recent .xlsx file format.

そもそも開けない。

 

xlrd でやろうとして失敗するところ

import xlrd

# xls を取得します。 xlrd.book.Book
workbook = xlrd.open_workbook('sample.xls')

# シートを選択する必要があります。0を指定して最初のやつを選びます。 xlrd.sheet.Sheet
sheet = workbook.sheets()[0]

# 行を取得。
row = sheet.row(18)

# 行の中からセルを取得。
cell = sheet.row(18)[1]

# セルの値を取得。
cell_value = cell.value

取得しかできない。

 

xlwt でやろうとして失敗するところ

既存 xls を開くメソッドが存在しない。

 

pandas でやろうとして失敗するところ

import pandas

# xls を取得します。 pandas.core.frame.DataFrame
dataframe = pandas.read_excel('sample.xls')

# それをそのまま別 xls へ保存してみます。
# NOTE: 見るも無残に形式の違うものが保存されます。
# NOTE: ここに元 xls を指定すると上書きされて元のが死ぬのでヤメてください。
dataframe.to_excel('sample2.xls')

# 元 xls を編集しようとします。
# NOTE: 不可。 ValueError: Append mode is not supported with xlwt!
with pandas.ExcelWriter('sample.xls', mode='a') as writer:
    dataframe.to_excel(writer, sheet_name='sheet1')

ここに↑書いているとおりだけれど、

  • to_excel で保存すると元の xls の書式が死ぬ。
  • ExcelWriter で更新を試みても、内部で、 xls を開けない xlwt を利用しているので不可。

である。