你好,
我有兩個問題創建 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。當我檢查臨時文件夾時,我看到創建了一個臨時文件,但文件名在擴展名前附加了一個“-”:例如“ 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 的字符列中(因為它們並不是真正的數字而是標識符)。當我 (暫時手動)打開臨時文件夾中的 Excel 文件,這些列將作為數字或常規讀入 Excel,即使我要保存的 JMP 表中的列肯定是字符/名義。這是有問題的,因為 Excel 無法處理 16 位數字並截斷最後 2 位數字,並將 12 位數字轉換為科學計數法,從而使兩個標識符都無用。在我看來,如果 JMP 本身生成 excel 文件,它應該能夠設置 excel 列的數據類型以匹配流程中最接近的 JMP 模擬數據類型。
我嘗試通過為每個數據表生成臨時 CSV 文件然後通過將它們拉回到 JMP 來迴避這個問題加載文本文件,調整列以讀取各種組合評估插入( "=TEXT(^正則表達式結果[1]^,\!"############\!")" )或者評估插入( "='^regexresult[1]^") 甚至是我發現的一些有關 excel CSV 處理的奇怪內容,例如在列數據中嘗試使用三重雙引號。這些似乎都無法讓我繞過 Excel 嘗試自動分類我的數據並破壞它的情況,所以我真的希望有一種方法可以讓 JMP 以正確的方式做到這一點。
還有第三種行為我想迴避一下,即JMP 不會響應,直到退出通過運行程序啟動的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" );