使用ODS Excel

时间:2016-04-14 18:53:11

标签: sas

尝试导出SAS" proc freq"使用带有SAS 9.4的Enterprise指南7.12在Windows上生成Excel文件(xlsx)。 以下代码示例:

ODS EXCEL
file='C:\Download\example.xlsx'
STYLE=HtmlBlue
OPTIONS ( sheet_interval="none" sheet_name="Results" );

data example;
input ins_cd$ 1-2 decl_aatrim $ 4-8 prog $ 10-13 compt $ 15-18;
cards;
02 20153 7646 XC12
02 20153 7646 AB02
02 20153 7646 CC13
02 20153 9999     
02 20153 7595 PS03
02 20153 7595 PS04
02 20153 6080 XC12
02 20153 6080 XC15
02 20153 6080 CC18
02 20153 6080 DC08
;

proc sort data=example;
by ins_cd decl_aatrim prog compt;
run;

data example2;
set example;
by ins_cd decl_aatrim prog compt;
if first.prog=1 then do;
test=first.prog;
rank=1;
retain rank 1;
end;
else rank=rank+1;
run;

proc freq data=example2;
tables prog*compt;
run;

ods EXCEL close;

在结果查看器中按预期输出freq表,每个prog有四行,如下所示:(截断为较少的复制粘贴,freq行标签值粗略翻译):

                           compt                            
                AB02    CC13    CC18    [...]
prog        
6080    Freq       0       0        1      1       0       0        1      1                            
        Pct     0.00    0.00    11.11   11.11   0.00    0.00    11.11   11.11
        row pct 0.00    0.00    25.00   25.00   0.00    0.00    25.00   25.00
        col.pct 0.00    0.00    100.00  100.00  0.00    0.00    50.00   100.00
7595    Freq       0       0        0       0      0 [...]
[...]

但是当ods生成的xlsx文件在Excel中打开时,freq表看起来像这样:

prog                    compt                               
Freq
Pct
row pct
col.pct     AB02    CC13    CC18    DC08    PS03    PS04    XC12    XC15    Total
6080           0       0       1       1
            0.00       0   11.11 [...]
            0.00    0.00   25.00
            0.00    0.00  100.00
7595           0
            0.00 [...]

并且具有freq计算的四个单元格被合并到每个prog的一个单元格和行中。

这个http://support.sas.com/kb/32/115.html似乎与我的问题有关,但是提议的交叉列表解决方案也没有在Excel中提供所需的输出。 有任何想法吗?谢谢!

2 个答案:

答案 0 :(得分:0)

如果您可以使用Proc Tabulate。无论如何,您可以更好地控制桌面和外观。

答案 1 :(得分:0)

这是由PROC FREQ的工作原理引起的,而ODS HTML解决方案(您称之为结果查看器)也没有什么不同。请注意它有:

<td class="r t stacked_cell data"><table width="100%" border="0" cellpadding="7" cellspacing="0">
<tr>
<td class="r t data top_stacked_value">1</td>
</tr>
<tr>
<td class="r t data bottom_stacked_value">11.11</td>
</tr>
</table></td>

内部每个单元格中 - 所以一个主表格单元格中有一个迷你表格,其中包含freq / rowpct / colpct / totalpct(或者在上面的情况下,两个元素在一个底部标题)。

您可以通过多种方式解决此问题。正如Reeza在另一个答案中指出的那样,一种选择是使用PROC TABULATE

另一种选择是通过PROC TEMPLATE编写自己的表格模板;毕竟,PROC FREQ的交叉表是如何完成的;你可以看看他们是如何做到这一点并改变它的。

第三种选择是对此输出进行后处理;由于生成的表具有您想要的所有数据,而不是行,您可以轻松编写VBA例程以将格式更改为所需的格式。