熊勇超夏蘭芳宋渝丹陳 浩王 園王 林△
?
Tagsets.ExcelXP語句在SAS導出到Excel的方法應用
熊勇超1夏蘭芳2宋渝丹3陳 浩1王 園1王 林1△
1.中國疾病預防控制中心政策研究與健康傳播中心(102206)
2.北京法瑪蘇提克咨詢有限公司
3.中國疾病預防控制中心科技處
SAS系統被譽為專業的統計分析標準軟件之一,具有強大的數據處理和數據分析功能[1-4]。當有的用戶在操作系統平臺上沒有安裝SAS軟件時,傳遞和共享SAS數據或報表時會存在困難。Microsoft excel是在平時辦公中運用十分廣泛的數據處理和分析軟件[5],為更加有效地實現SAS數據或報表的傳遞和共享,可以通過將SAS數據或分析結果導出到Microsoft excel文件中。目前,我國還沒有相關文獻介紹該方法的應用,本文將闡述如何采用ODS Tagsets.ExcelXP語句把SAS數據或報表導出為可以用Microsoft excel打開的文件。
1.ODS
ODS是SAS Base軟件中可以控制輸出方法及輸出結果的形式,ODS對象的常用輸出目標有OUTPUT、LISTING、HTML、RTF和PDF等。本文介紹ODS對象的輸出目標之一Tagsets,控制其輸出結果為可以用excel打開的XML格式文件,同時采用Tagsets.ExcelXP可以創建包含有多個工作表的excel工作簿。
2.Tagsets.ExcelXP語法及應用
下面基本的SAS代碼可用來創建excel工作簿:
①
ods _all_ close;
title J =C“Description”;
footnote J =C“Executed:&sysdate9.&systimeSAS Version:&sysver.”;
②
ods Tagsets.ExcelXP file =“d: est.xml”style =printer
③
options(embedded_titles =“yes”
embedded_footnotes =“yes”
autofilter =“1-2”
frozen_headers =“3”
frozen_rowheaders =“1”
absolute_column_width =“12”
autofit_height =“yes”
sheet_name =“Class”
proc print data =sashelp.class noobs label;
run;
④
ods Tagsets.ExcelXP close;
該程序的輸出結果為:

語句①是將ODS所有其他的輸出對象全部關閉,本程序只輸出可以用Excel打開的“xml”文件;語句②指定ODS Tagsets.ExcelXP對象,其中file =“d: test.xml”指定了存儲在本地磁盤目錄D下的可用excel打開的“xml”格式文件test。Style選項控制整個輸出文件的布局和格式,如字體,字號,背景顏色等,運行以下SAS代碼可顯示SAS中ODS可用的所有Style名稱。
ods _all_ close;
ods listing;
當問及“你知道超市中商品上的條形碼表示什么含義嗎?”時,國際貿易專業55%的學生表示知道,市場營銷專業84%的學生表示明白;當問及“你知道如何來評定茶葉的質量嗎?”時,國際貿易專業42%的學生表示知道,市場營銷專業79%的學生表示知道如何評定茶葉的質量;當問及“你知道如何來鑒別滌綸、錦綸、腈綸嗎?”國際貿易專業12%學生知道如何來鑒別這幾種紡織纖維,市場營銷專業46%的學生知道如何來鑒別這幾種紡織纖維。
proc template;list styles;run;quit;
語句③是用來控制excel工作簿的屬性和功能,在ODS語句中控制tagset選項是通過opions來實現的,Tagsets.ExcelXP可以實現許多的選項功能,運行下面的SAS代碼,所有tagset選項輸出到SAS日志窗口中。
filename temp temp;
ods Tagsets.ExcelXP file =temp options(doc =′help′);
ods Tagsets.ExcelXP close;
filename temp clear;
語句④是結束ods Tagsets.ExcelXP語句。
下面將重點介紹幾種常用的Tagsets選項,如語句③所示,本例中運用了9個Tagsets選項。embedded_ titles和embedded_footnotes是分別用來指定是否輸出數據或報表的標題和尾注,其默認值“no”。當需要輸出數據或報表的標題和尾注,程序員除了要指定SAS程序中title和footnote語句,還要在ODS Tagsets選項中指定embedded_titles =“yes”和embedded_footnotes=“yes”;autofilter選項用來實現數據或報表的篩選功能,其默認值為“none”,當指定autofilter =“all”時,所有的列標題右側均有一個篩選按鈕,有時需要某一列或某幾列有篩選按鈕,此時指定autofilter等于需要指定列的序號;有時為了查看數據或報表方便,需要凍結工作表的行和列,frozen_headers和frozen_rowheaders是用來實現該功能的,其默認值為“no”。當需要凍結工作表的前三行和左一列時,可指定frozen_headers =“3”和frozen_rowheaders =“1”來實現;absolute_column_width是用來指定輸出工作表列的絕對寬度,其默認值為“none”;autofit_height,默認值為“no”,指定為“yes”時可以自動調整行高;sheet_name用來指定輸出工作表的名稱,默認值為“none”;sheet_interval該選項控制輸出的excel工作簿中含有幾個工作表,默認值為“table”單個工作簿中只會有一個工作表,當指定為“bygroup”時by變量的每個值都會作為一個工作表,指定為“proc”時每個SAS過程輸出的內容作為一個工作表。
3.單個工作薄中輸出多個工作表的SAS實現
下面這段程序可以實現在單個工作簿中輸出多個工作表的功能:
ods _all_ close;
title J =C“Description of Class”;
footnote J =C“Executed:&sysdate9.&systimeSAS Version:&sysver.”;
ods Tagsets.ExcelXP file =“d: est.xml”style =printer
options(embedded_titles =“yes”
embedded_footnotes =“yes”
autofilter =“1-2”
autofit_height =“yes”
frozen_headers =“3”
frozen_rowheaders =“1”
absolute_column_width =“12”);
⑤
ods Tagsets.ExcelXP options(sheet_name =“Class _Female”
sheet_interval =“none”);
proc print data =sashelp.class noobs label style (header)=[just =center];
where sex =“F”;
run;
⑥
ods Tagsets.ExcelXP options(sheet_name =“Class _Male”
sheet_interval =“none”);
proc print data =sashelp.class noobs label style (header)=[just =center];
where sex =“M”;
run;
ods Tagsets.ExcelXP close;
該程序的輸出結果為:

單個工作簿中輸出多個工作表的實現方法有多種,正如上文所介紹的sheet_interval選項,當指定為“bygroup”或“proc”時均可以實現該功能,但是要在單個工作簿中輸出多個工作表的同時分別指定每個工作表的名稱時,可以采用以上的SAS程序,如⑤和⑥所示對每個輸出的工作表分別指定sheet_name和sheet_ interval選項。
在實踐中往往會遇到將指定的整批SAS數據集導出為excel文件,以下這段程序可以幫助我們實現這一功能:
proc sql noprint;
create table cur_data as select memname from dictionary.tables
where libname =“SASUSER”order by memname;
select count(distinct memname)into:dscnt from cur_data;
%let dscnt =&dscnt;
select distinct memname into:ds1-:ds&dscnt from cur_data order by memname;
quit;
title J =C“Description”;
footnote J =C“Executed:&sysdate9.&systimeSASVersion:&sysver.”;
ods Tagsets.ExcelXP file =“d: test_many.xml”style =printer
options(embedded_titles =“yes”
embedded_footnotes =“yes”
autofilter =“1-2”
autofit_height =“yes”
frozen_headers =“3”
frozen_rowheaders =“1”
absolute_column_width =“12”);
%macro sas2xls;
%do i =1%to &dscnt;
ods Tagsets.ExcelXP options(sheet _ name =“&&ds&i.”
sheet_interval =“none”);
proc print data =sasuser.&&ds&i.noobs label style (header)=[just =center];run;
%end;
%mend sas2xls;
%sas2xls;
ods Tagsets.ExcelXP close;
上面的程序可以把SAS軟件自帶的SASUSER庫中的所有數據集全部導出到D盤的test_many文件中;如果輸出該庫中除某個數據集外的所有數據集,可以將該不輸出數據集名字從cur_data中刪掉。

本文介紹的ODS Tagsets.ExcelXP語句是實現SAS數據或報表輸出到excel文件最基本、最常用的SAS程序。當有其他格式要求時,可以通過設置語句中style和options選項控制excel輸出的各種外觀和功能,此外,其他相關內容可以參考SAS相關文獻[6]。
單個excel工作簿中輸出多個工作表時,style選項(如文章中的style =printer)控制了整個excel文件的格式,如果在上段程序中⑤和⑥中再指定其他的style是無效的。在這種情況下,可以在具體的proc過程中指定style選項來實現該工作表的外觀屬性。在實踐中,如果想把某個文件夾中的所有數據集輸出為excel文件,可以將該文件夾路徑添加至SAS Library中,如命名為BJ,然后采用本文中的程序將BJ庫中的所有數據集導出。
本文采用ODS Tagsets.ExcelXP語句輸出的文件后綴是“xml”,是可以用excel打開的,如果產生的是“xls”或“xlsx”文件,用excel 2007/2010打開時會彈出警告對話框,但仍可以打開。Ods Tagests.ExcelXP語句要求在SAS Base9.1.3及以上版本使用,并且要求excel 2002及其以后的版本。
將SAS數據導出到excel的方法除了上文所介紹的方法,還有其他方法,例如SAS菜單欄下導出數據選項、export過程、ods csvall語句、libname語句等等,但是這些方法僅限于數據集的導出,不能輸出SAS過程產生的結果,也不能實現對輸出文件的背景顏色、字體、字號、格式等excel外觀和功能的控制,這是ODS Tagsets.ExcelXP語句最大的優點。ODS Tagsets.ExcelXP可以將數據集或者SAS過程的結果輸出到excel文件中,但是不支持圖像的輸出,因此不能與SAS/ GRAPH軟件的過程聯合使用[6]。
參考文獻
[1]王詩遠,劉沛.流行病學調查報告數據標準化入口的SAS實現.中國衛生統計,2013,30(1):114-118.
[2]李洪興,董國慶,王麗,等.SAS軟件在公共衛生監測數據核查中的應用.中國衛生統計,2012,29(5):749,751.
[3]裴磊磊,任琳,高文龍,等.集中指數及可信區間的SAS實現.中國衛生統計,2013,32(3):390-392.
[4]夏蘭芳,孟郁潔,李迎迎,等.多選題數據統計分析方法及SAS實現.中國衛生統計,2015,32(1):163-164.
[5]宋廷山,王堅,姜愛萍.應用統計學:以EXCEL為分析工具.北京:清華大學出版社,2012.
[6]DelGobboV.Some Techniques for Integrating SAS Output with Microsoft Excel Using Base SAS.Proceedings of the SAS Global Forum 2013 Conference.Cary,NC:SAS Institute Inc.
(責任編輯:劉 壯)
通信作者:△王林,E-mail:wanglin@ chinacdc.cn