Salut,
J'ai deux problèmes avec le Créer un classeur Excel appelez un script JMP et j'espère que quelqu'un ici pourra me donner un aperçu.
je suis entrain de courir JMP Pro 15.2.1 sur Windows 10 .J'ai un script qui gère une paire de tables invisibles (::dt_wj et ::dt_ma ci-dessous) qui sont mises à jour par l'utilisateur via une fenêtre d'interface utilisateur non modale.L'un des boutons de cette fenêtre est censé générer un nouveau classeur Excel dans le dossier TEMP de l'utilisateur via le code ci-dessous :
::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);Comportement étrange 1 : Quand j'exécute le code comme écrit ci-dessus ( il est enveloppé dans une fonction dans mon code, d'où les instructions Return commentées ), il passe le premier bloc Try ( où il appelle Créer un classeur Excel ) sans exécuter la clause catch, cependant, la ligne de code suivante ( essai Est un fichier ) renvoie 0.Lorsque je vérifie le dossier temporaire, je vois qu'un fichier temporaire a été créé, mais le nom du fichier comporte un « - » ajouté avant l'extension : par exemple » MAWJ259022-.xlsx '.Cependant, plus bizarre encore, si j'ajuste le Est un fichier test pour inclure le trait d'union inexplicable :
If( !Is File( filepath||"-.xslx" ),<BR /> Write(Eval Insert("File ^filepath||\!"-.xslx\!"^ does not exist!\!N"));<BR /> Return( Empty() );<BR />);Cela échoue toujours, même si je peux voir de mes propres yeux un classeur Excel de 5 Ko avec ce chemin de fichier précis vérifié via la sortie du journal.
Comportement étrange 2 : Deux des colonnes de l'une de mes tables JMP contiennent de grands numéros d'identification ( 12 et 16 chiffres respectivement ) qui sont conservés dans les colonnes Caractère de JMP ( puisqu'il ne s'agit pas vraiment de chiffres mais d'identifiants ).Quand je ( manuellement pour l'instant ) ouvrez le fichier Excel dans le dossier temporaire, ces colonnes sont lues dans Excel comme numériques ou générales, même si la colonne de la table JMP à partir de laquelle j'enregistre est définitivement Caractère/Nominal.Ceci est problématique car Excel ne peut pas gérer le nombre à 16 chiffres, tronque les 2 derniers chiffres et convertit le nombre à 12 chiffres en notation scientifique, rendant les deux identifiants inutiles.Il me semble que si JMP génère lui-même le fichier Excel, il devrait être capable de définir le type de données de la colonne Excel pour qu'il corresponde au type de données analogique JMP le plus proche dans le processus.
J'ai essayé d'éviter cela en générant des fichiers CSV temporaires pour chaque table de données, puis en les réintégrant dans JMP via Charger un fichier texte , en ajustant les colonnes pour lire diverses combinaisons de Insertion d'évaluation ( "=TEXTE(^regexresult[1]^,\!"############\!")" ) ou Insertion d'évaluation ( "='^regexresult[1]^") ou même des trucs étranges que j'ai trouvés sur la gestion CSV d'Excel, comme essayer des guillemets triples dans les données de la colonne.Rien de tout cela ne semble m'empêcher d'essayer de catégoriser automatiquement mes données et de les ruiner, j'espère donc vraiment qu'il existe un moyen de faire en sorte que JMP fasse cela de la bonne manière.
Il existe un troisième comportement Je voudrais éviter, c'est-à-dire que JMP ne répond plus jusqu'à ce que l'instance Excel lancée avec Exécuter le programme soit quittée, mais je soupçonne que c'est un problème plus important à résoudre et sa résolution est secondaire par rapport à mon objectif principal ici.
Tout aperçu ou commentaire/suggestion sur les choses à essayer serait grandement apprécié, merci !
La balise de script a mutilé une partie de ce code en raison du style de commentaire dans les instructions try & if, republiée ci-dessous sans commentaires pour fournir un code fonctionnel.
::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" );