Pythonを使用してExcelファイルを処理する

画像

職場では、Pythonを使用してxlsファイルを処理するタスクを処理する必要がありました。 少しグーグルで、Excelファイルで作業できるいくつかのライブラリに出会いました。



図書館:

-xlrd-Excelファイルを読み取ることができます

-xlwt-Excelファイルを作成して入力する

-xlutils-前の2つのライブラリの機能を拡張するユーティリティのセット

-pyExcelerator-Excelファイルでの作業も可能になりますが、長い間更新されていません。



私のタスクでは、最初の3つのライブラリーを使用しました。

タスクはいくつかの部分に分割されました:xls拡張子を持つファイルの読み取り。 新しいものを作成して記入します。 入力ファイルに基づいてファイルのコピーを作成します。 出力ファイルの必要な行を削除します。



入力ファイルの読み取り



このタスクはそれほど難しくありません。 xlrdに付属のドキュメントと例は、xlrdの迅速な解決に役立ちました。

コード例:

import xlrd

rb = xlrd . open_workbook( 'd:/final.xls' ,formatting_info = True )

sheet = rb . sheet_by_index( 0 )

for rownum in range (sheet . nrows):

row = sheet . row_values(rownum)

for c_el in row:

print c_el









新しいファイルを作成して入力します



このタスクは、前のタスクほど難しくありませんでした。 ドキュメントと例が役に立ちました。

コード例:

import xlwt

from datetime import datetime



font0 = xlwt . Font()

font0 . name = 'Times New Roman'

font0 . colour_index = 2

font0 . bold = True



style0 = xlwt . XFStyle()

style0 . font = font0



style1 = xlwt . XFStyle()

style1 . num_format_str = 'D-MMM-YY'



wb = xlwt . Workbook()

ws = wb . add_sheet( 'A Test Sheet' )



ws . write( 0 , 0 , 'Test' , style0)

ws . write( 1 , 0 , datetime . now(), style1)

ws . write( 2 , 0 , 1 )

ws . write( 2 , 1 , 1 )

ws . write( 2 , 2 , xlwt . Formula( "A3+B3" ))



wb . save( 'example.xls' )









入力ファイルに基づいてファイルのコピーを作成する



この問題は2つの方法で解決できます。 オプション1:読み取り用に入力ファイルを開き、新しいファイルを作成し、ループ内の1つのファイルから別のファイルにすべてのデータを上書きします。 このようなソリューションを実装するのは難しくないため、サンプルコードをレイアウトしても意味がありません。 オプション2:xlutilsライブラリを使用します。 このライブラリには多くの興味深い有用なものがありますが、 xlutils.copyはこのタスクにとって興味深いものです。

したがって、xlutils.copyを使用して入力に基づいてファイルを作成するコードの例:

import xlrd

import xlwt

from xlutils.copy import copy



rb = open_workbook( 'final.xls' ,on_demand = True ,formatting_info = True )

wb = copy(rb)

wb . save( "final_complete.xls" )









ここにそのような小さなコードがあります。 動作するためには、 on_demand = Trueフラグがオンになっている必要があります。 format_infoフラグを使用すると、入力と同じデザインスタイルで出力ファイルが取得されます。 私の仕事では、これが正しいオプションであることがわかりました。



指定した条件で行を削除する



この問題を解決するために、フィルターを使用することにしました。 1つのオプションは、特定の条件を満たさないオプションを除外して、あるファイルから別のファイルに書き換えることです。 ただし、1つの落とし穴があります。ドキュメントのデザインスタイルを保持する必要がある場合、このアプローチは機能しません(もちろん、デザインスタイルを事前に知っていて、プログラムで設定できる場合を除きます)。 この問題の解決は、xlutils.filterを使用して達成されました。 タスク:転送されたリストに含まれるエントリのみを出力Excelファイルに残す。

この問題を解決するコード:

from xlutils.filter import GlobReader,BaseFilter,DirectoryWriter,process



myfile = 'final2.xls'

mydir = 'd:/'



class MyFilter (BaseFilter):



goodlist = None



def __init__ ( self ,elist):

self . goodlist = goodlist

self . wtw = 0

self . wtc = 0





def workbook ( self , rdbook, wtbook_name):

self . next . workbook(rdbook, 'filtered_' + wtbook_name)



def row ( self , rdrowx, wtrowx):

pass



def cell ( self , rdrowx, rdcolx, wtrowx, wtcolx):

value = self . rdsheet . cell(rdrowx,rdcolx) . value

if value in self . goodlist:

self . wtc = self . wtc +1

self . next . row(rdrowx,wtrowx)

else :

return

self . next . cell(rdrowx,rdcolx, self . wtc,wtcolx)





data = """somedata1

somedata2

somedata3

somedata4

somedata5

"""




goodlist = data . split( " \n " )



process(GlobReader(os . path . join(mydir,myfile)),MyFilter(goodlist),DirectoryWriter(mydir))









おわりに



3つのライブラリのセットを使用して、タスクが解決されました。 次のことに注意してください。入力Excelファイルにグラフィック要素(画像など)がある場合、それらは出力ファイルに転送されません。 おそらくこれらのライブラリを研究したことで、問題のこの部分を解決することが可能になるでしょう。



参照資料



sourceforge.net/projects/pyexcelerator

www.python - excel.org-最初の3つのライブラリへ。

groups.google.com/group/python-excelは、xlrd、xlwt、およびxlutilsライブラリの使用について説明するグループです。



PSこの投稿をテーマ別のブログに転送するといいと思います。



All Articles