エクセルコピペ作業自動化(xls、xlsx)

エクセルをpythonで扱う

仕事していると、エクセルで延々と だるい コピペ作業とかってありませんか。 先日、pythonを使ってコピペ作業を自動化しました。 その時、用いたpython用ライブラリ、使用方法を紹介します。

※今回は読み込みにしぼって説明

ライブラリ 

調査したところ、それぞれ対応しているライブラリは以下の通りのようです。

xlsxlsx 両方読み込みを行なうライブラリ、見当たりませんでした。

※ 諸事情によりxls形式を扱う人は多いのではないでしょうか。xlsxはexcel2007以降

読み込み方法

xlsとxlsx形式を扱うライブラリですが、 手順は以下に記載したとおりほとんど同じです。

  • 1.ワークシートを指定
  • 2.指定したワークシートからブック名一覧を取得
  • 3.ブックを指定
  • 4.指定したブックの値や入力された範囲を取得

あとはメソッド名を変えてあげれば対応OKです。

読み込んだファイル

今回は以下のファイル(xlsとxlsx形式)を読み込みました。 ファイル名:xls_test.xls

https://gyazo.com/3925b2837db18d3da1ce9c951b933197

プログラム例

実行環境:python 3.5.2

from abc import ABCMeta, abstractmethod
import re
import glob
import openpyxl
import xlrd

class ExcelTemplate(metaclass=ABCMeta):
    # デコレータ(abstractmethod)をつけると、サブクラスが抽象メソッドをオーバーライドしないとエラーとなる
    @abstractmethod
    def read_sheet():
        pass
    def get_filename(self,file):
        print(file + "の読み取りを行います。")

class XlsRead(ExcelTemplate):
    # xlsファイル読み込み
    def read_sheet(self,worksheet):
        # ワークシートを指定
        book = xlrd.open_workbook(worksheet)
        # シート名を取得 戻り値はリスト
        print(book.sheet_names())
        sheet_name = book.sheet_names()[0]
        # 一番目のシートを指定
        sheet_1 = book.sheet_by_name(sheet_name)
        print("値が入力されている 行列数:",sheet_1.ncols,sheet_1.nrows)
        print("1行目:1列目の値は:",sheet_1.cell(0, 0).value)

class XxlsRead(ExcelTemplate):
    # xlsxファイル読み込み
    def read_sheet(self,worksheet):
         # ワークシートを指定
        book = openpyxl.load_workbook(worksheet)
        # シート名表示 戻り値はリスト
        print(book.get_sheet_names())
         # 一番初めのシート名を取得
        sheet_name = book.get_sheet_names()[0]
        # 一番目のシートを指定
        sheet_1 = book[sheet_name]
        print("値が入力されている 行列数:",sheet_1.max_column,sheet_1.max_row)
        print("2行目:1列目の値は:",sheet_1.cell(row=2,column=1).value)

def main():
    xls_instance = XlsRead()
    xxls_instance = XxlsRead()
    worksheets = glob.glob(パスを指定)
    # 取得したエクセルリストに対して
    # xlsファイル、xlsmファイルに応じて切り替え
    for worksheet in worksheets:
        if re.match(r".+\.xls$",worksheet):
            xls_instance.get_filename(worksheet)
            xls_instance.read_sheet(worksheet)
            print("------------")
        elif re.match(r".+\.xlsx$",worksheet):
            xxls_instance.get_filename(worksheet)
            xxls_instance.read_sheet(worksheet)
            print("------------")
        else:
            pass

if __name__ == '__main__':
    main()
    
$ python template_xls.py

xls_test.xlsの読み取りを行います。
['Sheet1']
値が入力されている 行列数: 1 10
1行目:1列目の値は: xls_test1
------------
xlsx_test.xlsxの読み取りを行います。
['Sheet1']
値が入力されている 行列数: 1 10
2行目:1列目の値は: xlsx_test2
------------

参考文献

Javaで学ぶデザインパターン