2020年6月14日

〔SAS〕使用ODS EXCEL將報表匯出為XLSX檔

長久以來SAS程序產出的報表,大都透過ODS HTML將報表轉EXCEL檔,之前介紹過ODS TAGSETS.EXCELXP的語法(後續簡稱ExcelXP),也很少被使用來處理報表轉EXCEL檔的需求。

ODS HTML應只是將HTML報表的副檔名改為XLS,WIDOWS系統在預設環境下,自然會以EXCEL開啟,算是一種偷吃步吧,但每次開啟檔案,EXCEL均會出現警告「’OOO.xls’的檔案格式與副檔名不相符。此檔案可能已損毀或不安全。除非您信任此檔案的來源,否則請勿開啟此檔案。您仍要開啟此檔案嗎?」(如下圖)。

’OOO.xls’的檔案格式與副檔名不相符。此檔案可能已損毀或不安全。除非您信任此檔案的來源,否則請勿開啟此檔案。您仍要開啟此檔案嗎?

雖然只是按一個「是(Y)」就可開啟,但檔案很多時,還是挺煩人的。而且就算使用ExcelXP來匯出報表,依然會出現相同的警告,因為ExcelXP所產生的EXCEL檔不是原生的EXCEL檔格式(native Excel format (.xlsx)),詳情請參考ODS TAGSETS.EXCELXP and ODS EXCEL SHOWDOWN

先以PROC MEANS的報表來比較三組語法和報表樣式的差異。依慣例產生一個模擬檔,語法如下:

data base1;
    do i=1 to 100;
        do x= 1 to 2;
            y1=abs(normal(12)*1*x+1);
            y2=abs(normal(12)*2*x+2);
             y3=abs(normal(12)*3*x+3);
            y4=abs(normal(12)*4*x+4);
            output;
        end;
    end;
run;

ODS HTML的語法

filename odsout "e:\temp\odsexcel\";
ods html file='結果-html.xls'    metatext='charset=big5'  path=odsout  style=printer; 
ods results off;

     proc means data =base1 n mean std p25 p50 p75 maxdec=2;
        class x;
        var y1-y4;
    run;

ods html close;
ods results  on; ods html ;

「結果-html.xls」中報表樣式如下圖。

ODS TAGSETS.EXCELXP的語法

ods tagsets.excelxp path="e:\temp\odsexcel\" file="結果-tagsets.xls"  style=printer;
ods results off;
     proc means data =base1 n mean std p25 p50 p75 maxdec=2;
        class x;
        var y1-y4;
     run;
ods tagsets.excelxp close;
ods results  on;

「結果-excelxp.xls」中報表樣式如下圖。

ODS EXCEL的語法

ods excel file="e:\temp\odsexcel\結果-odsexcel.xlsx"  style=printer;
ods results off;
     proc means data =base1 n mean std p25 p50 p75 maxdec=2;
        class x;
         var y1-y4;
    run;
ods excel close;
ods results  on;

「結果-odsexcel.xlsx」中報表樣式如下圖。


接下來以PROC FREQ的報表來比較三組語法和報表樣式的差異。模擬檔語法如下:

data base2;
    do i=1 to 100;
        do x= 1 to 2;
         y1=RANTBL(23, 0.5,0.5) ;
        y2=RANTBL(23, 0.6,0.4) ;
        y3=RANTBL(23, 0.7,0.3) ;
        y4=RANTBL(23, 0.8,0.2) ;
        output;
        end;
    end;
    label y1="我是  Y1" ;
run;

ODS HTML的語法

filename odsout "e:\temp\odsexcel\";
ods html file='結果-freq-html.xls'    metatext='charset=big5'  path=odsout  style=printer; 
ods results off;

     proc freq data =base2 ;
        table (y1 Y2 y3 y4)*x;
     run;

ods html close;
ods results  on; ods html ;

「結果-freq-html.xls」中報表樣式如下圖,圖中箭頭所指處,當開啟檔案時候會發生不明的移位,讓後續整理報表時候產生困擾。

ODS TAGSETS.EXCELXP的語法

ods tagsets.excelxp path="e:\temp\odsexcel\" file="結果-freq-excelxp.xls" 
                             style=printer options (sheet_interval="proc" );
ods results off;
      proc freq data =base2 ;
        table (y1 Y2 y3 y4)*x;
    run;
ods tagsets.excelxp close;
ods results  on;

「結果-freq-excelxp.xls」中報表樣式如下圖,無發生位移。

ODS EXCEL的語法

ods excel file="e:\temp\odsexcel\結果-freq-odsexcel.xlsx"  
               style=printer options(sheet_interval="proc");
ods results off;
     proc freq data =base2 ;
         table (y1 Y2 y3 y4)*x;
    run;
ods excel close;
ods results  on;

「結果-freq-odsexcel.xlsx」中報表樣式如下圖,無發生位移且可爽快開啟。


結論:

如有將報表轉為EXCEL檔案的需求,建議以ODS EXCEL為主。除了語法相對精簡,所產生的EXCEL檔案為原生格式,可直接開啟,且報表樣式不會位移(應該吧~沒有試過所有的報表,如果發生移位狀況,請分享)。


參考文獻:

1.ODS TAGSETS.EXCELXP and ODS EXCEL SHOWDOWN.Christopher J. Boniface.2017.
2.The ODS Destination for Excel Tip Sheet.

沒有留言:

張貼留言