Q&A
実現したいこと・前提
以下のような事を実行するPythonファイルを作成してほしい。
ある名前のExcelファイルがあり、各列に情報が並んでいる。
各列には必ず、「学歴」、「キャンパス情報」、「大学時代の経験」、「経歴」、「学生にお話できること」、「学生からのコメント」の文字列がありますが、必ずしも同じ行にはありません。
上記の文字列は、情報の境目であり、その文字列の前後に情報があります。
これを見やすくするため、「学歴」、「キャンパス情報」、「大学時代の経験」、「経歴」、「学生にお話できること」、「学生からのコメント」の文字列を同じ行に揃えたいです。
具体的な作業イメージは、以下のような感じです。
1.各列の「学歴」の文字列を探し、一番下の「学歴」の文字列がある行の位置を確認する。
2.各列の「学歴」の文字列より下の情報を、1.で確認した行で先頭にするように移す。(例:1.で確認した行が37行目であるとする。A列の情報が、1行目から120行目まであるとする。A列の「学歴」が21行目だとする。その場合、A列の「学歴」を先頭とする100行の情報を、先頭の「学歴」が37行目になるように下に移す。その場合、A列は21-36行目は空白になる。これを、情報がある全ての列で行う。)
3.「キャンパス情報」、「大学時代の経験」、「経歴」、「学生にお話できること」、「学生からのコメント」の文字列でも、1.及び2.を実行する。
これを実行するPythonコードを作成してください。
発生している問題
以下のコードを実行したのですが、元のファイルと全く同じファイルが出力されます。原因がどこにあるかが分かりません。
該当のソースコード
Python
1import openpyxl 2 3# Excelファイルを開く 4wb = openpyxl.load_workbook("sample.xlsx") 5ws = wb.worksheets[1] # 左から2番目のシートに目的情報がある。 6 7# 検索するキーワード 8keywords = ['学歴', 'キャンパス情報', '大学時代の経験', '経歴', '学生にお話できること', '学生からのコメント'] 9 10# シート内の各列に対して処理を実行する 11for col in ws.iter_cols(): 12 # 列の先頭セルの値がキーワードのリストに含まれる場合 13 if col[0].value in keywords: 14 keyword = col[0].value 15 16 # キーワードのある行を検索 17 keyword_row = None 18 for cell in col: 19 if cell.value == keyword: 20 keyword_row = cell.row 21 break 22 23 # キーワードが見つからない場合はスキップ 24 if keyword_row is None: 25 continue 26 27 # 各列の情報をキーワードがある行に移動する 28 for column in ws.iter_cols(): 29 # 列の先頭セルの値がキーワードである場合、スキップ 30 if column[0].value == keyword: 31 continue 32 33 # キーワードがある列に情報がない場合、スキップ 34 if column[keyword_row - 1].value is None: 35 continue 36 37 # 情報を移動する 38 move_rows = keyword_row - column[0].row 39 for i, cell in enumerate(column): 40 # キーワードのある行より上にある情報はスキップする 41 if i < keyword_row - 1: 42 continue 43 44 # 移動先の行がシートの範囲外の場合はスキップする 45 if i + move_rows >= len(column) or i + move_rows < 0: 46 continue 47 48 # 情報を移動する 49 column.move_range(start_index=i, end_index=i, rows=move_rows) 50 51# Excelファイルを上書き保存する 52wb.save("output_new.xlsx") 53
試したこと
下記の修正コードも実行したのですが、結果は変わりませんでした。
Python
1 2import openpyxl 3 4# Excelファイルを開く 5wb = openpyxl.load_workbook("sample.xlsx") 6ws = wb.worksheets[1] # 左から2番目のシートに目的情報がある。 7 8# 検索するキーワード 9keywords = ['学歴', 'キャンパス情報', '大学時代の経験', '経歴', '学生にお話できること', '学生からのコメント'] 10 11# シート内の各列に対して処理を実行する 12for col in ws.columns: 13 # 列の先頭セルの値がキーワードのリストに含まれる場合 14 if col[0].value in keywords: 15 keyword = col[0].value 16 17 # キーワードのある行を検索 18 keyword_row = None 19 for cell in col: 20 if cell.value == keyword: 21 keyword_row = cell.row 22 break 23 24 # キーワードが見つからない場合はスキップ 25 if keyword_row is None: 26 continue 27 28 # 各列の情報をキーワードがある行に移動する 29 for column in ws.columns: 30 # 列の先頭セルの値がキーワードである場合、スキップ 31 if column[0].value == keyword: 32 continue 33 34 # キーワードがある列に情報がない場合、スキップ 35 if column[keyword_row - 1].value is None: 36 continue 37 38 # 情報を移動する 39 move_rows = keyword_row - 1 - column[0].row 40 for i, cell in enumerate(column): 41 # キーワードのある行より上にある情報はスキップする 42 if cell.row < keyword_row: 43 continue 44 # 移動先の行がシートの範囲外の場合はスキップする 45 if cell.row + move_rows > ws.max_row: 46 continue 47 # 情報を移動する 48 ws.cell(row=cell.row+move_rows, column=cell.column).value = cell.value 49 50# Excelファイルを上書き保存する 51wb.save("output_new.xlsx") 52
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。