Assets im Snippet (@param asset)

Erstellt: 2026-07-18 · Aktualisiert: 2026-07-19

Ein Snippet kann eigene Dateien mitbringen — Bilder, Icons oder Datenlisten. Sie liegen im Ordner des Snippets, werden beim Publizieren, Sichern und Hochladen automatisch mitgenommen, und das Script greift über ppptools.* darauf zu.

Mit dem Parametertyp asset bekommt der Nutzer daraus eine Auswahlliste mit Vorschaubild — gespeist aus einer CSV-Datei, die neben dem Snippet liegt.

Diese Seite erklärt beides am durchgehenden Beispiel eines Länderflaggen-Snippets: 271 Länder, je zwei Seitenverhältnisse, als PNG und als SVG.

Warum nicht einfach Dateipfade im Code?

Ein Snippet läuft auf fremden Rechnern und wird über die Bibliothek verteilt. Ein fester Pfad wie C:\Bilder\ch.png funktioniert dort nicht. Assets im Snippet-Ordner wandern dagegen mit dem Snippet mit.


Der Snippet-Ordner

Assets liegen direkt neben code.cs. Unterordner sind erlaubt:

<Snippet-Ordner>\
├── code.cs             ← vom Editor erzeugt
├── snippet.xml         ← vom Editor erzeugt
├── preview.png         ← vom Editor erzeugt
├── countries.csv       ← eigene Datenliste
├── flags_png\
│   ├── 1x1\  ch.png · de.png · …
│   └── 4x3\  ch.png · de.png · …
└── flags_svg\
    ├── 1x1\  ch.svg · de.svg · …
    └── 4x3\  ch.svg · de.svg · …

So kommen die Dateien hinein: Snippet einmal speichern, dann in Snippet-Verwalten auf „Ordner öffnen" klicken und die Dateien im Explorer hineinkopieren. Erneutes Speichern überschreibt nur code.cs und snippet.xml — die Assets bleiben liegen.

Erlaubte Dateitypen

Kategorie Endungen
Bilder .png · .jpg · .jpeg · .svg
Daten .xml · .csv · .json
Inhalte .pptx (Fragmente und Folien)

Andere Dateitypen werden beim ZIP-Export und beim Hochladen abgewiesen. Das schützt davor, dass über die Bibliothek ungewollte Dateien verteilt werden.


Die Datenliste

Die CSV braucht eine Kopfzeile und verwendet Semikolon als Trennzeichen. Spalten werden später über ihren Namen angesprochen, die Reihenfolge ist also frei:

iso;de;en;svg_1x1;svg_4x3;png_1x1;png_4x3
CH;Schweiz;Switzerland;flags_svg\1x1\ch.svg;flags_svg\4x3\ch.svg;flags_png\1x1\ch.png;flags_png\4x3\ch.png
DE;Deutschland;Germany;flags_svg\1x1\de.svg;flags_svg\4x3\de.svg;flags_png\1x1\de.png;flags_png\4x3\de.png

Die Pfade sind relativ zum Snippet-Ordner. Benennst du einen Ordner um, musst du nur die CSV anpassen — nicht den Code.


Auswahl mit Vorschau: @param asset

// @param asset <name> "<Label>" source="<datei.csv>" labelcol="<spalte>"
//              [valuecol="<spalte>"] [previewcol="<spalte>"] [default="<wert>"] [tooltip="…"]
  • source — die CSV im Snippet-Ordner
  • labelcol — Spalte, die in der Liste angezeigt wird
  • valuecol — Spalte, die das Script als Wert erhält (fehlt sie, wird das Label zurückgegeben)
  • previewcol — Spalte mit dem Vorschaubild
  • default — Eintrag, der beim Öffnen vorausgewählt ist (Wert aus labelcol)

Im Script liefert Params.GetString("<name>") den Inhalt von valuecol.

Für das Flaggen-Beispiel:

// @param asset Land "Land" source="countries.csv" labelcol="de" valuecol="de"
//              previewcol="png_1x1" default="Schweiz" tooltip="Land wählen"

Vorschau nur als PNG oder JPG

previewcol muss auf ein PNG oder JPG zeigen. SVG kann im Parameter-Dialog nicht angezeigt werden — Windows bringt dafür keinen Decoder mit. Zeigt die Spalte auf eine SVG-Datei, bleibt die Vorschau einfach leer.

Das ist kein Problem: Die Vorschau darf ruhig ein anderes Format zeigen als das, was am Ende eingefügt wird. Im Flaggen-Beispiel zeigt sie immer png_1x1, während das Script je nach Nutzerwahl SVG oder PNG einfügt.


Zugriff aus dem Script

Scripts dürfen aus Sicherheitsgründen kein System.IO verwenden. Der Zugriff läuft deshalb über ppptools — und ist dabei fest auf den eigenen Snippet-Ordner begrenzt:

