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

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

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

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

Q&A

解決済

1回答

1909閲覧

pythonのpptxを使用してパワーポイントを自動で複製

manson1120

総合スコア1

Python

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

0グッド

1クリップ

投稿2021/03/04 05:54

編集2021/03/04 06:05

実現したいこと

パワーポイントを自動で繰り返し処理を用いて作成したい

1.エクセルの情報を抽出

2.エクセルから抽出した情報をタイトルとテキストに反映

3.2番目をデータ分繰り返し、1つのパワーポイントファイルに複数のページを作成

できている内容

・エクセルのデータを抽出してlistに格納
・パワーポイント自動作成

できない内容

・エクセルから抽出した情報をタイトルとテキストにいれる
※「パワーポイント自動作成コード」に記載の★箇所にエクセルで取得したデータを入れて、PPTシートをデータ分作成することが出来ない。

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

pythonバージョン ⇒ Python 3.8.0
python実行環境 ⇒ windows10
file構成 ⇒ デスクトップに「python」ディレクトリを設置
pythonディレクトリ内の設置物 ⇒ pythonコードファイル、エクセルファイル、テンプレート用PPT
エクセルファイル名 ⇒ data.xlsx
PPTファイル名 ⇒ templat.pptx

エクセル情報

イメージ説明

パワーポイント自動作成コード

# coding: cp932 # ---必要なモジュールをimport--- from pptx import Presentation from pptx.chart.data import ChartData from pptx.enum.chart import XL_CHART_TYPE from pptx.util import Inches from pptx.util import Pt, Inches # ---大きさの単位変更--- # センチメートルをPowerPoint上の距離に変換する関数 def Centis(length): centi = Inches(length/2.54) return centi # ---スライド作成--- # 1枚のスライドでプレゼンテーションを作成する※今回はPPTを指定した prs = Presentation('templat.pptx') # 1枚目のスライドのレイアウトを使用するように指定 title_only_slide_layout = prs.slide_layouts[1] slide = prs.slides.add_slide(title_only_slide_layout) shapes = slide.shapes # タイトルに入力したい文字列 slide_title = '★C列の題名を入れたい★' shapes.title.text = slide_title # ---------- # 前月のテキストボックスの位置を決める left_Sub = Centis(1.0) top_Sub = Centis(2.3) # 前月のテキストボックスの幅と高さを決める width_Sub = Centis(4.4) height_Sub = Centis(0.86) txBoxSub = slide.shapes.add_textbox(left_Sub, top_Sub, width_Sub, height_Sub) tfSub = txBoxSub.text_frame tfSub.text = '★D列のサブ題名を入れたい★' # フォントサイズ・書体名変更 tfSub.paragraphs[0].font.size = Pt(14) tfSub.paragraphs[0].font.name = 'メイリオ' # ---------- # 前月のテキストボックスの位置を決める left = Centis(2.17) top = Centis(2.97) # 前月のテキストボックスの幅と高さを決める width = Centis(2.17) height = Centis(0.86) txBox = slide.shapes.add_textbox(left, top, width, height) tf = txBox.text_frame tf.text = "★A列の前月を入れたい★" # フォントサイズ・書体名変更 tf.paragraphs[0].font.size = Pt(14) tf.paragraphs[0].font.name = 'メイリオ' # 今月のテキストボックスの位置を決める left_Month = Centis(2.17) top_Month = Centis(10.79) # 今月のテキストボックスの幅と高さを決める width_Month = Centis(2.17) height_Month = Centis(0.86) txBoxMonth = slide.shapes.add_textbox(left_Month, top_Month, width_Month, height_Month) tfMonth = txBoxMonth.text_frame tfMonth.text = '★B列を入れたい★' # フォントサイズ変更 tfMonth.paragraphs[0].font.size = Pt(14) tfMonth.paragraphs[0].font.name = 'メイリオ' prs.save('chart-01.pptx')

エクセルデータをlistに格納

import openpyxl # ブック取得 wb = openpyxl.load_workbook("data.xlsx") # シートを取得 sheet = wb["Sheet1"] #A列のデータのみ取り出す ※10月 #値の入っている最大行、最大列まで行単位でセルの値を取得する for rows in sheet.iter_rows(min_row=2, min_col=1, max_col=1): for cell in rows: list_A = cell.value print(list_A) #B列のデータのみ取り出す ※11月 #値の入っている最大行、最大列まで行単位でセルの値を取得する for rows in sheet.iter_rows(min_row=2, min_col=2, max_col=2): for cell in rows: list_B = cell.value print(list_B) #C列のデータのみ取り出す ※title #値の入っている最大行、最大列まで行単位でセルの値を取得する for rows in sheet.iter_rows(min_row=2, min_col=3, max_col=3): for cell in rows: list_C = cell.value print(list_C) #D列のデータのみ取り出す ※sub title #値の入っている最大行、最大列まで行単位でセルの値を取得する for rows in sheet.iter_rows(min_row=2, min_col=4, max_col=4): for cell in rows: list_D = cell.value print(list_D)

