Find structural clues behind unexpected blank Excel print pages, without changing the workbook.
Open Printscope · 中文说明 · Testing notes · Releases
Choose a workbook, select a worksheet, and review the evidence next to the cell-coordinate map. Export a JSON report to keep the findings. Files are processed in a cancellable browser worker; nothing in the workbook is uploaded or changed.
Printscope inspecting a real sample workbook
The included sample has report values in A1:F24 and a value in M85 hidden by ;;;. Its print area includes both. Download the sample from the app and inspect M85 in Excel to check the diagnosis yourself.
- Declared, stored, populated and candidate-visible cell bounds, kept separate.
- Values hidden by the exact custom number format
;;;. - Explicit white fonts, hidden rows/columns and errors configured to print blank.
- Fixed print areas, multiple print areas and manual page breaks.
- Cell-anchored drawings extending beyond the data.
- Unsupported expressions and display features, reported as limitations instead of guessed results.
This is not a pagination engine. It cannot predict an exact page count, calculate formulas or establish that a workbook is safe to print. Always confirm changes in Excel's Page Break Preview. No cells are deleted and no workbook is rewritten.
Node.js 22.13 or newer:
npm ci
npm test
npm run devimport { readFile } from 'node:fs/promises'; import { inspectWorkbook } from './core/workbook.mjs'; const report = inspectWorkbook(new Uint8Array(await readFile('report.xlsx'))); console.log(JSON.stringify(report, null, 2));
Reports contain sheet names, cell addresses, print settings and findings, but not cell values or formula text. Treat reports as potentially sensitive metadata.
Ordinary unencrypted .xlsx only; no .xls, .xlsb or macro-enabled workbooks. Up to 20 MiB per file, 50 sheets, 100,000 stored cells, 100,000 shared strings and 20,000 styles. Each inspected XML part is bounded to 12 MiB, with 64 MiB of cumulative XML reads. ZIP directory, expanded size, checksum, XML nesting and node limits are checked. Nothing is extracted to the filesystem or fetched from workbook relationships.
Conditional formatting, theme colors, merged visual extents, legacy drawings, printer metrics and some inherited display settings are not evaluated. Candidate-visible bounds are a diagnostic reference, not a suggested replacement print area. Files hitting a limit fail with an explanation rather than returning a partial clean bill of health.
Microsoft documents several causes of blank printed pages, including hidden-looking values, blank error printing and distant objects: Blank pages unexpectedly printed in Excel. The workbook reader follows the SpreadsheetML worksheet structure and PageSetup attributes.
React, TypeScript, Vinext and Vite, with a framework-independent inspection core. fflate handles decompression and fast-xml-parser validates/parses XML. GitHub Actions tests, checks types and builds the static app before publishing to Pages. No application server or API key is needed.
npm run lint npm run typecheck npm run build
Reproducible edge cases are welcome. Do not attach a private workbook to a public issue: create a fresh, minimal workbook with invented values, or describe the relevant XML settings and your Excel version. Useful issues include the expected result, actual finding and a tiny sample that preserves the problem.
Use the workbook issue form and read the contribution guide for safe samples and regression checks.
MIT licensed. See third-party notices for reused components and icons.