格式化导出SAS表格到Excel电子表格中的列

我使用ODS ExcelXP自动从SAS导出数据集到Excel:

  PURCHASE_ annual_ Minimum_ Obs APR fee Cash_Advance 1 23.45% NONE $10 2 23.45% NONE $10 3 23.45% NONE $10 4 18.45% NONE $10 5 18.45% NONE $10 6 18.45% NONE $10 7 23.45% NONE $10 8 23.45% NONE $10 9 23.45% NONE $10 10 23.45% $0 11 23.45% $0 12 23.45% $0 

在SAS中,这些列被格式化为文本,我希望所有的列都以文本forms导入到Excel中。 我已经使用下面的代码来使用PROC REPORT来创build文件:

 ods tagsets.ExcelXP path="H:/path" file="file.xls" style=myStyle options(frozen_headers='yes' WrapText='no' embedded_titles='yes' suppress_bylines='yes' sheet_interval='none' sheet_label=' ' sheet_name='Solicited' width_points='1' width_fudge='1' absolute_column_width='100' autofit_height='yes' zoom='100'); title1; proc report data=testing2 nowd; column purchase_APR annual_fee minimum_cash_advance; define purchase_APR / display style(column)={tagattr='format:@'} 'PURCHASE_APR'; define annual_fee / display style(column)={tagattr='format:@'} 'ANNUAL_FEE'; define minimum_cash_advance / display style(column)={tagattr='format:@'} 'MINIMUM_CASH_ADVANCE'; run; ods tagsets.ExcelXP close; 

但是,打开Excel文件时,文本字段已经以某种方式分别从23.45%$0$10 (文本)更改为0.234510 (文本)。

我怎样才能在Excel中获得输出就像在SAS中设置的数据?

我已经尝试使用特定的格式,让他们看起来相同(即tagattr='format:0.00%'等),但在Excel中的输出是数字,而不是文本格式。

正确的方法是修改模板如何处理数字。 在这种情况下,你可以很容易地做到这一点。 你甚至可以只是注释掉一行代码,但是这里是真正的答案。

在文本编辑器中打开模板 。 我们将添加几个参数,并实现它们。

首先,将选项添加到$ valid_options数组中。 有一堆这样的线,加上这两个(约635线左右):

 set $valid_options["TEXTPERCENT"] "This value forces percentages to be displayed as text"; set $valid_options["TEXTCURRENCY"] "This value forces currency amounts to be displayed as text"; 

该文本可以是任何你想要的,这是一个解释。 现在,在700行左右有一些行设置默认值,添加这两个:

 set $option_defaults["TEXTCURRENCY"] 'no'; set $option_defaults["TEXTPERCENT"] 'no'; 

现在下来(1670行左右),你有定义$标点符号的部分。 如果您设置了以下选项,我们将更改工作方式以从列表中删除“%”和“$”:

 set $punctuation $thousands_separator " "; set $punctuation $punctuation "%" /if ^$textpct; set $punctuation $punctuation $currency_sym /if ^$textcurr; 

(基本上,设置$ variable / if;我们设置标点符号以$ thousand_separator开始,如果它们是“no”,则添加其他位)。

现在在“是/否开/关选项…”部分的2100行左右,我们评估选项的价值。 (之前使用这些值,但没关系;实际上是在稍后调用。)

 set $option_key 'TEXTPERCENT'; trigger do_yes_no; eval $textpct $answer; set $option_key 'TEXTCURRENCY'; trigger do_yes_no; eval $textcurr $answer; 

最后,我们执行的东西。 在7400行左边是event value_type; 这是%$被删除的位置,数字被调整为“实数”,即使它们不应该是这样。 这很烦人 所以我们告诉它不要。

 do /if ^$textpct; do /if $convert_percentages; eval $tmp inputn($value, $test_format)/100; else; eval $tmp inputn($value, $test_format); done; /*putlog "Percent value:" $tmp;*/ set $value $tmp; done; 

我们使用do /if ^$textpct;包装百分比转换代码do /if ^$textpct;done ,它告诉它跳过inputn(这将杀死我们的百分比)。 如果我们在作弊,而没有按照正确的方式来做,我们可以注释掉这一行:

 set $value compress($value, $punctuation); 

但是,由于我们已经修正了$标点符号variables来包含(或不包含!)正确的东西,这不是一个问题。

现在这将工作! 我们只是修改tagset调用:

 *First include your tagset, which I put in c:\temp\ but you can put wherever and call whatever you like; %include "c:\temp\excel_tpl_nocompress.txt"; ods tagsets.ExcelXP path="c:\temp\" file="testfile.xml" options(frozen_headers='yes' WrapText='no' embedded_titles='yes' suppress_bylines='yes' sheet_interval='none' sheet_label=' ' sheet_name='Solicited' convert_percentages="no" width_points='1' width_fudge='1' absolute_column_width='100' autofit_height='yes' textcurrency='yes' textpercent='yes' zoom='100'); title1; *Then add in the textpercent and textcurrency lines, and it should work as is.; 

现在你要参加比赛了。

 - <Row ss:AutoFitHeight="1"> - <Cell ss:StyleID="data__l1" ss:Index="1"> <Data ss:Type="String">23.45%</Data> </Cell> - <Cell ss:StyleID="data__c1" ss:Index="2"> <Data ss:Type="String" /> </Cell> - <Cell ss:StyleID="data__l1" ss:Index="3"> <Data ss:Type="String">$0</Data> </Cell> </Row> 

我find了我需要的答案。 我在下面的页面find了ExcelXP选项: ExcelXP选项我知道这是一个'黑客',但我改变了tagsets.ExcelXP的默认选项是currency_symbol = "|"decimal_separator = "|" …欺骗SAS认为它应该寻找货币pipe道,而不是美元符号和pipe道,而不是一个百分比的时间段。 这样,当它遇到$023.45%它把它们当作纯文本。