pythonでエクセル、パワポ、メモ

ChatGPTに聞きながらまた色々サンプル作成

●複数のcsvをxlsxにまとめるサンプル
●pptxを読み込んで適当にダンプ
●pptx作成サンプル

●複数のcsvをxlsxにまとめるサンプル
```python: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を読み込んで適当にダンプ
```python: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/
```python: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 = "４つめ"
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")
```