Hallo,
Ich habe zwei Probleme damit Erstellen Sie eine Excel-Arbeitsmappe Rufen Sie ein JMP-Skript auf und ich hoffe, dass mir hier jemand einen Einblick geben kann.
Ich renne JMP Pro 15.2.1 An Windows 10 .Ich habe ein Skript, das ein Paar unsichtbarer Tabellen verwaltet (::dt_wj und ::dt_ma unten), die vom Benutzer über ein nichtmodales UI-Fenster aktualisiert werden.Eine der Schaltflächen in diesem Fenster soll über den folgenden Code eine neue Excel-Arbeitsmappe im TEMP-Ordner des Benutzers generieren:
::excelpath = Trim(<BR /> Run Program( Executable( "C:\Windows\System32\where.exe" ), Options( {"/R", "C:\", "excel.exe"} ), Read Function( "text" ) )<BR />);<BR />temppath = Convert File Path( "$TEMP", Absolute, Windows );
timestamp = Round( Tick Seconds() );
filename = "MAWJ" || Char( timestamp );
filepath = Convert File Path(temppath||filename,Absolute,Windows);
Try(
Create Excel Workbook(
filepath,
{::dt_wj,::dt_ma},
{"WJ","MA"}
);
,//else
Write("Failed to create workbook!\!N");
//Return(Empty());
);
If( !Is File( filepath||".xslx" ),
Write("File does not exist!\!N");
//Return(Empty());<BR />);
Write( "Opening with Excel..." );
Try(<BR /> Run Program( Executable( ::excelpath ), Options( Eval List( {"/e", filepath} ) ) )<BR />,//else<BR /> Write( "Failed!!!\!N" );<BR /> //Return(filepath);<BR />);
Write( "Done.\!N" );<BR />//Return(filepath);Seltsames Verhalten 1 : Wenn ich den Code wie oben beschrieben ausführe ( Es ist in eine Funktion in meinem Code eingebunden, daher sind die Return-Anweisungen auskommentiert ), übergibt es den ersten Try-Block ( wo es ruft Erstellen Sie eine Excel-Arbeitsmappe ), ohne die Catch-Klausel auszuführen, jedoch die nächste Codezeile ( testen Ist Datei ) gibt 0 zurück.Wenn ich den temporären Ordner überprüfe, sehe ich, dass eine temporäre Datei erstellt wurde, aber an den Dateinamen ist vor der Erweiterung ein „-“ angehängt: zum Beispiel „ MAWJ259022-.xlsx '.Allerdings wird es noch seltsamer, wenn ich das anpasse Ist Datei Test, um den unerklärlichen Bindestrich einzuschließen:
If( !Is File( filepath||"-.xslx" ),<BR /> Write(Eval Insert("File ^filepath||\!"-.xslx\!"^ does not exist!\!N"));<BR /> Return( Empty() );<BR />);Es schlägt immer noch fehl, obwohl ich mit eigenen Augen eine 5-KB-Excel-Arbeitsmappe mit diesem genauen Dateipfad sehen kann, der anhand der Protokollausgabe überprüft wurde.
Merkwürdiges Verhalten 2 : Zwei der Spalten in einer meiner JMP-Tabellen enthalten große ID-Nummern ( 12 bzw. 16 Ziffern ), die in Zeichenspalten in JMP gespeichert sind ( da es sich nicht wirklich um Zahlen, sondern um Bezeichner handelt ).Wenn ich ( vorerst manuell ) Öffnen Sie die Excel-Datei im temporären Ordner. Diese Spalten werden als Numerisch oder Allgemein in Excel eingelesen, obwohl die Spalte in der JMP-Tabelle, aus der ich speichere, definitiv Zeichen/Nominal ist.Dies ist problematisch, da Excel die 16-stellige Zahl nicht verarbeiten kann und die letzten beiden Ziffern abschneidet und die 12-stellige Zahl in die wissenschaftliche Notation umwandelt, wodurch beide Bezeichner unbrauchbar werden.Mir scheint, dass JMP, wenn es die Excel-Datei selbst generiert, in der Lage sein sollte, den Datentyp für die Excel-Spalte so festzulegen, dass er mit dem nächstgelegenen JMP-analogen Datentyp im Prozess übereinstimmt.
Ich habe versucht, dies zu umgehen, indem ich temporäre CSV-Dateien für jede Datentabelle generierte und sie dann über zurück in JMP zog Textdatei laden , wobei die Spalten angepasst werden, um verschiedene Kombinationen davon zu lesen Evaluierungseinfügung( "=TEXT(^regexresult[1]^,\!"############\!")" ) oder Evaluierungseinfügung( "='^regexresult[1]^") oder sogar einige seltsame Dinge, die ich über die CSV-Verarbeitung von Excel gefunden habe, wie z. B. das Ausprobieren von dreifachen doppelten Anführungszeichen in den Spaltendaten.Nichts davon bringt mich anscheinend dazu, Excel dazu zu bringen, meine Daten automatisch zu kategorisieren und zu ruinieren, also hoffe ich wirklich, dass es stattdessen eine Möglichkeit gibt, JMP dazu zu bringen, dies richtig zu machen.
Es gibt ein drittes Verhalten Ich würde gerne umgehen, was bedeutet, dass JMP nicht mehr reagiert, bis die mit „Programm ausführen“ gestartete Excel-Instanz beendet wird, aber ich vermute, dass es sich dabei um ein größeres Problem handelt, das gelöst werden muss, und dessen Lösung für mein Hauptziel hier zweitrangig ist.
Für Einblicke oder Kommentare/Vorschläge zu Dingen, die Sie ausprobieren können, wären wir sehr dankbar, danke!
Das Skript-Tag hat einen Teil dieses Codes aufgrund des Kommentarstils in den try- und if-Anweisungen entstellt und unten ohne Kommentare erneut gepostet, um funktionierenden Code bereitzustellen.
::excelpath = Trim( Run Program( Executable( "C:\Windows\System32\where.exe" ), Options( {"/R", "C:\", "excel.exe"} ), Read Function( "text" ) ) );
temppath = Convert File Path( "$TEMP", Absolute, Windows );
timestamp = Round( Tick Seconds() );
filename = "MAWJ" || Char( timestamp );
filepath = Convert File Path( temppath || filename, Absolute, Windows );
Try(
Create Excel Workbook( filepath, {::dt_wj, ::dt_ma}, {"WJ", "MA"} ),
Write( "Failed to create workbook!\!N" );
);
If( !Is File( filepath || ".xslx" ),
Write( "File does not exist!\!N" )
);
Write( "Opening with Excel..." );
Try( Run Program( Executable( ::excelpath ), Options( Eval List( {"/e", filepath} ) ) ), Write( "Failed!!!\!N" ) );
Write( "Done.\!N" );