xlsxファイルを読み込みたい(DDE)

スポンサーリンク
スポンサーリンク

概要

・xlsxファイルを読み込みます。
・DDEを利用します。
・DDEはこの記事執筆時点でとても古い技術です(1980年代)。
・環境を選びます。
・infileステートメントを使います。
・注意事項は最下部で。


コード

* 読み込むExcelファイルを指定;
%let path     = C:\Users\xxxx\Documents;
%let exfile   = sample.xlsx;
%let tgtsheet = Sheet1;

* Excelファイルを開く;
%sysexec "&path.\&exfile.";

* エクセルの起動待ち(状況に応じて任意に変更する);
data _null_;
  x = sleep(10);
run;

* ExcelシートをDDE経由で読み込み;
filename EXL_DDE dde "Excel|[&exfile.]&tgtsheet.!r1c1:r100c20";

data IN_020_EX;
  length VAR1 - VAR20 $100;
  infile EXL_DDE notab dlm = "09"x dsd missover lrecl = 30000 firstobs = 2;
  input VAR1 - VAR20;
run;

* Excelを閉じる;
filename AAA dde "excel|system" ;
data _NULL_;
  file AAA;
  put "[close()]";
run;

* リソース解放;
filename EXL_DDE clear;
filename AAA clear;

ポイント

  • %sysexec でExcelファイルを開き、
  • filenameで、SASから起動中のExcelの指定シート・指定範囲へDDE接続し、
  • infileでタブ区切り(dlm=”09″x)のテキストとして読み込む。
  • Excel終了は excel|system にコマンドを送る。

背景事情

CSVファイルはinfileでシンプルに読み込めます。
では、同じようにExcel(.xlsx)をinfileで読めるのか?という疑問がよくあります。

結論から言えば、xlsxファイルそのものはinfileでは読めません
なぜなら、xlsxは内部的にZIP圧縮されたXMLファイル群であり、テキストファイルではないからです。
拡張子を.zipに変えると解凍でき、中身はXMLのテキストですが、人間やSASが直接扱うには面倒な構造です。

しかし、例外的に DDE(Dynamic Data Exchange)を利用することで「Excelが展開したシート内容」をinfileで読み込むことは可能です。
この記事ではその方法の紹介をしています。


DDEは古いけど現場で残っている理由

安定しているから。
DDEはたしかに古い技術ですが、
・大きなファイルでも落ちにくい。
・数値と文字が混ざる列でも欠損化しない。
といった安定性があり、現場では今でも普通に使われています。


注意事項

  • Windows限定(Excel必須、Linux/Unixでは不可)。
  • SASとExcelのビット数一致が必要(64bit同士など)。
  • Excelの状態に依存:保存確認ダイアログなどが出ると止まる。
  • 文字コード問題:Unicode SAS環境では日本語が文字化けする場合あり。
  • サーバー不可:SAS StudioやSAS Viyaでは使えない。

コメント