1

我正在使用以下方法自动将数据集从 SAS 导出到 Excel ODS ExcelXP

       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(text)更改为0.2345010(text)。

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

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

4

2 回答 2

2

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

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

首先,将选项添加到 $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 行)你有定义 $punctuation 的部分。如果您设置了这些选项,我们会更改其工作方式以从列表中删除“%”和“$”:

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

(基本上,设置 $variable /if ;我们将标点符号设置为以 $thousands_separator 开头,然后如果它们只是“否”,则添加其他位。)

现在在“是/否开/关选项...”部分的第 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;我们用and包裹百分比转换代码done,告诉它跳过输入(这将杀死我们的百分比)。如果我们在作弊并且没有以正确的方式这样做,我们可以注释掉这一行:

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

但是由于我们已经修复了 $punctuation 变量以包含(或不包含!)正确的内容,所以这不是问题。

现在这将起作用!我们只是修改标签集调用:

*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>
于 2013-08-06T23:54:45.297 回答
1

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

于 2013-08-07T16:47:03.127 回答