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

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

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

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

Q&A

解決済

1回答

6688閲覧

pythonでエクセルデータから必要なデータだけを抽出して別のシートを作成する

shigeyasu

総合スコア2

Python

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

0グッド

0クリップ

投稿2020/10/04 04:16

編集2020/10/04 14:15

前提・実現したいこと

手作業でやっているエクセルデータの加工を
python(3.x)の勉強を兼ねてやってみようと思い躓きました。

最終的に作りたいのが、
品番ごとの操作前の数量と棚卸後の数量の表です。
これを元データとは別のシートに作りたいと考えています。

別シートに必要な項目は、次の4点です。
品番
品名
カテゴリ
操作前の数量
操作後の数量

品番によっては、下記のように
複数行データがある場合があります。
イメージ説明

同じ品番で1行しかない場合・・・そのデータをそのまま使う

同じ品番の複数行ある場合(今回の場合は、P202027が複数行あるデータです)
操作前の数量は、操作日時が一番古い行のデータ。
棚卸後の数量は、操作日時が一番新しい行のデータ。

最終的に作りたい表は、
イメージ説明

エクセルファイルの読み込みには成功しましたが、
調べ方すらわから立ち止まってしまいました。

python

1import openpyxl 2import csv 3 4wb = openpyxl.load_workbook("C:\Users\tanaka\Dropbox\53在庫管理\50顧客\201912-201905株式会社hosizora\202010\tanaoroshi202009_3.xlsx") 5sh1 = wb["tanaoroshi202009_2"] 6sh2 = wb.create_sheet(index=0, title="tanaoroshi_sai001") 7sh2.cell(1,1).value = "品番" 8sh2.cell(1,2).value = "品名" 9sh2.cell(1,3).value = "カテゴリ" 10sh2.cell(1,4).value = "棚卸前の数量" 11sh2.cell(1,5).value = "棚卸後の数量" 12 13 14wb.save("C:\Users\tanaka\Dropbox\53在庫管理\50顧客\201912-201905株式会社hosizora\202010\tanaoroshi202009_2.xlsx") 15

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

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

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

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

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

meg_

2020/10/04 04:36

> エクセルファイルの読み込みには成功しましたが、 そのコードを提示しましょう。
meg_

2020/10/04 04:39

・エクセルシートのタイトル(物品名など)が見切れているので、全部見える画像を載せましょう。 ・「品番」とは何のことですか? ・「最終的に作りたい」シートの例も提示すると伝わりやすくなります。
shigeyasu

2020/10/04 13:26

meg_様 ご返信いただきありがとうございます。 初めての質問で、作法になれておらず申し訳ございません。 修正いたしました。
meg_

2020/10/04 13:57

元データは「品番順」に並んでいるという前提で良いですか?
shigeyasu

2020/10/04 14:14

meg_様 ありがとうございます。 品番順に並んでいます。 すみません、1点更新日というのは、操作日時のことです。 申し訳ございません。
guest

回答1

0

ベストアンサー

ブック名、シート名は変更しています。

Python

1import openpyxl 2import csv 3 4wb = openpyxl.load_workbook('test.xlsx') 5sh1 = wb['Sheet1'] 6sh2 = wb.create_sheet(index=0, title='test') 7sh2.cell(1,1).value = "品番" 8sh2.cell(1,2).value = "品名" 9sh2.cell(1,3).value = "カテゴリ" 10sh2.cell(1,4).value = "棚卸前の数量" 11sh2.cell(1,5).value = "棚卸後の数量" 12 13row_index = 2 14row_index2 = 2 15date = '' 16 17for row in range(2, sh1.max_row + 1): 18 print(row) 19 product_name = sh1.cell(row, 4).value 20 if product_name != sh1.cell(row + 1, 4).value: 21 sh2.cell(row_index2, 1).value = product_name 22 sh2.cell(row_index2, 2).value = sh1.cell(row, 1).value 23 sh2.cell(row_index2, 3).value = sh1.cell(row, 10).value 24 if date == '': 25 sh2.cell(row_index2, 4).value = sh1.cell(row, 6).value 26 sh2.cell(row_index2, 5).value = sh1.cell(row, 7).value 27 else: 28 sh2.cell(row_index2, 4).value = sh1.cell(row_index, 6).value 29 sh2.cell(row_index2, 5).value = sh1.cell(row_index, 7).value 30 date = '' 31 row_index2 += 1 32 else: 33 if date == '': 34 date = sh1.cell(row, 2).value 35 row_index = row 36 if date < sh1.cell(row + 1, 2).value: 37 date = sh1.cell(row + 1, 2).value 38 row_index = row + 1 39 40wb.save('test_2.xlsx') 41

投稿2020/10/04 15:24

meg_

総合スコア10602

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

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

shigeyasu

2020/10/04 22:48

meg_様 ありがとうございます! 早速コードを書いて試してみます。この度は何かとご迷惑をおかけしてすみませんでした。
meg_

2020/10/05 00:42

迷惑ではないので大丈夫です。質問に対して対応いただけたので問題ないですよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問