【问题标题】:exporting sas stored process output导出 sas 存储过程输出
【发布时间】:2015-09-15 17:47:00
【问题描述】:

我创建了一个存储过程,但我想将输出导出到 Excel。我常用的导出语句在存储过程中不起作用。

%let _ODSDEST=none;
%STPBEGIN();
data x;
  set sashelp.class;
run;

proc export data=x outfile = "//my documents/sp_test.xlsx" dbms=xlsx replace;     
  sheet="table1"; 
run; 
* Begin EG generated code (do not edit this line); 
;*';*";*/;quit; 
%STPEND;

有没有办法让它在存储过程中工作?

【问题讨论】:

  • 你说它不起作用是什么意思?你在日志中得到错误吗?您的目标是让存储过程将 excel 文件返回给用户(什么客户端正在调用存储过程?)还是只是编写 excel 文件而不实际返回它?
  • 这个过程是在 web 上的 sas 门户上运行的。所以它将html输出到屏幕上。我也想让存储过程发送到excel。
  • 所以当用户从门户运行存储过程时,您希望他们获得一个文件下载对话框,以便他们可以保存 excel 文件?
  • 是的,这正是我想要的
  • 建议您使用当前的 STP 代码更新您的问题。或者更确切地说,使用 %STPbegin 等将 sashelp.class 导出到 excel 的简化版本。 .如果它正在工作(创建一个 excel 文件并将其写入服务器上的 /mypath 目录),将结果发送到 _webout 应该不需要太多更改(并设置适当的 html 标头)

标签: sas


【解决方案1】:

让存储过程返回一个 excel 文件(实际上在这种情况下它是一个 xml 文件,excel 会很高兴地打开)的一种方法是使用 ODS 来输出 tagsets.excelxp (xml)。

执行此操作时,您可以使用 stpsrv_header 修改 HTML 标头。第一条语句告诉浏览器用 excel 打开文件,第二条告诉它文件名。我相信要使此标头修改起作用,存储过程需要提供流式传输结果,而不是打包结果。但我可能是错的。

当我在下面运行时,我从浏览器中得到一个文件下载对话框,允许我打开或保存文件。我从存储过程 Web 应用程序运行,但从信息交付门户调用时应该可以正常工作。

%let _odsdest=tagsets.excelxp;
%let rc=%sysfunc(stpsrv_header(Content-type,application/vnd.ms-excel));
%let rc=%sysfunc(stpsrv_header(Content-disposition,attachment%str(;) filename=MyExcelFile.xls));

%stpbegin()
proc print data=sashelp.shoes (obs=&obs);
run;
%stpend()

【讨论】:

    【解决方案2】:

    您是否检查了您的拼写 proc exportd 和 outfile='mypath/my documents/myoutpt.xlsx' dbms=xlsx 或 outfile='mypath/my documents/myoutpt.xls' dbms=xls?你也可以试试ODS。

    【讨论】:

      【解决方案3】:

      您还可以尝试将您的 STP 设置为流式 Web 服务,删除 %STPBEGIN%STPEND 宏,并使用此宏发送到 _webouthttps://core.sasjs.io/mp__streamfile_8sas.html

      这样做的好处是您的代码随后也可以在 Viya 上运行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-15
        • 2011-06-01
        相关资源
        最近更新 更多