ラベル ods tagsets excelxp の投稿を表示しています。 すべての投稿を表示
ラベル ods tagsets excelxp の投稿を表示しています。 すべての投稿を表示

ods tagsets.excelxpで作成されたエクセルもどき(XML)をちゃんとしたEXCELファイルに変換するマクロの紹介

今回はただの公式情報紹介です。

以前、「9.4からODS EXCELでエクセルファイルが作れる話」
や
ods tagsets.excelxp絡みの記事で、

ods tagsets.excelxpだと、作成されるのはエクセルで開くことのできる
XML形式で、純粋なEXCEL形式じゃないから、一回開いてEXCEL形式で保存する必要があるとかって
話をしたことがあります。

9.4があればods excelでいいんですが、実際まだ9.4使っている現場ってそんな多くないと思います。多分。

で、最近知ったのですが、SASの公式で、
XML形式をEXCEL形式に変換するマクロが公開されていて、これを使えば一応ods tagsets.excelxpで作った
ファイルをEXCELにしてくれます。

使い方等も記述されているので、読んでその通りにやれば再現できるはずです。


見てみるとわかりますが、要はXMLをEXCELに変換するVBScriptをputで生成して、それを走らせて変換して貰ってるってことですね。
もはやSAS関係ないですね。

ただし、この方法でもods excelのようにグラフの画像を含めることはできないのでそこだけ注意してください。

9.4からODS EXCELでエクセルファイルが作れる話

連続投稿。
次は9.4の話です。持ってない方、すみません。家でuniversityで試してください。

SASからEXCELファイルを生成する方法はたくさんあります。

ただODS経由で、生成する場合、今まではods tagsets.excelxp というものがあったのですが、
弱点として

・純粋なXLS形式ではない(XML)ため、開くときにメッセージがでたりする。
・XLSX形式は生成できないこともあり、ファイルサイズが大きくなりがち
・グラフなどの画像の挿入にテクニックがいる(できなくはないらしいですが)

などなどがありました。
(ただ、EXCEL周りは難しいところが多いので、僕の話をあまり信用しないでください)

特にグラフ等の画像をEXCELに挿入するのは、中々悩ましいところで、僕は以前DDEでやってました。
それも、一旦画像を外部ファイルとしてどこかに保存し、それをddeでコピーしてエクセルに
ペタッと貼るというコードだったので、あまりスマートではないなぁと思ってました。

ところが9.4からODS EXCELという、名前そのままの機能が実装されました。
(またしても、もっと早く実装してよ!絶対要望あっただろ!アドイン製品ばっか売ろうと...まあこの辺にしておきましょう)

9.4をどうにか会社にぶち込みたい方は、素人にもわかりやすく便利な機能で、見た目おおっ!てなるので、これを武器に上司をうまく丸め込んでみるとか?(Universityでデモ作れるし)


さて使い方ですが、僕もまだ今日初めてなので、基本だけ

data Q1;
X='い';Y=1;Z=3;output;
X='い';Y=2;Z=1;output;
X='い';Y=3;Z=2;output;
X='ろ';Y=1;Z=2;output;
X='ろ';Y=2;Z=4;output;
run;

という適当なデータがあったとして、コードは

ods excel file='/folders/myfolders/example.xlsx'
 style=pearl
 options(sheet_interval='none' 
         heet_name='シート名'
         embedded_title='yes'); 

ods text='自由にテキスト入れれます';

proc print data=Q1 noobs;
run;

proc freq data=Q1;
tables X*Y;
run;

ods graphics / height=400 width=700;
proc sgplot;
 series x=y y=z/group=x;
run;

ods excel close;

結果は











































と、要はods excelとods excel closeの間にあるプロシジャ出力が
全部エクセル化されるよってことです。

DDEのように、セル番地を指定して、値を出力といった感じではなく、
デザインは完全にプロシジャのアウトプットに依存します。

きめ細かい書式のリスト出力が欲しいのであれば、proc reportとかでなんとか頑張りましょう。

ちなみに、このODS EXCELはエクセルがインストールされてない環境で使えます。
実際に上のサンプルは、入ってないやつで動かして、キングソフトとかで開いたものです。

ODS tagsets.excelxpでエクセルの関数式を仕込む

odsでエクセル(xml)ファイルを作成する際、以下のように書くことで
作成されるシートにエクセル関数を仕込むことができます。

data Q1;
X=1;Y=3;output;
run;


ods tagsets.excelxp file='D:\TEST.xls';
proc print data=Q1 noobs;
 var X Y;
 var X / style={tagattr="formula:sum(RC[-1]:RC[-2])"};
run;
ods tagsets.Excelxp close;









上の例だと、そんなもんデータステップで計算してからだせよって感じで終わりですが
例えば、VLOOKUP関数で他のエクセルからデータ持ってくるようにするとか、シチュエーションに
よってはエクセルの特性を活かすことができます。



tagsets excelxpでODS出力をエクセルファイルにする時に、セルの表示形式を設定する方法

例えば、以下のようなデータセットがあったとします。

data Q1;
IDNO='001';X='い';Y=1;output;
IDNO='002';X='ろ';Y=2.2;output;
run;






これに対して

ods tagsets.excelxp file='D:\A.xls';
proc print data=Q1 noobs;
 var IDNO X Y;
run;
ods tagsets.excelxp close;

とすれば、純粋なエクセルではないのでファイルが開く際に
確認のメッセージが入りますがOKすれば








こんな感じのエクセルファイルができると思います。

便利なのでちょっとした出力の際によく使うのですが、
これだとセルの表示形式が「標準」になってしまうため、「001」といったテキストが
1になってしまいます。

そういった場合に次のように書くことで回避できます。

ods tagsets.excelxp file='D:\B.xls';
proc print data=Q1 noobs;
 var IDNO/style={tagattr='format:text'};
 var X;
 var Y/style={tagattr='format:0.0'};
run;
ods tagsets.excelxp close;
















/style={tagattr='format:text'}と打つことで「文字列」とすることができ、

また/style={tagattr='format:0.0'};で有効表示桁数を設定できます。