我在SAS中创建了一个html输出
ods html style=analysis body="...html" ;
proc print data=test;
title= 'test ' ;
run;
ods html close;
表格还可以,但我希望这个表格更具互动性。 。 。 这个表是否有任何方式可以为列设置过滤器,就像excel电子表格那样,以便用户可以按名称或其他特征过滤掉?我的桌子太大了,不太方便。 。 。 SAS有这样的选择吗?
答案 0 :(得分:2)
我建议查看Tableeditor tagset。这是SAS提供的标记集,可用于创建表,包括可过滤/可排序表。
该文章中您使用的具体代码如下:
ods tagsets.tableeditor file="c:\temp.html"
options(autofilter="yes"
autofilter_width="7em"
autofilter_table="1"
) style=styles.mystyle ;
proc print data=sashelp.orsales(obs=100);
run;
ods tagsets.tableeditor close;
这假设您正在尝试制作本地HTML文件。如果你想把它放在网上供某人使用,你应该使用SAS / Intrnet和/或各种BI包。
您还可以使用ods excel
(在9.4 TS1M0中)或ods tagsets.excelxp
(在9.1.3-9.4中)生成excel文件,这两个文件都直接具有自动过滤选项。
答案 1 :(得分:2)
为了获得最佳效果,我使用了jQuery数据表:
此处显示了具有多列过滤的表的示例:
https://datatables.net/examples/api/multi_filter.html
首先,我采用SAS生成的现有HTML输出并手动修改它,直到您获得jQuery数据表工作。我先从一个简单的过滤器开始,然后尝试一个多列过滤器。一旦完成这项工作,您将知道SAS生成的最终文件必须是什么样的。
要在SAS中实现这一点,我创建2个模板文件,它们实际上是HTML文件(标题)的顶部,以及HTML文件的底部(页脚)。您将自己在您选择的HTML编辑器/文本编辑器中构建它们。
SAS将创建中间的所有内容,这几乎就是<TABLE> ... </TABLE>
。您可以使用我认为的ODS声明中的BODY
选项来执行此操作。
在SAS中,您将读入头文件并将其输出到目标文件名。然后,您将使用ODS将表附加到同一目标文件。最后,您将读取页脚文件并将其附加到同一目的地。
如果您不想使用&#39;模板&#39;文件,您甚至可以让SAS使用put
语句在ODS执行此操作之前和之后将必要的HTML写入文件。
答案 2 :(得分:1)
为了完全扩展解决方案我自己和Rob概述,这里是构建包含jQuery数据表插件的新标记集的基本代码。
(格式化的道歉 - 必须将它全部包装在<code><pre>
块中,以便保留脚本标记)
首先创建标记集,将路径(绝对或相对于html位置)修改为jQuery,Datatables和Datatable CSS。如果您选择或工作,可以将标记集写入永久库。
使用jQuery 1.4.2和Datatables 1.7.0 beta 2测试(刚才写的!)
我还修改了Datatables插件,以便正确排序SAS date9值,但这不在本文的范围内。
%LET LIB= work ;
%MACRO BUILD_TAGSET(TAGSET=,COLS=) ;
ods path &LIB..TEMPLAT(UPDATE) SASSTORE.TEMPLAT(READ) SASUSER.TEMPLAT(READ) SASHELP.TMPLMST(READ) ;
/* EVENTROW is the number of rows generated within the THEAD element of the report, i.e. the
last row is the row to which the TH elements have the event listeners added by jQuery.
COLS is the number of columns on the report. Not usually required.
By default all columns are searchable and sortable */
proc template ;
define tagset &TAGSET ;
parent=tagsets.htmlcss ;
define event initialize ;
do / if $options["EVENT_ROW"] ;
set $event_row $options["EVENT_ROW"] ;
else ;
set $event_row '1' ;
done ;
do / if $options["TABLEID"] ;
set $tableid $options["TABLEID"] ;
else ;
set $tableid 'default_table' ;
done ;
end ;
define event doc_head ;
start:
put "<head>" NL ;
put "<script language='javascript' type='text/javascript' src='/media/js/jquery.js'></script>" NL
"<script type='text/javascript' language='javascript' src='/media/js/jquery.dataTables.js'></script>" NL
"<script type='text/javascript' charset='utf-8'>" NL
" $(document).ready(function() {" NL
" oTable = $('#" $tableid "').dataTable({" NL
" 'bJQueryUI': false," NL
" 'iDisplayLength': 50," NL
" 'sPaginationType': 'two_button'," NL
%IF &COLS ne %THEN %DO ;
" 'aoColumns': [" NL
%DO _I = 1 %TO &N ;
" {'bSortable':true} " %IF &_I < &N %THEN %DO ; "," %END ; NL
%END ;
" ]," NL
%END ;
" 'bStateSave': false," NL
" 'iCookieDuration': 21600" NL /* SaveState cookie duration = 12 hours */
" });" NL
" } );" NL
"</script>" NL
"<link rel='stylesheet' type='text/css' href='/css/demo_table_jui.css'>" NL /* Change path to stylesheet here */
"<style type='text/css'>" NL
" #" $tableid " { margin-top: 12px }" NL
"</style>" NL
;
put VALUE NL ;
finish:
put "</head>" NL ;
end ;
define event header ;
start:
do /if cmp( htmlclass, "DataEmphasis") and cmp ( colstart, "1");
set $filter_row data_row;
put "</tbody>" NL;
put "<tfoot>" NL;
put "<tr class=""noFilter"">" NL;
done;
do /if cmp( row, $event_row) ;
put "<th" ; /* TH for last row in header */
else ;
put "<td" ; /* TD for non-last rows in header */
done ;
putq " id=" HTMLID ;
putq " headers=" headers /if $header_data_associations ;
putq " title=" flyover ;
trigger classalign ;
trigger style_inline ;
trigger rowcol ;
put ">" ;
trigger cell_value ;
finish:
trigger cell_value ;
do /if cmp( row, $event_row) ;
put "</th>" NL ;
else ;
put "</td>" NL ;
done ;
end ;
define event table_body;
put "<tbody";
put ">" NL;
finish:
do /if ^exist( $filter_row);
put "</tbody>" NL;
else;
put "</tfoot>" NL;
done;
end;
define event row;
do /if cmp(section, 'head') ;
put "<tr>" NL ;
done ;
finish:
put "</tr>" NL;
end;
define event data;
start:
do /if ^cmp( htmlclass, "DataEmphasis") and cmp ( colstart, "1");
put "<tr>" NL;
done;
do /if cmp( htmlclass, "DataEmphasis") and cmp ( colstart, "1");
set $filter_row data_row;
put "</tbody>" NL;
put "<tfoot>" NL;
put "<tr class=""noFilter"">" NL;
done;
trigger header /breakif cmp( htmlclass, "RowHeader");
trigger header /breakif cmp( htmlclass, "Header");
put "<td";
putq " id=" HTMLID;
putq " headers=" headers /if $header_data_associations;
putq " title=" flyover;
trigger classalign;
trigger style_inline;
trigger rowcol;
put " nowrap" /if no_wrap;
put ">";
trigger cell_value;
finish:
trigger header /breakif cmp( htmlclass, "RowHeader");
trigger header /breakif cmp( htmlclass, "Header");
trigger cell_value;
put "</td>" NL;
end;
end ;
run ;
ods path &LIB..TEMPLAT(READ) SASSTORE.TEMPLAT(READ) SASUSER.TEMPLAT(READ) SASHELP.TMPLMST(READ) ;
%MEND BUILD_TAGSET ;
%BUILD_TAGSET(TAGSET=&LIB..datatables) ;
然后,只要您想使用标签集,请指定ODS路径:
ods path &LIB..TEMPLAT(READ) SASSTORE.TEMPLAT(READ) SASUSER.TEMPLAT(READ) SASHELP.TMPLMST(READ) ;
然后使用ODS TAGSET创建输出,例如
ods &LIB..datatables body="c:\Datatable.htm" style=styles.sasweb options (event_row='1' tableid='table1') ; proc report data=sashelp.class style(REPORT)={htmlid='table1'} ; run ; title; ods &LIB..datatables close ;
答案 3 :(得分:0)
是的。这是一篇非常好的文章的链接。 http://www2.sas.com/proceedings/forum2008/266-2008.pdf
在第10页,它解释了一切。
如果您熟悉javascript,这应该不是您的问题。只包括
headtext='<SCRIPT LANGUAGE=JAVASCRIPT TYPE="TEXT/JAVASCRIPT"
SRC="c:\temp\sorttable.js"></script>'