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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Q&A

解決済

1回答

1509閲覧

エクセルファイルより別のエクセルファイルの所定の位置に書込み方が分かりません

Kyohei

総合スコア23

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

0グッド

0クリップ

投稿2018/11/06 02:46

環境:python3系、Mac OS
エクセルファイルsample_openpyxl.xlsxにある「年齡と性別」列にある要素を
別のエクセルファイルkakikomi.xlsxにある年齡と性別」列及び所定の行に書込みをしたいのですが
※所定の位置とは,,,同じ名前の行のセルへの書込みです。
どのようなコードにすれば良いでしょうか?恐れ入りますがご教授願います。
説明や表現が不十分でしたら申し訳ございません。

下記は私が書いてみたコードです。

file_sample = 'sample_openpyxl.xlsx' file_kakikomi = 'kakikomi.xlsx' #テンプレブックの読み込み #要編集:データが追加されても要素がある範囲全てを読み込むプログラムにしたい wb = openpyxl.load_workbook(file_sample, data_only=True)#数式ではなく値のみ抽出 sheet_sample = wb.active #ojisan_data = sheet['A2:C5'] for row in range(2,sheet_sample.max_row+1): #スタッフ名前 sample_stuff = sheet_sample['A' + str(row)].value #年齡 sample_age = sheet_sample['B' + str(row)].value #性別 sample_sex = sheet_sample['C' + str(row)].value #書込みブックの読み込み #要編集:データが追加されても要素がある範囲全てを読み込むプログラムにしたい wb_kakikomi = openpyxl.load_workbook(file_kakikomi) sheet_kakikomi = wb_kakikomi.active for row in range(2,sheet_kakikomi.max_row+1): #スタッフ名前 kakikomi_stuff = sheet_kakikomi['A' + str(row)].value #年齡 kakikomi_age = sheet_kakikomi['B' + str(row)].value #性別 kakikomi_sex = sheet_kakikomi['C' + str(row)].value #テンプレ内容(年齢:性別を正確な位置に)書込み #sampleのスタッフ名をkakikomiのスタッフ列から見つけ出し、同じ名前であれば、 #その年齡列と性別列にsampleのデータを書込む while sample_stuff == kakikomi_stuff: kakikomi_age = sample_age kakikomi_sex = sample_sex

RUNの結果何も起こりません(エラー含めて:インタラクティブシェル上)

イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

このような感じでしょうか?

  1. メンバー一覧が記載された Excel ファイルを読み込み、辞書に格納しておく。
  2. 書き込みようの Excel ファイルを開き、一致する名前の年齢、性別を書き込む。

入力データ

members.xlsx

スタッフ 年齢 性別 村上 20 女 田中 30 男 山田 20 男 佐藤 30 男 安田 20 女 武田 40 男

assign.xlsx

スタッフ 年齢 性別 村上 田中 山田

出力データ

assign.xlsx

スタッフ 年齢 性別 村上 20 女 田中 30 男 山田 20 男

サンプルコード

python

1import openpyxl 2 3members_path = 'members.xlsx' 4assign_path = 'assign.xlsx' 5 6wb = openpyxl.load_workbook(members_path, data_only=True, read_only=True) 7sheet = wb.active 8 9# メンバー一覧を読み込む。 10members = {} 11for r in range(2, sheet.max_row + 1): 12 name = sheet.cell(row=r, column=1).value 13 age = sheet.cell(row=r, column=2).value 14 sex = sheet.cell(row=r, column=3).value 15 members[name] = {'age': age, 'sex': sex} 16print(members) 17 18# 出力用のファイルを読み込む。 19out_wb = openpyxl.load_workbook(assign_path) 20out_sheet = out_wb.active 21for r in range(2, out_sheet.max_row + 1): 22 name = out_sheet.cell(row=r, column=1).value 23 24 # 名前に対応した年齢、性別を書き込む。 25 if name in members: 26 out_sheet.cell(row=r, column=2).value = members[name]['age'] 27 out_sheet.cell(row=r, column=3).value = members[name]['sex'] 28 29out_wb.save(assign_path)

投稿2018/11/06 04:47

編集2018/11/06 15:24
tiitoi

総合スコア21956

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

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

Kyohei

2018/11/06 14:17

tiitoi様 いつもありがとうございます。 その通りです! tiitoi様のコードを参考に添付させていただいたエクセルファイル2つを使用して走らせてみましたが、 sample_opepyxl.xlsx内の年齡と性別のデータがkakikomi.xlsxのスタッフ名で言うと山田、田中、安田、羽生の年齡列、性別列に上から順に入ってしまっている状態です。。。
tiitoi

2018/11/06 15:00

回答のコードはうまく動かなかったですか?
Kyohei

2018/11/06 15:18

うまく動きました。ただ、試しにassign.xlsxの村上を田辺に変えても田辺の行にmembers.xlsxの村上の情報が加えられます。
tiitoi

2018/11/06 15:25

すいません。コードに一箇所間違いがあったので修正しました。これで動くかと思います。
Kyohei

2018/11/06 15:49

うまく動きました!夜遅くまでご協力いただきましてありがとうございます! 辞書型を使うのかな?と最初に思ってはいたのですがスタッフ名に対して年齡と性別の2つのキーとなるので 無理と勝手に判断しておりました。辞書の中に辞書を含ませることができるのですね、初めて知りました。リストやタプルのよなものなのですね。 大変勉強になりました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問