質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.40%
openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

576閲覧

【python】Excelで空白の行がエラーになってしまう

nanoko

総合スコア10

openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2023/08/24 07:45

前提

excelで人事評価一覧表をpythonを使って作成しています。
既存の従業員一覧表ファイル(excel)に社員番号、社員名、従業員区分などが記載されており、従業員区分が「社員」のものだけを抽出し、新規作成した人事評価一覧表に「社員」で該当した者の社員名と社員番号を転記する作業を行っています。

従業員一覧表の範囲はmax_row関数を使って最大行数を取得しているのですが、表は232行までしかないにも関わらず、max_row=235と出てしまいます。
今回、セルに社員と書かれているかどうかで分岐をしているのでmax_rowの値が違うとしても影響はないと考えていたのですが、233行目から” if df_shain.iloc[i,4] == '社員':”の箇所で下記のようなエラーが出てしまいます。(エラー文では228行目となっていますが、ヘッダーがあるため実際は233行目に該当します。)
実際のExcelをお見せできないため、非常に分かりづらく申し訳ありませんが、233行目からはただ空白のセルが続いているだけです。
表の途中にも従業員区分が空白の箇所はあるのですが、そこでエラーを吐くことがないため原因が分かりません。

憶測でご回答いただくことになってしまうかと思いますが、どのような要因で下記のエラーが出てしまうことがあるのかご教示お願い致します。

発生している問題・エラーメッセージ

index 228 is out of bounds for axis 0 with size 228 File "C:\Users\ko\Documents\python\jinjitest\test.py", line 34, in <module> if df_shain.iloc[i,4] == '社員': ~~~~~~~~~~~~~^^^^^ IndexError: index 228 is out of bounds for axis 0 with size 228

該当のソースコード

python

1import pandas as pd 2import openpyxl 3import glob 4import warnings 5import os 6 7warnings.filterwarnings('ignore') 8 9#人事評価一覧の作成 10df_new = pd.DataFrame() 11df_new.to_excel('新方式一覧表_test.xlsx', index=False) 12wb_new = openpyxl.load_workbook('新方式一覧表_test.xlsx',data_only=True) 13ws_new = wb_new.active 14 15#従業員一覧表の読み込み 16shain_path =glob.glob( './data/list/*.xlsx') 17for shain in shain_path: 18 wb_shain = openpyxl.load_workbook(shain, data_only=True) 19 ws_shain = wb_shain.active 20df_shain = pd.read_excel(shain,header=3) 21#表の最大範囲を指定 22max_r = range(ws_shain.max_row-5) 23max_c = range(ws_shain.max_column) 24 25#社員を抽出 26i=0 27x=2 28for i in max_r: 29 data = {} 30 if df_shain.iloc[i,4] == '社員': 31 #社員名抽出 32 menb = str(df_shain.iloc[i,1]) 33 #社員番号抽出 34 code = df_shain.iloc[i,0] 35 36 #人事評価一覧表に転記 37 ws_new.cell(row=x,column=2).value = menb 38 ws_new.cell(row=x,column=1).value = code 39 ws_new.cell(row=x,column=3).value = '社員' 40 x = x + 1 41 42wb_new.save('新方式一覧表_test.xlsx')

試したこと

エラー文で検索してみたり、Excelのテーブル範囲を再設定などしてみましたが、解決しませんでした。
また、表を別シートにコピペし、同じコードで実行したところ、max_rowは正常な値になったのですが、233行目は同じくエラーになってしまいます。
テーブルの外側はエラーになってしまうような仕様なのかと考えていますが、かなり不便です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakaiY

2023/08/24 08:37

openpyxlで開いているので、DataFrameに入れなくても目的のセルの内容は確認できて、処理もできると思うのですが、 DataFrameに入れている理由はなにですか?
nanoko

2023/08/24 09:08

df_new = pd.DataFrame() でしょうか? こちらは記載しておりませんでしたが、実際はカラムを追加する必要があったためDataFrameを使用しています。
nanoko

2023/08/24 09:09

python初学者のため、コードは見づらく拙い部分が多いかと思いますが、ご了承ください。
TakaiY

2023/08/24 09:28

「カラムを追加する必要があったためDataFrameを使用しています」 とありますが、そのような処理は無いようです。他のところでやっているのでしょうか? また、やっていたとしても、新しいExcelブックを作るのには関係ないようです。
nanoko

