ChatGPTに聞きながらまた色々サンプル作成
●複数のcsvをxlsxにまとめるサンプル
●pptxを読み込んで適当にダンプ
●pptx作成サンプル
●複数のcsvをxlsxにまとめるサンプル
test_openpyex_csv2xlsx.py
import glob
import csv
from openpyxl import Workbook
from openpyxl.styles import Border, Side
import math
# 新しいWorkbookを作成
wb = Workbook()
# 罫線のスタイルを定義
thin_border = Border(left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin'))
# CSVファイルのパスを取得
csv_files = glob.glob("./csv/t_csv*.csv")
# 各CSVファイルに対して処理を行う
for csv_file in csv_files:
# CSVファイル名をシート名として使用
sheet_name = csv_file.split('/')[-1].replace('.csv', '')
# 新しいシートを作成
sheet = wb.create_sheet(title=sheet_name.replace("/","_").replace(".","").replace("\\","_"))
# CSVファイルを読み込む
#df = pd.read_csv(csv_file, header=None)
with open(csv_file, newline='', encoding='utf-8') as file:
reader = csv.reader(file)
# リストにデータを格納
data = list(reader)
# データをセルに挿入
dt_r_max = 0
dt_c_max = 0
for r_idx, row in enumerate(data):
for c_idx, value in enumerate(row):
cell = sheet.cell(row=r_idx + 1, column=c_idx + 1, value=value)
if len(str(cell.value)) > 0 :
print(len(str(cell.value)),cell.value,type(cell.value))
if dt_r_max <= r_idx :
dt_r_max = r_idx
if dt_c_max <= c_idx :
dt_c_max = c_idx
for r_idx in range(dt_r_max +1) :
for c_idx in range(dt_c_max+1 ) :
#print(r_idx,c_idx)
cell = sheet.cell(row=r_idx +1, column=c_idx+1 )
# 罫線を設定
cell.border = thin_border
# デフォルトのシート(最初に作成されたシート)を削除
if 'Sheet' in wb.sheetnames:
del wb['Sheet']
# ファイルを保存
wb.save("example_openpyex_csv2cell.xlsx")
●pptxを読み込んで適当にダンプ
ppt_make_pydump.py
from pptx import Presentation
from pptx.util import Inches
from pptx.dml.color import RGBColor
# プレゼンテーションの読み込み
prs = Presentation("presentation.pptx")
#左上原点
# 各オブジェクトの情報をダンプ
for slide_number, slide in enumerate(prs.slides, start=1):
print(f"Slide {slide_number}:")
for shape in slide.shapes:
# 座標とサイズの取得
left = shape.left
top = shape.top
width = shape.width
height = shape.height
if hasattr(shape, "text"):
print(f" Shape Type: {shape.shape_type}, Text: '{shape.text}'")
print(f" Position: (left: {left}, top: {top}), Size: (width: {width}, height: {height})")
if shape.has_text_frame:
for paragraph in shape.text_frame.paragraphs:
# フォント情報を取得
font_size = paragraph.font.size
is_bold = paragraph.font.bold
color = paragraph.font.color
# 色のチェックを例外処理で行う
try:
color_value = color.rgb if color else "No color set"
except AttributeError:
color_value = "No color set"
print(f" Text: '{paragraph.text}', Font Size: {font_size}, Bold: {is_bold}, Color: {color_value}")
if shape.shape_type == 19: # テーブルの場合
for row in shape.table.rows:
for cell in row.cells:
print(f" Table Cell: '{cell.text}'")
for paragraph in cell.text_frame.paragraphs:
font_size = paragraph.font.size
color = paragraph.font.color
# 色のチェックを例外処理で行う
try:
color_value = color.rgb if color else "No color set"
except AttributeError:
color_value = "No color set"
print(f" Text: '{paragraph.text}', Font Size: {font_size}, Color: {color_value}")
print() # 空行で区切り
●pptx作成サンプル
参考URL:www.shibutan-bloomers.com/python-libraly-pptx-2/1024/
ppt_make_py_out.py
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
from pptx.util import Inches
def center_shape_on_slide(prs, shape):
# スライドの幅と高さを取得
slide_width = prs.slide_width
slide_height = prs.slide_height
# オブジェクトの幅と高さを取得
shape_width = shape.width
shape_height = shape.height
# 新しい位置を計算
left = int((slide_width - shape_width) / 2)
top = int((slide_height - shape_height) / 2)
# 位置を設定
shape.left = left
shape.top = top
#enddef
# プレゼンテーションの作成
prs = Presentation()
# スライドの追加
slide = prs.slides.add_slide(prs.slide_layouts[5]) # 空白のスライド
# テキストボックスの追加
textbox = slide.shapes.add_textbox(Inches(1), Inches(1), Inches(5), Inches(1))
text_frame = textbox.text_frame
p = text_frame.add_paragraph()
p.text = "これはテキストボックス"
p.font.bold = True
p.font.size = Pt(20)
p.font.color.rgb = RGBColor(255, 0, 0) # 赤色
# 四角形の追加
shape = slide.shapes.add_shape(
1, # msoShapeRectangle
Inches(1), Inches(2), Inches(5), Inches(1)
)
shape.text = "これは図形の四角形"
text_frame = shape.text_frame
p = text_frame.paragraphs[0]
p.font.bold = True
p.font.size = Pt(18)
p.font.color.rgb = RGBColor(0, 0, 255) # 青色
# テーブルの追加
rows, cols = 5, 5
table = slide.shapes.add_table(rows, cols, Inches(1), Inches(3), Inches(5), Inches(2)).table
# テーブルのセルにテキストを追加
for row in range(rows):
for col in range(cols):
cell = table.cell(row, col)
cell.text = f"{row+1}-{col+1}"
for p in cell.text_frame.paragraphs:
p.font.size = Pt(12)
p.font.color.rgb = RGBColor(0, 128, 0) # 緑色
# スライドの追加
slide = prs.slides.add_slide(prs.slide_layouts[5]) # 空白のスライド
# 1つ目のテキストボックス
textbox1 = slide.shapes.add_textbox(Inches(1), Inches(1), Inches(5), Inches(1))
textbox1.text = "ひとつめのテキストボックス"
# 2つ目のテキストボックス(赤色の枠)
textbox2 = slide.shapes.add_textbox(Inches(1), Inches(2), Inches(5), Inches(1))
textbox2.text = "ふたつめのてきすとぼっくす"
textbox2.line.color.rgb = RGBColor(255, 0, 0) # 赤色の枠
textbox2.line.width = Pt(2) # 枠線の幅を2ポイントに設定
# 3つ目のテキストボックス(青色で枠内塗りつぶし)
textbox3 = slide.shapes.add_textbox(Inches(1), Inches(3), Inches(5), Inches(1))
textbox3.text = "みっつめのてきすと"
textbox3.fill.solid() # 塗りつぶしを設定
textbox3.fill.fore_color.rgb = RGBColor(0, 0, 255) # 青色で塗りつぶし
# 4つ目のテキストボックス(青い色の枠、黄色で塗りつぶし)
textbox4 = slide.shapes.add_textbox(Inches(1), Inches(4), Inches(5), Inches(1))
textbox4.text = "4つめ"
textbox4.line.color.rgb = RGBColor(0, 0, 255) # 青色の枠
textbox4.line.width = Pt(2) # 枠線の幅を2ポイントに設定
textbox4.fill.solid() # 塗りつぶしを設定
textbox4.fill.fore_color.rgb = RGBColor(255, 255, 0) # 黄色で塗りつぶし
# スライドの追加
slide = prs.slides.add_slide(prs.slide_layouts[5]) # 空白のスライド
# テーブルの作成
rows, cols = 4, 4
table = slide.shapes.add_table(rows, cols, Inches(1), Inches(1), Inches(5), Inches(3)).table
# センタリング関数を呼び出し
center_shape_on_slide(prs,slide.shapes[-1])
# テーブルのスタイル設定
for row in range(rows):
for col in range(cols):
cell = table.cell(row, col)
cell.fill.solid() # 塗りつぶ
#cell.fill.fore_color.rgb = RGBColor(255, 255, 255) # 白色
# 3-3のセルだけ黄色で塗りつぶし
if row == 2 and col == 2: # 3行3列目(インデックスは0始まり)
cell.fill.solid()
cell.fill.fore_color.rgb = RGBColor(255, 255, 0) # 黄色
# プレゼンテーションを保存
prs.save("presentation.pptx")