最終イメージPPT

※下記PPTシートをエクセルシート7行目の情報分作成する
イメージ説明

試したこと

forを使用して繰り返し処理を行おうと思いましたが、プログラムを作った経験が今回が初めてで、どのように書いたらいいのかイメージが湧きませんでした。
お力添えいただけると幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

「パワーポイント自動作成コード」のところを関数化して、呼び出す形にしてみたらどうでしょうか。

from pptx import Presentation from pptx.chart.data import ChartData from pptx.enum.chart import XL_CHART_TYPE from pptx.util import Inches from pptx.util import Pt, Inches import openpyxl def create_presentation(previous_month, this_month, slide_title, sub_title, template): # ---大きさの単位変更--- # センチメートルをPowerPoint上の距離に変換する関数 def Centis(length): centi = Inches(length/2.54) return centi # ---スライド作成--- # 1枚のスライドでプレゼンテーションを作成する※今回はPPTを指定した prs = template # 1枚目のスライドのレイアウトを使用するように指定 title_only_slide_layout = prs.slide_layouts[1] slide = prs.slides.add_slide(title_only_slide_layout) shapes = slide.shapes # タイトルに入力したい文字列 # ★C列の題名を入れる shapes.title.text = slide_title # ---------- # 前月のテキストボックスの位置を決める left_Sub = Centis(1.0) top_Sub = Centis(2.3) # 前月のテキストボックスの幅と高さを決める width_Sub = Centis(4.4) height_Sub = Centis(0.86) txBoxSub = slide.shapes.add_textbox(left_Sub, top_Sub, width_Sub, height_Sub) tfSub = txBoxSub.text_frame tfSub.text =sub_title # フォントサイズ・書体名変更 tfSub.paragraphs[0].font.size = Pt(14) tfSub.paragraphs[0].font.name = 'メイリオ' # ---------- # 前月のテキストボックスの位置を決める left = Centis(2.17) top = Centis(2.97) # 前月のテキストボックスの幅と高さを決める width = Centis(2.17) height = Centis(0.86) txBox = slide.shapes.add_textbox(left, top, width, height) tf = txBox.text_frame # ★A列(前月)を入れる★ tf.text = previous_month # フォントサイズ・書体名変更 tf.paragraphs[0].font.size = Pt(14) tf.paragraphs[0].font.name = 'メイリオ' # 今月のテキストボックスの位置を決める left_Month = Centis(2.17) top_Month = Centis(10.79) # 今月のテキストボックスの幅と高さを決める width_Month = Centis(2.17) height_Month = Centis(0.86) txBoxMonth = slide.shapes.add_textbox(left_Month, top_Month, width_Month, height_Month) tfMonth = txBoxMonth.text_frame # ★B列(今月)を入れる★ tfMonth.text = this_month # フォントサイズ変更 tfMonth.paragraphs[0].font.size = Pt(14) tfMonth.paragraphs[0].font.name = 'メイリオ' # ブック取得 wb = openpyxl.load_workbook("data.xlsx") # シートを取得 sheet = wb["Sheet1"] list_A = [] #値の入っている最大行、最大列まで行単位でセルの値を取得する for rows in sheet.iter_rows(min_row=2, min_col=1, max_col=4): list_A.append([cell.value for cell in rows]) prs = Presentation('templat.pptx') # スライドを作成する for a in list_A: create_presentation(previous_month=str(a[0]), this_month=str(a[1]), slide_title=a[2], sub_title=a[3], template=prs) prs.save('chart-01.pptx')

投稿2021/03/05 09:38

編集2021/03/09 12:16
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

manson1120

2021/03/09 08:24 編集

ありがとうございます!エクセルの内容をPPTに反映させることができました! 今のコードですと、「エクセル1行ごとにPPTファイルを作成」する内容ですが、「エクセル1行ごとに1つのPPTファイルにエクセル行分、スライドを作成」する場合だと「prs.save('chart-'+str.zfill(str(filenum),2)+'.pptx')」の書き方を変える感じでしょうか?
退会済みユーザー

退会済みユーザー

2021/03/09 12:16

ファイルを新規作成するものと勘違いしておりすみませんでした。スライドを追加するコードに修正しました。
manson1120

2021/03/10 04:13

ありがとうございます!できました_(._.)_
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問