superbig / craft3-beam
Generate CSVs and XLS files in your templates
Installs: 33 130
Dependents: 0
Suggesters: 0
Security: 0
Stars: 18
Watchers: 1
Forks: 6
Open Issues: 4
Type:craft-plugin
pkg:composer/superbig/craft3-beam
Requires
- craftcms/cms: ^5.0.0
- league/csv: ^9.0
- mk-j/php_xlsxwriter: ^0.39.0
Requires (Dev)
- craftcms/ecs: dev-main
- craftcms/phpstan: dev-main
- craftcms/rector: dev-main
This package is auto-updated.
Last update: 2025-10-14 12:28:39 UTC
README
Generate CSVs and XLS files in your templates
Requirements
This plugin requires Craft CMS 3.0.0-beta.23 or later.
Installation
To install the plugin, follow these instructions.
- 
Open your terminal and go to your Craft project: cd /path/to/project
- 
Then tell Composer to load the plugin: composer require superbig/craft3-beam
- 
In the Control Panel, go to Settings → Plugins and click the “Install” button for Beam. 
Using Beam
The starting point when working with Beam is to create a instance:
{% set options = {
    header: ['Email', 'Name'],
    content: [
        [ 'test@example.com', 'John Doe' ],
        [ 'another+test@example.com', 'Jane Doe' ],
        [ 'third+test@example.com', 'Trond Johansen' ],
    ]
} %}
{% set beam = craft.beam.create(options) %}
This will return a BeamModel behind the scenes.
If you want to append content dynamically, say from a loop, you can use the append method:
{% set myUserQuery = craft.users()
    .group('authors') %}
{# Fetch the users #}
{% set users = myUserQuery.all() %}
{# Display the list #}
{% for user in users %}
    {% do beam.append([user.username, user.name, user.email]) %}
{% endfor %}
To generate an CSV:
{% do beam.csv() %}
To generate an XLSX:
{% do beam.xlsx() %}
Changing config on the fly
To set the header of the file (the first row):
{% do beam.setHeader([ 'Username', 'Name', 'Email' ]) %}
To set the filename:
{% set currentDate = now|date('Y-m-d') %}
{% do beam.setFilename("report-#{currentDate}") %}
To overwrite the content:
{% do beam.setContent([
    [ 'test@example.com', 'John Doe' ],
    [ 'another+test@example.com', 'Jane Doe' ],
    [ 'third+test@example.com', 'Trond Johansen' ],
]) %}
Custom cell formatting is supported for XLSX:
{% set options = {
    header: ['Email', 'Name', { text: 'Number', type: 'number' }, { text: 'Date', type: 'date' }],
    content: [
        [ 'test@example.com', 'John Doe', 100000, '2022-06-10'],
        [ 'another+test@example.com', 'Jane Doe', 252323, '2022-06-22'],
        [ 'third+test@example.com', 'Trond Johansen', 30, '2022-06-22'],
        [ 'third+test@example.com', 'Trond Johansen', 6233, '2023-06-22'],
    ]
} %}
{% set beam = craft.beam.create(options) %}
{%  do beam.xlsx() %}
These types are supported:
| Format Type | Maps to the following cell format | 
|---|---|
| string | @ | 
| integer | 0 | 
| date | YYYY-MM-DD | 
| datetime | YYYY-MM-DD HH:MM:SS | 
| time | HH:MM:SS | 
| price | #,##0.00 | 
| dollar | [$$-1009]#,##0.00;[RED]-[$$-1009]#,##0.00 | 
| euro | #,##0.00 [$€-407];[RED]-#,##0.00 [$€-407] | 
Brought to you by Superbig
