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

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

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

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

Q&A

解決済

1回答

233閲覧

Excelファイルの表を内容を別の形でまとめたい

shield

総合スコア16

Python 3.x

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

0グッド

0クリップ

投稿2019/04/09 04:23

毎月売り上げデータをまとめているのですが、元のデータの表と上司に提出するための表の形式が異なっているので、表の形式の変換をやりたいと考えています。

添付したExcelファイルのまとめ_理想タブのように各届け先の品名ごとに数量、売上、利益をまとめたいのですが、読み取って列ごとに別タブに書き出しするまでしかできておりません。

知識が少なく申し訳ありませんが、うまく作成できる変換できる方法をご教授お願いいたします。

Excelファイル

python3.7

1 2import openpyxl 3 4workbook = openpyxl.load_workbook('sample1.xlsx') 5sheet = workbook["Sheet1"] 6 7 8#得意先を集計 9tokuisaki = [] 10 11for i in range(2,8): 12 cell_value = sheet.cell(row=i, column=1).value 13 tokuisaki.append(cell_value) 14 15 16#届け先を集計 17todokesaki = [] 18 19for j in range(2,8): 20 cell_value = sheet.cell(row=j, column=2).value 21 todokesaki.append(cell_value) 22 23#品名を集計 24hinmei = [] 25 26for k in range(2,8): 27 cell_value = sheet.cell(row=k, column=3).value 28 hinmei.append(cell_value) 29 30 31#数量をまとめる 32suryo = [] 33 34for l in range(2,8): 35 cell_value = sheet.cell(row=l, column=4).value 36 suryo.append(cell_value) 37 38 39#売上をまとめる 40uriage = [] 41 42for m in range(2,8): 43 cell_value = sheet.cell(row=m, column=5).value 44 uriage.append(cell_value) 45 46#利益をまとめる 47rieki = [] 48 49for n in range(2,8): 50 cell_value = sheet.cell(row=n, column=6).value 51 rieki.append(cell_value) 52 53 54ns = workbook.create_sheet("まとめ") 55ns["A1"]="得意先" 56ns["B1"]="届け先" 57ns["C1"]="品名" 58 59for i,j,k,l in zip(list(range(2,8)),tokuisaki,todokesaki,hinmei): 60 ns.cell(row=i,column=1,value=j) 61 ns.cell(row=i,column=2,value=k) 62 ns.cell(row=i,column=3,value=l) 63 64workbook.save('sample1.xlsx') 65 66

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

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

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

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

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

tiitoi

2019/04/09 04:45

Sheet1 と まとめ_理想 の値の関係がよくわからないのですが、どのように売上単価、利益単価はどのように算出するのでしょうか?
shield

2019/04/09 04:49

説明不足で申し訳ありません。 売上単価、利益単価は、売上、又は利益を数量で割った値を各単価としています。
guest

回答1

0

ベストアンサー

以下のような感じでしょうか?

上司の指示なら仕方ないですが、「セル結合」は処理が面倒になるので、使わないほうがよいと思いますね。

python

1import openpyxl as px 2 3wb = openpyxl.load_workbook('sample1.xlsx') 4 5in_ws = wb["Sheet1"] # 入力のシート 6out_ws = wb.create_sheet("result") # 出力のシート 7 8# 1行目にヘッダーをコピーする。 9for c in range(1, 4): 10 out_ws.cell(row=1, column=c).value = in_ws.cell(row=1, column=c).value 11 12offset = 2 13for r in in_ws.iter_rows(min_row=2): 14 # シートから値を取得する。 15 customer, destination, goods, count, sales, profit = [c.value for c in r] 16 17 # 4列目に各種ラベルを代入する。 18 out_ws.cell(row=offset, column=4).value = "数量" 19 out_ws.cell(row=offset + 1, column=4).value = "売り上げ単価" 20 out_ws.cell(row=offset + 2, column=4).value = "売上" 21 out_ws.cell(row=offset + 3, column=4).value = "利益単価" 22 out_ws.cell(row=offset + 4, column=4).value = "利益" 23 # 5列目に各種値を代入する。 24 out_ws.cell(row=offset, column=5).value = count 25 out_ws.cell(row=offset + 1, column=5).value = sales / count 26 out_ws.cell(row=offset + 2, column=5).value = sales 27 out_ws.cell(row=offset + 3, column=5).value = profit / count 28 out_ws.cell(row=offset + 4, column=5).value = profit 29 # 1列目、2列目、3列目のセルを結合する。 30 out_ws.merge_cells(start_row=offset, end_row=offset + 4, start_column=1, end_column=1) 31 out_ws.merge_cells(start_row=offset, end_row=offset + 4, start_column=2, end_column=2) 32 out_ws.merge_cells(start_row=offset, end_row=offset + 4, start_column=3, end_column=3) 33 # 1列目、2列目、3列目に得意先、届け先、商品名を代入する。 34 out_ws.cell(row=offset, column=1).value = customer 35 out_ws.cell(row=offset, column=2).value = destination 36 out_ws.cell(row=offset, column=3).value = goods 37 38 offset += 5 39 40wb.save('output.xlsx')

投稿2019/04/09 07:14

tiitoi

総合スコア21956

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

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

shield

2019/04/09 08:48

ご回答ありがとうございました。 丸投げに近いような質問に丁寧にご回答いただき、本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問