Excel to PDF

Your spreadsheet is converted in this tab, and no number is invented.

Runs locally

Drop files here, or click to choose

Accepts XLSX, XLSM. No size limit, no sign-up.

Pick a file and this page reads its structure first — columns, text boxes, charts, formulas, and every character it will have to draw — and tells you what will and will not survive. That check runs before anything is converted, and nothing is uploaded at any point.

    What this tool does not do

    • Formulas are never recalculated. We print the result your spreadsheet saved; where a file has a formula with no saved result, that cell is left blank rather than filled with a plausible-looking zero.
    • Images in the sheet are not drawn in this first version. Cell text and numbers are all kept.
    • A sheet wider than the page is split into horizontal chunks, which is what Excel itself does when printing.
    • Text wider than its column is truncated with an ellipsis instead of spilling over its neighbour.
    • Cell styling is limited to fill colour, bold headers and number formats already stored in the file.

    The bundled Chinese font is Noto Sans TC under the SIL Open Font License 1.1. The licence text ships with it. Section 5 of the OFL says in as many words that the requirement to stay under that licence does not apply to documents created with the font — so the PDF you download here carries no licence obligation of its own.Read the font licence

    This page reads your .xlsx file, lays out each worksheet as a table, and writes a PDF — all inside your browser. Cell text and numbers come out as selectable vector text. Two things it deliberately will not do: it will not recalculate your formulas, and it will not print a plausible-looking number where the file does not actually contain one.

    The honest part first: we do not recalculate formulas

    An .xlsx file stores two things for every formula cell: the formula itself, and the last result your spreadsheet program calculated. Excel, LibreOffice and Google Sheets all write that cached result when they save, so for files that came out of any of them, printing the cached value is exactly right and indistinguishable from recalculating.

    Some files do not have it. Exports from custom systems, report generators and libraries sometimes write the formula with no saved result. A converter that trusts whatever number it finds will print a zero there — and a zero in a growth-rate column or a totals row is the most dangerous possible output, because it looks completely reasonable and nobody double-checks it. Our first version did exactly that: a whole column of 0% growth, and a totals row of zeros.

    We now detect that case and leave the cell blank, with a warning naming how many cells are affected. Blank is honest: it tells you something is missing. The fix takes ten seconds — open the file in Excel or Google Sheets and save it again, and the results will be there. A full recalculation engine would mean implementing hundreds of Excel functions and their edge cases, and getting one of them subtly wrong would put us right back to printing plausible wrong numbers.

    Wide sheets, and why splitting is the correct answer

    Spreadsheets are usually wider than paper. There are three ways to deal with that: shrink everything until it is unreadable, cut off the columns that do not fit, or print the sheet in horizontal chunks — the first group of columns on one set of pages, the next group after it. Excel itself does the third, and so do we.

    The page tells you when it happens, naming the worksheet and how many chunks it produced, so a missing column is never a surprise. Column widths come from the widths stored in your file where they exist; where they do not, we measure the content of the first sixty rows and size the column to fit, clamped so one long paragraph in a cell cannot push everything else off the page.

    Text wider than its column is truncated with an ellipsis rather than spilling into the neighbouring cell. That differs from Excel, which lets text overflow when the cell to the right is empty. In a PDF, overflow means two cells drawing on top of each other with no way to tell which is which, so truncation with a visible marker is the lesser evil. The count of truncated cells is reported.

    What is not in the output, and why the numbers can mislead you

    Images are not drawn in this first version. Charts and pivot tables are not converted. If your workbook is mainly a grid of numbers, none of that matters. If it is a product catalogue with a photo in every row, it matters enormously — and this is where a fidelity metric will lie to you.

    We tested a real 4.2 MB workbook and measured 100% of its text preserved. That number was completely misleading: 4.00 MB of that file, ninety-three per cent of it, was eighty-six product photographs. We kept every word and threw away almost the entire document. The reference output was fifty-four pages; ours was eight.

    So the check is not just how much text survived, it is what the file is made of. This page measures how much of your workbook is images and how many anchors place them on sheets, and when images are more than half the file it tells you plainly that the main content is not text and the conversion will be badly incomplete. That is a case where a different tool is the right answer, and we would rather say so than hand you eight pages and let you find out.

    Chinese text, and the spreadsheet-specific parts of getting it right

    Chinese in a PDF needs a font embedded in the file, because the fonts every PDF reader has built in are Latin-only. We ship a subset of Noto Sans TC covering 6,403 characters and fetch it only after you choose a file, and only if that file needs it. It is then subset again down to the exact characters your workbook uses before being embedded, so the output PDF stays small — typically a few tens of kilobytes of font data regardless of which set was downloaded.

    Spreadsheets stress this differently from documents. Sheet names, header rows and short labels are where full-width punctuation and unusual characters show up, and a single name in a column of customers can be a character outside the common set. Around one real Traditional Chinese document in five uses at least one Big5 Level 2 character, and when it does it is usually one or two characters, often in somebody's name. That is exactly the case where printing a question mark is unacceptable, so when we detect one we fetch the extended set instead.

    Numbers use the formatted string your spreadsheet stored, so thousands separators, currency symbols, percentages and date formats appear as you set them up rather than as raw values. Numeric cells are right-aligned, the first row is treated as a header with a shaded background, and cell fill colours are carried across. Other styling — fonts, borders per cell, conditional formatting — is not.

    Nothing is uploaded, and what that is worth for a spreadsheet

    Spreadsheets are the files people least want to hand over. Payroll, customer lists, pricing, unreleased figures, medical or student records — these are the everyday contents of an .xlsx, and uploading one to a stranger's server to turn it into a PDF is a poor trade. Here the file is read by the browser, converted in the same tab, and the PDF is created in memory. There is no request containing your data, so there is no retention window to trust and no link that could be shared by mistake.

    You can confirm it yourself in under a minute: open developer tools, switch to the Network tab, convert a file, and look at what was requested. The page, its code, and the Chinese font if needed. Nothing else. The security policy this site sends restricts connections to our own origin, so the browser would block an attempt to send your workbook anywhere even if the code tried.

    The spreadsheet reader we use is SheetJS, pinned to version 0.20.3 and shipped as part of this site rather than pulled from a package registry at build time. The version published on npm is older and carries two unpatched high-severity vulnerabilities that we reproduced rather than merely read about: one pollutes a JavaScript prototype from a crafted comment, and the other freezes the tab for four and a half seconds on a 262 KB file. Both are on the code path any spreadsheet reader takes. The version we ship fixes both, and its checksum is recorded in the repository so the bytes can be verified.

    Frequently asked questions

    Why is a cell blank when my file has a formula there?

    Because the file does not contain a result for that formula, and we do not calculate formulas. Printing a zero there would look reasonable and be wrong. Open the file in Excel or Google Sheets and save it again — that writes the results, and the next conversion will show them.

    Are images in my spreadsheet included?

    Not in this version. Cell text and numbers are all kept. If images are more than half the file, the page tells you before converting that the result will be badly incomplete.

    My sheet is very wide. What happens?

    It is split into horizontal chunks, the same thing Excel does when printing a wide sheet. The page names the worksheet and the number of chunks so nothing goes missing quietly.

    Can it convert .xls files?

    No — .xls is the old binary format. Open it in Excel, LibreOffice or Google Sheets and save as .xlsx first. Macro-enabled .xlsm files are accepted; the macros are simply ignored, which does not affect the output.

    Is my spreadsheet uploaded?

    No. It is read and converted inside your browser tab. Watch the Network tab in developer tools while you convert — your file appears in no request, and the site's security policy would block one.

    Does it keep my colours and fonts?

    Cell fill colours and number formats are kept, the header row is shaded, and numbers are right-aligned. Per-cell fonts, borders and conditional formatting are not carried across in this version.