python Dimoraデータ整理 2026-09-10-3 | 60歳を迎えて、思うこと。

60歳を迎えて、思うこと。

いつの間にか、「60」という年月が経ちました。
残り少ないか多いか?わかりませんが。
じじぃ~の「ひとりごと」を細々と続けられれば。。。

python Dimoraデータ整理 2026-09-10-3

# python
# Dimora
# DIGA
# ONLINE Backup

にゃあw 3部作・・・



# ==============================
# ==== Dimoraデータ
# ==== xlsx to openpyxl
# 2026/08/22 15:30:55
# 【Gemini】様
# ### 修正後の全文コード
# 設定を一カ所に集約し、**全角スペースをすべて半角スペース・タブに全置換**した修正版です。そのままコピー&ペーストして実行できます。

# ==========================================================
# 1. ライブラリの読み込み(一番上におく!)
# ==========================================================
import datetime
from glob import glob
import os
from pathlib import Path
import shutil
import openpyxl
from openpyxl.styles import Alignment, Border, Font, PatternFill, Side
from copy import copy

# ==========================================================
# 3. カレントディレクトリの変更 ★絶対死守★
# ==========================================================
script_dir = os.path.dirname(os.path.abspath(__file__))
os.chdir(script_dir)
print(f"Current directory: {os.getcwd()}")

# ==========================================
# ==== 2. 設定エリア(変更・管理するのはここだけ)
# ==========================================
# 設定パラメータ(ここだけ書き換える!)
# ==========================================
MODE = 1  # 1: 本体 / 2: USB-1 / 3: USB-2

# 共通パラメータ
# INPUT_FILE = "UTF-RecList-Replace済.csv"
OUTPUT_FILE = "UTF-2W101-本体-ONLY-SORT-py.xlsx"
SORT_KEY = "ジャンル"

# モードに応じた自動分岐(辞書マッピング)
CONFIG_MAP = {
    1: {"key": "本体", "file": "UTF-2W101-本体-ONLY-SORT.xlsx"},
    2: {"key": "USB-1", "file": "UTF-2W101-USB-1-ONLY-SORT.xlsx"},
    #                            UTF-2W101-USB-1-ONLY-SORT.xlsx
    3: {"key": "USB-2", "file": "UTF-2W101-USB-2-ONLY-SORT.xlsx"},
}

# 選択された設定を取得
config = CONFIG_MAP.get(MODE)

if config:
    OUTPUT_KEY = config["key"]
    # OUTPUT_FILE = config["file"]
    INPUT_FILE = config["file"]
else:
    raise ValueError("無効なMODEが設定されています。1〜3を指定してください。")
# ==============================

SHEET_NAME = "DIGA番組表"

# # [openpyxl スタイル設定の集約]
# STYLES = {
#     "HEADER_FONT": Font(name="メイリオ", size=11, bold=True, color="FFFFFF"),
#     "HEADER_FILL": PatternFill(
#         start_color="1F4E78", end_color="1F4E78", fill_type="solid"
#     ),
#     "DATA_FONT": Font(name="メイリオ", size=10),
#     "ALIGN_CENTER": Alignment(horizontal="center", vertical="center"),
#     "THIN_BORDER": Border(
#         left=Side(style="thin", color="D9D9D9"),
#         right=Side(style="thin", color="D9D9D9"),
#         top=Side(style="thin", color="D9D9D9"),
#         bottom=Side(style="thin", color="D9D9D9"),
#     ),
# }

# ==========================================
# ==== 3. メイン処理エリア
# ==========================================
# ==== debug
print(INPUT_FILE)
print(OUTPUT_FILE)
print(SHEET_NAME)

# 入力ファイル読み込み
wb = openpyxl.load_workbook(INPUT_FILE)
ws = wb[SHEET_NAME] if SHEET_NAME in wb.sheetnames else wb.active

now = datetime.datetime.now()
date_time_now = f"{now:%Y/%m/%d %H:%M}"

KEISEN = 14 # 14= M列まで
INS_GYOU = 1

# 空白行の挿入
SheetRowNo = 1
for x in range(INS_GYOU):
    ws.insert_rows(SheetRowNo)


# セルに値とフォーマットを与える関数
def set_cell(cname, value, fmt):
    c = ws[cname]
    c.value = value
    c.number_format = fmt


# 行数の取得
max_row = ws.max_row
row_info=str(max_row)+("行")
print(row_info)

# カラム数の取得
max_col = ws.max_column
col_info=str(max_col)+("列")
print(col_info)
# ==============================
# 全体(個別指定以外)の行高さを設定
# ws.sheet_format.defaultRowHeight = 10

# 個別の行高さを設定

ws.row_dimensions[1].height = 12
ws.row_dimensions[2].height = 18

