你好
我有两个问题创建Excel工作簿调用JMP脚本,我希望这里的人可以给我一些见识。
我在跑JMP专业版15.2.1上Windows 10 。我有一个脚本,用于维护一对不可见表(下面的::: dt_wj和::: dt_ma),这些表由用户通过非模式UI窗口进行更新。该窗口上的按钮之一应该通过以下代码在用户的TEMP文件夹中生成一个新的excel工作簿:
::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);奇怪的行为1 :当我运行上面编写的代码时(它包装在我的代码中的函数中,因此注释了Return语句),它将通过第一个Try块(它在哪里打电话创建Excel工作簿)而不执行catch子句,但是,下一行代码(测试是文件)传回0。当我检查temp文件夹时,我看到一个临时文件已创建,但是文件名在扩展名之前附加了“-”:例如“ MAWJ259022-.xlsx '。但是,如果我调整了是文件测试包含莫名其妙的连字符:
If( !Is File( filepath||"-.xslx" ),<BR /> Write(Eval Insert("File ^filepath||\!"-.xslx\!"^ does not exist!\!N"));<BR /> Return( Empty() );<BR />);即使我可以亲眼看到一本5KB excel工作簿,该工作簿具有通过日志输出验证的精确文件路径,但它仍然失败。
奇怪行为2 :我的一个JMP表中的两列包含较大的ID号(分别为12位和16位数字)保存在JMP(因为它们不是数字,而是标识符)。当我 (现在手动)打开temp文件夹中的excel文件,即使我要保存的JMP表中的列肯定是Character / Nominal,这些列也将以数值或常规方式读入Excel。这是有问题的,因为Excel无法处理16位数字并截断最后2位数字,并将12位数字转换为科学计数法,从而使两个标识符都无用。在我看来,如果JMP本身生成了excel文件,则它应该能够为excel列设置数据类型以匹配该过程中最接近的JMP模拟数据类型。
我尝试通过为每个数据表生成临时CSV文件然后通过以下方式将它们拉回到JMP来回避此问题加载文本文件,调整列以读取以下内容的各种组合评估插入“ = TEXT(^ regexresult [1] ^,\!” #############!“)” )要么评估插入“ ='^ regexresult [1] ^”)甚至是我发现的有关excel CSV处理的一些奇怪的东西,例如尝试对列数据中的三重双引号进行尝试。这些似乎都无法使我绕过excel来尝试对数据进行自动分类并破坏它的过程,因此,我真的希望有一种方法可以使JMP正确地执行此操作。
有第三种行为我想回避一下,这是直到退出由运行程序启动的excel实例之前,JMP才变得无响应,但是我怀疑这是一个要解决的更大问题,它的解决方案对我的主要目标而言是次要的。
任何对尝试的见解或评论/建议将不胜感激,谢谢!
脚本标签由于try&if语句中的注释样式而使其中的一些代码混乱,下面重新发布而无注释以提供有效的代码。
::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" );