概要
業務でちょっとエクセルファイルを加工する機会があったので、その時の処理のうち
エクセルファイルに列を追加したり、特定の条件の行を削除する処理をまとめてみました。
テンプレートや元になるデータにをちょっと加工する必要がある時に使えるかもしれません。
必要なもの
- python 3.7.2
- pandas
- numpy
- openpyxl
今回はexeはないです。
公開場所
githubで公開しています。
使い方
-
inputディレクトリの
基準データ.xlsx
に対し各種操作を行います。 -
inputディレクトリの
定義ファイル.xlsx
をもとに基準データ.xlsx
の内容を修正します。 -
各項目配下のようになっています
項番 | シート名 | カラム名 | 説明 |
---|---|---|---|
1 | 追加列 | 項目名 | 基準データのカラム名に対応設定した値を カラム名として追加する |
2 | 追加列 | 追加列 | 基準データ指定した列に追加を行う A列から1始まりで設定する |
3 | 追加列 | 追加データ | 追加するデータを記載したシートを指定する。データは行の位置に対応する値を設定すること。 |
4 | 削除行 | 項目名 | 基準データのカラム名に対応設定した値を指定する。 削除する行の条件に使用するカラムを指定する。 |
5 | 削除行 | 条件 | 削除する行の条件を指定する。 |
ソースの説明
以下の処理が列追加処理の部分になります。
取得したファイルからカラム名、追加する位置を取得しさらにそのデータを記載しているシート
から追加するデータを取得しています。
inser_cols
メソッドで指定した位置に列を追加しています。
データを取得し追加した列に値を設定しています。
また値を設定するときに罫線も引いています。
for columninfo in addColumnInfos:
addColumnName=columninfo[1]
addColumnPosition=columninfo[2]
addColumnData=columninfo[3]
addColmunDatas=inputWorkbook.parse(addColumnData)
addDatas=np.asarray(addColmunDatas)
baseSheet.insert_cols(addColumnPosition,1)
baseSheet.cell(column=addColumnPosition,row=2,value=addColumnName).border=blackBorder
for i,data in enumerate (addDatas):
baseSheet.cell(column=addColumnPosition,row=i+3,value=data[1]).border=blackBorder
以下の処理が行削除の部分になります。
取得したファイルから削除する条件が指定されているカラム名、削除条件を取得します。
その後削除対象の行の位置を決定後(pandasのqueryで条件を求めています)
その位置にたいして delete_rows
メソッドで削除しています。
行を削除した場合は削除した分詰まっていくので行の位置を補正しています。
for columninfo in addColumnInfos:
delTargetColumnName=columninfo[1]
delRowCondition=columninfo[2]
deleteRows=targetDeleteRowSheet.query(delTargetColumnName+'=="'+delRowCondition+'"')
deleteIndexs=deleteRows.index
log.info(deleteIndexs)
for delcount,delindex in enumerate(deleteIndexs):
baseSheet.delete_rows(startIndex+delindex-delcount)
活用方法
今回は適当に定義したファイルの条件をもとに削除する形をとっていますが、
例えば集計表の結果が0の行を削除する。
何らかの帳票に列を追加して提出用にするなどエクセルを加工する時の方法の一つとして使えるかもしれません。