A Gantt chart is just horizontal bars on a date axis: each bar starts at a task's start date and
runs for its duration. Spreadsheets can't draw a "Gantt" natively — but there are two reliable
ways to fake one perfectly, and this guide walks through both using the Gantt Chart tab
(sheets/02-gantt-chart.csv). The worked numbers match the sample data.
The Gantt tab gives every task four numbers the chart needs:
| Col | Header | Meaning | T11 (Page implementation) |
|---|---|---|---|
| C | Start_Date | bar's left edge | 2025-03-13 |
| D | End_Date | bar's right edge | 2025-03-28 |
| E | Offset_Days | calendar days from project start | 66 |
| F | Span_Days | calendar length of the bar | 16 |
Offset_Days = Start_Date − ProjStart and Span_Days = End_Date − Start_Date + 1. For the
sample, ProjStart is 2025-01-06, so T11 starts 66 days in and runs 16 calendar days. Those
two numbers — offset and span — are all a bar chart needs to float each bar in the right
place.
This is the professional approach: a stacked horizontal bar chart where the first series is made
invisible so the second series appears to float.
You need three columns next to each other: the task name, the offset, and the span.
Task_Name Offset_Days Span_Days
Stakeholder interviews 0 5
Requirements gathering 7 5
...
Page implementation 66 16
(The Gantt tab already has these — columns B, E, F.)
chart**.
You'll see two colored segments per row: the offset, then the span.
Click the Offset_Days series (the first segment of every bar) and set its fill to **None /
No fill**. The offset becomes transparent, and each remaining Span bar now floats at its start
date. That's your Gantt.
Charts plot the first row at the *bottom* by default, which puts your project upside-down. Turn
on "Reverse order" (Excel: Format Axis → Categories in reverse order; Sheets: chart editor →
Vertical axis → check the reverse option) so T01 sits at the top and time reads top-to-bottom.
The horizontal axis is currently "days since start" (0, 7, 14…). To show real dates, set the
axis minimum to your project start's serial number and format the axis as a date. Now the
bars line up under real calendar dates.
Split each bar's span into "done" and "remaining" so the chart shows completion, not just
schedule. Add two helper columns:
Done_Span = Span_Days * Pct_Complete/100
Remain_Span = Span_Days - Done_Span
Now the chart has three series: invisible Offset, solid Done_Span (dark), and lighter
Remain_Span. For T11 (16-day span, 20% done): Done = 3.2, Remain = 12.8 — a bar that's
one-fifth filled. Do this and a glance at the chart tells you both *when* and *how far along*.
If you'd rather keep everything in cells, paint the bars onto a calendar grid with conditional
formatting. This is lighter, prints cleanly, and never detaches from the data.
In a block to the right of your task rows, put a row of dates — one per column. Weekly columns
keep it compact: 2025-01-06, 2025-01-13, 2025-01-20, … Put the first date in, say, K1 and
fill across.
Select the whole grid (e.g. K2:AZ19) and add a custom-formula conditional-format rule:
=AND(K$1>=$C2, K$1<=$D2)
It fills a cell when that column's date (K$1, row locked) falls between the task's start
($C2, column locked) and end ($D2). The mixed $ anchors are the whole trick — they let one
rule cover the entire grid. Choose a blue fill.
Add a higher-priority rule that paints the completed portion a darker shade. The done-bar
ends this many days into the span:
=AND(K$1>=$C2, K$1 <= WORKDAY($C2, ROUND($F2*0 + (G_pct)/100*Duration,0)))
Simpler in practice: add a Done_Until helper column = WORKDAY(Start, Duration*Pct/100 - 1)
and make the dark rule =AND(K$1>=$C2, K$1<=$Done_Until). The dark band shows how much of each
bar is finished; the light band shows what's left.
Add one more rule to draw a vertical "today" line — highlight the column whose date matches your
status date:
=K$1=$AsOf
→ a red left border or a yellow fill on that column. Now you can see, at a glance, which bars the
status line has already passed (those should be complete) and which it cuts through mid-bar.
| Stacked-bar chart | Conditional-format grid | |
|---|---|---|
| Looks like | a polished chart object | a painted calendar |
| Best for | presentations, stakeholder decks | living trackers, printing |
| Progress shading | yes (Method 1, step 6) | yes (Step 3) |
| "Today" line | fiddly | one easy rule |
| Detaches from data? | it's a separate object | never — it *is* the data |
| Effort | ~10 minutes | ~5 minutes |
Most teams keep the grid for day-to-day work (it updates the instant a date changes) and
generate the chart when they need something to paste into a slide.
With the bars drawn and the AsOf line at 2025-03-17, the sample tells its story visually:
A good Gantt makes "are we on track?" answerable in one glance — which is exactly what you want
on the wall during a status meeting.
For a quick text Gantt with zero setup, the Progress_Bar column (##########) already
ships on the Gantt tab via =REPT("#",done)&REPT("-",remain). Pair it with the Status column
and you have a readable mini-dashboard in two columns — no chart, no grid, works everywhere
including plain-text exports.
Questions about charting your own data? Email [email protected].
Get the full Project Management Spreadsheet and unlock everything.
Get the complete guide with every chapter unlocked, including code samples, diagrams, and best practices.
Access all interactive tools with complete data, all workload profiles, and the full scenario library.
Downloadable source code, configuration files, and working examples from every chapter.
Free updates for life. Every new chapter, tool, and improvement included.