Generate Excel, Word and PowerPoint files from your app
Real xlsx/docx/pptx, written headlessly — no Office, no headless browser.
The problem
Someone needs the report as a real file: a spreadsheet their finance team can open, a document their lawyer can track changes in, a deck they can present.
The usual options are all bad. A PDF is not editable. CSV loses everything. A headless browser rendering to PDF adds a fragile binary to your deploy. And most libraries either generate something Office opens with a repair prompt, or require Office itself to be installed on your server.
What you are building
Live surfaces, not screenshots — every one composed from the same components you would install.
Generated documents
The writers are headless — this is what the app has on disk after an agent builds the quarterly pack.
holy-sheet
dark-slide
last-word
Each ships a PHP and a Node twin, same API.
The code
use HolySheet\Workbook;
// A declarative sheet, not a cell-by-cell API -- which is what makes it
// something an AGENT can emit in one shot rather than drive imperatively.
$workbook = Workbook::make()
->sheet('Forecast', function ($sheet) use ($rows) {
$sheet->headers(['Region', 'Q3', 'Q4']);
$sheet->rows($rows);
$sheet->format('B:C', ['numberFormat' => '#,##0']);
});
$workbook->write(storage_path('app/reports/Q3-forecast.xlsx'));// holy-sheet-js is a PORT, not a binding -- same shapes, same output, no PHP
// in the process. Pick the one that matches the runtime you are already in.
import { Workbook } from "@particle-academy/holy-sheet";
await Workbook.make()
.sheet("Forecast", (sheet) => {
sheet.headers(["Region", "Q3", "Q4"]);
sheet.rows(rows);
})
.write("storage/reports/Q3-forecast.xlsx");How to solve it
Pick the writer for the format
Three headless writers: xlsx, docx and pptx. No Office dependency and no browser — they write the file format directly.
Run thisbash composer require particle-academy/holy-sheet # xlsx composer require particle-academy/last-word # docx composer require particle-academy/dark-slide # pptxOr the same thing on Node
Each has a matched port. Same contract, same output — pick the one matching the runtime you are in rather than standing up a service in the other language.
Run thisbash npm install @particle-academy/holy-sheet npm install @particle-academy/last-word npm install @particle-academy/dark-slideBuild the document from data, not markup
The writers take plain structures, which is what makes them usable by an agent as well as by your code — the input is JSON-shaped rather than a template language.
Round-trip when you need to read one back
The docx and pptx packages read as well as write, and docx carries markdown bridges in both directions — useful when a model produced markdown and the deliverable is a Word file.
