Hola,
Tengo dos problemas con el Crear libro de Excel llame a un script de JMP y espero que alguien aquí pueda darme una idea.
Estoy corriendo JMP Pro 15.2.1 en Windows 10 .Tengo un script que mantiene un par de tablas invisibles (:: dt_wj y :: dt_ma a continuación) que el usuario actualiza a través de una ventana de IU no modal.Se supone que uno de los botones en esta ventana genera un nuevo libro de trabajo de Excel en la carpeta TEMP del usuario a través del siguiente código:
::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);Comportamiento extraño 1 : Cuando ejecuto el código como está escrito arriba ( está envuelto en una función en mi código, por lo tanto, comentaron las declaraciones de retorno ), pasa el primer bloque Try ( donde llama Crear libro de Excel ) sin ejecutar la cláusula catch, sin embargo, la siguiente línea de código ( pruebas Es archivo ) devuelve 0.Cuando reviso la carpeta temporal, veo que se creó un archivo temporal, pero el nombre del archivo tiene un '-' agregado antes de la extensión: por ejemplo ' MAWJ259022-.xlsx '.Sin embargo, más extraño aún, si ajusto el Es archivo prueba para incluir el guión inexplicable:
If( !Is File( filepath||"-.xslx" ),<BR /> Write(Eval Insert("File ^filepath||\!"-.xslx\!"^ does not exist!\!N"));<BR /> Return( Empty() );<BR />);Todavía falla, aunque puedo ver con mis propios ojos un libro de Excel de 5 KB con esa ruta de archivo precisa como se verificó a través de la salida del registro.
Comportamiento extraño 2 : Dos de las columnas de una de mis tablas JMP contienen números de identificación grandes ( 12 y 16 dígitos respectivamente ) que se mantienen en columnas de caracteres en JMP ( ya que en realidad no son números sino identificadores ).Cuando yo ( manualmente por ahora ) abre el archivo de Excel en la carpeta temporal, estas columnas se leen en Excel como Numérico o General, aunque la columna de la tabla JMP de la que estoy guardando es definitivamente Carácter / Nominal.Esto es problemático ya que Excel no puede manejar el número de 16 dígitos y trunca los últimos 2 dígitos y convierte el número de 12 dígitos a notación científica, haciendo que ambos identificadores sean inútiles.Me parece que si JMP está generando el archivo de Excel en sí, debería poder configurar el tipo de datos para la columna de Excel para que coincida con el tipo de datos analógico de JMP más cercano en el proceso.
He intentado eludir esto generando archivos CSV temporales para cada tabla de datos y luego volviéndolos a colocar en JMP a través de Cargar archivo de texto , ajustando las columnas para leer varias combinaciones de Insertar evaluación ( "= TEXT (^ regexresult [1] ^, \!" ############ \! ")" ) o Insertar evaluación ( "= '^ regexresult [1] ^") o incluso algunas cosas raras que encontré sobre el manejo de CSV de Excel, como intentar triplicar las comillas dobles en los datos de la columna.Nada de esto parece ayudarme a sobresalir tratando de categorizar automáticamente mis datos y arruinarlos, así que realmente espero que haya una manera de hacer que JMP haga esto de la manera correcta.
Hay un tercer comportamiento Me gustaría eludir, que es que JMP no responde hasta que se sale de la instancia de Excel lanzada con Run Program, pero sospecho que es un problema mayor que resolver y su resolución es secundaria a mi objetivo principal aquí.
Cualquier idea o comentario / sugerencia sobre cosas para probar sería muy apreciado, ¡gracias!
La etiqueta script destrozó parte de ese código debido al estilo de comentario en las declaraciones try & if, que se publicaron a continuación sin comentarios para proporcionar un código de trabajo.
::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" );