# データ行
for row in range(3, max_row + 2):
    ws.row_dimensions[row].height = 14

# 追加文字列行
row_sum = max_row + 1
row_date = max_row + 2
row_filename = max_row + 3

ws.row_dimensions[row_sum].height = 12
ws.row_dimensions[row_date].height = 12
ws.row_dimensions[row_filename].height = 12

# ==============================
# 列幅(カラム幅)の個別指定
    # "A": 14,"B": 10,"C": 60,
    # "D": 4,"E": 4,"F": 8,
    # "G": 5,"H": 8,"I": 6,
    # "J": 8,"K": 8,"L": 8,
    # "M": 8,
    
col_width = {
    "A": 12,
    "B": 8,
    "C": 70,
    "D": 3,
    "E": 3,
    "F": 6,
    "G": 4,
    "H": 10,
    "I": 4,
    "J": 4,
    "K": 4,
    "L": 4,
    "M": 5,
    "N": 3,
    "O": 3,
    "P": 3,
    "Q": 3,
    "R": 3,
    "S": 3,
    "T": 3,
    "U": 3,
    "V": 3,
    "W": 3,
    "X": 3,
    "Y": 3,
    "Z": 3,
}

for col, width in col_width.items():
    ws.column_dimensions[col].width = width

# 表タイトル記入
# ==============================
# あらかじめ多めに用意しているリスト(26列分など)
headers = [
    "A-1", "B-2", "C-3", "D-4", "E-5", "F-6", "G-7",
    "H-8", "I-9", "J-10", "K-11", "L-12", "M-13",
    "N-14","O-15","P-16","Q-17","R-18","S-19","T-20", 
]

l_no1 = 1

# 既存シートの最終列を取得(例: すでに5列分データがあれば 5 が入る)
col = ws.max_column

# 取得した最終列の数だけ headers から取り出して書き込み
for col_idx, header in enumerate(headers[:col], start=1):
    ws.cell(row=l_no1, column=col_idx).value = header
# ==============================
# 1つのループにまとめて処理できます
for i, row in enumerate(range(3, max_row + 1), start=1):
    # 4列目に「1」を設定
    ws.cell(row=row, column=4).value = 1
    
    # 5列目に連番(1, 2, 3...)を設定
    ws.cell(row=row, column=5).value = i
    
    # 6列目に「時間換算の数式(=I3/1440 など)」を設定
    # row がそのまま現在の行番号(3, 4, 5...)になります
    ws.cell(row=row, column=6).value = f"=I{row}/1440"
    
    # ※もし6列目をExcelの「時刻表示(hh:mm)」にしたい場合は以下を追加
    # ws.cell(row=row, column=6).number_format = "hh:mm"

# 配置と表示形式
for row in ws["A3:A900"]:
    for cell in row:
        cell.alignment = Alignment(horizontal="right")
        cell.number_format = "yyyy/mm/dd"

for row in ws["B3:B900"]:
    for cell in row:
        cell.alignment = Alignment(horizontal="left")

for row in ws["C3:C900"]:
    for cell in row:
        cell.alignment = Alignment(horizontal="left")

for row in ws["D3:D900"]:
    for cell in row:
        cell.alignment = Alignment(horizontal="right")

for row in ws["E3:E900"]:
    for cell in row:
        cell.alignment = Alignment(horizontal="right")
        # cell.number_format = "¥#,##0;[Red]¥-#,##0"

for row in ws["F3:F900"]:
    for cell in row:
        cell.alignment = Alignment(horizontal="right")
        cell.number_format = "hh:mm"

for row in ws["G3:G900"]:
    for cell in row:
        cell.alignment = Alignment(horizontal="center")
        # cell.number_format = "¥#,##0;[Red]¥-#,##0"

for row in ws["H3:H900"]:
    for cell in row:
        cell.alignment = Alignment(horizontal="right")
        # cell.number_format = "¥#,##0;[Red]¥-#,##0"

for row in ws["I3:I900"]:
    for cell in row:
        cell.alignment = Alignment(horizontal="right")

for row in ws["J3:J900"]:
    for cell in row:
        cell.alignment = Alignment(horizontal="right")

for row in ws["K3:K900"]:
    for cell in row:
        cell.alignment = Alignment(horizontal="center")

for row in ws["L3:L900"]:
    for cell in row:
        cell.alignment = Alignment(horizontal="center")

for row in ws["M3:M900"]:
    for cell in row:
        cell.alignment = Alignment(horizontal="center")

for row in ws["A1:M2"]:
    for cell in row:
        cell.alignment = Alignment(horizontal="center", vertical="center")

