Sie befinden sich hier: start » de » Interne Dokumentation » DokuWiki-Erweiterungen (WvdS) » FluentUI (Design-System-Bibliothek) » FluentUI: Komponenten-Referenzen » FluentUI: Desktop-DataGrid — Demo-Übersicht » DataGrid: Data Export

DataGrid: Data Export

Zurück: Demo-Übersicht


1. Übersicht und Zweck

Status: Zeilen-Copy [Live]; CSV-Export ist ein [Live]-Anwendungsfall des bestehenden bulkActions-Kontrakts (kein eigener Widget-Code); ein dedizierter Export-Helper ist [Live]. Referenz: DevExpress ASPxGridView „Data Export„ (CSV/XLSX/PDF).

2. Voraussetzungen

  • Für Copy/Copy with Headers: rowActions() am Grid gesetzt (Abschnitt 6).
  • Für CSV-Export: Selection (multi) + bulkActions bereits verstanden.

3. Konzepte

Kein eingebautes Export-Feature — zwei bestehende Kontrakte wiederverwendet: Copy nutzt rowActions()/Kontextmenü, CSV-Export nutzt bulkActions. dataGrid() erzeugt selbst keine CSV-Datei — das bleibt Sache eines eigenen Server-Endpunkts.

4. Erste Schritte

$rowActions = function (array $row) {
    return $this->rowActions([
        ['label' => 'Copy', 'element' =>
            '<button type="button" data-wk-copy="' . hsc($row['name']) . "\t" . hsc($row['status']) . '">Copy</button>'],
    ]);
};
 
echo $widgets->dataGrid($columns, $rows, ['rowActions' => $rowActions]);

Falsch: den Export-Endpunkt die ungefilterte Gesamtmenge statt der Auswahl exportieren lassen, weil „selection[] leer war, dann eben alles“ (s. Abschnitt 7, Sicherheit).

5. Verwendung

Bedarf Muster
Einzelne Zeile in die Zwischenablage Copy/Copy with Headers über rowActions() — Abschnitt 6
Ausgewählte Zeilen als Datei CSV-Export als Massenaktion über bulkActions — Abschnitt 6
Verallgemeinerter Export-Helper exportRows() — Abschnitt 8

6. API-Referenz

[Live] Copy / Copy with Headers

Über rowActions() + scripts/contextmenu.js (api → rowActions()) trägt jede Zeile optional ein Kontextmenü mit „Copy„/„Copy with Headers“:

$rowActions = function (array $row) {
    return $this->rowActions([
        ['label' => 'Copy', 'element' =>
            '<button type="button" data-wk-copy="' . hsc($row['name']) . "\t" . hsc($row['status']) . '">Copy</button>'],
        ['label' => 'Copy with Headers', 'element' =>
            '<button type="button" data-wk-copy-headers="1">Copy with Headers</button>'],
    ]);
};
 
echo $widgets->dataGrid($columns, $rows, ['rowActions' => $rowActions]);

[Live] CSV-Export als Massenaktion

Der bestehende bulkActions-Kontrakt (Data Editing (Massenaktionen)) angewendet auf einen Export-Endpunkt:

echo $widgets->dataGrid($columns, $rows, [
    'selection'   => 'multi',
    'rowKey'      => 'id',
    'bulkActions' => [
        ['label' => 'CSV-Export der Auswahl', 'element' =>
            '<button type="submit" formaction="' . hsc(wl($ID, ['do' => 'export-csv'])) . '" class="wk-btn wk-btn--accent">CSV-Export der Auswahl</button>'],
    ],
]);

7. Parameter, Optionen und Zustände

Attribut Wirkung
data-wk-copy Zwischenablage-Text für Copy (einzige Zusatzfunktion in scripts/contextmenu.js ohne No-JS-Äquivalent — Zwischenablage ist grundsätzlich ein Client-Feature)
data-wk-copy-headers Copy inklusive Spaltenüberschriften
Strg+C bei aktivem Auswahlmodell kopiert direkt, ohne Kontextmenü zu öffnen: bei selection => 'single' die aktive Zeile, bei 'multi' alle gewählten Zeilen zeilenweise (\n-getrennt)

Sicherheit: der Export-Server-Endpunkt validiert die selection[]-Schlüssel erneut gegen ACL/Existenz (gleiche Regel wie bei jeder Massenaktion, s. Massenaktionen → Server-Seite), gibt dann Content-Type: text/csv + Content-Disposition: attachment mit den validierten Zeilen aus. Ein leerer selection[]-POST muss als Fehlerfall behandelt werden (Statusmeldung „keine Auswahl„), nicht als „exportiere alles“ — sonst exportiert ein Nutzer versehentlich Daten, die er nicht angefordert hat.

8. Vollständige Beispiele: Dedizierter Export-Helper [Live]

exportRows() verallgemeinert das CSV-Muster oben, statt dass jeder Aufrufer CSV-Escaping selbst nachbaut:

  • exportRows(array $columns, array $rows, string $format = 'csv'): string in helper_plugin_wkfluentui_widgets — nimmt dieselben $columns/$rows-Strukturen wie dataGrid() entgegen (ein Datensatz, zwei Darstellungen) und liefert RFC-4180-förmiges CSV: CRLF-Zeilenenden, jede Zelle gequotet, Anführungszeichen verdoppelt, Semikolon-Trenner; Zellen mit führendem =/+/-/@ erhalten ein vorangestelltes Apostroph gegen Formel-Injection in Excel/LibreOffice (CWE-1236). ['html' => …]-Zellen werden als Textinhalt exportiert, nie als Markup.
  • format: nur csv — jeder andere Wert liefert den leeren String; XLSX/PDF bleiben außerhalb dieses Widget-Kontrakts (externe Bibliotheken).
// im Export-Endpunkt, NACH ACL-/Existenz-Revalidierung der Auswahl:
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="export.csv"');
echo $widgets->exportRows($columns, $gewaehlteZeilen);
exit;

9. Einschränkungen und Randfälle

  • exportRows() erzeugt nur den CSV-String — HTTP-Header, Dateiname und die ACL-Revalidierung der Auswahl bleiben Sache des Endpunkts (Abschnitt 7).
  • Kein XLSX/PDF-Export (Abschnitt 8).

10. Accessibility und Kompatibilität

  • navigator.clipboard.writeText() erfordert einen sicheren Kontext (HTTPS oder localhost) — auf unsicheren HTTP-Verbindungen ist Copy clientseitig nicht verfügbar, das Kontextmenü zeigt die Option dann nicht an.
  • Ohne JavaScript ist Copy/Copy with Headers nicht erreichbar (dokumentierte Ausnahme vom sonstigen No-JS-Grundsatz, s. Abschnitt 7).

11. Troubleshooting

Symptom: CSV-Export liefert leere/unerwartete Datei.

Ursache: der Export-Endpunkt behandelt ein leeres selection[]-POST fälschlich als „alles exportieren„ statt als Fehlerfall.

Lösung: Endpunkt-Logik gegen Abschnitt 7 (Sicherheit) prüfen — leere Auswahl muss eine Fehlermeldung liefern, nie eine ungefilterte Gesamtexport.

12. Verwandte Themen

de/wiki/dwe/wkfluentui/component/datagrid/data-export.txt · Zuletzt geändert: von 0.0.0.0