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この投稿をテーマ別のブログに転送するといいと思います。

Source: https://habr.com/ru/post/J99923/


All Articles