#はじめに
訳あってwebページの表(予定が書かれている)をパワーポイントに書く作業があります。
しかも2ページくらいあるから、転記作業だけでも結構時間がかかります。
そこでwebサイト→パワーポイントに転記作業をpythonで自動化します。
したかった…
#環境
- mac
- python 3.7.3
#コード
よみこみ
todayPP.py
# coding: UTF-8
from pptx import Presentation
from pptx.util import Pt
from pptx.enum.text import PP_ALIGN
from bs4 import BeautifulSoup
import configparser
import requests
import feedparser
import datetime
import csv
パワポつくるところのメイン処理
todayPP.py
# パワーポイントを生成
def createPP(iniFile):
prs = Presentation(iniFile.get('settings', 'IN'))
# htmlから情報を取得
inputTable = getInputTable(iniFile)
# 表を変更
editPPTable(iniFile, prs.slides[0].shapes[0].table, prs.slides[1].shapes[1].table, inputTable)
# ファイルを保存
prs.save(iniFile.get('settings', 'OUT') + createFileName() + '.pptx')
htmlから情報を取得するところ。一旦保存したやつを見に行ったけど、selenium使って直で見に行ってもいいかも。
todayPP.py
# データ元の情報を取得
def getInputTable(iniFile):
# 保存したhtmlを取得
with open(iniFile.get('settings', 'HTML'), encoding="shift_JIS", errors='ignore') as f:
html = f.read()
#要素を抽出
soup = BeautifulSoup(html, 'lxml')
# テーブルを指定
return soup.findAll("table")[0]
パワポの表を修正するところ。2ページあるのでtabel1、table2に分けている。
todayPP.py
# パワーポイントのテーブルを修正
def editPPTable(iniFile, table1, table2, inputTable):
# 要素を取得
tdList = inputTable.findAll("td", attrs = {"class": "p11pa2"})
# 設定に必要なcsvを取得
directory = getDirectory(iniFile.get('settings', 'CSV'))
for td in tdList:
# 行番号を取得。なければ飛ばす
if directory[td.text[:3]][1] != '':
rowNum = int(directory[td.text[:3]][1])
contents = td.parent.findAll("td", attrs = {"class": "p11"})
for i,content in enumerate(contents):
# テーブル番号、列番号を設定
if directory[td.text[:3]][2] == '1':
changeTable = table1
columnNum = 2 + i
else:
changeTable = table2
columnNum = 1 + i
# テキストを設定
changeCell = changeTable.cell(rowNum, columnNum)
changeCell.text = changeStr(content.get_text('.').split('.'))
# レイアウトを修正
changeLayout(changeCell, 10)
# セルのフォントサイズを変更して、中央揃えにする
def changeLayout(cell, size):
for paragraph in cell.text_frame.paragraphs:
for run in paragraph.runs:
run.font.size = Pt(size)
# 中央揃えにもする
paragraph.alignment = PP_ALIGN.CENTER
HTML表からpptx表への付け合せについては、CSVで設定取得を行いました。
1列目:検索コード
2列目:見出し(これは使わなかった)
3列目:どの行か
4列目:どの表か
todayPP.py
# CSVを取得
def getDirectory(csvPath):
directory = {}
with open(csvPath, 'r') as f:
reader = csv.reader(f)
for row in reader:
directory[row[0]] = [row[1],row[2],row[3]]
return directory
#結果
なんとかいきましたが、以下問題は残る・・・・
- 表が左詰めになってしまった
- 要素直指定。検索かけにいくようにしたい
でもフォントサイズも変更できたし、中央そろえにできてよかった。
あと転記作業から開放されて超ハッピー
github