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)
# ==============================