エクセルコピペ作業自動化(xls、xlsx)
エクセルをpythonで扱う
仕事していると、エクセルで延々と だるい コピペ作業とかってありませんか。
先日、pythonを使ってコピペ作業を自動化しました。
その時、用いたpython用ライブラリ、使用方法を紹介します。
※今回は読み込みにしぼって説明
ライブラリ
調査したところ、それぞれ対応しているライブラリは以下の通りのようです。
※ xlsと xlsx 両方読み込みを行なうライブラリ、見当たりませんでした。
※ 諸事情によりxls形式を扱う人は多いのではないでしょうか。xlsxはexcel2007以降
読み込み方法
xlsとxlsx形式を扱うライブラリですが、 手順は以下に記載したとおりほとんど同じです。
- 1.ワークシートを指定
- 2.指定したワークシートからブック名一覧を取得
- 3.ブックを指定
- 4.指定したブックの値や入力された範囲を取得
あとはメソッド名を変えてあげれば対応OKです。
読み込んだファイル
今回は以下のファイル(xlsとxlsx形式)を読み込みました。 ファイル名:xls_test.xls
プログラム例
実行環境: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 ------------