你好
我有兩個問題創建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" );