4

Excel Datei per Script erstellen - createXLSX()

Mit der Version 3.12 wurde die neue Funktion createXLSX() aufgenommen, mit der man jetzt per Script Excel-Dateien erstellen kann.
Ich habe eine klein Beispiel Datenbank erstellt, welche die Möglichkeiten anhand von Praxisbeispielen näher bringt.
Sie ist noch nicht abschließend und wird um noch nicht integrierte Praxisbeispiele erweitert.

Ich hoffe, sie unterstützt euch bei euren Projekten.

13 Antworten

null
    • DataSolution LUD GmbH
    • DSLUD
    • vor 2 Monaten
    • Gemeldet - anzeigen

    Hi Uwe, die Beispiele für die Excel-Scripte sind prima. Hast Du vielleicht auch noch eine Idee, wie ich per Script gleich den Zellenumbruch aktivieren und die Zellausrichtung vorgeben kann? Habe ich bisher nicht hinbekommen. Danke

      • UweG
      • vor 2 Monaten
      • Gemeldet - anzeigen

       
      Die Zellausrichtung müsste in style mit 'alignment' einstellbar sein.
      Hier ein Link zu der Dokumentation: https://docs.ninox.com/en/script/functions-overview/functions/createxlsx

      Zeilenumbruch innerhalb einer Zelle weiss ich nicht, ob es die Funktionalität der Funktion hergibt und habe auch nichts dazu in der Doku gefunden.
      Ich frage mal bei den Ninox Entwicklern nach

      • DataSolution LUD GmbH
      • DSLUD
      • vor 2 Monaten
      • Gemeldet - anzeigen

       Super, danke. Der Link zur Dokumentation hilft auch schon mal. Die Doku hatte ich nicht gefunden. VG Berit

      • UweG
      • vor 2 Monaten
      • Gemeldet - anzeigen

      Hallo Berit:
      An der Vollständigkeit der Dokumentation arbeitet Ninox intensiv und sie sollte bald in neuer Version veröffentlicht werden.

    • Rafael_Sanchis
    • vor 2 Monaten
    • Gemeldet - anzeigen

    Look tooo good, on Android Tablets.

    • Maurice
    • vor 3 Wochen
    • Gemeldet - anzeigen

    Hallo,

    gibt es einen Parameter, die Zeilen abwechselnd unterschiedlich einzufärben? Also so, wie beim Export aus dem Zahnradmenü von Ninox?

    Grüße
    Maurice

      • UweG
      • vor 3 Wochen
      • Gemeldet - anzeigen

       Das kann man so bauen, indem man bei der Datenerstellung als JSON noch einen Key zufügt, der einfach von 1 hoch zählt und diesen Eintrag in der Styles Definition auf gerade/ungerade prüft und die entsprechende Hintergrundfarbe setzt.

      Hier ein Gedankenmodell zum kopieren in ein Berechnungsfeld zur Anschauung.
      Bsp:
      let vObj := [{
                  name: "UweG"
              }, {
                  name: "BenLN"
              }, {
                  name: "JoergM"
              }];
      let k := 1;
      for i in vObj do
          setItem(i, "Line", k);
          setItem(i, "styles", [{
                  fill: {
                      bgColor: {
                          argb: if odd(i.number(Line)) then "Farbe1" else "Farbe2" end
                      }
                  }
              }]);
          k := k + 1
      end;
      debugValueInfo(vObj)

      • Maurice
      • vor 3 Wochen
      • Gemeldet - anzeigen

       In meinem Buttonfeld integriert erscheint eine Fehlermeldung zu 

      i.number(Line)

      Siehe Anhang. thisrows als das zu betrachtende array ist definiert als

      let thisrows := ((select Kurse_RuR)[Kurs.Kursjahrgang.Jahrgang = thisKJ and (Kurs.Kursart = 1 or Kurs.Kursart = 2)] order by last(Kurs.Kursleitung.Kursleitung).Name)

      und ansonsten unauffällig. In einem Formelfeld wird dein Code ausgeführt.

      Die Farbwerte definiere ich natürlich noch.

      Eine Idee, woran das liegen könnte?

      • Maurice
      • vor 3 Wochen
      • Gemeldet - anzeigen

       Hallo Uwe, ergänzend mit Gruß an die Entwickler: ich kann mir gut einen Parameter "standardNinox" vorstellen, so dass die Excel-Datei im Stil so aussieht wie beim Export über das Zahnrad. Das wäre konsistent und ich persönlich finde den Output sehr gelungen über das Zahnrad. Das versuche ich gerade per Hand nachzubilden. ;-)

      Grüße Maurice

      • UweG
      • vor 3 Wochen
      • Gemeldet - anzeigen

       
      Ich habe es bei mir getestet und es funktioniert.

      Möglicherweise ist deine Datenbasis fehlerhaft.
      Anbei mein Code für das Ergebnis des Bildschirmfotos:

      let vFont := text(Fonts);
      let vBoldFett := 'Bold-Fett';
      let vItalic := Italic;
      let xBackGround1 := "00" + substring(text(raw(PatternBackgroundColor_1)), 1, 7);
      let xBackground2 := "00" + substring(text(raw(PatternBackgroundColor_2)), 1, 7);
      let vUnterstrichenUnderline := 'Unterstrichen-Underline';
      let columns := [{
                  header: "Team",
                  key: "Team",
                  width: 15
              }, {
                  header: "Name",
                  key: "Name",
                  width: 20
              }, {
                  header: "Workplace",
                  key: "Workplace",
                  width: 30,
                  height: 20
              }, {
                  header: "Hardware PC",
                  key: "HardwarePC",
                  width: 80
              }];
      let rows := (select Team).{
              Team: text(Team),
              Name: Name,
              Workplace: text(Workplace),
              HardwarePC: text(Hardware)
          };
      let k := 1;
      for i in rows do
          setItem(i, "Line", k);
          setItem(i, "styles", [{
                  font: {
                      name: vFont,
                      bold: vBoldFett,
                      italic: vItalic,
                      underline: if contains(text(i.Hardware), "Windows") then
                          true
                      else
                          false
                      end
                  },
                  fill: {
                      type: "pattern",
                      pattern: "solid",
                      fgColor: {
                          argb: if odd(i.number(Line)) then xBackGround1 else xBackground2 end
                      }
                  }
              }]);
          k := k + 1
      end;
      let worksheets := {
              Sheet1: {
                  columns: columns,
                  rows: rows
              }
          };
      Image := createXLSX(this, worksheets, "DB_Team.xlsx");
      'ShareLink ExcelSheet' := shareFile(Image)

      Zu deiner weiteren Anmerkung eine Standardeinstellung vorzugebe:.
      Die Funktion createXLSX() wurde gerade deshalb eingeführt um individuelle Exceldateien per Script zu erstellen.
      Wenn man die Styles weg lässt, hat man einen Excelstandard.
      Wenn man mehrere Ninox User befragt, wird jeder unterchiedliche Anforderungen an die Definition eines Standards stellen.
      Deshalb ist Standard die Erstellung ohne 'styles'.

      • Maurice
      • vor 3 Wochen
      • Gemeldet - anzeigen

       Jetzt klappt es. Vielen Dank.

      Zu deinen Ausführungen zu Standard-Style: da hast du natürlich recht, dass der Standard eben der das einfache Excel-Theeme ist.

      Zwei Fragen noch:

      1. Bei mir wird z.B. nicht in jeder Reihe jede Zelle mit einem Inhalt belegt (wenn bei dir fehlt beispielsweise eine Angabe zu Hardware PC bei LanaM fehlen würde). Dann richtet sich die Hintergrundfarbe nach Excelstandard und wird weiß. Das lässt sich umgehen, indem ich setze; if 'Hardware PC' != null then 'Hardware PC' else "".
        Gibt es ggf. eine elegantere Methode, sonst muss ich das für jeden Spaltenkey setzen?
      2. Ich hatte auch als Alternative zu deinem Code versucht:
        styles: [{
                 fill: {
                     type: "pattern",
                     pattern: "solid",
                     fgColor: {
                         argb: for i in thisrows do
                             if even(index(thisrows, i)) then
                                   "00DCE6F1"
                             else
                                "00ffFFFF"
                              end
                          end
                      }
                   }
               }]
        
        

        als Style-Parameter in die rows Definition zu schreiben. Es gab aber nur schwarze Zellen (ebenso, wenn ich bgcolor verwende).
        thisrows dabei das Array für die Reihen - wie oben beschrieben.
        Wieso klappt das nicht?

      Grüße Maurice

      • UweG
      • vor 3 Wochen
      • Gemeldet - anzeigen


      bgColor ist wohl noch buggy und würde ich momentan nicht verwenden.

      Wenn man JSON-Objekte manuell erstellt, benötigen sie immer einen Inhalt, da ansonsten der JSON-Key komplett weggelassen wird.
      (Hier hilft wieder die Funktion debugValueInfo() um sich das Ergebnis ansehen zu können).
      Man könnte dem Key auch den Wert "" zuweisen bei leerem Inhalt.
      Das findet manchmal auch Anwendung bei custom-JSON, die für den dynamischen Druck/Carbone verwendet werden.

      Im bisherigen Script, war die styles-Zuordnung Zellabhängig.
      Wenn kein entsprechende key im JSON vorhanden ist, findet sie auch keine Anwendung.
      Glücklicherweise kann man das mit dem JSON-Key 'targets' innerhalb 'styles' beheben beheben.
      targets : ["Zellenname1", "Zellenname2", etc]

      Hier hilft auch die Ninox Dokumentation zu den Funktionen weiter.
      https://docs.ninox.com/en/script/functions-overview/functions/createxlsx

      Nicht alle Möglichkeiten können bis ins letzte Detail dokumentiert sein.
      Man muss auch selber mal seine Komfortzone verlassen und Dinge ausprobieren , Rückschläge hinnehmen und neue Ansätze finden und sich damit beschäftigen.
      Ich kann nachvollziehen, dass dies nicht jedermans Sache ist, aber dafür gibt es dann die Ninox-Partner, die gegen ein Entgelt diese Arbeit übernehmen.

      Ninox ist ein Baukasten und das finde ich Super.
      Für mich ist es eine grosse Spielwiese, die immer wieder Neuigkeiten bereit hält.
      Und es überrascht mich auch immer wieder. Auch durch die Forenbeiträge.
      Manchmal muss man sich aber auch eingestehen, dass nicht jeder Gedanke umsetzbar ist und das akzeptieren.

      Ninox ist nicht perfekt und andere Tools können sicherlich einige Dinge besser als Ninox oder es wird so empfunden.
      Wenn man sie aber in der Gesammtheit der Möglichkeiten mit Ninox vergleicht sehe ich einen größeren Raum an machbaren in Ninox besser abgedeckt als bei anderen Produkten.
      (Das kommt natürlich auch auf die Zielsetzung für eine Entwicklung an)
      Da kann ich persönlich dann darüber hinweg sehen, dass Ninox eben nicht die eierlegende Wollmilchsau ist die sich jeder eigentlich gerne wünschen würde.

      • Maurice
      • vor 2 Wochen
      • Gemeldet - anzeigen

       Ich antworte mir mal selbst. Dank Uwes Hilfe war es jetzt leicht möglich, die Zellen abwechseln einzufärben.

      Doch Vorsicht: dadurch wird ja die explizite einzelne Zelle entsprechend eingefärbt. Mein Anliegen, die Ausgabe der Zeilen alternierend zu formatieren wie bei der Ausgabe über das Zahnrad, musste ich wieder aufgeben, denn der entscheidende Unterschied ist: bei der Ausgabe über das Zahnrad wird die abwechselnde Einfärbung der Zellen über das entsprechende Tabellenformat erreicht.

      Das erkennt man leicht daran: sortiert man die Tabelle neu nach einem bestimmten Filter, bleibt die alternierende Einfärbung erhalten, beim Export über createXLSX nicht, da laufen die Farben (natürlich) mit den Einträgen mit.

      Ich frage mich natürlich, wie Ninox die Excel-Datei über das Zahnrad erzeugt?

      Für mich ist Ninox auch ein tolles Werkzeug, dass mir schnell und flexibel gute Lösungen bietet. Manchmal nicht immer so, wie man das auf direktem Weg hätte, aber ich kenne kein Tool, dass mich so schnell zu brauchbaren Lösungen kommen lässt.