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

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

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

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

Q&A

解決済

1回答

953閲覧

一覧の成績表から、個人ごとの評価表を作ってPDFにしたい

bigineralal

総合スコア11

Python 3.x

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

0グッド

0クリップ

投稿2022/05/23 03:14

各サイトやPythonの本などを読んで取り組んでいる初学者です。
どなたかご教授お願い致します。

請求書作成のサイトを参考に、pytonで評価表を作っています。
(実際は取引先の評価表を作っているため、名前カラムが"社名"になっています)

一覧で作成された成績表をもとに、各人毎の評価表エクセルを作り、PDFにもして保存したいです。

実現したいこと

イメージ説明
ここに実現したいことを箇条書きで書いてください。

  • 一覧で作成された成績表をもとに、各人毎の評価表エクセルを作る。
  • PDFにもして保存する。

評価表A2に個人名 C8セルからE12セルまでに、評価とコメントを入れたい

出来ずに困っていること

D8セルからE12セルに成績データを入力していくfor文の書き方がわからない

該当のソースコード

pyton

1import xlwings as xw 2import pandas as pd 3import os 4 5#対象エクセルのファイルパスを指定 6hyoukapath = 'evaluation_list.xlsx' 7templatepath = 'template.xlsx' 8out_dir = '\\output' 9 10#エクセルを読み込む 11df = pd.read_excel(hyoukapath) 12 13#個人のリストを作成 14namaea_list = sorted(list(df['社名'].unique())) 15 16 17#エクセル開く 18App = xw.App() 19 20#名前ごとに処理 21for namae in namae_list: 22 23 # テンプレートを開く 24 wb = App.books.open(templatepath) 25 ws = wb.sheets('テンプレート') 26 27 # 名前ごとにフィルターしてリストに変換 28 filtered = df[df['社名'] == f'{namae}'] 29 values = filtered.values.tolist() 30 31 # 評価をテンプレートへ書き込む 32 for x, cell in enumerate(namae): 33  #この部分がわからない 34 35 # テンプレートに各情報を出力 36 ws.range('A2').value = namae 37 ws.name = namae 38 39 # テンプレートをPDFとして保存 40 wb.api.ExportAsFixedFormat(0, out_dir) 41 os.startfile(pdf_path) 42 43 # テンプレートを新しいエクセルとして保存 44 wb.save(r'output\\'+ namae) 45 wb.close() 46 47# エクセルをアプリケーションごと閉じる 48App.quit()

試してみたこと

個人ごとのデータは、エクセルで横向きに並べて、複数の値がある辞書型のデータでも作成してみましたが、どうやって値を貼り付ければいいのかわからなくて挫折しました。

補足情報(FW/ツールのバージョンなど)

Pythonは3.9です

どうぞよろしくお願い致します

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

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

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

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

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

guest

回答1

0

自己解決

あれこれ調べて自己解決しました。

各データを流し込む際に、読み込んだdfをそのまま利用すると、氏名もセルに
流し込まれるので、氏名以外を抽出したdf1を作り、それを流し込むようにしました。

テンプレートの保存先は、どーしても絶対パスしか受け付けてくれなかったので、
実行ファイル化して汎用にするために、テンプレートのJ2セル(印刷範囲外)に、
利用者が保存したいパスをいれておく形式にしました。

python

1from datetime import datetime, timedelta 2import xlwings as xw 3import pandas as pd 4import os 5 6# 対象エクセルのファイルパスを指定 7hyoukapath = 'evaluation_list.xlsx' 8templatepath = 'test_template.xlsx' 9 10# 評価リストのデータを読み込む 11df = pd.read_excel(hyoukapath) 12 13#評価リストのデータから、評価と点数とコメントを抽出 14df1 = df[['科目','評価','コメント']] 15 16# 評価リストにある氏名をソートし、重複を削除して社名リストを作成 17shimei_list = sorted(list(df['氏名'].unique())) 18 19# エクセルを開く 20App = xw.App() 21 22# リストの氏名ごとに処理 23for shimei in shimei_list: 24 25 # テンプレートエクセルを開く 26 wb = App.books.open(templatepath) 27 ws = wb.sheets('テンプレート') 28 29 # 氏名ごとにフィルターしてリストに変換 30 filtered = df1[df['氏名'] == f'{shimei}'] 31 values = filtered.values.tolist() 32 33 # 各データをテンプレートエクセルへ流し込む 34 gyou = 8 35 for x, cell in enumerate(values): 36 if x == 0: 37 ws.range(gyou, 3).value = cell 38 elif x == 1: 39 ws.range(gyou +1, 3).value = cell 40 elif x == 2: 41 ws.range(gyou + 2, 3).value = cell 42 elif x == 3: 43 ws.range(gyou + 3, 3).value = cell 44 elif x == 4: 45 ws.range(gyou + 4, 3).value = cell 46 47 # テンプレートA2セルに氏名を入力 48 ws.range('A2').value = shimei 49 ws.name = shimei 50 51 # テンプレートE1セルに当日の日付を入力 52 now = datetime.now() 53 hiduke = now.strftime('%Y-%m-%d') 54 ws.range('E1').value = hiduke 55 56 # テンプレートエクセルをPDFとして保存 57 # テンプレートのJ2セルに入っているURLのフォルダにPDFデータを収納 58 savepath = ws.range('J2').value 59 pdf_path = os.path.join(savepath, f'{shimei}.pdf') 60 wb.api.ExportAsFixedFormat(0, pdf_path) 61 62 # テンプレートエクセルを新しいエクセルとして保存 63 #保存先はカレントフォルダ内にあるoutputフォルダ 64 wb.save(r'output\\'+ shimei) 65 wb.close() 66 67# エクセルを閉じる 68App.quit() 69

投稿2022/05/26 02:50

bigineralal

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問