2023/08/25 00:40 編集

社内情報が含まれているため、カラムはテラテイル上で省略しております。 ws_new.cell(row=x,column=2).value = menb ws_new.cell(row=x,column=1).value = code ws_new.cell(row=x,column=3).value = '社員' 上記のコードやmax_rowを使うためにopenpyxlを、カラムを作成するためにDataFrameを用いているのですが、誤っておりますでしょうか? なんだか自分でも変な文法だなと感じておりましたので、最適な記述方法があればご教示ください。
guest

回答2

0

データフレームを使わないようにしました。

Python3

1import pandas as pd 2import openpyxl 3import glob 4import warnings 5import os 6 7warnings.filterwarnings('ignore') 8 9#人事評価一覧の作成 10df_new = pd.DataFrame() 11df_new.to_excel('新方式一覧表_test.xlsx', index=False) 12wb_new = openpyxl.load_workbook('新方式一覧表_test.xlsx',data_only=True) 13ws_new = wb_new.active 14 15#従業員一覧表の読み込み 16shain_path =glob.glob( './data/list/*.xlsx') 17for shain in shain_path: 18 wb_shain = openpyxl.load_workbook(shain, data_only=True) 19 ws_shain = wb_shain.active 20 21x=2 22for wrow in range(5,ws_shain.max_row+1): 23 if ws_shain.cell(wrow,5).value == '社員': 24 #人事評価一覧表に転記 25 #社員名 26 ws_new.cell(row=x,column=2).value = ws_shain.cell(wrow,2).value 27 #社員番号 28 ws_new.cell(row=x,column=1).value = ws_shain.cell(wrow,1).value 29 ws_new.cell(row=x,column=3).value = '社員' 30 x = x + 1 31 32wb_new.save('新方式一覧表_test.xlsx') 33

投稿2023/08/25 02:41

tatsu99

総合スコア5489

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nanoko

2023/08/28 01:21

ご回答ありがとうございます。 ilocを使わずに番号で指定する方法が分からなかったため勉強になりました。 こちら参考にさせていただきます。
guest

0

ベストアンサー

根本的な解決策ではありませんが、問題になっているDataFrameは使わなくてもいいのではないこと思います。

シートをDataFrameに読み込んで使っていますが、

ws_new.cell(row=x,column=2).value = menb
ws_new.cell(row=x,column=1).value = code
ws_new.cell(row=x,column=3).value = '社員'
上記のコードやmax_rowを使うためにopenpyxlを、カラムを作成するためにDataFrameを用いている

抜粋すると以下のように、DataFrameのデータはセルの値の参照のみで使っています。

python

1df_shain = pd.read_excel(shain,header=3) 2 3 if df_shain.iloc[i,4] == '社員': 4 5 menb = str(df_shain.iloc[i,1]) 6 7 ws_new.cell(row=x,column=2).value = menb

セルの参照だけであれば、openpyxl でできるので、それで充分だと思います。
抜粋ですが、以下のようしてみてはいかがでしょうか。
ただし、「row=i + 5」のところとか、columnの値などは調整が必要かもしれません。

python

1# 不要 2# df_shain = pd.read_excel(shain,header=3) 3 4#社員を抽出 5x=2 6for i in max_r: 7 data = {} 8 if ws_shain.cell(row=i + 5, column=4).value == '社員': 9 #if df_shain.iloc[i,4] == '社員': 10 #社員名抽出 11 menb = str(ws_shain.cell(row=i + 5, column=1)).value 12 #menb = str(df_shain.iloc[i,1]) 13 #社員番号抽出 14 code = ws_shain.cell(row=i + 5, column=0).value 15 #code = df_shain.iloc[i,0] 16 17 #人事評価一覧表に転記 18 ws_new.cell(row=x,column=2).value = menb 19 ws_new.cell(row=x,column=1).value = code 20 ws_new.cell(row=x,column=3).value = '社員' 21 x = x + 1 22 23wb_new.save('新方式一覧表_test.xlsx')

投稿2023/08/25 02:09

TakaiY

総合スコア13341

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nanoko

2023/08/28 01:19

ご回答ありがとうございます。 ilocを使わずにそのような記述方法にすればエラーにはならなさそうですね。 こちらを参考にさせていただき組んでみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.40%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問