Blog

Password-protected XLSX

The Render extension now lets you create encrypted XLSX files that ask for a password when opened in Excel or other compatible apps. It works in the browser or on Node.js, and you don't need any extra dependencies.

icon jspreadsheet

Published at 16/04/2026

Introducing

Render is a Jspreadsheet extension that turns spreadsheet JSON into native XLSX files. With the new password option, you can encrypt your exported workbook using Agile Encryption, which is the same method Excel uses by default.

The output uses a standard format, so Excel, LibreOffice Calc, Numbers, and other XLSX-compatible apps will recognize it and ask for the password before opening. You don't need extra libraries—encryption uses WebCrypto in the browser and Node's built-in crypto module on the server.

Password-protected XLSX

What's new?

You only need to add one new option to the render call to encrypt your output.

The password option

Just pass a password when you call jspreadsheet.render(...), and your output file will be encrypted. Excel, Excel Online, LibreOffice, and other viewers will all prompt for the password before opening the file.

jspreadsheet.render(spreadsheet, {
    filename: 'confidential.xlsx',
    password: 'mypassword',
});

Standards-compliant Agile Encryption

The implementation follows [MS-OFFCRYPTO] §2.3.4 (Agile Encryption):

  • Cipher: AES-256 in CBC mode
  • Hash: SHA-512
  • Spin count: 100,000 password-derivation iterations
  • Integrity: HMAC-SHA-512 over the encrypted package

This uses the same encryption as Excel's 'Protect Workbook' feature, so files from Render will open in any tool that supports Excel's encrypted files.

Works everywhere

You can use this feature both in the browser and on the server:

  • Browser - uses the built-in WebCrypto API, so you don't need polyfills or extra crypto libraries.
  • Node.js - uses the native crypto module for full server-side generation, which is great for backend export pipelines.

Useful links

Export to XLSX documentation
Jspreadsheet examples