Methode Zweck
ppptools.SnippetDir Pfad des Snippet-Ordners (leer, wenn noch nie gespeichert)
ppptools.AssetExists("a", "b.png") Prüft, ob eine Datei vorhanden ist
ppptools.AssetPath("a", "b.png") Vollständiger Pfad — für AddPicture
ppptools.ReadAssetText("liste.csv") Textdatei als String
ppptools.ReadAssetLines("liste.csv") Textdatei zeilenweise

Pfadteile werden einzeln übergeben. Absolute Pfade und Sprünge nach oben (..) werden abgewiesen.

// Aus "flags_png\4x3\ch.png" in der CSV wird der volle Pfad:
string[] teile = pfad.Split('\\');
string datei = ppptools.AssetPath(teile);

Vollständiges Beispiel

// @param asset Land "Land" source="countries.csv" labelcol="de" valuecol="de"
//              previewcol="png_1x1" default="Schweiz"
// @param enum Dateiformat "Dateiformat" options="PNG (Bild)|SVG (Vektor)" default="PNG (Bild)"
// @param float Breite "Breite (pt)" default=120 min=8 max=720

string land   = Params.GetString("Land", "Schweiz");
bool   istPng = Params.GetString("Dateiformat", "PNG (Bild)").StartsWith("PNG");
float  breite = (float)Params.GetFloat("Breite", 120.0);
float  hoehe  = breite * 3f / 4f;

string datei = null, hinweis = null;

if (!ppptools.AssetExists("countries.csv"))
{
    hinweis = "countries.csv fehlt im Snippet-Ordner.";
}
else
{
    foreach (string zeile in ppptools.ReadAssetLines("countries.csv"))
    {
        if (zeile.Length == 0 || zeile.StartsWith("iso;")) continue;   // Kopfzeile
        string[] sp = zeile.Split(';');
        if (sp.Length < 7) continue;
        if (!string.Equals(sp[1], land, StringComparison.OrdinalIgnoreCase)) continue;

        string pfad = istPng ? sp[6] : sp[4];       // png_4x3 bzw. svg_4x3
        string[] teile = pfad.Split('\\');
        if (ppptools.AssetExists(teile)) datei = ppptools.AssetPath(teile);
        else                             hinweis = "Datei fehlt: " + pfad;
        break;
    }
}

if (datei != null)
{
    var flagge = ppptools.AddPicture(datei, 100f, 100f, breite, hoehe);
    flagge.Name = "Flagge_" + land;
}
else
{
    // Kein throw — siehe Hinweis unten
    var ph = ppptools.AddRect(100f, 100f, breite, hoehe);
    ph.TextFrame.TextRange.Text = hinweis;
}

Drei Fallstricke

1. Nie eine Exception werfen, wenn Assets fehlen

Beim Speichern im Advanced Snippet Editor wird das Script ausgeführt, um daraus das Vorschaubild zu erzeugen. Wirft es, lässt sich das Snippet nicht speichern — und ohne gespeichertes Snippet gibt es keinen Ordner, in den man die Assets legen könnte.

Zeige stattdessen einen sichtbaren Platzhalter auf der Folie. So lässt sich das Snippet anlegen, danach kopierst du die Dateien hinein.

2. Im Editor kennt nur ein gespeichertes Snippet seinen Ordner

ppptools.SnippetDir ist leer, solange das Snippet nie gespeichert wurde. Zum Testen mit echten Assets: erst speichern, dann aus der Galerie einfügen.

3. SVG wird als Gruppe eingefügt

PowerPoint macht aus einem eingefügten SVG eine Gruppe aus Einzelformen. Setzt du darauf Line, erscheinen Rahmen innerhalb der Grafik. Zwei Auswege: PNG verwenden, oder ein eigenes Rechteck über die Grafik legen und beides gruppieren.

Ein eingefügtes SVG sollte ausserdem nicht per Ungroup aufgelöst werden — das kann PowerPoint zum Absturz bringen.


Weitergeben

Weg Assets dabei
Speichern als ZIP ✔ inklusive Unterordner
In Online-Bibliothek hochladen
In den Public-Share publizieren
Backup und Wiederherstellen

Grosse Asset-Pakete werden beim Hochladen mit einer Rückfrage bestätigt.

Aus der Online-Bibliothek werden Assets einzeln bei Bedarf geladen, nicht als ganzes Paket: Beim Einfügen holt PPPTools nur die Dateien, die das Snippet tatsächlich anfasst, und legt sie lokal ab. Beim zweiten Mal kommt alles aus diesem Cache. Ein Snippet mit tausend Bildern ist damit genauso schnell wie eines mit einem einzigen — solange nur eines gebraucht wird.

Lizenzen mitliefern

Bringst du fremdes Material mit (Icons, Bilder, Datensätze), gehört die zugehörige Lizenzdatei in den Snippet-Ordner. Sie wird wie jedes andere Asset mitverteilt.


Siehe auch