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

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

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

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

Python

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

Q&A

解決済

1回答

1335閲覧

pythonでExcelファイルを読み平均を求め線グラフを出力したい

dog_bie

総合スコア3

openpyxl

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

Python

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

0グッド

0クリップ

投稿2021/01/27 05:33

編集2021/01/27 05:42

##前提・実現したいこと
openpyxlを使って結果集計をするプログラムを作成しています。
実現したいこととして、

  1. 別々のファイルにある3人分のデータシートを移動して新規ファイルを作成
  2. 各セルの平均点を出した値を別のシートに出力
  3. その表から線グラフを出力

の3つです。

以下のようなデータがAさん、Bさん、Cさんの3人分あります。
イメージ説明

出力したいイメージはこんな感じです。。
B5=SUM(A_result!B5+B_result!B5+C_result!B5)/3
イメージ説明

良い案があればご教授をお願いします。

appendを使って各結果のデータを結合してみたのですが、データを横方向に追加する方法はありますでしょうか。
また教科名は最初だけ出力させて、それ以降はB5:D7の数値のみの範囲を読み取りたいです。

宜しくお願いします。

###該当コード

Python

1import openpyxl 2from glob import glob 3 4wb = openpyxl.Workbook() 5wb.active 6ws = wb['Sheet'] 7ws.title = 'data' 8 9header= None 10 11#'テスト結果/*'に3人分のデータを格納 12for file_name in glob('テスト結果/*'): 13 print(file_name) 14 read_wb = openpyxl.load_workbook(file_name) 15 print('read_ws:', read_wb) 16 read_ws = read_wb.worksheets[0] 17 min_row = read_ws.min_row 18 max_row = read_ws.max_row 19 print(min_row) 20 print(max_row) 21 22 print('read_ws', read_ws) 23 if not header: 24 header= read_ws[3] 25 header = [v.value for v in header] 26 ws.append(header) 27 28 for row in read_ws.iter_rows(min_row=4): 29 format_l = [] 30 for cell in row: 31 format_l.append(cell.value) 32 print(format_l) 33 ws.append(format_l) 34wb.save('final_data.xlsx')

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

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

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

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

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

guest

回答1

0

ベストアンサー

openpyxlの練習に作ってみました。

横並びに格納して、一番左に平均値が出るようになっています。

python

1import openpyxl 2from glob import glob 3 4tbl = ' ABCDEFGHIJKLMNOPQRSTUVWXYZ' 5 6def xy2a1(x, y): 7 return f'{tbl[x]}{y}' 8 9def areacopy(ss, sx, sy, ts, tx, ty, dx, dy): 10 for ix in range(dx): 11 for iy in range(dy): 12 ts[xy2a1(tx+ix, ty+iy)] = ss[xy2a1(sx+ix, sy+iy)].value 13 14wb = openpyxl.Workbook() 15wb.active 16ws = wb['Sheet'] 17ws.title = 'data' 18 19header= None 20 21#'テスト結果/*'に3人分のデータを格納 22for i, file_name in enumerate(glob('テスト結果/*')): 23 print(file_name) 24 read_wb = openpyxl.load_workbook(file_name) 25 print('read_ws:', read_wb) 26 read_ws = read_wb.worksheets[0] 27 min_row = read_ws.min_row 28 max_row = read_ws.max_row 29 print(min_row) 30 print(max_row) 31 print('read_ws', read_ws) 32 if not header: 33 header= read_ws[3] 34 header = [v.value for v in header] 35 ws.append(header) 36 if i == 0: 37 for row in read_ws.iter_rows(min_row=4): 38 format_l = [] 39 for cell in row: 40 format_l.append(cell.value) 41 print(format_l) 42 ws.append(format_l) 43 areacopy(read_ws,2,4,ws,3*i+5,2,3,4) 44 45for x in range(2,5): 46 for y in range(3,6): 47 ws[xy2a1(x, y)] = f'=({xy2a1(x+3, y)}+{xy2a1(x+6, y)}+{xy2a1(x+9, y)})/3' 48 49wb.save('final_data.xlsx') 50

投稿2021/01/28 07:43

ppaul

総合スコア24666

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

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

dog_bie

2021/02/01 14:33

返信が遅れてしまい申し訳ありません... 上記参考にさせていただいて、やりたいことができました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問