Converting an Excel workbook (.xlsx) to PDF produces a fixed-layout file that opens the same on every device and cannot be edited by mistake. This guide covers five methods: Excel's built-in export, LibreOffice headless CLI, Python automation, Node.js automation, and Google Sheets. It also fixes the problem that trips up most spreadsheet exports: columns cut off by the page edge.
How to convert Excel to PDF in Microsoft Excel
Microsoft Excel has a built-in PDF export under File, Save As. Before exporting, set the scaling, otherwise wide sheets get clipped at the right margin.
Windows:
- Open the .xlsx file in Excel.
- Go to the Page Layout tab. In the Scale to Fit group, set Width to 1 page (leave Height at Automatic for tall tables).
- Click File, then Save As, and choose PDF from the file type dropdown.
- Under Options, pick whether to export the active sheet, the entire workbook, or a selection.
- Click Save.
macOS:
- Open the .xlsx file in Excel.
- Set scaling in Page Layout, then click File, Save As, and pick PDF.
- Choose Workbook, Sheet, or Selection, then click Export.
Excel's own export produces the most faithful PDF because it uses the same layout engine that displays the workbook on screen. It preserves cell colors, borders, conditional formatting, and charts. This is the best option for one-off conversions when you have an Excel license.
How to convert Excel to PDF with LibreOffice (free, no license)
LibreOffice is a free, open-source office suite that reads .xlsx files and exports PDF from the command line without a GUI. It runs on Linux, macOS, and Windows and is the standard choice for servers and CI pipelines.
Install LibreOffice
# macOS
brew install --cask libreoffice
# Ubuntu / Debian
sudo apt install libreoffice
# Windows (winget)
winget install LibreOfficeConvert a single file
libreoffice --headless --convert-to pdf book.xlsxThe --headless flag runs LibreOffice without opening a window. The output book.pdf appears in the current directory. Formulas export as their computed values, and charts render as vector graphics.
Convert every .xlsx in a directory
libreoffice --headless --convert-to pdf --outdir ./pdfs *.xlsxLibreOffice processes files one at a time. On a 2024 MacBook Pro (M3), a 3-sheet financial workbook with charts converts in about 2 to 3 seconds. A workbook with 20 dense sheets takes 6 to 10 seconds.
LibreOffice reads the print ranges and page scaling stored in the .xlsx. If a sheet has no print area set, LibreOffice exports the full used range and may split a wide table across pages. Set the print range and scaling in the source file before converting, or in LibreOffice Calc under Format, Page Style, Sheet.
How to control page fit so columns are not cut off
The main headache with Excel to PDF is width: spreadsheets are wider than a printed page, so columns spill off the right edge or land on separate pages. Set scaling before you export, not after.
Excel offers three scaling controls in the Page Layout tab, Scale to Fit group:
| Setting | What it does | When to use |
|---|---|---|
| Width: 1 page | Shrinks columns so all fit horizontally | Wide tables that must stay on one page across |
| Height: 1 page | Shrinks rows so all fit vertically | Short, wide summaries |
| Width + Height: 1 page | Fits the entire sheet on a single page | Dashboards, one-page reports |
| Fit All Columns on One Page (Print menu) | Keeps columns intact, allows multiple vertical pages | Long tables where readability matters more than page count |
Landscape orientation adds roughly 40 percent more horizontal room than portrait on A4 or Letter, so switch orientation before shrinking text to an unreadable size. For a table with 15 or more columns, Landscape plus Width: 1 page usually keeps the font legible. If the text still becomes too small, split the table across two print areas instead of forcing one page.
In LibreOffice Calc, the same controls live in Format, Page Style, Sheet, under the Scale section: choose "Fit print range(s) to width/height" and set the page count. LibreOffice honors these settings when converting through the CLI, so set them in the .xlsx first.
How to convert Excel to PDF in Python
Python has two practical approaches: call LibreOffice through subprocess for cross-platform servers, or drive Excel through COM automation on Windows for exact fidelity.
Using subprocess with LibreOffice
This works on any operating system with LibreOffice installed and needs no Excel license.
import subprocess
from pathlib import Path
def xlsx_to_pdf(input_path: str, output_dir: str = ".") -> str:
"""Convert an .xlsx file to PDF using LibreOffice headless."""
subprocess.run(
["libreoffice", "--headless", "--convert-to", "pdf",
"--outdir", output_dir, input_path],
check=True,
timeout=120,
)
stem = Path(input_path).stem
return str(Path(output_dir) / f"{stem}.pdf")
pdf_path = xlsx_to_pdf("q3-report.xlsx", "./output")
print(f"Saved: {pdf_path}")Batch convert a directory
from pathlib import Path
import subprocess
input_dir = Path("./workbooks")
output_dir = Path("./pdfs")
output_dir.mkdir(exist_ok=True)
xlsx_files = list(input_dir.glob("*.xlsx"))
for xlsx in xlsx_files:
subprocess.run(
["libreoffice", "--headless", "--convert-to", "pdf",
"--outdir", str(output_dir), str(xlsx)],
check=True,
timeout=180,
)
print(f"Converted {len(xlsx_files)} files")Using Excel COM on Windows
When exact Excel fidelity matters and the script runs on Windows with Excel installed, drive Excel directly through pywin32. This respects every print setting saved in the workbook.
import win32com.client
excel = win32com.client.Dispatch("Excel.Application")
excel.Visible = False
wb = excel.Workbooks.Open(r"C:\reports\q3-report.xlsx")
# 0 = xlTypePDF
wb.ExportAsFixedFormat(0, r"C:\reports\q3-report.pdf")
wb.Close(False)
excel.Quit()LibreOffice does not support concurrent conversions from one install directory. For parallel processing, give each worker its own
--user-installprofile, or run conversions sequentially in a queue.
How to convert Excel to PDF in Node.js
The libreoffice-convert npm package wraps the LibreOffice CLI and returns a Buffer, which is handy for backends that already produce spreadsheets.
npm install libreoffice-convertimport { readFileSync, writeFileSync } from "fs";
import { convert } from "libreoffice-convert";
import { promisify } from "util";
const convertAsync = promisify(convert);
async function xlsxToPdf(inputPath: string, outputPath: string) {
const input = readFileSync(inputPath);
const pdf = await convertAsync(input, ".pdf", undefined);
writeFileSync(outputPath, pdf);
console.log(`Saved: ${outputPath}`);
}
xlsxToPdf("sales.xlsx", "sales.pdf");This spawns a LibreOffice process per conversion, so it fits low-volume or batch workloads rather than a high-throughput API endpoint. For a request-per-second API, keep a warm LibreOffice pool or move to direct HTML rendering (covered below).
How to convert Excel to PDF with Google Sheets
Google Sheets converts .xlsx to PDF in the browser with no local software. Upload the file to Google Drive, open it in Sheets, then use File, Download, PDF. The export dialog exposes the same scaling controls (fit to width, fit to page, landscape) as the desktop apps.
For automation, the Google Sheets export URL accepts query parameters that set the format, orientation, and scale:
https://docs.google.com/spreadsheets/d/SHEET_ID/export?format=pdf&portrait=false&fitw=true&gridlines=false
Pass fitw=true to fit the content to page width, portrait=false for landscape, and gridlines=false to hide the grid. This is a practical path when your data already lives in Google Sheets, and it pairs with the approach in generate PDF from Google Sheets.
Comparison: which Excel to PDF method to use?
| Method | Requires Excel license | Runs headless | Layout control | Batch support | Best for |
|---|---|---|---|---|---|
| Microsoft Excel | Yes | No | Exact | No (manual) | One-off, highest fidelity |
| LibreOffice CLI | No | Yes | High (from .xlsx settings) | Yes | Servers, CI/CD, batch |
| Python (subprocess) | No | Yes | High (from .xlsx settings) | Yes | Linux and cross-platform scripts |
| Python (win32com) | Yes (Windows) | Yes | Exact | Yes | Windows servers with Excel |
| Node.js (libreoffice-convert) | No | Yes | High (from .xlsx settings) | Yes | Node.js backends |
| Google Sheets | No | Yes (cloud) | Good (export params) | Yes (with quota) | No local install, cloud-first |
For production servers that need no license, LibreOffice with fonts installed and print settings set in the .xlsx is the standard choice. Excel's own export is the most accurate but needs a license and a session. Both produce vector text and lines, so tables stay sharp at any zoom.
Common Excel to PDF issues and fixes
Columns are cut off at the right edge. The sheet is wider than the page and no scaling is set. Fix: set Width to 1 page in Page Layout, Scale to Fit, or switch to Landscape. Set this in the .xlsx before converting with LibreOffice, since the CLI reads the file's own print settings.
The whole workbook exports when you only wanted one sheet. The export scope defaults to the active sheet in some versions and the whole workbook in others. Fix: in File, Print or the Save As Options dialog, choose Active Sheets or Selection explicitly.
Gridlines are missing or unwanted. Screen gridlines do not print by default. To show them, enable Page Layout, Sheet Options, Gridlines, Print. To hide them in a Google Sheets export, add gridlines=false to the export URL.
Fonts shift or numbers change width. LibreOffice substitutes missing fonts with metrically different alternatives, which can shift column widths and page breaks. Fix: install the exact fonts used in the workbook on the conversion machine. On Linux, install the Microsoft core fonts for Calibri and Cambria.
The PDF is very large. Workbooks with embedded high-resolution images produce large PDFs. After conversion, run the file through the PDF4.dev compress tool. A 12 MB PDF with product photos typically drops to 2 to 4 MB. To combine several exported sheets into one document, use the merge PDF tool.
When to generate a PDF from data instead of Excel
Excel to PDF works well for spreadsheets a person built and wants to share as a fixed document. But for reports, invoices, and statements you generate from data on a schedule, starting from a spreadsheet is fragile. Page-fit scaling, font substitution, and column drift compound when you produce hundreds of documents a day.
PDF4.dev takes a different path: you write an HTML template with CSS for exact layout, inject the numbers through Handlebars variables, and render the PDF with a headless browser. The rendering engine (Chromium) is the same one that displays the template in a browser, so the output is identical every time, with no page-fit guesswork.
const response = await fetch("https://api.pdf4.dev/v1/render", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.PDF4_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
template_id: "monthly-statement",
data: {
client: "Acme Corp",
period: "June 2026",
rows: [
{ item: "Rendering", qty: 1200, total: "$248.00" },
{ item: "Storage", qty: 500, total: "$45.00" },
],
total: "$293.00",
},
}),
});
const pdf = await response.arrayBuffer();This produces a table with exact column widths, exact fonts, and no clipped edges, because you control the layout in CSS instead of fighting a spreadsheet's print settings. For data-driven documents at scale, HTML to PDF with PDF4.dev is more predictable than converting .xlsx files. It is the same reasoning that applies to converting Word to PDF for generated documents.
Try the free HTML to PDF toolTry it freeSummary
- Set scaling first: in Excel, Page Layout, Scale to Fit, Width 1 page, and use Landscape for wide tables so columns are not cut off.
- For one-off conversions with a license, use Excel's File, Save As PDF. It gives the most faithful output.
- For free conversions without Excel, install LibreOffice and run
libreoffice --headless --convert-to pdf book.xlsx. - For Python automation, call LibreOffice through
subprocess, or usewin32comon Windows with Excel installed. - For Node.js backends, use the
libreoffice-convertnpm package. - For cloud-first workflows, export from Google Sheets with
fitw=trueandportrait=falsein the export URL. - For documents you generate from data, skip the spreadsheet and render directly from an HTML template with PDF4.dev for exact control over layout, fonts, and page fit. See the complete guide to PDF conversion for the full picture, and PDF to Excel for the reverse direction.
Frequently asked questions
- How do I convert Excel to PDF for free?
- Open the .xlsx file in Microsoft Excel and choose File, Save As, PDF, or File, Export, Create PDF. On macOS, File, Save As and pick PDF also works. If you do not have Excel, use LibreOffice Calc (free, open source): run libreoffice --headless --convert-to pdf book.xlsx from the command line. Google Sheets can also export any uploaded .xlsx as PDF via File, Download, PDF.
- How do I convert Excel to PDF on the command line?
- Install LibreOffice and run: libreoffice --headless --convert-to pdf book.xlsx. The --headless flag runs LibreOffice without a GUI. The output book.pdf appears in the current directory. This works on Linux, macOS, and Windows and is the standard method for servers and CI.
- Why does my Excel to PDF conversion cut off columns?
- Columns get cut off when the sheet is wider than the page and no scaling is set. Excel exports each sheet at its on-screen width, so a wide table spills onto extra pages or gets clipped. Fix it in Page Layout, Scale to Fit, and set Width to 1 page, or switch orientation to Landscape. In LibreOffice, set the print range and the scaling factor in Format, Page Style, Sheet before converting.
- How do I make Excel fit on one page when saving as PDF?
- In Excel, go to the Page Layout tab, find the Scale to Fit group, and set Width to 1 page and Height to 1 page. Or open File, Print, and choose Fit Sheet on One Page under scaling. This shrinks the content so every column and row fits, then export to PDF. For very wide tables, Fit All Columns on One Page keeps columns intact while allowing multiple pages vertically.
- Can I batch convert multiple Excel files to PDF?
- Yes. With LibreOffice, pass a wildcard: libreoffice --headless --convert-to pdf --outdir ./pdfs *.xlsx. In Python, loop over a directory and call LibreOffice via subprocess for each file. Both approaches handle hundreds of spreadsheets in one script. LibreOffice converts one file at a time from a single install directory, so run conversions sequentially.
- How do I convert Excel to PDF in Python?
- The most reliable method calls LibreOffice through subprocess: subprocess.run(["libreoffice", "--headless", "--convert-to", "pdf", "book.xlsx"]). It works on any OS with LibreOffice installed and preserves formulas as computed values, cell formatting, and charts. On Windows with Excel installed, the win32com.client COM automation calls Excel directly for exact fidelity.
- How do I convert only one worksheet to PDF?
- In Excel, select the sheet tab, open File, Print, and set the print scope to Print Active Sheets before saving as PDF. To export a cell range only, select the range first and choose Print Selection. In LibreOffice, define a print range with Format, Print Ranges, Define, then convert. This keeps the PDF to the exact area you want.
- Does Excel to PDF keep formulas and charts?
- Formulas export as their computed values, not the formula text, which is the expected behavior for a print-style PDF. Charts, conditional formatting, cell colors, and borders are preserved by Excel, LibreOffice, and Google Sheets. The PDF is a fixed snapshot: it cannot be recalculated. To keep an editable spreadsheet, keep the .xlsx and share the PDF as a read-only copy.
- Is there an Excel to PDF API?
- There is no free public API dedicated to .xlsx-to-PDF conversion. You can self-host LibreOffice behind a REST endpoint with Gotenberg or build a microservice that calls LibreOffice headless. For reports and invoices you generate from data, PDF4.dev renders a PDF directly from an HTML template, which gives pixel-exact layout and avoids the spreadsheet page-fit problem entirely.
- How do I convert Excel to PDF without losing quality?
- Set the scaling before export so columns are not clipped, install the fonts used in the workbook on the conversion machine, and export at standard quality rather than minimum size. Excel and LibreOffice produce vector text and lines, so there is no quality loss for tables. Only embedded images are rasterized. If the PDF is large, compress it afterward with a lossless-friendly tool.
Start generating PDFs
Build PDF templates with a visual editor. Render them via API from any language in ~300ms.



