楼主: zeugin
37694 34

[原创博文] SAS输出结果能导出到excel中吗? [推广有奖]

21
zyq111 发表于 2009-12-17 23:32:05 |只看作者 |坛友微信交流群
这个不错 学习中。。。

使用道具

22
xiaopang0830 发表于 2009-12-18 16:19:43 |只看作者 |坛友微信交流群
将数据集插入到指定的sheet页,还有一种笨方法 可以sas和VBA混合使用.通过sas调用excel已经写好的VBA宏.
下面是我自己以前写的一个宏,可能代码不是很好看.但是能实现基本的功能.适用于html,csv文件.默认excel文件和要导入到excel的文件存放在同一目录下.excel中有事先写好的宏.

SAS代码:
%let excelpath=E:\DDE\sasdatatoexcel\;
/*excel文件所在路径注意最后面的'\'符号*/
%macro toxls(excelname,sheetname,filename);
/*变量说明:*/
/*excelname-要导入数据的excel文件名*/
/*sheetname-sheet名*/
/*要导入到excel的文件名*/
/*打开excel程序*/
options noxsync noxwait xmin;
filename sas2xl dde 'excel|system';
data _null_;
length fid rc start stop time 8;
fid = fopen('sas2xl','s');
if (fid le 0) then do;
rc = system('start excel');
start=datetime();
stop=start+10;
do while (fid le 0);
  fid= fopen('sas2xl','s');
  time=datetime();
  if (time ge stop) then fid =1;
end;
end;
rc=fclose(fid);
run;
/*将文件导入到指定excel文件名的指定sheet*/
filename excel DDE "EXCEL|SYSTEM";
filename export DDE "EXCEL|sheetname!r1c1:r100c100" notab;
data _null_;
  file excel;
  put "[open(""&excelpath.&filename"")]";
  put "[open(""&excelpath.&excelname"")]";
  put "[run(""base"")]";
run;
data _null_;
  file export dlm='09'x;
  put "&sheetname";
  put "&excelname";
  put "&filename";
run;
data _null_;
  file excel;
  put "[run(""toxls"")]";
  put "[run(""deletesht"")]";
  put "[save]";
run;
%mend;


VBA代码:
Function WorksheetExists(wb As Workbook, sName As String) As Boolean
Dim s As String
On Error GoTo ErrHandle
s = wb.Worksheets(sName).Name
WorksheetExists = True
Exit Function
ErrHandle:
WorksheetExists = False
End Function

Sub crtsht()
Dim shtname As String
shtname = Sheets("sheetname").Cells(1, 1)
If WorksheetExists(ThisWorkbook, shtname) = False Then
    Sheets.Add.Name = shtname
Else
    Application.DisplayAlerts = False
    Sheets(shtname).Delete
    Sheets.Add.Name = shtname
End If
End Sub

Sub base()
Dim str As String
str = "sheetname"
If WorksheetExists(ThisWorkbook, str) = False Then
    Sheets.Add.Name = str
Else
    Sheets(str).Select
End If
End Sub

Sub deletesht()
    If WorksheetExists(ThisWorkbook, "sheetname") = True Then
        Application.DisplayAlerts = False
        Sheets("sheetname").Select
        Cells.Select
        Selection.Clear
        Sheets("sheetname").Delete
    End If
End Sub

Sub toxls()
    Dim shtname As String
    Dim excelname As String
    Dim filename As String
    shtname = Sheets("sheetname").Cells(1, 1)
    excelname = Sheets("sheetname").Cells(2, 1)
    filename = Sheets("sheetname").Cells(3, 1)
    If WorksheetExists(ThisWorkbook, shtname) = False Then
        Workbooks(filename).Sheets(shtname).Move After:=Workbooks(excelname).Sheets(ActiveWorkbook.Sheets.Count)
    Else
        Application.DisplayAlerts = False
        Sheets(shtname).Delete
        Workbooks(filename).Sheets(shtname).Move After:=Workbooks(excelname).Sheets(ActiveWorkbook.Sheets.Count)
    End If
End Sub

使用道具

23
zeugin 发表于 2009-12-18 19:57:29 |只看作者 |坛友微信交流群
proc export data=a outfile="路径" dbms=excel replace;
run;
好不容易自己掌握了哈

使用道具

24
haikuoxinkong 发表于 2009-12-19 13:40:28 |只看作者 |坛友微信交流群
到Word很容易 excel还没试过 不过我朋友做过 编程实现的 我问一下告诉你把
sas

使用道具

25
drhseu 发表于 2009-12-19 15:55:24 |只看作者 |坛友微信交流群
proc import

使用道具

26
SAS爱好者哦 发表于 2009-12-22 21:22:55 |只看作者 |坛友微信交流群
我也不知道

使用道具

27
yunai1988 发表于 2011-3-1 21:40:18 |只看作者 |坛友微信交流群
lwien007 发表于 2009-11-26 15:21
可以先利用ods csvall输出为csv,然后自动转换成excel,比较麻烦。
  1. ods listing close;
  2. ods csvall body='d:\tmp.csv';
  3. proc means data=sashelp.class;
  4.         var height;
  5. run;
  6. ods csvall close;
  7. ods listing;
  8. filename dst dde'excel|system';
  9. data _null_;
  10.         rc=system('start excel');
  11. run;        
  12. data _null_;
  13.         x=sleep(5);
  14. run;
  15. data _null_;
  16.         file dst;
  17.         put '[open("d:\tmp.csv")]';
  18.         put '[save.as("d:\tmp.xls",1)]';
  19.         put '[file.close()]';
  20.         put '[quit()]';
  21. run;
复制代码
太感谢这位高手了,有用到

使用道具

28
platypus 发表于 2012-8-6 10:44:24 |只看作者 |坛友微信交流群
ods tagsets.ExcelXP
正解
机会稍纵即逝,且只给有准备的人。

使用道具

29
tmdxyz 发表于 2013-4-17 09:51:44 |只看作者 |坛友微信交流群
lwien007 发表于 2009-11-26 15:21
可以先利用ods csvall输出为csv,然后自动转换成excel,比较麻烦。
衷心感谢。有用到。

使用道具

30
feifeichen 发表于 2013-4-17 13:19:21 |只看作者 |坛友微信交流群
每个过程都有自己的output或ODS,可以选择将结果输出到数据集中.
再用export过程可以直接输出.
而且可以在data步或sql过程中先整理成自己相要的格式.
我都是这样干的.

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-19 15:04