# フォント指定
# フォント定義(テンプレートとして保持)
base_fonts = {
    1: Font(name="00コミック7", size=7, bold=False, color="000000"),
    2: Font(name="00コミック7", size=8, bold=False, color="000000"),
    3: Font(name="00コミック7", size=10, bold=False, color="000000"),
    4: Font(name="00コミック7", size=8, bold=False, color="000000"),
    5: Font(name="00コミック7", size=8, bold=False, color="000000"),
    6: Font(name="00コミック7", size=9, bold=False, color="000000"),
    7: Font(name="00コミック7", size=9, bold=False, color="000000"),
    8: Font(name="00コミック7", size=9, bold=False, color="000000"),
    9: Font(name="00コミック7", size=5, bold=False, color="000000"),
    10: Font(name="00コミック7", size=5, bold=False, color="000000"),
    11: Font(name="00コミック7", size=5, bold=False, color="000000"),
    12: Font(name="00コミック7", size=5, bold=False, color="000000"),
    13: Font(name="00コミック7", size=5, bold=False, color="000000"),
    14: Font(name="00コミック7", size=5, bold=False, color="000000"),
}

# 1. rangeの上限を +1 する(13列=M列、max_row+3行まで確実に処理)
# 2. copy(base_fonts[col]) でインスタンスの参照共有を防ぐ
for row in range(1, max_row + 4):
    for col in range(1, 14):
        ws.cell(row=row, column=col).font = copy(base_fonts[col])

# ==========================================
# 挿入文字列 + セル単位のフォント設定
# ==========================================
# font_08 = Font(name="00コミック7", size=8, bold=False, color="000000")
# cell = ws.cell(row=1, column=13)
# cell.font = font_08
# cell = ws.cell(row=2, column=13)
# cell.font = font_08
font_06 = Font(name="00コミック7", size=6, bold=False, color="000000")
font_12 = Font(name="00コミック7", size=8, bold=False, color="000000")
font_14 = Font(name="00コミック7", size=8, bold=False, color="000000")
font_18 = Font(name="00コミック7", size=8, bold=False, color="000000")
fill = PatternFill(patternType="solid", fgColor="F0E68C", bgColor="F0E68C")

# 表の情報
title_no = max_row - 2

# 1. 変数 cell の中身を「C列のセル」に上書き更新する!
cell = ws.cell(row=max_row + 1, column=3)

# 2. C列のセルに値をセットする
cell.value = str(title_no) + " 番組数  " + str(max_col) + " 列"

# 3. C列のセル(cell)にフォントを適用する
cell.font = font_14

# ws.cell(row=max_row + 1, column=3).value = (
#     str(title_no) + " 番組数(行)" + str(max_col) + " 列"
# )
# cell.font = font_14

# 日時
cell = ws.cell(row=max_row + 2, column=3)
cell.value = now
cell.font = font_12
cell.alignment = Alignment(horizontal="left", vertical="center")

# ファイル名
cell = ws.cell(row=max_row + 3, column=3)
cell.value = str(INPUT_FILE)
cell.font = font_12

# 小計
# cell = ws.cell(row=max_row + 1, column=4)
# cell.value = "小計"
# cell.font = font_18
# cell.fill = fill

# SUM
# cell = ws.cell(row=max_row + 1, column=5)
# cell.value = f"=SUM(E3:E{max_row+1})"
# cell.font = font_18
# cell.fill = fill
# これがかなり分かりやすい構造です。

# 収録時間
cell = ws.cell(row=2, column=6)
cell.font = font_06
# MODE
cell = ws.cell(row=2, column=7)
cell.font = font_06


# 罫線設定
border = Border(
    top=Side(style="thin", color="000000"),
    bottom=Side(style="thin", color="000000"),
    left=Side(style="thin", color="000000"),
    right=Side(style="thin", color="000000"),
)

xxx = max_row + 1
for row_num in range(1, xxx):
    for col_num in range(1, KEISEN):
        ws.cell(row=row_num, column=col_num).border = border

# 背景色
fill = PatternFill(patternType="solid", fgColor="F0E68C", bgColor="F0E68C")

for row in ws["A2:M2"]:
    for cell in row:
        cell.fill = fill

# 印刷設定
ws.page_setup.paperSize = 9
ws.page_setup.orientation = "landscape"
ws.page_margins.left = 0.3
ws.page_margins.right = 0.3
ws.page_margins.top = 0.4
ws.page_margins.bottom = 0.4
ws.page_margins.header = 0.2
ws.page_margins.footer = 0.2
ws.oddFooter.center.text = "&[Page] / &Nページ"

# 表示倍率
ws.sheet_view.zoomScale = 200

print("xlsx から openpyxl への整形が完了しました。")
print("ファイルの出力を実行しました")

# シート名変更と保存
ws.title = SHEET_NAME
wb.save(OUTPUT_FILE)
# ==============================