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

时间:2013-08-06 22:35:37

标签: excel sas export-to-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中,列的格式为文本,我希望将所有列作为文本导入Excel。我使用以下代码使用PROC REPORT创建文件:

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.2345,{{分别为1}}和0(文本)。

如何让Excel中的输出与SAS中的数据集一样?

我尝试使用特定格式使它们看起来相同(例如10等),但Excel中的输出是数字而不是文本格式。

2 个答案:

答案 0 :(得分:2)

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

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

首先,将选项添加到$ 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;我们设置标点符号以$ thousands_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;done包装百分比转换代码,告诉它跳过输入(这会杀死我们的百分比)。如果我们作弊而不是以正确的方式这样做,我们可以注释掉这一行:

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

但是既然我们已经修正了$ punctuation变量来包含(或不包含!)正确的东西,这不是问题。

现在这将有效!我们只修改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>

答案 1 :(得分:1)

我找到了我需要的答案。我在下一页找到了ExcelXP选项:ExcelXP Options我知道这是'黑客',但我将tagsets.ExcelXP中的默认选项更改为currency_symbol = "|"decimal_separator = "|" ...愚弄SAS认为它应该寻找货币的管道而不是美元符号和管道而不是百分比的时期。这样,当遇到$023.45%时,它会将这些视为纯文本。