~/neet2027/create_excel.py
from openpyxl import Workbook
from openpyxl.styles import (Font, PatternFill, Alignment, Border, Side)
from openpyxl.utils import get_column_letter
wb = Workbook()
# ── colour palette ──────────────────────────────────────────────
C_DARK_BG = "1A237E" # deep navy – sheet headers
C_BIO = "1B5E20" # dark green – Biology
C_BIO_LIGHT = "C8E6C9"
C_CHEM = "0D47A1" # dark blue – Chemistry
C_CHEM_LIGHT= "BBDEFB"
C_PHY = "B71C1C" # dark red – Physics
C_PHY_LIGHT = "FFCDD2"
C_MOCK = "4A148C" # purple – Mock/Revision
C_MOCK_LIGHT= "E1BEE7"
C_PHASE = "E65100" # orange – Phase headers
C_PHASE_LIGHT="FFE0B2"
C_GOLD = "F57F17"
C_WHITE = "FFFFFF"
C_GREY_HDR = "37474F"
C_GREY_ROW = "ECEFF1"
def hdr_font(size=11, bold=True, color=C_WHITE):
return Font(name="Arial", size=size, bold=bold, color=color)
def body_font(size=10, bold=False, color="000000"):
return Font(name="Arial", size=size, bold=bold, color=color)
def fill(hex_color):
return PatternFill("solid", start_color=hex_color, fgColor=hex_color)
def center(wrap=False):
return Alignment(horizontal="center", vertical="center", wrap_text=wrap)
def left(wrap=True):
return Alignment(horizontal="left", vertical="center", wrap_text=wrap)
thin = Side(style="thin", color="BDBDBD")
med = Side(style="medium", color="757575")
def thin_border():
return Border(left=thin, right=thin, top=thin, bottom=thin)
def med_border():
return Border(left=med, right=med, top=med, bottom=med)
def style_cell(cell, fg, font, align, border=None):
cell.fill = fill(fg)
cell.font = font
cell.alignment = align
if border:
cell.border = border
# ════════════════════════════════════════════════════════════════
# SHEET 1 – OVERVIEW
# ════════════════════════════════════════════════════════════════
ws1 = wb.active
ws1.title = "Overview"
ws1.sheet_view.showGridLines = False
ws1.column_dimensions["A"].width = 28
ws1.column_dimensions["B"].width = 22
ws1.column_dimensions["C"].width = 22
ws1.column_dimensions["D"].width = 22
ws1.column_dimensions["E"].width = 18
# Title
ws1.merge_cells("A1:E1")
ws1["A1"] = "NEET 2027 – Master Study Plan"
style_cell(ws1["A1"], C_DARK_BG, hdr_font(16, True), center())
ws1.merge_cells("A2:E2")
ws1["A2"] = "Dropper | Target: 700+ (AIR Top 1000) | May 2026 – May 2027"
style_cell(ws1["A2"], C_GOLD, hdr_font(11, False, "000000"), center())
ws1.row_dimensions[1].height = 36
ws1.row_dimensions[2].height = 22
# ── Score targets table ──
headers = ["Subject", "Total Marks", "Target Score", "Max Wrong", "% Accuracy"]
col_fills = [C_GREY_HDR, C_GREY_HDR, C_GREY_HDR, C_GREY_HDR, C_GREY_HDR]
for r in range(3,5): ws1.row_dimensions[r].height = 6 # spacer
r = 5
ws1.row_dimensions[r].height = 20
for c, h in enumerate(headers, 1):
cell = ws1.cell(row=r, column=c, value=h)
style_cell(cell, C_GREY_HDR, hdr_font(10), center(), thin_border())
data = [
("Biology", 360, "340+", "≤5 questions", "94%"),
("Chemistry", 180, "164+", "≤4 questions", "91%"),
("Physics", 180, "156+", "≤8 questions", "87%"),
("TOTAL", 720, "660+", "", "92%"),
]
row_cols = [C_BIO_LIGHT, C_CHEM_LIGHT, C_PHY_LIGHT, C_PHASE_LIGHT]
for i, (subj, total, tgt, wrong, acc) in enumerate(data):
r += 1
ws1.row_dimensions[r].height = 18
for c, val in enumerate([subj, total, tgt, wrong, acc], 1):
cell = ws1.cell(row=r, column=c, value=val)
bold = (subj == "TOTAL")
style_cell(cell, row_cols[i], body_font(10, bold), center(), thin_border())
# ── Phase overview table ──
r += 2
phase_data = [
("Phase", "Period", "Duration", "Focus", "Key Activity"),
("Phase 1", "May 10 – Jun 7, 2026", "4 weeks", "Diagnostic + Foundation Reset", "Full paper attempt, chapter audit, weak-list"),
("Phase 2", "Jun 8 – Oct 31, 2026", "21 weeks", "Core Syllabus Coverage", "All chapters: NCERT 1st + 2nd pass + problems"),
("Phase 3", "Nov 2 – Dec 28, 2026", "8 weeks", "PYQ Blitz (15 years)", "Chapter-wise PYQs for all 3 subjects"),
("Phase 4", "Dec 29 – Jan 25, 2027", "4 weeks", "Second Revision Cycle", "Rapid NCERT re-read + error log"),
("Phase 5", "Jan 26 – Apr 26, 2027", "13 weeks", "Mock Test Blitz", "70–80 full mocks + post-mock analysis"),
("Phase 6", "May 4 – 18, 2027", "2 weeks", "Final Lockdown", "NCERT only + error log + sleep"),
]
ph_clrs = [C_GREY_HDR, C_PHASE_LIGHT, C_BIO_LIGHT, C_CHEM_LIGHT, C_PHY_LIGHT, C_MOCK_LIGHT, "FFF9C4"]
ws1.column_dimensions["E"].width = 40
for pi, row_vals in enumerate(phase_data):
ws1.row_dimensions[r].height = 22
is_hdr = (pi == 0)
for c, val in enumerate(row_vals, 1):
cell = ws1.cell(row=r, column=c, value=val)
fg = C_GREY_HDR if is_hdr else ph_clrs[pi]
fnt = hdr_font(10) if is_hdr else body_font(10)
style_cell(cell, fg, fnt, left() if c >= 4 else center(), thin_border())
r += 1
# ════════════════════════════════════════════════════════════════
# SHEET 2 – WEEK-BY-WEEK TIMETABLE
# ════════════════════════════════════════════════════════════════
ws2 = wb.create_sheet("Weekly Timetable")
ws2.sheet_view.showGridLines = False
cols_w = [8, 20, 26, 26, 26, 22]
col_letters = ["A","B","C","D","E","F"]
for i, w in enumerate(cols_w):
ws2.column_dimensions[col_letters[i]].width = w
ws2.merge_cells("A1:F1")
ws2["A1"] = "NEET 2027 – Week-by-Week Timetable (May 2026 – May 2027)"
style_cell(ws2["A1"], C_DARK_BG, hdr_font(14, True), center())
ws2.row_dimensions[1].height = 34
ws2.merge_cells("A2:F2")
ws2["A2"] = "6 study days/week | 8–9 hours/day | Sunday = light revision/rest"
style_cell(ws2["A2"], C_GOLD, body_font(10, False, "000000"), center())
ws2.row_dimensions[2].height = 18
# column headers
r = 3
ws2.row_dimensions[r].height = 22
for c, h in enumerate(["Wk", "Period", "Biology", "Chemistry", "Physics", "Notes/Phase"], 1):
cell = ws2.cell(row=r, column=c, value=h)
style_cell(cell, C_GREY_HDR, hdr_font(10), center(), thin_border())
# weekly data: (wk, period, bio, chem, phy, notes)
weekly = [
# Phase 1
("W1", "May 10–16", "Attempt NEET 2024 full paper → Chapter audit", "Attempt NEET 2024 full paper → Chapter audit", "Attempt NEET 2024 full paper → Chapter audit", "PHASE 1 – Diagnostic"),
("W2", "May 17–23", "Animal Kingdom, Plant Kingdom, Bio Classification", "Mole Concept + Atomic Structure", "Kinematics (NCERT + HC Verma)", ""),
("W3", "May 24–30", "Cell Structure + Biomolecules", "Chemical Bonding", "Laws of Motion", ""),
("W4", "May 31–Jun 7","Cell Division + Morphology of Plants", "Thermodynamics", "Work, Energy & Power", "End Phase 1"),
# Phase 2
("W5", "Jun 8–14", "Plant Anatomy + Transport in Plants", "Equilibrium (Chemical)", "Rotational Motion Part 1", "PHASE 2 – Core Syllabus"),
("W6", "Jun 15–21", "Mineral Nutrition + Photosynthesis", "Equilibrium (Ionic) + pH", "Rotational Motion Part 2", ""),
("W7", "Jun 22–28", "Respiration in Plants + Plant Growth", "Solutions", "Gravitation", ""),
("W8", "Jun 29–Jul 5","Human Digestion & Absorption", "Electrochemistry", "SHM + Waves", ""),
("W9", "Jul 6–12", "Breathing & Exchange of Gases", "Chemical Kinetics", "Thermal Properties", ""),
("W10", "Jul 13–19", "Body Fluids & Circulation", "s-Block Elements", "Thermodynamics (Physics)", ""),
("W11", "Jul 20–26", "Excretory Products & Elimination", "p-Block Part 1 (Grp 13–14)", "Electrostatics Part 1", ""),
("W12", "Jul 27–Aug 2","Locomotion & Movement", "p-Block Part 2 (Grp 15–18)", "Electrostatics Part 2", ""),
("W13", "Aug 3–9", "Neural Control & Coordination", "d & f Block Elements", "Current Electricity Part 1", ""),
("W14", "Aug 10–16", "Chemical Coordination (Endocrine)", "Coordination Compounds", "Current Electricity Part 2", ""),
("W15", "Aug 17–23", "Human Reproduction", "Haloalkanes & Haloarenes", "Magnetic Effects of Current", ""),
("W16", "Aug 24–30", "Reproductive Health", "Alcohols, Phenols & Ethers", "Moving Charges & Magnetism", ""),
("W17", "Aug 31–Sep 6","Principles of Inheritance + Genetics", "Aldehydes & Ketones", "Electromagnetic Induction", ""),
("W18", "Sep 7–13", "Chromosomal Basis of Inheritance", "Carboxylic Acids & Derivatives", "Alternating Current", ""),
("W19", "Sep 14–20", "Molecular Basis of Inheritance (DNA)", "Amines", "Ray Optics Part 1", ""),
("W20", "Sep 21–27", "Evolution", "Biomolecules (Chemistry)", "Ray Optics Part 2", ""),
("W21", "Sep 28–Oct 4","Human Health & Disease", "Polymers + Chemistry in Everyday Life", "Wave Optics", ""),
("W22", "Oct 5–11", "Microbes in Human Welfare", "Surface Chemistry", "Dual Nature of Radiation", ""),
("W23", "Oct 12–18", "Biotechnology: Principles & Processes", "General Organic Chemistry (GOC)", "Atoms", ""),
("W24", "Oct 19–25", "Biotechnology & Its Applications", "Revision: Physical Chemistry", "Nuclei", ""),
("W25", "Oct 26–Nov 1","Ecosystem + Organisms & Populations + Biodiversity", "Revision: Inorganic Chemistry", "Semiconductors + Communication Systems", "End Phase 2"),
# Phase 3
("W26", "Nov 2–8", "PYQs: Animal/Plant Kingdom, Classification, Cell", "PYQs: Physical Chemistry (Part 1)", "PYQs: Mechanics (Kinematics–Rotational)", "PHASE 3 – PYQ Blitz"),
("W27", "Nov 9–15", "PYQs: Plant Physiology (all 5 chapters)", "PYQs: Physical Chemistry (Part 2)", "PYQs: Gravitation, SHM, Waves, Thermal", ""),
("W28", "Nov 16–22", "PYQs: Human Physiology (all 5 chapters)", "PYQs: Inorganic Chemistry (Part 1: s,p-block)", "PYQs: Electrostatics + Current Electricity", ""),
("W29", "Nov 23–29", "PYQs: Reproduction + Genetics + Molecular Bio", "PYQs: Inorganic Chemistry (Part 2: d-block, Coord.)", "PYQs: Magnetism + EMI + AC", ""),
("W30", "Nov 30–Dec 6","PYQs: Evolution + Health + Biotech + Ecology", "PYQs: Organic Chemistry (Part 1)", "PYQs: Optics (Ray + Wave)", ""),
("W31", "Dec 7–13", "Error log revision – Biology", "PYQs: Organic Chemistry (Part 2)", "PYQs: Modern Physics (Dual+Atoms+Nuclei)", ""),
("W32", "Dec 14–20", "Biology weak chapters targeted revision", "Error log revision – Chemistry", "PYQs: Semiconductors + Communication", ""),
("W33", "Dec 21–28", "Full Biology rapid revision", "Full Chemistry rapid revision", "Error log revision – Physics", "End Phase 3"),
# Phase 4
("W34", "Dec 29–Jan 4","NCERT 3rd read: Tier 1 chapters", "Rapid revision: Physical Chemistry", "Rapid revision: Mechanics + Electricity", "PHASE 4 – 2nd Revision"),
("W35", "Jan 5–11", "NCERT 3rd read: Tier 2 + 3 chapters", "Rapid revision: Inorganic Chemistry", "Rapid revision: Optics + Modern Physics", ""),
("W36", "Jan 12–18", "Error log + diagram flashcards", "Rapid revision: Organic Chemistry", "Formula sheet consolidation", ""),
("W37", "Jan 19–25", "Full Biology mock + analysis", "Full Chemistry mock + analysis", "Full Physics mock + analysis", "End Phase 4"),
# Phase 5
("W38", "Jan 26–Feb 1","2 Full Mocks + error analysis", "2 Full Mocks + error analysis", "2 Full Mocks + error analysis", "PHASE 5 – Mock Blitz"),
("W39", "Feb 2–8", "2 Full Mocks + Bio weak chapter", "2 Full Mocks + Chem weak chapter", "2 Full Mocks + Phy weak chapter", ""),
("W40", "Feb 9–15", "2 Full Mocks + Bio PYQ targeted", "2 Full Mocks + Chem PYQ targeted", "2 Full Mocks + Phy PYQ targeted", ""),
("W41", "Feb 16–22", "2 Full Mocks + error log revision", "2 Full Mocks + error log revision", "2 Full Mocks + error log revision", ""),
("W42", "Feb 23–Mar 1","3 Full Mocks + subject mini-tests", "3 Full Mocks + subject mini-tests", "3 Full Mocks + subject mini-tests", ""),
("W43", "Mar 2–8", "3 Full Mocks", "3 Full Mocks", "3 Full Mocks", ""),
("W44", "Mar 9–15", "3 Full Mocks + Bio error log", "3 Full Mocks + Chem error log", "3 Full Mocks + Phy error log", ""),
("W45", "Mar 16–22", "3 Full Mocks", "3 Full Mocks", "3 Full Mocks", ""),
("W46", "Mar 23–29", "3 Full Mocks + NCERT rapid read", "3 Full Mocks + formula tables", "3 Full Mocks + formula sheet", ""),
("W47", "Mar 30–Apr 5","3–4 Full Mocks + error log only", "3–4 Full Mocks + error log only", "3–4 Full Mocks + error log only", ""),
("W48", "Apr 6–12", "3–4 Full Mocks", "3–4 Full Mocks", "3–4 Full Mocks", ""),
("W49", "Apr 13–19", "3–4 Full Mocks", "3–4 Full Mocks", "3–4 Full Mocks", ""),
("W50", "Apr 20–26", "Final mock + thorough analysis", "Final mock + thorough analysis", "Final mock + thorough analysis", "End Phase 5"),
# Phase 6
("W51", "May 4–6", "NCERT rapid read: all 38 chapters", "NCERT + 1-page summary tables", "Formula sheet + key concepts only", "PHASE 6 – Final Lockdown"),
("W52", "May 7–10", "Error log + diagram flashcards", "Error log flashcards", "Error log flashcards", ""),
("W53", "May 11–14", "Light revision only, 8 hrs sleep", "Light revision only", "Light revision only", ""),
("W54", "May 18", "EXAM DAY – Trust your preparation", "EXAM DAY", "EXAM DAY", "NEET 2027"),
]
phase_rows = {
"W1": C_PHASE, "W5": C_PHASE, "W26": C_PHASE,
"W34": C_PHASE, "W38": C_PHASE, "W51": C_PHASE,
}
r = 4
for wk, period, bio, chem, phy, notes in weekly:
ws2.row_dimensions[r].height = 32
# decide row background
phase_note = notes
if "PHASE 1" in notes:
row_bg = C_PHASE_LIGHT
elif "PHASE 2" in notes:
row_bg = C_BIO_LIGHT
elif "PHASE 3" in notes or "End Phase 3" in notes:
row_bg = C_CHEM_LIGHT
elif "PHASE 4" in notes or "End Phase 4" in notes:
row_bg = C_PHY_LIGHT
elif "PHASE 5" in notes or "End Phase 5" in notes:
row_bg = C_MOCK_LIGHT
elif "PHASE 6" in notes:
row_bg = "FFF9C4"
elif "NEET 2027" in notes:
row_bg = C_GOLD
elif "End Phase" in notes:
row_bg = "EEEEEE"
else:
row_bg = C_WHITE
# phase header rows get orange bg
is_phase_hdr = any(p in notes for p in ["PHASE 1","PHASE 2","PHASE 3","PHASE 4","PHASE 5","PHASE 6"])
for c, val in enumerate([wk, period, bio, chem, phy, notes], 1):
cell = ws2.cell(row=r, column=c, value=val)
if is_phase_hdr:
bg = C_PHASE
fnt = hdr_font(9, True)
elif "NEET 2027" in notes:
bg = C_GOLD
fnt = hdr_font(10, True, "000000")
else:
bg = row_bg
fnt = body_font(9)
style_cell(cell, bg, fnt, left(wrap=True), thin_border())
r += 1
# ════════════════════════════════════════════════════════════════
# SHEET 3 – BIOLOGY CHAPTER PRIORITY
# ════════════════════════════════════════════════════════════════
ws3 = wb.create_sheet("Biology Chapters")
ws3.sheet_view.showGridLines = False
ws3.column_dimensions["A"].width = 6
ws3.column_dimensions["B"].width = 38
ws3.column_dimensions["C"].width = 10
ws3.column_dimensions["D"].width = 16
ws3.column_dimensions["E"].width = 14
ws3.column_dimensions["F"].width = 38
ws3.merge_cells("A1:F1")
ws3["A1"] = "Biology – Chapter Priority & Study Guide"
style_cell(ws3["A1"], C_BIO, hdr_font(14), center())
ws3.row_dimensions[1].height = 32
r = 2
for c, h in enumerate(["Tier","Chapter","Class","Avg Qs/Year","Priority","Study Method"], 1):
cell = ws3.cell(row=r, column=c, value=h)
style_cell(cell, C_GREY_HDR, hdr_font(10), center(), thin_border())
ws3.row_dimensions[r].height = 20
bio_chapters = [
("T1","Human Reproduction","12","4–6","★★★","NCERT 3x + PYQs + all diagrams"),
("T1","Genetics & Mendelian Inheritance","12","5–7","★★★","Pedigree practice + NCERT 3x"),
("T1","Molecular Basis of Inheritance (DNA)","12","5–7","★★★","Enzymes, sequences, lac operon"),
("T1","Evolution","12","3–5","★★★","NCERT exact text + Hardy-Weinberg"),
("T1","Human Health & Disease","12","4–6","★★★","Causative agents table + immunity"),
("T1","Plant Kingdom","11","3–5","★★★","Alternation of generations + examples"),
("T1","Animal Kingdom","11","4–6","★★★","Phylum features + coelom/notochord"),
("T1","Biological Classification","11","2–4","★★★","5-kingdom + virus/viroid/lichen"),
("T1","Digestion & Absorption","11","3–4","★★★","Enzyme + site table + absorption"),
("T1","Breathing & Exchange of Gases","11","2–4","★★★","Lung volumes, O2 dissociation curve"),
("T2","Reproductive Health","12","2–3","★★","Contraception + STI list"),
("T2","Chromosomal Basis","12","2–3","★★","Linkage, crossing over, sex determination"),
("T2","Microbes in Human Welfare","12","2–3","★★","Biogas, sewage, antibiotics, SCP"),
("T2","Biotechnology Principles","12","3–4","★★","RE enzymes, vectors, PCR, blotting"),
("T2","Biotechnology Applications","12","2–3","★★","Bt crops, golden rice, ELISA, gene therapy"),
("T2","Ecosystem","12","2–3","★★","Energy flow, pyramids, nutrient cycles"),
("T2","Biodiversity & Conservation","12","2–3","★★","IUCN categories, hotspots, in-situ/ex-situ"),
("T2","Body Fluids & Circulation","11","2–4","★★","Heart anatomy + ECG + blood groups"),
("T2","Excretory Products","11","2–3","★★","Nephron diagram + urine formation"),
("T2","Locomotion & Movement","11","2–3","★★","Sliding filament + joint types"),
("T2","Neural Control","11","2–3","★★","Neuron, synapse, resting/action potential"),
("T2","Chemical Coordination","11","2–3","★★","Hormones + glands + feedback loops"),
("T2","Cell Structure & Function","11","2–3","★★","Organelle functions + cell wall"),
("T2","Biomolecules","11","2–3","★★","Enzyme kinetics, Km, inhibition types"),
("T3","Transport in Plants","11","1–2","★","Osmosis, xylem, phloem"),
("T3","Mineral Nutrition","11","1–2","★","Macro/micro nutrients + deficiency"),
("T3","Photosynthesis","11","2–3","★","Z-scheme, Calvin cycle, C4/CAM"),
("T3","Respiration in Plants","11","1–2","★","Glycolysis, Krebs, ETC"),
("T3","Plant Growth & Development","11","1–2","★","Phytohormones + photoperiodism"),
("T3","Morphology of Flowering Plants","11","1–2","★","Root/stem/leaf/flower modifications"),
("T3","Anatomy of Flowering Plants","11","1–2","★","Tissue systems + secondary growth"),
("T3","Structural Org. in Animals","11","1–2","★","Epithelium/connective/muscle/neural"),
("T3","Organisms & Populations","12","1–2","★","Population interactions + growth curves"),
("T3","Environmental Issues","12","1–2","★","Pollution types + remediation"),
]
for chap in bio_chapters:
r += 1
ws3.row_dimensions[r].height = 22
tier = chap[0]
bg = C_BIO_LIGHT if tier == "T1" else ("E8F5E9" if tier == "T2" else C_WHITE)
for c, val in enumerate(chap, 1):
cell = ws3.cell(row=r, column=c, value=val)
style_cell(cell, bg, body_font(9, tier=="T1"), center() if c <= 5 else left(), thin_border())
# ════════════════════════════════════════════════════════════════
# SHEET 4 – CHEMISTRY & PHYSICS CHAPTERS
# ════════════════════════════════════════════════════════════════
ws4 = wb.create_sheet("Chem & Physics Chapters")
ws4.sheet_view.showGridLines = False
for col, w in zip(["A","B","C","D","E","F","G","H","I","J"],
[6,28,12,14,6,28,10,14,8,30]):
ws4.column_dimensions[col].width = w
ws4.merge_cells("A1:E1")
ws4["A1"] = "Chemistry – Chapter Priority"
style_cell(ws4["A1"], C_CHEM, hdr_font(13), center())
ws4.merge_cells("F1:J1")
ws4["F1"] = "Physics – Chapter Priority"
style_cell(ws4["F1"], C_PHY, hdr_font(13), center())
ws4.row_dimensions[1].height = 30
for c, h in enumerate(["Tier","Chapter","Type","Avg Qs/Year","Class"], 1):
cell = ws4.cell(row=2, column=c, value=h)
style_cell(cell, C_GREY_HDR, hdr_font(10), center(), thin_border())
for c, h in enumerate(["Tier","Chapter","Class","Avg Qs/Year","Key Tip"], 1):
cell = ws4.cell(row=2, column=c+5, value=h)
style_cell(cell, C_GREY_HDR, hdr_font(10), center(), thin_border())
ws4.row_dimensions[2].height = 20
chem = [
("T1","Mole Concept & Stoichiometry","Physical","2–3","11"),
("T1","Chemical Bonding","Phys/Inorg","4–5","11"),
("T1","Thermodynamics","Physical","3–4","11"),
("T1","Electrochemistry","Physical","3–4","12"),
("T1","Chemical Kinetics","Physical","3–4","12"),
("T1","Coordination Compounds","Inorganic","4–5","12"),
("T1","Alcohols, Phenols & Ethers","Organic","3–4","12"),
("T1","Aldehydes & Ketones","Organic","3–4","12"),
("T1","Biomolecules (Chem)","Organic","3–4","12"),
("T1","p-Block (Grp 15–18)","Inorganic","4–5","12"),
("T2","Atomic Structure","Physical","2–3","11"),
("T2","Equilibrium","Physical","3–4","11"),
("T2","Solutions","Physical","2–3","12"),
("T2","Surface Chemistry","Physical","1–2","12"),
("T2","d & f Block","Inorganic","2–3","12"),
("T2","Haloalkanes & Haloarenes","Organic","2–3","12"),
("T2","Amines","Organic","2–3","12"),
("T2","Polymers","Organic","2–3","12"),
("T2","Chemistry in Everyday Life","Organic","1–2","12"),
("T2","s-Block Elements","Inorganic","1–2","11"),
]
phy = [
("T1","Laws of Motion","11","2–3","Free body diagrams essential"),
("T1","Work, Energy & Power","11","2–3","Conservation laws"),
("T1","Rotational Motion","11","2–4","MI table + rolling problems"),
("T1","Electrostatics","12","4–5","E-field + potential + capacitors"),
("T1","Current Electricity","12","4–5","KVL/KCL + Wheatstone"),
("T1","Electromagnetic Induction","12","2–3","Lenz law + Faraday"),
("T1","Alternating Current","12","2–3","LCR circuits + resonance"),
("T1","Ray Optics","12","3–4","Mirror/lens formula + sign conv."),
("T1","Wave Optics","12","2–3","YDSE fringe width formula"),
("T1","Modern Physics","12","5–7","Photoelectric + Bohr + decay law"),
("T1","Semiconductors","12","3–4","p-n junction + logic gates"),
("T2","Kinematics","11","1–2","Equations of motion"),
("T2","Gravitation","11","1–2","Kepler + escape velocity"),
("T2","SHM","11","1–2","x=A sin(ωt) + energy"),
("T2","Waves","11","2–3","Standing waves + Doppler"),
("T2","Thermal Properties","11","1–2","Calorimetry + conduction"),
("T2","Thermodynamics (Phy)","11","1–2","PV diagrams + 1st/2nd law"),
("T2","Magnetic Effects","12","2–3","Biot-Savart + Ampere"),
("T2","Moving Charges","12","1–2","Cyclotron + galvanometer"),
]
r = 3
for i in range(max(len(chem), len(phy))):
ws4.row_dimensions[r].height = 20
if i < len(chem):
tier, chap, typ, qs, cls = chem[i]
bg = C_CHEM_LIGHT if tier == "T1" else "E3F2FD"
for c, val in enumerate([tier, chap, typ, qs, cls], 1):
cell = ws4.cell(row=r, column=c, value=val)
style_cell(cell, bg, body_font(9, tier=="T1"), center() if c != 2 else left(), thin_border())
if i < len(phy):
tier, chap, cls, qs, tip = phy[i]
bg = C_PHY_LIGHT if tier == "T1" else "FFEBEE"
for c, val in enumerate([tier, chap, cls, qs, tip], 1):
cell = ws4.cell(row=r, column=c+5, value=val)
style_cell(cell, bg, body_font(9, tier=="T1"), center() if c not in [2,5] else left(), thin_border())
r += 1
# ════════════════════════════════════════════════════════════════
# SHEET 5 – DAILY SCHEDULE
# ════════════════════════════════════════════════════════════════
ws5 = wb.create_sheet("Daily Schedule")
ws5.sheet_view.showGridLines = False
ws5.column_dimensions["A"].width = 20
ws5.column_dimensions["B"].width = 32
ws5.column_dimensions["C"].width = 20
ws5.merge_cells("A1:C1")
ws5["A1"] = "Recommended Daily Schedule (Mon–Sat)"
style_cell(ws5["A1"], C_DARK_BG, hdr_font(13), center())
ws5.row_dimensions[1].height = 30
r = 2
for c, h in enumerate(["Time Slot", "Activity", "Subject"], 1):
cell = ws5.cell(row=r, column=c, value=h)
style_cell(cell, C_GREY_HDR, hdr_font(10), center(), thin_border())
ws5.row_dimensions[r].height = 20
schedule = [
("6:00 – 8:00 AM", "NCERT reading / PYQ solving", "Biology", C_BIO_LIGHT),
("8:30 – 10:30 AM", "Concepts + Numericals", "Physics", C_PHY_LIGHT),
("10:30 – 11:00 AM", "Break + light snack", "–", C_WHITE),
("11:00 AM – 1:00 PM","Theory + problems", "Chemistry", C_CHEM_LIGHT),
("1:00 – 2:30 PM", "Lunch + rest (NO study)", "–", C_WHITE),
("2:30 – 4:30 PM", "Revision of morning topics", "All", C_PHASE_LIGHT),
("4:30 – 5:00 PM", "Short break / walk", "–", C_WHITE),
("5:00 – 6:30 PM", "PYQ practice / weak chapter focus", "Rotating", "FFF9C4"),
("6:30 – 7:00 PM", "Break", "–", C_WHITE),
("7:00 – 8:30 PM", "Problem sets / mock section", "Rotating", C_MOCK_LIGHT),
("8:30 – 9:30 PM", "Flashcard review / notes update", "All", C_PHASE_LIGHT),
("9:30 PM onwards", "Wind down – NO screens, 8 hrs sleep", "–", C_WHITE),
]
for time, act, subj, bg in schedule:
r += 1
ws5.row_dimensions[r].height = 22
for c, val in enumerate([time, act, subj], 1):
cell = ws5.cell(row=r, column=c, value=val)
style_cell(cell, bg, body_font(10), center() if c != 2 else left(), thin_border())
# Sunday note
r += 2
ws5.merge_cells(f"A{r}:C{r}")
ws5[f"A{r}"] = "SUNDAY: Light revision (2 hrs max) + full rest. No new chapters. Recharge for the week."
style_cell(ws5[f"A{r}"], C_GOLD, body_font(10, True, "000000"), left())
ws5.row_dimensions[r].height = 24
# ── Save ──────────────────────────────────────────────────────
out = "/home/daytona/workspace/neet2027/NEET_2027_Study_Plan.xlsx"
wb.save(out)
print(f"Saved: {out}")