Hallo,
Ich habe zwei Probleme mit dem Erstellen Sie eine Excel-Arbeitsmappe Rufen Sie ein JMP-Skript auf und ich hoffe, jemand hier kann mir einen Einblick geben.
Ich renne JMP Pro 15.2.1 auf Windows 10 .Ich habe ein Skript, das ein Paar unsichtbarer Tabellen (:: dt_wj und :: dt_ma unten) verwaltet, die vom Benutzer über ein nicht modales UI-Fenster aktualisiert werden.Eine der Schaltflächen in diesem Fenster soll eine neue Excel-Arbeitsmappe im TEMP-Ordner des Benutzers über den folgenden Code 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 eingeschlossen, daher werden die Return-Anweisungen auskommentiert ) übergibt es den ersten Try-Block ( wo es anruft 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 dem Dateinamen wird vor der Erweiterung ein '-' angehängt: zum Beispiel ' MAWJ259022-.xlsx '.Allerdings noch seltsamer, wenn ich das einstelle 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 genau diesem Dateipfad sehen kann, der über die Protokollausgabe überprüft wurde.
Seltsames Verhalten 2 : Zwei der Spalten in einer meiner JMP-Tabellen enthalten große ID-Nummern ( 12 bzw. 16 Ziffern ), die in Zeichenspalten in JMP ( da es sich nicht wirklich um Zahlen handelt, sondern um Bezeichner ).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 Nummer nicht verarbeiten kann und die letzten 2 Ziffern abschneidet und die 12-stellige Nummer in wissenschaftliche Notation konvertiert, wodurch beide Bezeichner unbrauchbar werden.Es scheint mir, dass JMP, wenn es die Excel-Datei selbst generiert, in der Lage sein sollte, den Datentyp für die Excel-Spalte so einzustellen, dass er dem nächstgelegenen JMP-analogen Datentyp im Prozess entspricht.
Ich habe versucht, dies zu umgehen, indem ich temporäre CSV-Dateien für jede Datentabelle generiert und diese dann über in JMP zurückgezogen habe Textdatei laden Anpassen der Spalten, um verschiedene Kombinationen von zu lesen Eval Insert ( "= TEXT (^ regexresult [1] ^, \!" ############ \! ")" ) oder Eval Insert ( "= '^ regexresult [1] ^") oder sogar einige seltsame Dinge, die ich über die CSV-Behandlung von Excel gefunden habe, wie das Ausprobieren von dreifachen Anführungszeichen in den Spaltendaten.Nichts davon scheint mich dazu zu bringen, meine Daten automatisch zu kategorisieren und zu ruinieren. Ich hoffe also wirklich, dass es eine Möglichkeit gibt, JMP dazu zu bringen, dies stattdessen richtig zu machen.
Es gibt ein drittes Verhalten Ich würde gerne ausweichen, was bedeutet, dass JMP nicht reagiert, bis die mit Run Program gestartete Excel-Instanz beendet wird, aber ich vermute, dass dies ein größeres Problem ist, das gelöst werden muss, und dass die Lösung meinem Hauptziel hier untergeordnet ist.
Jeder Einblick oder Kommentare / Vorschläge zu Dingen zu versuchen wäre sehr dankbar, danke!
Das Skript-Tag hat einen Teil dieses Codes aufgrund des Kommentarstils in den try & if-Anweisungen entstellt, die unten ohne Kommentare erneut veröffentlicht wurden, um Arbeitscode 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" );