PHPackages                             markocupic/export\_table - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [PDF &amp; Document Generation](/categories/documents)
4. /
5. markocupic/export\_table

ActiveContao-module[PDF &amp; Document Generation](/categories/documents)

markocupic/export\_table
========================

Export Contao database tables to CSV- or XML-files.

5.7.5(3mo ago)68.7k↓27.8%3[1 issues](https://github.com/markocupic/export_table/issues)2MITPHPPHP ^8.1CI passing

Since Jun 3Pushed 3mo ago1 watchersCompare

[ Source](https://github.com/markocupic/export_table)[ Packagist](https://packagist.org/packages/markocupic/export_table)[ RSS](/packages/markocupic-export-table/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependencies (3)Versions (60)Used By (2)

[![Markoo Cupic Logo](docs/logo.png?raw=true "logo")](docs/logo.png?raw=true)

Export Table für Contao CMS
===========================

[](#export-table-für-contao-cms)

Mit dieser Erweiterung lassen sich aus dem Contao Backend heraus Datenbank-Tabellen ins CSV- oder XML-Format exportieren. Dabei kann der Export konfiguriert werden.

- Export-Typ auswählen (CSV/XML)
- Tabelle auswählbar
- Felder auswählbar
- Kopfzeile ja/nein
- Über die Eingabe eines json-Arrays Datensätze filtern
- Ausgabe sortierbar (Feldname und Richtung)
- Delimiter einstellbar (Default: ;)
- Enclosure einstellbar (Default: ")
- BOM (für korrekte Darstellung von UTF-8 codierten Zeichen in MS Excel)
- Trennzeichen für Arrays einstellbar
- Deeplink Support
- Speicher-Verzeichnis wählbar
- Dateiname wählbar
- Extension mit HOOKS und weiteren Writern erweiterbar

[![Backend](docs/backend.png?raw=true "Backend")](docs/backend.png?raw=true)

Der Einsatz von Filtern
-----------------------

[](#der-einsatz-von-filtern)

Der Export ist über Filter konfigurierbar.

Folgender einfacher Filter für die Mitgliedertabelle *tl\_member* lässt nur **Frauen** aus **Luzern** zu:
`[["gender = ? AND city = ?"],["female","Luzern"]]`

Oder nur **Frauen** aus **Luzern** oder **Bern**:
`[["gender = ? AND (city = ? OR city = ?)"],["female","Luzern","Bern"]]`

Oder mit benannten Platzhaltern (named placeholders): `[["gender = :gender AND (city = :city_A OR city = :city_B)"],{"gender":"male","city_A":"Luzern","city_B":"Bern"}]`

Oder alle **Mitglieder** aus der **Mitgliedergruppe** mit der ID 3: `[["tl_member.groups LIKE '%:\"3\";%' AND id > ?"],["0"]]`

Auch der Gebrauch von Contao **Insert Tags** ist möglich:
`[["lastname = ? AND city = ?"],["{{user::lastname}}","Oberkirch"]]`

Oder Parameterübergabe aus der URL:
`[["lastname = ? AND city = ?"],["{{GET::lastname}}","Oberkirch"]]`

Für Entwickler: Die Ausgabe über EventListener oder den "exportTable" HOOK steuern
----------------------------------------------------------------------------------

[](#für-entwickler-die-ausgabe-über-eventlistener-oder-den-exporttable-hook-steuern)

### QueryBuilderPreparedEvent - Datenbank Query anpassen

[](#querybuilderpreparedevent---datenbank-query-anpassen)

Der `QueryBuilderPreparedEvent` ermöglicht es dir, Datenbank-Queries vor ihrer Ausführung anzupassen. Dies ist nützlich, um zusätzliche Bedingungen, Filter oder andere Modifikationen auf Query-Builder-Ebene vorzunehmen. Erstelle dazu einen **Event Listener**. Siehe [QueryBuilderPreparedListener](docs/wiki/event_listener/queryBuilderPreparedListener.md)

Via **Hooks** kann die Ausgabe transformiert/angepasst werden. Die Erweiterung selber nutzt diese Hooks. Beispielsweise werden timestamps vie [exportTable Hook](docs/wiki/hooks/exportTable.md) zu formatierten Daten umgewandelt. Bereits vorhandene Hooks lassen sich über einen eigenen Hook deaktivieren. Dabei muss die Priority so eingestellt werden, dass der neue Hook vor dem bestehenden aufgerufen wird.
Siehe [siehe dieses Beispiel](docs/wiki/hooks/exportTable.md):

HOOK[exportTable](docs/wiki/hooks/exportTable.md)[exportTablePreWrite](docs/wiki/hooks/exportTablePreWrite.md)[exportTablePostWrite](docs/wiki/hooks/exportTablePostWrite.md)### ExportTable aus eigenem Controller heraus nutzen

[](#exporttable-aus-eigenem-controller-heraus-nutzen)

Die ExportTable-Klasse lässt sich recht simpel auch aus anderen Erweiterungen heraus nutzen.

Dazu muss als Erstes der Export konfiguriert werden. Als Konstruktor-Argument wird der Konfigurationsklasse der Name der zu exportierenden Tabelle übergeben. Mit dieser Minimalkonfiguration werden die Default-Einstellungen übernommen. Ein Beispiel mit einer etwas ausführlicheren Konfiguration findest du weiter unten.

```
$config = new Config('tl_member');

```

Der eigentliche Export-Service wird mit der Methode `$this->exportTable->run($objConfig)` aufgerufen, welche als einzigen Parameter das vorher erstellte Config-Objekt erwartet.

```
$config = new Config('tl_member');
$config->setOutputBom(ByteSequence::BOM['UTF-8']);

return $this->exportTable->run($config);

```

Hier ein etwas ausführlicheres Beispiel eingebettet in einem Custom Controller.

```
// App/Controller/CustomController.php

declare(strict_types=1);

namespace App\Controller;

use Contao\CoreBundle\Exception\ResponseException;
use Contao\CoreBundle\Framework\ContaoFramework;
use Contao\FilesModel;
use Markocupic\ExportTable\Config\Config;
use Markocupic\ExportTable\Export\ExportTable;
use Markocupic\ExportTable\Writer\ByteSequence;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

#[Route('/_test_export', name: CustomController::class, defaults: ['_scope' => 'frontend', '_token_check' => false])]
class CustomController extends AbstractController
{

    public function __construct(
        private ContaoFramework $framework,
        private ExportTable $exportTable,
    ){
    }

    public function __invoke(): Response
    {
        $this->framework->initialize();

        // First you have to config your data export.
        $config = (new Config('tl_member'))
            ->setExportType('csv')
            ->setFields(['firstname', 'lastname', 'dateOfBirth'])
            ->setAddHeadline(true)
            ->setHeadlineFields(['Vorname', 'Nachname', 'Geburtsdatum'])
            ->setDelimiter(',')
            ->setEnclosure('"')
            // Select * FROM tl_member WHERE tl_member.city = 'Oberkirch'
            ->setFilter([["city=?"],["Oberkirch"]])
            // Save the file to the Contao filesystem
            ->setSaveExport(true)
            // Define a target path, otherwise the file will be temporarily stored in system/tmp
            ->setSaveExportDirectory(FilesModel::findByPath('files')->uuid)
            // Define a filename, otherwise the file will become the name of the table ->tl_member.csv
            ->setFilename('export.csv')
            // Add BOM (correct display of UTF8 encoded chars in MS-Excel)
            ->setOutputBom(ByteSequence::BOM['UTF-8'])
            // Use the row callback to manipulate records
            ->setRowCallback(
                static function ($arrRow) {
                    foreach($arrRow as $fieldName => $varValue)
                    {
                        $arrRow[$fieldName] = doSomething($varValue);
                    }
                    return $arrRow;
                }
            )
            //->convertEncoding(true, 'UTF-8', 'ISO-8859-1');
        ;

        // The export class takes the config object as single parameter.
        return $this->exportTable->run($config);
    }
}
```

Erstellen eines Custom-Exporter-Services
----------------------------------------

[](#erstellen-eines-custom-exporter-services)

Falls die beiden Standard-Writer (CSV und XML) nicht genügen sollten, ist es ohne weiteres möglich einen weiteren Writer hinzuzufügen. Dazu muss eine Writer Klasse geschrieben werden, die das `Markocupic\ExportTable\Writer\WriterInterface` implementiert. In `services.yaml` muss die Klasse mit `name: markocupic_export_table.writer` getaggt werden. Der Alias sollte eindeutig sein und nicht bereits verwendet worden sein. Z.B. `alias: my_custom_csv`

```
    # Inject Custom CSV writer into Markocupic\ExportTable\Export\ExportTable and Markocupic\ExportTable\DataContainer\ExportTable during compilation
    App\ExportTable\Writer\CustomXmlWriter:
        tags:
            - { name: markocupic_export_table.writer, alias: xml, verbose_name: Custom xml exporter class }
```

Viel Spass mit Export Table!

###  Health Score

57

—

FairBetter than 98% of packages

Maintenance79

Regular maintenance activity

Popularity30

Limited adoption so far

Community16

Small or concentrated contributor base

Maturity86

Battle-tested with a long release history

 Bus Factor1

Top contributor holds 99.5% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~62 days

Recently: every ~15 days

Total

58

Last Release

92d ago

Major Versions

1.2.0 → 2.0.02018-01-06

2.0.4 → 3.0.02018-04-09

3.3.1 → 4.0.42021-10-11

4.1.0 → 5.1.22021-10-13

PHP version history (4 changes)1.0.0PHP &gt;=5.3

2.0.0PHP &gt;=7.1

5.3.0PHP ^7.4|^8.0

5.4.1PHP ^8.1

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/1525166?v=4)[Marko Cupic](/maintainers/markocupic)[@markocupic](https://github.com/markocupic)

---

Top Contributors

[![markocupic](https://avatars.githubusercontent.com/u/1525166?v=4)](https://github.com/markocupic "markocupic (182 commits)")[![agonyz](https://avatars.githubusercontent.com/u/71080150?v=4)](https://github.com/agonyz "agonyz (1 commits)")

---

Tags

xmlexportcsvcontao

### Embed Badge

![Health badge](/badges/markocupic-export-table/health.svg)

```
[![Health](https://phpackages.com/badges/markocupic-export-table/health.svg)](https://phpackages.com/packages/markocupic-export-table)
```

###  Alternatives

[soapbox/laravel-formatter

A formatting library that converts data output between XML, CSV, JSON, TXT, YAML and a few others.

2501.1M12](/packages/soapbox-laravel-formatter)[silverstripe/gridfieldqueuedexport

Export large data sets from your GridField in the SilverStripe CMS interface through async jobs

10213.1k5](/packages/silverstripe-gridfieldqueuedexport)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
