機能: Excelファイル (.xlsx) の取り扱い
継承: tkExcel(tkDataFile):
モジュール: openpyxl, pandas
attributes:
self.fp
# 現在開いているファイルポインタ
self.path #
現在開いているファイルパス
self.mode #
現在開いているモード
self.password #
暗号化されたファイルのパスワード。Noneの場合はパスワード無し
self.tmp_file #
暗号化されたファイルを開く際の一時ファイルパス
self.wb
# workbook
self.ws
# current worksheet
self.table_name # DBとして扱う際のテーブル名。current
worksheet名に一致
self.isheet # current
worksheetの番号
self.sheetname # current worksheet名
self.dataframe # use_dataframe()を使った場合、pandas.DataFrame変数の参照が入る
コンストラクタ: xls = tkExcelDB_ path = None, mode = 'r', table_name = None, password = None, tmp_file = None,
OpenFile = True, CloseFile = False, data_only = True, description = '', **args)
OpenFile is Trueの場合: self.open()を呼び出し、ファイル内容を取得する
ファイルオープン: xls.open(path = None, mode = None, data_only = True, encoding = None, IsPrint =
True)
暗号化ファイルの読み込み: xls.open_encrypted(self, path = None, mode = None, password = None, tmp_file = 'tmp.xlsx',
data_only = True, encoding = None, IsPrint = True):
ファイルクローズ: xls.close()
インスタンス情報表示: xls.print_inf()
print()と同じように、現在位置から改行しながらcellに出力する:
xls.print(*vals, end = '\n')
current worksheetのcellにvalを設定する: xls.write(irow, icol, val) set()と同じ
cellにvalを設定する: xls.set(irow, icol, val, ws = None)
cellから値を取得する: val = xls.get(irow, icol, def_val = None, ws =
None)
cellの書式と値をコピーする: xls.copy_cell_format( ws_source = None, irow_source = None, icol_source = None,
ws_target = None, irow_target = None, icol_target = None, format =
'value|fill|font|border'):
同じworkbookのシートをcurrent worksheetにコピーする: xls.copy_worksheet( ws_source, title = None):
異なるworkbookのシートをcurrent worksheetにコピーする:
xls.copy_worksheet2( ws_source, title = None):
indexesとrowsのリスト変数で与えた列、行に対応するラベルとデータをリスト変数で取得:
labels = data_list = xls. get_specified_data( indexes = None, rows = None, convert_label =
True)
labelで与えた正規表現に一致する列番号を返す: icol =
xls.get_icolumn_from_label_regex(label, column_org = 1, row_org = 1, sheet =
None)
labelで与えた文字列に一致する列番号を返す: icol =
xls.get_icolumn_from_label(label, column_org = 1, row_org = 1, sheet = None)
valで与えた値に一致する行番号を返す: irow =
xls.find_val_in_row(label, column_org = 1, row_org = 1, sheet = None)
valで与えた値に一致する列番号を返す: icol =
xls.find_val_in_column(val, icolumn, row_org = 1, sheet = None, auto_add =
False)
conditionの検索条件に合う行番号のリストを取得:
irows_list = xls.select_irows(condition, key_column_org = 1, key_row_org = 1, target_row_org = 2, is_print = False, first_hit_only =
False)
conditionの検索条件に合うデータから、target_labelsの列のデータの2次元リスト変数、辞書変数、行番号のリスト変数を取得:
ret = xls. select(condition, target_labels = None, key_column_org = 1, target_row_org = 2, key_row_org = 1, ret_type = 'list', is_print = False):
ret: ret_type == 'all': ラベルのリスト (target_labelsに対応するラベル名)、リスト変数、辞書変数、
行番号のリスト変数を含む辞書変数
ret_type == 'list':
labels, data_list を返す
ret_type == 'dict':
labels, data_dict を返す
ret_type == 'irows':
labels, irows_list を返す
2次元リスト変数をpandas.DataFrameに変換: df = xls.use_dataframe(labels, data_list):
worksheetを挿入: create_sheet(self, index = 0, title = None):
worksheetを削除: remove_sheet(self, title):
worksheet名を設定: set_sheet_name(self, title, sheet = None):
index番目のworksheetを取得: get_sheet(self, index):
シート名からworksheetを取得: get_sheet_by_name(self, title):
シート名あるいはその正規表現からworksheet番号を取得: find_isheet(self, name, reg_exp = False):
行を挿入: insert_rows(self, irow):
フォントや書式を指定して列を挿入: insert_cols(self, icol, sheet = None, label = None, check_exist = False, column_org = 1, row_org = 1,
font = None, alignment = None, fill = None, border = None,
width = None, restore_width = True, restore_hidden = True):
固定行を設定: freeze_panes(self, cell = 'A1', sheet = None):
最大行数を取得: max_row(self):
最大列数を取得: max_column(self):
ラベル行からラベルのリストを取得: get_labels(self, ws = None, irow_origin = 1, icol_origin =
1)
行削除: delete_rows(self, irow):
列削除: delete_cols(self, icol):
行データのリストを取得: get_row(self, irow, ws = None):
プログラム例:
# ファイル読み込み
xls_in1 = tkExcelDB(infile1, table_name = None, password = password, tmp_file = tmp_file,
OpenFile = True, CloseFile = True, description = '入力ファイル1', IsPrint = True)
if xls_in1.ws is None:
print("")
print(f"Error: Cannot read [{infile1}]")
# ファイル作成: outfileが存在したら、まずmode
= 'r'で読み込み、処理をした後 save()で保存する
print(f"出力ファイル {outfile}を読み込みます")
xls_out = tkExcelDB(outfile, table_name = None, password = password,
tmp_file = tmp_file,
mode = 'r', OpenFile = True,
CloseFile = True, data_only = True, description = '出力ファイル', IsPrint = True)
print(f"出力ファイル {outfile} に保存します")
xls_out.save(path = None, workbook = None)
#入力ファイルからラベルがkeyである行を抽出
key_column_org1 = xls_in1.get_icolumn_from_label(key, column_org =
1, row_org = 1, sheet = None)
if key_column_org1 is None:
print(f"Error: [{key}]列が入力ファイル1 [{infile1}]
{icol_origin1}列以降の{irow_label1}行目に見つかりません")
#ファイル情報を表示
xls_in1.print_inf()
#入力ファイルからラベルがkeyの値が空白でないデータを抽出。ラベル行は1行目、データは2行目から始まる
# ret_type='all'にすると、リスト変数、辞書変数と、抽出した行番号のリストを含む辞書変数を返す
# 検索演算子としては、=, !=, <,
<=, >, >= (数値型)、eq, neq (文字列型)、正規表現として
like, not like w使える
# 左辺はラベル名でなければいけない
(ラベル名は正規表現で指定する。"番号"
に正確にヒットさせる場合、"^番号$" とする)
# 例: '番号' > 100 and '番号' < 1000 and '得点' > 50
# 例: '番号' > 100 and '番号' < 1000 and '得点' > 50
condition = f"'{key}' neq ''"
inf = xls_in1.select(condition, target_labels = None, key_column_org = 1, key_row_org =
1, target_row_org = 2, ret_type = 'all', is_print = False)
target_labels = inf["labels"]
data_list = inf["list"]
data_dict = inf["dict"]
irow_list = inf["irows"]
#cellの値を取得
val = xls_in2.get(irow = irow_source, icol = icol_source)
#cell書式を含めてコピー
xls_out.copy_cell_format(ws_source = xls_in1.ws, irow_source = irow_source, icol_source = icol_source,
ws_target = None, irow_target = irow_target, icol_target = icol_target,
format = 'value|fill|font|border')
# pands.DataFrameに変換
df_labels = ['id', 'score']
# DataFrameで検索する場合、ラベル (columns)
はpythonの変数名として付かなければいけない
df = db_exam.use_dataframe(labels = df_labels, data_list = data_list)
# DataFrameでの検索の仕方
df_labels = ['id', 'cancel', 'result', 'focus', 'prof', 'prof1']
dq = df.query("100 < id <
1000")
#
idが100より大きく1000より小さいデータを抽出
dq = df.query("id.str.contains('M')")
#
idに文字列 M が含まれるデータを抽出