How to create pivot tables from excel data entirely in your browser
- Step 1Confirm you are on the Developer tier — The Pivot Table Generator is gated to Developer. Free, Pro, and Pro-media can load the page and pick options, but pressing run throws
Pivot Table Generator requires Developer tier.Upgrade before processing, or use a sibling that fits your tier for the prep step. - Step 2Flatten your data to one row per observation — The input must be a flat table: a single header row, then one row per record (one transaction, one event, one ticket). Pivots, merged cells, and multi-row headers are not understood — only the cells under the literal column headers are read.
- Step 3Drop the .xlsx or .csv onto the tool — SheetJS parses the file in-browser. Note that only the first sheet is read — if your data is on
Sheet2or a tab namedData, move it to the first position before uploading, or the tool will pivot whatever is on sheet one. - Step 4Type the three field names exactly — Enter the row dimension into
rowField, the column dimension intocolField, and the column to aggregate intovalueField. These are matched against header text case-sensitively —Regionandregionare different. All three are required; leaving any blank throwsRow field, column field, and value field are all required. - Step 5Choose the aggregation —
aggFndefaults tosum. Pickcountto tally rows per cell,average/min/maxfor numeric stats, orcountdistinctto count unique values (e.g. unique customer IDs).sum,average,min, andmaxonly consider cells that parse as numbers; non-numeric values are ignored by those four. - Step 6Run and download pivot-table.xlsx — The result is a binary workbook with one sheet (
Pivot): therowFieldcolumn on the left, each distinctcolFieldvalue as a column (alphabetically sorted), aggregated values in the body, and aGrand Totalrow at the bottom. Open it in any spreadsheet app, or feed it to a chart or report.
The four pivot options (real schema)
Every control the tool exposes, taken from the option schema. There are no presets, no drag-and-drop, no multi-field areas, and no filter pane — just these four inputs.
| Option | Control | Required / default | What it does |
|---|---|---|---|
rowField | Text input | Required | Header name of the column used as the pivot's row dimension. Matched case-sensitively against the header row of sheet one. |
colField | Text input | Required | Header name of the column spread across the top as pivot columns. Distinct values become columns, sorted alphabetically. |
valueField | Text input | Required | Header name of the column whose values are aggregated into each cell. |
aggFn | Dropdown | Default sum | One of sum, count, average, min, max, countdistinct. Determines how the values in each (row, column) bucket are reduced to one number. |
How each aggregation reduces a cell
What the six aggregations actually compute, and how they treat non-numeric or empty value cells. count is a row tally, not a distinct count.
| aggFn | Per-cell result | Empty value cell | Non-numeric value cell | Grand Total column? |
|---|---|---|---|---|
sum | Sum of numeric values in the bucket; 0 if none | Skipped | Skipped (only numbers added) | Yes |
count | Number of source rows that fell into the cell | Still counts the row | Still counts the row | No |
average | Mean of numeric values; 0 if none | Skipped | Skipped | No |
min | Smallest numeric value; 0 if none | Skipped | Skipped | No |
max | Largest numeric value; 0 if none | Skipped | Skipped | No |
countdistinct | Count of unique stringified values in the bucket | Skipped (blank never enters the set) | Counted as a distinct string | No |
Tier gate and limits (excel family)
This tool runs only on Developer. The size/row limits below are the excel-family limits; the run itself is rejected on anything below Developer regardless of file size.
| Tier | Can run pivot? | Max file size | Max rows | Files per run |
|---|---|---|---|---|
| Free | No (rejected) | 5 MB | 10,000 | 1 |
| Pro | No (rejected) | 50 MB | 100,000 | 5 |
| Pro-media | No (rejected) | 200 MB | 500,000 | 20 |
| Developer | Yes | 500 MB | Unlimited | Unlimited |
Cookbook
Worked examples on real-shaped flat data. The code blocks show the exact input header/value layout, the option values you type, and the resulting pivot grid.
Region x Quarter revenue with SUM
The canonical first pivot: total revenue by region across quarters. Note the Grand Total column appears because the aggregation is sum, and columns are sorted alphabetically (Q1..Q4 here, which happens to be chronological).
Input (sheet 1): Region,Quarter,Revenue EMEA,Q1,1200 EMEA,Q2,1500 APAC,Q1,800 APAC,Q2,900 EMEA,Q1,300 Options: rowField=Region colField=Quarter valueField=Revenue aggFn=sum Output (pivot-table.xlsx, sheet Pivot): Region,Q1,Q2,__Grand Total APAC,800,900,1700 EMEA,1500,1500,3000 Grand Total,2300,2400,4700
COUNT rows per status, not values
count tallies how many source rows land in each cell — it does not look at the value column's contents at all. Here we count tickets per (priority, status). There is no Grand Total column because count omits it.
Input: Priority,Status,TicketId High,Open,T-1 High,Open,T-2 High,Closed,T-3 Low,Open,T-4 Options: rowField=Priority colField=Status valueField=TicketId aggFn=count Output: Priority,Closed,Open High,1,2 Low,0,1 Grand Total,1,3
COUNT DISTINCT unique buyers
countdistinct stringifies every value in a bucket and counts unique entries. Blank value cells never enter the set, so missing IDs don't inflate the count. Excel's classic pivot can't do this without Power Pivot.
Input: Segment,Month,CustomerId Pro,Jan,C1 Pro,Jan,C1 Pro,Jan,C2 Free,Jan,C3 Free,Jan, Options: rowField=Segment colField=Month valueField=CustomerId aggFn=countdistinct Output: Segment,Jan Free,1 Pro,2 Grand Total,3
Blank field values fall into a (blank) bucket
If a row or column field cell is empty, it is not dropped — it joins a bucket literally labelled (blank), which sorts near the top. This makes data-quality gaps visible instead of silently merging them.
Input: Rep,Region,Deals Ana,West,5 Ben,,3 Ana,West,2 Options: rowField=Rep colField=Region valueField=Deals aggFn=sum Output: Rep,(blank),West,__Grand Total Ana,0,7,7 Ben,3,0,3 Grand Total,3,7,10
AVERAGE order value, with text values ignored
average only considers cells that parse as numbers via parseFloat. A stray text entry like 'N/A' in the value column is skipped, so it neither lowers nor raises the mean. A bucket with no numeric values resolves to 0.
Input: Channel,Tier,OrderValue Web,Gold,120 Web,Gold,80 Web,Gold,N/A Web,Silver,40 Options: rowField=Channel colField=Tier valueField=OrderValue aggFn=average Output (Gold = mean of 120,80 = 100; 'N/A' ignored): Channel,Gold,Silver Web,100,40 Grand Total,100,40
Edge cases and what actually happens
Account is below Developer tier
RejectedThe processor checks the tier first and throws Pivot Table Generator requires Developer tier. on Free, Pro, or Pro-media — no output is produced. This is the most common surprise: the page loads and the options look usable on any plan, but the run only completes on Developer.
A required field name is left blank
ErrorAll three of rowField, colField, and valueField are mandatory. If any is empty the tool throws Row field, column field, and value field are all required. before reading the data. Type each header name exactly.
Field name does not match a header (or wrong case)
Invalid fieldMatching is case-sensitive and exact. If you type revenue but the header is Revenue, every lookup returns blank: the row/column dimension collapses to a single (blank) bucket and a sum/average value field yields all zeros. Check the header spelling and case in the first row before running.
Data is not on the first sheet
Wrong sheetOnly sheet index 0 is read. A workbook whose data sits on Sheet2, Data, or a later tab will be pivoted using the first sheet's contents — often an empty or summary tab — giving an empty or nonsensical pivot. Move the data tab to the first position first.
Value column holds non-numeric text under SUM/AVG/MIN/MAX
By designsum, average, min, and max consider only cells that parse as numbers via parseFloat. Text like N/A, pending, or $1,200 (the comma/symbol break parseFloat after $) is skipped. A cell whose bucket has zero numeric values resolves to 0, not an error — verify your value column is clean numbers if a cell unexpectedly reads 0.
Empty (row, column) combination
ExpectedCombinations that never occur in the data are filled with 0 rather than left blank, producing a dense rectangular grid. This is intentional so charts and downstream formulas see numbers everywhere; it does not mean a real zero was recorded.
Blank cells in the row or column field
PreservedEmpty rowField or colField cells are bucketed under the literal label (blank) instead of being dropped. The (blank) label sorts near the top of the axis, surfacing data-quality gaps rather than hiding them.
High-cardinality column field
Wide outputEvery distinct colField value becomes its own column. Putting a near-unique field (order ID, email, timestamp) into colField produces thousands of one-cell-wide columns and a huge, unreadable workbook. Use a low-cardinality dimension (region, status, month) as the column field; pre-bucket continuous values first.
Columns sort alphabetically, not chronologically
By designBoth axes are sorted with a plain string sort. Jan, Feb, Mar sorts to Feb, Jan, Mar, and 10 sorts before 2. For chronological order, format periods as ISO strings (2026-01, 2026-Q1) so alphabetical order matches time order. See the monthly/quarterly recipe.
Calling the tool via the public HTTP API
Browser onlyBecause the output is a binary XLSX workbook, the public API redirects this slug to the browser tool — there is no JSON HTTP response. Run it interactively in the browser (Developer tier) rather than scripting it through the API endpoint.
Frequently asked questions
Do I need Excel installed to use this?
No. The pivot is computed in your browser with SheetJS and the result is written as a downloadable pivot-table.xlsx. You can open that file in Excel, LibreOffice Calc, Google Sheets, or Numbers — but you don't need any of them to generate it. This is the point of the tool: it works on Chromebooks, Linux, and Office-less Macs.
Why does it say the tool requires Developer tier?
The Pivot Table Generator is gated to the Developer tier in the processor. Free, Pro, and Pro-media accounts can load the page and fill in options, but the run is rejected with Pivot Table Generator requires Developer tier. Upgrade to Developer to produce output. Other excel tools have lower gates if you only need cleaning or reshaping.
Is this drag-and-drop like Excel's pivot fields pane?
No. Despite the name, you don't drag fields. You type three column-header names into text boxes (rowField, colField, valueField) and choose one aggregation from a dropdown. There is one row dimension, one column dimension, and one value — there are no nested fields, no value-area stacking, and no filter pane.
What aggregations are supported?
Six: sum (default), count, average, min, max, and countdistinct. sum, average, min, and max operate only on cells that parse as numbers. count tallies the number of source rows in each cell. countdistinct counts unique stringified values, which is the unique-count Excel's classic pivot needs Power Pivot for.
Does the output include grand totals?
A Grand Total row is always appended at the bottom, recomputed across all rows for each column. A Grand Total column is added only when the aggregation is sum — it sums each row across its columns. For count, average, min, max, and countdistinct the column is deliberately omitted, because a row-wise total of averages or minimums is not meaningful.
Can I have multiple value fields or multiple row/column fields?
No. One rowField, one colField, one valueField per run. To compare two measures (e.g. revenue and units), run the tool twice and place the two outputs side by side, or join them afterwards. The tool does not support stacked or nested dimensions.
Why is a cell showing 0 when I expected a number?
Two common causes. First, that (row, column) combination may genuinely not exist in the data — empty combinations are filled with 0. Second, for sum/average/min/max, the value cells in that bucket may not parse as numbers (text like N/A, or values with currency symbols/commas), so nothing was aggregated and the cell defaults to 0. Clean the value column to plain numbers if needed.
Why are my month columns in the wrong order?
Both axes are sorted as plain strings, so Jan, Feb, Mar becomes Feb, Jan, Mar. Format period labels as ISO strings — 2026-01, 2026-02 for months or 2026-Q1 for quarters — so alphabetical order equals chronological order. Standardise inconsistent source dates first with the Date Standardizer.
What does (blank) mean in my pivot?
It's the bucket for rows whose rowField or colField cell was empty. Rather than discard those rows, the tool labels them (blank) so missing categorical data stays visible. If you'd rather exclude them, filter empty-field rows out of the source before uploading, or fix them with a sibling tool first.
Does it read all the sheets in my workbook?
No — only the first sheet (index 0). If your data is on a later tab, move it to the first position before uploading, otherwise the pivot is built from whatever happens to be on sheet one. The output workbook itself contains a single sheet named Pivot.
Is my data uploaded to a server?
No. Parsing and aggregation run entirely in your browser via SheetJS; the file bytes never leave your device. Only an anonymous usage counter (no content) is recorded for signed-in dashboard stats. This keeps financial, HR, and customer data local.
How large a file can I pivot?
On Developer tier the excel-family limit is 500 MB and unlimited rows. The lower tiers' limits (Free 5 MB / 10,000 rows; Pro 50 MB / 100,000 rows; Pro-media 200 MB / 500,000 rows) are moot for this tool, since the run is rejected below Developer anyway. Very wide pivots are constrained more by colField cardinality than by file size — keep the column dimension low-cardinality.
Privacy first
Every JAD Excel tool runs entirely in your browser using SheetJS and ExcelJS. Your spreadsheets, formulas, and data never leave your device — verified by zero outbound network requests during processing.