こんにちは、
私は2つの問題を抱えていますExcelワークブックを作成するJMPスクリプトを呼び出して、ここにいる誰かが私に洞察を与えてくれることを願っています。
私は走っていますJMPプロ15.2.1オンウィンドウズ10 。非モーダルUIウィンドウを介してユーザーによって更新される非表示のテーブルのペア(以下の:: dt_wjと:: dt_ma)を維持しているスクリプトがあります。このウィンドウのボタンの1つは、以下のコードを介して、ユーザーの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テーブルの1つの列の2つに大きなID番号が含まれています(それぞれ12桁と16桁)JMPの文字列に保持されている(それらは実際には数字ではなく識別子なので)。私が(今のところ手動で)tempフォルダーのExcelファイルを開くと、保存元のJMPテーブルの列が間違いなくCharacter / Nominalであっても、これらの列は数値または一般としてExcelに読み込まれます。Excelは16桁の数値を処理できず、最後の2桁を切り捨て、12桁の数値を科学的記数法に変換して、両方の識別子を使用できないため、これは問題があります。JMPがExcelファイル自体を生成している場合は、プロセス内で最も近いJMPアナログデータ型と一致するようにExcel列のデータ型を設定できるはずです。
データテーブルごとに一時CSVファイルを生成し、それらをJMPにプルバックすることで、これを回避しようとしました。テキストファイルをロード、列を調整して、のさまざまな組み合わせを読み取りますEval Insert( "= TEXT(^ regexresult [1] ^、\!" ############ \! ")" )またはEval Insert( "= '^ regexresult [1] ^")または、列データで3重引用符を試すなど、ExcelのCSV処理について見つけた奇妙なものです。これのどれも私のデータを自動分類してそれを台無しにしようとすることに優れているようには思えないので、代わりにJMPにこれを正しい方法で行わせる方法があることを本当に望んでいます。
3番目の動作があります回避したいのですが、Run Programで起動されたExcelインスタンスが終了するまで、JMPが応答しなくなりますが、それは解決すべきより大きな問題であり、その解決はここでの私の主な目標の2番目です。
試してみるべきことについての洞察やコメント/提案は大歓迎です、ありがとう!
スクリプトタグは、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" );