cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
The Discovery Summit 2025 Call for Content is open! Submit an abstract today to present at our premier analytics conference.
See how to use JMP Live to centralize and share reports within groups. Webinar with Q&A April 4, 2pm ET.
Choose Language Hide Translation Bar
View Original Published Thread

创建 Excel 工作簿奇怪的行为

gob0b
Level II

你好,

我有两个问题创建 Excel 工作簿调用 JMP 脚本,我希望这里有人能给我一些见解。

我在跑JMP 专业版 15.2.1Windows 10 。我有一个脚本维护一对不可见的表(下面是::dt_wj 和::dt_ma),这些表由用户通过非模式 UI 窗口进行更新。该窗口上的按钮之一应该通过以下代码在用户的 TEMP 文件夹中生成一个新的 Excel 工作簿:

 

::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"}
 );
,//else
 Write("Failed to create workbook!\!N");
 //Return(Empty());
);
If( !Is File( filepath||".xslx" ),
    Write("File does not exist!\!N");
 //Return(Empty()););

Write( "Opening with Excel..." );
Try(    Run Program( Executable( ::excelpath ), Options( Eval List( {"/e", filepath} ) ) ),//else    Write( "Failed!!!\!N" );    //Return(filepath););
Write( "Done.\!N" );//Return(filepath);

奇怪的行为1 :当我运行上面写的代码时(它被包装在我的代码中的一个函数中,因此注释掉了 Return 语句),它传递了第一个 Try 块(它在哪里调用创建 Excel 工作簿) 而不执行 catch 子句,但是,下一行代码 (测试是文件) 返回 0。当我检查临时文件夹时,我看到创建了一个临时文件,但文件名在扩展名前附加了一个“-”:例如“ MAWJ259022-.xlsx '。然而,更奇怪的是,如果我调整是文件测试包括莫名其妙的连字符:

 

If( !Is File( filepath||"-.xslx" ),    Write(Eval Insert("File ^filepath||\!"-.xslx\!"^ does not exist!\!N"));    Return( Empty() ););

尽管我可以亲眼看到一个 5KB 的 Excel 工作簿,其中包含通过日志输出验证的精确文件路径,但它仍然失败。

 

奇怪的行为2 :我的 JMP 表之一中的两列包含较大的 ID 号(分别为12位和16位),它们保存在 JMP 的字符列中(因为它们并不是真正的数字而是标识符)。当我 (暂时手动)打开临时文件夹中的 Excel 文件,这些列将作为数字或常规读入 Excel,即使我要保存的 JMP 表中的列肯定是字符/名义。这是有问题的,因为 Excel 无法处理 16 位数字并截断最后 2 位数字,并将 12 位数字转换为科学计数法,从而使两个标识符都无用。在我看来,如果 JMP 本身生成 excel 文件,它应该能够设置 excel 列的数据类型以匹配流程中最接近的 JMP 模拟数据类型。

 

我尝试通过为每个数据表生成临时 CSV 文件然后通过将它们拉回到 JMP 来回避这个问题加载文本文件,调整列以读取各种组合评估插入( "=TEXT(^正则表达式结果[1]^,\!"############\!")"或者评估插入( "='^regexresult[1]^") 甚至是我发现的一些有关 excel CSV 处理的奇怪内容,例如在列数据中尝试使用三重双引号。这些似乎都无法让我绕过 Excel 尝试自动分类我的数据并破坏它的情况,所以我真的希望有一种方法可以让 JMP 以正确的方式做到这一点。

 

还有第三种行为我想回避一下,即 JMP 不会响应,直到退出通过运行程序启动的 excel 实例,但我怀疑这是一个需要解决的更大问题,而且它的解决方案对于我的主要目标来说是次要的。

 

任何有关尝试的见解或评论/建议将不胜感激,谢谢!

 

This post originally written in English (US) has been computer translated for you. When you reply, it will also be translated back to English (US).

1 REPLY 1
gob0b
Level II

回复:创建 Excel 工作簿奇怪的行为

由于 try 和 if 语句中的注释风格, script 标记破坏了部分代码,在下面重新发布,没有注释以提供工作代码。

::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" );

This post originally written in English (US) has been computer translated for you. When you reply, it will also be translated back to English (US).