Treatment give in case of cold cough fever n of style
treatment common cold cough fever adults 2025 guidelines
| Drug | Dose (Adults) | Notes |
|---|---|---|
| Paracetamol (Acetaminophen) | 500-1000 mg every 4-6 hrs | First choice; safe in most patients |
| Ibuprofen (NSAID) | 200-400 mg every 6-8 hrs | Anti-inflammatory + antipyretic; avoid in gastric ulcer, renal disease |
| Aspirin | Not used in children | Risk of Reye syndrome - avoid in children under 16 |
From Swanson's Family Medicine Review: "In those with fever, antipyretics may be used. Aspirin should be avoided because of the risk of Reye syndrome."
| Therapy | Evidence |
|---|---|
| Zinc lozenges (≥75 mg/day) | Started within 24 hrs of symptom onset - reduces duration of cold (Family Medicine 9e). May cause nausea/bad taste. |
| Vitamin C | Regular supplementation reduces severity and duration modestly (13% children, 8% adults) |
| Probiotics | May reduce number of colds (pooled OR 0.58); results inconsistent across trials |
| Nasal saline irrigation | Proven helpful for symptom relief and prevention |
| Symptom | Treatment |
|---|---|
| Fever | Paracetamol, Ibuprofen |
| Nasal congestion | Pseudoephedrine, Oxymetazoline spray (short-term), saline irrigation |
| Runny nose | Ipratropium spray, antihistamine-decongestant combo |
| Dry cough | Honey, Dextromethorphan |
| Productive cough | Guaifenesin (expectorant), fluids |
| General illness duration | Zinc lozenges (within 24 hrs), Vitamin C |
Opd syke doctor sheet
mkdir -p /tmp/workspace/opd-sheet && ls /tmp/workspace/opd-sheet/
~/opd-sheet/create_opd_sheet.py
import openpyxl
from openpyxl.styles import (
Font, Alignment, PatternFill, Border, Side, GradientFill
)
from openpyxl.utils import get_column_letter
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "OPD Consultation Sheet"
# ── Colours ──────────────────────────────────────────────────────────────────
HEADER_FILL = PatternFill("solid", fgColor="1F4E79") # dark blue
SECTION_FILL = PatternFill("solid", fgColor="BDD7EE") # light blue
ROW_FILL = PatternFill("solid", fgColor="F2F9FF") # very light blue
WHITE_FILL = PatternFill("solid", fgColor="FFFFFF")
LABEL_FILL = PatternFill("solid", fgColor="DEEAF1")
RX_FILL = PatternFill("solid", fgColor="E2EFDA") # light green for Rx
BORDER_FILL = PatternFill("solid", fgColor="2E75B6")
# ── Borders ───────────────────────────────────────────────────────────────────
thin = Side(style="thin", color="2E75B6")
thick = Side(style="medium", color="1F4E79")
def cell_border(top=thin, bottom=thin, left=thin, right=thin):
return Border(top=top, bottom=bottom, left=left, right=right)
outer = Border(top=thick, bottom=thick, left=thick, right=thick)
inner = cell_border()
# ── Helper functions ──────────────────────────────────────────────────────────
def set_cell(ws, row, col, value="", bold=False, size=10, color="000000",
fill=None, align_h="left", align_v="center", wrap=False,
border=None, italic=False):
c = ws.cell(row=row, column=col, value=value)
c.font = Font(name="Arial", bold=bold, size=size, color=color, italic=italic)
c.alignment = Alignment(horizontal=align_h, vertical=align_v,
wrap_text=wrap)
if fill:
c.fill = fill
if border:
c.border = border
return c
def merge_range(ws, r1, c1, r2, c2, value="", bold=False, size=10,
color="000000", fill=None, align_h="left", align_v="center",
wrap=False, border=None, italic=False):
ws.merge_cells(start_row=r1, start_column=c1,
end_row=r2, end_column=c2)
c = set_cell(ws, r1, c1, value, bold, size, color, fill, align_h,
align_v, wrap, border, italic)
return c
def section_header(ws, row, c1, c2, label):
merge_range(ws, row, c1, row, c2, label,
bold=True, size=10, color="FFFFFF",
fill=SECTION_FILL, align_h="center",
border=cell_border(top=thick, bottom=thick,
left=thick, right=thick))
ws.cell(row=row, column=c1).font = Font(name="Arial", bold=True,
size=10, color="1F4E79")
# ── Column widths ─────────────────────────────────────────────────────────────
col_widths = {
1: 2, # left margin
2: 18, # label col A
3: 20, # value col A
4: 2, # spacer
5: 18, # label col B
6: 20, # value col B
7: 2, # spacer
8: 18, # label col C
9: 20, # value col C
10: 2, # right margin
}
for col, width in col_widths.items():
ws.column_dimensions[get_column_letter(col)].width = width
# ── Row heights ───────────────────────────────────────────────────────────────
for r in range(1, 80):
ws.row_dimensions[r].height = 18
# ═══════════════════════════════════════════════════════════════════════════════
# ROW 1-3 : HOSPITAL HEADER
# ═══════════════════════════════════════════════════════════════════════════════
ws.row_dimensions[1].height = 8
ws.row_dimensions[2].height = 32
ws.row_dimensions[3].height = 20
ws.row_dimensions[4].height = 8
merge_range(ws, 2, 1, 2, 10,
"🏥 OUTPATIENT DEPARTMENT (OPD) — CONSULTATION SHEET",
bold=True, size=15, color="FFFFFF",
fill=PatternFill("solid", fgColor="1F4E79"),
align_h="center", border=outer)
merge_range(ws, 3, 1, 3, 10,
"Hospital Name | Address | Phone: ____________ | Email: ____________",
bold=False, size=9, color="1F4E79",
fill=PatternFill("solid", fgColor="DEEAF1"),
align_h="center", border=cell_border())
# ═══════════════════════════════════════════════════════════════════════════════
# ROW 5 : SECTION — PATIENT INFORMATION
# ═══════════════════════════════════════════════════════════════════════════════
ws.row_dimensions[5].height = 20
section_header(ws, 5, 1, 10, "▶ PATIENT INFORMATION")
ws.cell(row=5, column=1).value = "▶ PATIENT INFORMATION"
ws.cell(row=5, column=1).font = Font(name="Arial", bold=True, size=10, color="1F4E79")
merge_range(ws, 5, 1, 5, 10, "▶ PATIENT INFORMATION",
bold=True, size=10, color="FFFFFF",
fill=PatternFill("solid", fgColor="2E75B6"),
align_h="center", border=cell_border(top=thick, bottom=thick,
left=thick, right=thick))
def lv(ws, row, lc, label, vc, value="", lf=LABEL_FILL, vf=WHITE_FILL):
"""Label + value pair."""
set_cell(ws, row, lc, label, bold=True, size=9, color="1F4E79",
fill=lf, align_h="left", border=inner)
set_cell(ws, row, vc, value, bold=False, size=9, color="000000",
fill=vf, align_h="left", border=inner)
# Row 6-11 : patient info grid
patient_rows = [
(6, "OPD No.", 3, "Date:", 6, "Time:", 9),
(7, "Patient Name:", 3, "Age:", 6, "Gender:", 9),
(8, "Address:", 3, "Phone:", 6, "Blood Group:", 9),
(9, "Referred By:", 3, "Aadhar / ID No.:", 6, "Insurance No.:", 9),
(10, "Next of Kin:", 3, "Relationship:", 6, "Emergency Ph.:", 9),
]
for row, l1, v1, l2, v2, l3, v3 in patient_rows:
ws.row_dimensions[row].height = 18
lv(ws, row, 2, l1, v1)
lv(ws, row, 5, l2, v2)
lv(ws, row, 8, l3, v3)
# ── Spacer ─────────────────────────────────────────────────────────────────────
ws.row_dimensions[11].height = 6
# ═══════════════════════════════════════════════════════════════════════════════
# ROW 12 : SECTION — VITAL SIGNS
# ═══════════════════════════════════════════════════════════════════════════════
ws.row_dimensions[12].height = 20
merge_range(ws, 12, 1, 12, 10, "▶ VITAL SIGNS",
bold=True, size=10, color="FFFFFF",
fill=PatternFill("solid", fgColor="2E75B6"),
align_h="center", border=cell_border(top=thick, bottom=thick,
left=thick, right=thick))
vital_rows = [
(13, "Temp (°F/°C):", 3, "Pulse (bpm):", 6, "RR (/min):", 9),
(14, "BP (mmHg):", 3, "SpO2 (%):", 6, "Weight (kg):", 9),
(15, "Height (cm):", 3, "BMI:", 6, "Pain Score (0-10):", 9),
]
for row, l1, v1, l2, v2, l3, v3 in vital_rows:
ws.row_dimensions[row].height = 18
lv(ws, row, 2, l1, v1)
lv(ws, row, 5, l2, v2)
lv(ws, row, 8, l3, v3)
ws.row_dimensions[16].height = 6
# ═══════════════════════════════════════════════════════════════════════════════
# ROW 17 : SECTION — CHIEF COMPLAINT & HISTORY
# ═══════════════════════════════════════════════════════════════════════════════
ws.row_dimensions[17].height = 20
merge_range(ws, 17, 1, 17, 10, "▶ CHIEF COMPLAINT & HISTORY",
bold=True, size=10, color="FFFFFF",
fill=PatternFill("solid", fgColor="2E75B6"),
align_h="center", border=cell_border(top=thick, bottom=thick,
left=thick, right=thick))
def text_area(ws, row, end_row, label, cols=(1, 10)):
ws.row_dimensions[row].height = 18
set_cell(ws, row, cols[0], label, bold=True, size=9, color="1F4E79",
fill=LABEL_FILL, border=inner)
for r in range(row, end_row + 1):
for c in range(cols[0] + 1, cols[1] + 1):
set_cell(ws, r, c, "", fill=WHITE_FILL, border=inner)
ws.row_dimensions[r].height = 18
# merge value area
ws.merge_cells(start_row=row, start_column=2,
end_row=end_row, end_column=10)
text_area(ws, 18, 19, "Chief Complaint:")
text_area(ws, 20, 22, "History of Present Illness:")
text_area(ws, 23, 24, "Past Medical / Surgical History:")
text_area(ws, 25, 25, "Family History:")
text_area(ws, 26, 26, "Social History (smoking / alcohol / occupation):")
text_area(ws, 27, 28, "Allergies:")
text_area(ws, 29, 29, "Current Medications:")
ws.row_dimensions[30].height = 6
# ═══════════════════════════════════════════════════════════════════════════════
# ROW 31 : SECTION — EXAMINATION
# ═══════════════════════════════════════════════════════════════════════════════
ws.row_dimensions[31].height = 20
merge_range(ws, 31, 1, 31, 10, "▶ CLINICAL EXAMINATION",
bold=True, size=10, color="FFFFFF",
fill=PatternFill("solid", fgColor="2E75B6"),
align_h="center", border=cell_border(top=thick, bottom=thick,
left=thick, right=thick))
text_area(ws, 32, 33, "General Examination:")
text_area(ws, 34, 35, "Systemic Examination:")
text_area(ws, 36, 37, "CNS / CVS / RS / GIT Findings:")
text_area(ws, 38, 39, "Local Examination:")
ws.row_dimensions[40].height = 6
# ═══════════════════════════════════════════════════════════════════════════════
# ROW 41 : SECTION — INVESTIGATIONS
# ═══════════════════════════════════════════════════════════════════════════════
ws.row_dimensions[41].height = 20
merge_range(ws, 41, 1, 41, 10, "▶ INVESTIGATIONS ADVISED",
bold=True, size=10, color="FFFFFF",
fill=PatternFill("solid", fgColor="2E75B6"),
align_h="center", border=cell_border(top=thick, bottom=thick,
left=thick, right=thick))
# Table header
inv_headers = ["#", "Investigation", "Result", "Unit", "Normal Range", "Remarks"]
inv_cols = [2, 3, 5, 7, 8, 9]
inv_widths = [1, 3, 2, 1, 2, 2]
for col, header in zip([2,3,5,7,8,9], inv_headers):
set_cell(ws, 42, col, header, bold=True, size=9, color="FFFFFF",
fill=PatternFill("solid", fgColor="2E75B6"),
align_h="center", border=inner)
ws.row_dimensions[42].height = 18
for i in range(43, 48):
ws.row_dimensions[i].height = 17
fill = ROW_FILL if i % 2 == 1 else WHITE_FILL
for col in [2,3,5,7,8,9]:
set_cell(ws, i, col, "", fill=fill, border=inner)
set_cell(ws, i, 2, str(i - 42), align_h="center", fill=fill, border=inner)
ws.row_dimensions[48].height = 6
# ═══════════════════════════════════════════════════════════════════════════════
# ROW 49 : SECTION — DIAGNOSIS
# ═══════════════════════════════════════════════════════════════════════════════
ws.row_dimensions[49].height = 20
merge_range(ws, 49, 1, 49, 10, "▶ DIAGNOSIS",
bold=True, size=10, color="FFFFFF",
fill=PatternFill("solid", fgColor="2E75B6"),
align_h="center", border=cell_border(top=thick, bottom=thick,
left=thick, right=thick))
text_area(ws, 50, 51, "Provisional Diagnosis:")
text_area(ws, 52, 53, "Differential Diagnosis:")
text_area(ws, 54, 54, "Final / Confirmed Diagnosis (ICD Code):")
ws.row_dimensions[55].height = 6
# ═══════════════════════════════════════════════════════════════════════════════
# ROW 56 : SECTION — PRESCRIPTION (Rx)
# ═══════════════════════════════════════════════════════════════════════════════
ws.row_dimensions[56].height = 20
merge_range(ws, 56, 1, 56, 10, "℞ PRESCRIPTION",
bold=True, size=11, color="FFFFFF",
fill=PatternFill("solid", fgColor="1A7A1A"),
align_h="center", border=cell_border(top=thick, bottom=thick,
left=thick, right=thick))
# Rx table headers
rx_h = ["#", "Drug Name", "Dose", "Route", "Frequency", "Duration", "Instructions"]
rx_c = [2, 3, 5, 6, 7, 8, 9]
ws.row_dimensions[57].height = 18
for col, hdr in zip(rx_c, rx_h):
set_cell(ws, 57, col, hdr, bold=True, size=9, color="FFFFFF",
fill=PatternFill("solid", fgColor="1A7A1A"),
align_h="center", border=inner)
for i in range(58, 66):
ws.row_dimensions[i].height = 17
fill = RX_FILL if i % 2 == 0 else WHITE_FILL
for col in rx_c:
set_cell(ws, i, col, "", fill=fill, border=inner)
set_cell(ws, i, 2, str(i - 57), align_h="center",
fill=fill, size=9, border=inner)
ws.row_dimensions[66].height = 6
# ═══════════════════════════════════════════════════════════════════════════════
# ROW 67 : SECTION — ADVICE / FOLLOW-UP / REFERRAL
# ═══════════════════════════════════════════════════════════════════════════════
ws.row_dimensions[67].height = 20
merge_range(ws, 67, 1, 67, 10, "▶ ADVICE, FOLLOW-UP & REFERRAL",
bold=True, size=10, color="FFFFFF",
fill=PatternFill("solid", fgColor="2E75B6"),
align_h="center", border=cell_border(top=thick, bottom=thick,
left=thick, right=thick))
text_area(ws, 68, 69, "Dietary / Lifestyle Advice:")
text_area(ws, 70, 70, "Follow-up Date:")
text_area(ws, 71, 71, "Referred To (if any):")
text_area(ws, 72, 72, "Reason for Referral:")
ws.row_dimensions[73].height = 6
# ═══════════════════════════════════════════════════════════════════════════════
# ROW 74 : SIGNATURES
# ═══════════════════════════════════════════════════════════════════════════════
ws.row_dimensions[74].height = 20
merge_range(ws, 74, 1, 74, 10, "▶ SIGNATURES",
bold=True, size=10, color="FFFFFF",
fill=PatternFill("solid", fgColor="2E75B6"),
align_h="center", border=cell_border(top=thick, bottom=thick,
left=thick, right=thick))
ws.row_dimensions[75].height = 50
# Doctor sig
merge_range(ws, 75, 2, 75, 4, "", fill=WHITE_FILL,
border=cell_border())
set_cell(ws, 75, 2, "", fill=WHITE_FILL, border=inner)
ws.row_dimensions[76].height = 16
merge_range(ws, 76, 2, 76, 4, "Doctor's Signature & Stamp",
bold=True, size=8, color="1F4E79",
fill=LABEL_FILL, align_h="center", border=inner)
merge_range(ws, 75, 6, 75, 7, "", fill=WHITE_FILL, border=cell_border())
merge_range(ws, 76, 6, 76, 7, "Doctor's Name & Reg. No.",
bold=True, size=8, color="1F4E79",
fill=LABEL_FILL, align_h="center", border=inner)
merge_range(ws, 75, 9, 75, 10, "", fill=WHITE_FILL, border=cell_border())
merge_range(ws, 76, 9, 76, 10, "Patient's Signature",
bold=True, size=8, color="1F4E79",
fill=LABEL_FILL, align_h="center", border=inner)
# ── Footer ────────────────────────────────────────────────────────────────────
ws.row_dimensions[77].height = 8
ws.row_dimensions[78].height = 16
merge_range(ws, 78, 1, 78, 10,
"CONFIDENTIAL — This document is meant for medical use only. "
"All information is protected under patient privacy laws.",
bold=False, size=8, color="FFFFFF", italic=True,
fill=PatternFill("solid", fgColor="1F4E79"),
align_h="center", border=outer)
# ── Print settings ─────────────────────────────────────────────────────────────
from openpyxl.worksheet.page import PageMargins
ws.page_setup.orientation = "portrait"
ws.page_setup.paperSize = 9 # A4
ws.page_setup.fitToPage = True
ws.page_setup.fitToWidth = 1
ws.page_setup.fitToHeight = 0
ws.page_margins = PageMargins(left=0.5, right=0.5,
top=0.75, bottom=0.75)
ws.print_area = "A1:J78"
# ── Save ──────────────────────────────────────────────────────────────────────
output_path = "/tmp/workspace/opd-sheet/OPD_Consultation_Sheet.xlsx"
wb.save(output_path)
print(f"Saved: {output_path}")
cd /tmp/workspace/opd-sheet && python create_opd_sheet.py
OPD Consultation Sheet
Spreadsheet · XLSX
| Section | Details |
|---|---|
| Patient Information | OPD No., Date, Time, Name, Age, Gender, Address, Phone, Blood Group, Aadhar/ID, Insurance, Next of Kin |
| Vital Signs | Temperature, Pulse, RR, BP, SpO2, Weight, Height, BMI, Pain Score |
| Chief Complaint & History | Presenting complaint, History of illness, Past medical/surgical, Family, Social, Allergies, Current medications |
| Clinical Examination | General, Systemic, CNS/CVS/RS/GIT findings, Local examination |
| Investigations Advised | Table with drug name, result, unit, normal range, remarks |
| Diagnosis | Provisional, Differential, Final (with ICD code field) |
| Prescription (Rx) | 8-row table - Drug, Dose, Route, Frequency, Duration, Instructions |
| Advice / Follow-up / Referral | Lifestyle advice, follow-up date, referral details |
| Signatures | Doctor stamp, Doctor name/reg. no., Patient signature |
Treatment give cold cough and fever opd style doctor sheet
~/opd-sheet/create_cold_cough_fever_opd.py
import openpyxl
from openpyxl.styles import Font, Alignment, PatternFill, Border, Side
from openpyxl.utils import get_column_letter
from openpyxl.worksheet.page import PageMargins
from datetime import date
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "OPD Sheet"
# ── Colours ───────────────────────────────────────────────────────────────────
C_DARK_BLUE = "1F4E79"
C_MID_BLUE = "2E75B6"
C_LIGHT_BLUE = "BDD7EE"
C_XLIGHT = "EBF3FB"
C_WHITE = "FFFFFF"
C_LABEL = "DEEAF1"
C_GREEN_H = "1A6B1A"
C_GREEN_L = "E2EFDA"
C_WARN = "FFF2CC"
C_FOOTER = "F2F2F2"
C_TITLE_TXT = "FFFFFF"
C_BLUE_TXT = "1F4E79"
C_BLACK = "000000"
C_RED = "C00000"
def fill(hex_color):
return PatternFill("solid", fgColor=hex_color)
thin = Side(style="thin", color=C_MID_BLUE)
thick = Side(style="medium", color=C_DARK_BLUE)
none = Side(style=None)
def bdr(t=thin, b=thin, l=thin, r=thin):
return Border(top=t, bottom=b, left=l, right=r)
outer = bdr(thick, thick, thick, thick)
# ── Column widths ─────────────────────────────────────────────────────────────
# 10 columns: A=margin, B=label1, C=val1, D=gap, E=label2, F=val2, G=gap, H=label3, I=val3, J=margin
widths = {1:1.5, 2:20, 3:22, 4:1.5, 5:18, 6:20, 7:1.5, 8:18, 9:20, 10:1.5}
for c, w in widths.items():
ws.column_dimensions[get_column_letter(c)].width = w
def rh(row, h):
ws.row_dimensions[row].height = h
def cell(r, c, val="", bold=False, sz=9, color=C_BLACK, bg=None,
ha="left", va="center", wrap=False, bd=None, italic=False, underline=False):
cl = ws.cell(row=r, column=c, value=val)
ul = "single" if underline else None
cl.font = Font(name="Arial", bold=bold, size=sz, color=color,
italic=italic, underline=ul)
cl.alignment = Alignment(horizontal=ha, vertical=va, wrap_text=wrap)
if bg: cl.fill = fill(bg)
if bd: cl.border = bd
return cl
def merge(r1, c1, r2, c2, val="", bold=False, sz=9, color=C_BLACK, bg=None,
ha="left", va="center", wrap=False, bd=None, italic=False):
ws.merge_cells(start_row=r1, start_column=c1, end_row=r2, end_column=c2)
return cell(r1, c1, val, bold, sz, color, bg, ha, va, wrap, bd, italic)
def sec(r, label, bg=C_MID_BLUE):
rh(r, 20)
merge(r,1,r,10, label, bold=True, sz=10, color=C_TITLE_TXT,
bg=bg, ha="center", bd=outer)
def lv_row(r, l1, v1, l2, v2, l3="", v3=""):
rh(r, 18)
cell(r,2, l1, bold=True, sz=9, color=C_BLUE_TXT, bg=C_LABEL, bd=bdr())
cell(r,3, v1, sz=9, bg=C_WHITE, bd=bdr())
cell(r,5, l2, bold=True, sz=9, color=C_BLUE_TXT, bg=C_LABEL, bd=bdr())
cell(r,6, v2, sz=9, bg=C_WHITE, bd=bdr())
cell(r,8, l3, bold=True, sz=9, color=C_BLUE_TXT, bg=C_LABEL, bd=bdr())
cell(r,9, v3, sz=9, bg=C_WHITE, bd=bdr())
def text_block(r_start, r_end, label, value=""):
for r in range(r_start, r_end+1):
rh(r, 17)
cell(r_start, 2, label, bold=True, sz=9, color=C_BLUE_TXT, bg=C_LABEL, bd=bdr())
ws.merge_cells(start_row=r_start, start_column=3,
end_row=r_end, end_column=9)
cell(r_start, 3, value, sz=9, bg=C_WHITE, bd=bdr(), wrap=True, va="top")
if r_end > r_start:
for r in range(r_start+1, r_end+1):
cell(r, 2, "", bg=C_LABEL, bd=bdr())
def spacer(r, h=5):
rh(r, h)
# ═══════════════════════════════════════════════════════════════════════════════
# TITLE
# ═══════════════════════════════════════════════════════════════════════════════
rh(1,6); rh(2,34); rh(3,18); rh(4,6)
merge(2,1,2,10,
"🏥 DOCTOR'S OPD CONSULTATION SHEET",
bold=True, sz=16, color=C_TITLE_TXT, bg=C_DARK_BLUE,
ha="center", bd=outer)
merge(3,1,3,10,
"General / Family Medicine | Outpatient Department | Date: " + str(date.today().strftime("%d-%b-%Y")),
sz=9, color=C_BLUE_TXT, bg=C_LABEL, ha="center", bd=bdr())
# ═══════════════════════════════════════════════════════════════════════════════
# PATIENT INFORMATION
# ═══════════════════════════════════════════════════════════════════════════════
sec(5, "▶ PATIENT INFORMATION")
lv_row(6, "OPD No.:", "OPD-001", "Date:", str(date.today().strftime("%d-%b-%Y")), "Time:", "09:30 AM")
lv_row(7, "Patient Name:", "_________________","Age:", "___ yrs", "Gender:", "M / F")
lv_row(8, "Address:", "_________________","Phone:", "_________________","Blood Grp:", "__")
lv_row(9, "Referred By:", "Self", "Known Case of:","Nil", "Allergies:","NKDA")
spacer(10)
# ═══════════════════════════════════════════════════════════════════════════════
# VITAL SIGNS
# ═══════════════════════════════════════════════════════════════════════════════
sec(11, "▶ VITAL SIGNS (recorded by nurse)")
lv_row(12, "Temp (°F):", "99 – 101 °F", "Pulse (bpm):", "80 – 100 bpm", "RR (/min):", "16 – 22 /min")
lv_row(13, "BP (mmHg):", "Within normal limits","SpO2 (%):", "≥ 96%", "Weight:", "___ kg")
spacer(14)
# ═══════════════════════════════════════════════════════════════════════════════
# CHIEF COMPLAINT
# ═══════════════════════════════════════════════════════════════════════════════
sec(15, "▶ CHIEF COMPLAINT & HISTORY OF PRESENT ILLNESS")
text_block(16, 17, "Chief Complaint:",
"1. Cold (nasal congestion, runny nose) 2. Cough (dry / productive) 3. Fever (low-grade to moderate, onset ___ days ago)")
text_block(18, 19, "History:",
"Symptoms started ___ days ago. Gradual/sudden onset. Associated: sore throat, mild headache, body ache, malaise. "
"No breathlessness, no chest pain, no hemoptysis. No significant travel history.")
text_block(20, 20, "Past History:", "No significant past illness. No prior hospitalisations.")
text_block(21, 21, "Drug History:", "No current medications. NKDA (No Known Drug Allergies).")
text_block(22, 22, "Family History:", "Non-contributory.")
text_block(23, 23, "Social History:", "Non-smoker. No alcohol. Regular diet. Adequate hydration.")
spacer(24)
# ═══════════════════════════════════════════════════════════════════════════════
# EXAMINATION
# ═══════════════════════════════════════════════════════════════════════════════
sec(25, "▶ CLINICAL EXAMINATION")
text_block(26, 27, "General Examination:",
"Conscious, oriented, cooperative. Febrile. Mild pallor – absent. Icterus – absent. "
"Cyanosis – absent. Clubbing – absent. Lymphadenopathy – nil. Pedal edema – nil.")
text_block(28, 29, "Systemic Examination:",
"RS: Air entry bilaterally equal. No added sounds (wheeze/crepitations). "
"CVS: S1 S2 heard, no murmur. P/A: Soft, non-tender. CNS: No focal deficits.")
text_block(30, 30, "ENT / Local:",
"Throat – hyperaemic, mild congestion. Tonsils – not enlarged. Nasal mucosa – congested, clear discharge. Ear – NAD.")
spacer(31)
# ═══════════════════════════════════════════════════════════════════════════════
# INVESTIGATIONS
# ═══════════════════════════════════════════════════════════════════════════════
sec(32, "▶ INVESTIGATIONS (if required)")
# Header
rh(33, 17)
for col, hdr, bg in [
(2,"#",C_MID_BLUE),(3,"Investigation",C_MID_BLUE),(5,"Result",C_MID_BLUE),
(7,"Unit",C_MID_BLUE),(8,"Normal Range",C_MID_BLUE),(9,"Remarks",C_MID_BLUE)
]:
cell(33, col, hdr, bold=True, sz=9, color=C_TITLE_TXT, bg=bg, ha="center", bd=bdr())
inv_data = [
("1","CBC (Complete Blood Count)", "WNL / as reported", "", "As per lab", "Rule out bacterial infection"),
("2","CRP / ESR", "Mildly elevated", "", "CRP <5 mg/L", "Indicates viral aetiology"),
("3","Throat swab culture", "If indicated", "", "No growth", "Only if strep suspected"),
("4","Chest X-ray (PA view)", "If indicated", "", "Normal", "If LRT involvement suspected"),
("5","COVID-19 RAT / PCR", "If indicated", "", "Negative", "Rule out COVID-19"),
]
for i, (no, inv, res, unit, nrm, rem) in enumerate(inv_data):
r = 34 + i
rh(r, 17)
bg = C_XLIGHT if i%2==0 else C_WHITE
cell(r,2, no, sz=9, bg=bg, ha="center", bd=bdr())
cell(r,3, inv, sz=9, bg=bg, bd=bdr())
cell(r,5, res, sz=9, bg=bg, bd=bdr())
cell(r,7, unit,sz=9, bg=bg, bd=bdr())
cell(r,8, nrm, sz=9, bg=bg, bd=bdr())
cell(r,9, rem, sz=9, bg=bg, bd=bdr())
spacer(39)
# ═══════════════════════════════════════════════════════════════════════════════
# DIAGNOSIS
# ═══════════════════════════════════════════════════════════════════════════════
sec(40, "▶ DIAGNOSIS")
text_block(41, 41, "Provisional Dx:",
"Acute Viral Upper Respiratory Tract Infection (URI) — Common Cold with Fever | ICD-10: J00")
text_block(42, 42, "Differential Dx:",
"1. Influenza (Flu) | 2. COVID-19 (mild) | 3. Bacterial Pharyngitis / Tonsillitis | 4. Allergic Rhinitis")
spacer(43)
# ═══════════════════════════════════════════════════════════════════════════════
# PRESCRIPTION
# ═══════════════════════════════════════════════════════════════════════════════
sec(44, "℞ PRESCRIPTION", bg=C_GREEN_H)
# Note
rh(45, 16)
merge(45,1,45,10,
"⚠ Antibiotics are NOT indicated for viral URI. Treatment is symptomatic. "
"Reassess if symptoms worsen or persist beyond 7–10 days.",
sz=9, color="7B3F00", bg=C_WARN, ha="center", bd=bdr(), italic=True)
# Rx table header
rh(46, 18)
rx_hdr = ["#","Drug Name (Generic)","Dose","Route","Frequency","Duration","Instructions"]
rx_cols = [2, 3, 5, 6, 7, 8, 9]
for col, hdr in zip(rx_cols, rx_hdr):
cell(46, col, hdr, bold=True, sz=9, color=C_TITLE_TXT,
bg=C_GREEN_H, ha="center", bd=bdr())
rx_data = [
("1","Paracetamol (Acetaminophen)", "500 mg", "Oral","TDS (3x/day)","5 days", "Take after food. For fever & pain."),
("2","Cetirizine (Antihistamine)", "10 mg", "Oral","OD at night", "5 days", "For runny nose & sneezing. May cause drowsiness."),
("3","Pseudoephedrine + Triprolidine\n(Actifed / Decongestant)",
"1 tab", "Oral","BD", "3–5 days","For nasal congestion. Avoid in hypertension."),
("4","Dextromethorphan 10 mg +\nGuaifenesin 100 mg (Cough Syrup)",
"2 tsp (10 ml)","Oral","TDS", "5 days", "For dry/productive cough. Shake well before use."),
("5","Zinc Gluconate / Lozenges", "10–15 mg", "Oral","BD", "5–7 days","Start within 24 hrs of onset. Reduces duration."),
("6","Vitamin C (Ascorbic Acid)", "500 mg", "Oral","OD", "7 days", "Immune support. Take after meals."),
("7","ORS (Oral Rehydration Solution)", "As needed", "Oral","Frequent sips","5 days", "Maintain hydration. Warm fluids preferred."),
("8","Intranasal Saline Spray\n(0.9% NaCl)", "2 puffs/nostril","Nasal","TDS", "7 days", "Loosens secretions. Safe for all ages."),
]
for i, (no, drug, dose, route, freq, dur, instr) in enumerate(rx_data):
r = 47 + i
rh(r, 28)
bg = C_GREEN_L if i%2==0 else C_WHITE
cell(r,2, no, sz=9, bg=bg, ha="center", bd=bdr(), va="center")
cell(r,3, drug, sz=9, bg=bg, bd=bdr(), wrap=True, va="top")
cell(r,5, dose, sz=9, bg=bg, ha="center", bd=bdr(), va="center")
cell(r,6, route, sz=9, bg=bg, ha="center", bd=bdr(), va="center")
cell(r,7, freq, sz=9, bg=bg, ha="center", bd=bdr(), va="center")
cell(r,8, dur, sz=9, bg=bg, ha="center", bd=bdr(), va="center")
cell(r,9, instr, sz=9, bg=bg, bd=bdr(), wrap=True, va="top")
spacer(55)
# ═══════════════════════════════════════════════════════════════════════════════
# ADVICE & FOLLOW-UP
# ═══════════════════════════════════════════════════════════════════════════════
sec(56, "▶ ADVICE, FOLLOW-UP & RED FLAGS")
# Advice block
rh(57, 17)
merge(57,2,57,9, "GENERAL ADVICE FOR PATIENT:",
bold=True, sz=9, color=C_BLUE_TXT, bg=C_LABEL, bd=bdr())
advice = [
"✔ Complete rest. Stay home and avoid close contact with others.",
"✔ Drink plenty of warm fluids (water, soups, herbal teas, warm lemon water).",
"✔ Steam inhalation 2–3 times/day for nasal congestion.",
"✔ Warm saltwater gargling (1/4 tsp salt in warm water) 2–3 times/day for sore throat.",
"✔ Honey (1 tsp) + warm water / ginger tea for cough relief. (NOT for children < 1 year).",
"✔ Wash hands frequently. Cover mouth/nose when coughing or sneezing.",
"✔ Light, easily digestible diet. Avoid cold beverages, ice cream.",
"✔ Use a humidifier or maintain warm room temperature.",
]
for i, adv in enumerate(advice):
r = 58 + i
rh(r, 16)
cell(r, 2, " ", bg=C_XLIGHT, bd=bdr())
merge(r, 3, r, 9, adv, sz=9, bg=C_XLIGHT, bd=bdr())
# Red flags
rh(66, 17)
merge(66,2,66,9, "🔴 RED FLAGS — RETURN TO DOCTOR IMMEDIATELY IF:",
bold=True, sz=9, color=C_RED, bg="FFE6E6", bd=bdr())
red_flags = [
"⚠ Fever > 39°C (102.2°F) or fever lasting more than 3 days",
"⚠ Difficulty breathing, chest pain, or shortness of breath",
"⚠ Severe headache, stiff neck, or skin rash",
"⚠ Symptoms worsen after initial improvement ('double sickening')",
"⚠ Symptoms persist beyond 10–14 days (suspect bacterial sinusitis)",
"⚠ Ear pain or discharge (possible Otitis Media)",
"⚠ Children: fast breathing, inability to feed, high-pitched cry",
]
for i, flag in enumerate(red_flags):
r = 67 + i
rh(r, 16)
cell(r, 2, " ", bg="FFE6E6", bd=bdr())
merge(r, 3, r, 9, flag, sz=9, color=C_RED, bg="FFE6E6", bd=bdr())
spacer(74)
# Follow-up row
rh(75, 18)
cell(75,2, "Follow-up Date:", bold=True, sz=9, color=C_BLUE_TXT, bg=C_LABEL, bd=bdr())
cell(75,3, "After 5–7 days (or earlier if red flags appear)", sz=9, bg=C_WHITE, bd=bdr())
cell(75,5, "Referred To:", bold=True, sz=9, color=C_BLUE_TXT, bg=C_LABEL, bd=bdr())
cell(75,6, "Nil at present", sz=9, bg=C_WHITE, bd=bdr())
cell(75,8, "Sick Leave:", bold=True, sz=9, color=C_BLUE_TXT, bg=C_LABEL, bd=bdr())
cell(75,9, "2–3 days advised", sz=9, bg=C_WHITE, bd=bdr())
spacer(76)
# ═══════════════════════════════════════════════════════════════════════════════
# SIGNATURES
# ═══════════════════════════════════════════════════════════════════════════════
sec(77, "▶ DOCTOR'S SIGNATURE")
rh(78, 50)
rh(79, 16)
merge(78,2,78,4, "", bg=C_WHITE, bd=bdr())
merge(79,2,79,4, "Doctor's Signature & Stamp",
bold=True, sz=8, color=C_BLUE_TXT, bg=C_LABEL, ha="center", bd=bdr())
merge(78,5,78,7, "", bg=C_WHITE, bd=bdr())
merge(79,5,79,7, "Doctor Name & Registration No.",
bold=True, sz=8, color=C_BLUE_TXT, bg=C_LABEL, ha="center", bd=bdr())
merge(78,8,78,10, "", bg=C_WHITE, bd=bdr())
merge(79,8,79,10, "Patient / Guardian Signature",
bold=True, sz=8, color=C_BLUE_TXT, bg=C_LABEL, ha="center", bd=bdr())
spacer(80)
rh(81, 15)
merge(81,1,81,10,
"CONFIDENTIAL — For medical use only. Information protected under patient privacy laws. "
"© OPD Consultation Sheet — General Medicine",
sz=8, color=C_TITLE_TXT, bg=C_DARK_BLUE, ha="center", italic=True, bd=outer)
# ── Print Setup ───────────────────────────────────────────────────────────────
ws.page_setup.orientation = "portrait"
ws.page_setup.paperSize = 9 # A4
ws.page_setup.fitToPage = True
ws.page_setup.fitToWidth = 1
ws.page_setup.fitToHeight = 0
ws.page_margins = PageMargins(left=0.4, right=0.4, top=0.6, bottom=0.6)
ws.print_area = "A1:J81"
# ── Save ──────────────────────────────────────────────────────────────────────
path = "/tmp/workspace/opd-sheet/Cold_Cough_Fever_OPD_Sheet.xlsx"
wb.save(path)
print("Saved:", path)
cd /tmp/workspace/opd-sheet && python create_cold_cough_fever_opd.py
Cold Cough Fever OPD Sheet
Spreadsheet · XLSX
| # | Drug | Dose | Freq | Duration |
|---|---|---|---|---|
| 1 | Paracetamol | 500 mg | TDS | 5 days |
| 2 | Cetirizine | 10 mg | OD night | 5 days |
| 3 | Pseudoephedrine + Triprolidine | 1 tab | BD | 3-5 days |
| 4 | Dextromethorphan + Guaifenesin syrup | 2 tsp | TDS | 5 days |
| 5 | Zinc Gluconate | 10-15 mg | BD | 5-7 days |
| 6 | Vitamin C | 500 mg | OD | 7 days |
| 7 | ORS | As needed | Frequent | 5 days |
| 8 | Nasal Saline Spray | 2 puffs | TDS | 7 days |