【问题标题】:When using ods excel statement stop Excel converting numbers saved as character使用ods excel语句时停止Excel转换保存为字符的数字
【发布时间】:2020-06-12 10:29:37
【问题描述】:

我需要将一些结果从 SAS 导出到 Excel。到目前为止,我为此使用了一个简单的proc export,但由于导出变得更加复杂(多个proc results 和data sets 需要映射到一张表),我需要找到一个替代方案。 看来,ods excel 是要走的路——我同意,它是高度可定制的——但我面临一个问题,我不确定它是否与 SAS 或 Excel 相关。

问题:

当我有一个带有字符列的 SAS 数据集时,其中数据是由点分隔的数字字符串,ods export 到 Excel 将始终将此数据转换为数字格式,这基本上使数据不可读。例如:

character in SAS "04.2000" will become "4,2" in Excel (Standard format)

MWE:

data test;
input date $;
datalines;
04.2000
10.2001
; 

ods excel file="date.xlsx";
proc print data=test;
run;
ods excel close;

proc 导出正确打印此数据,无需自动转换。这是 SAS 还是 Excel 方面的东西?使用ods excel 时,我该怎么做才能获得与proc export 相同的结果,有什么想法吗?

【问题讨论】:

    标签: excel sas


    【解决方案1】:

    要绝对强制<month>.<year> 日期表示值成为 Excel 中的字符串,请将其呈现为公式。即使在“null”编辑单元格 (F2,Enter) 之后,该值也不会改变。

    例子:

    data test;
    input datestring $;
    forcedate = '="' || datestring || '"';
    datalines;
    04.2000
    10.2001
    ; 
    
    ods excel file="date.xlsx";
    proc print data=test;
    run;
    ods excel close;
    

    您可以将$CHAR<n> 格式应用于您的日期字符串。如果您手动编辑单元格,该字段在 Excel 中仍将被解释为数字。

    例子:

    data test;
    input datestring $;
    format datestring $char7.;
    datalines;
    04.2000
    10.2001
    ; 
    
    ods excel file="date.xlsx";
    proc print data=test;
    run;
    ods excel close;
    

    Excel(图片)

    您还可以使用 ODS EXCEL 样式选项tagattr='type:String' 强制初始单元格呈现,但是在编辑时(F2、Enter)Excel 将再次对单元格值进行数字化。

    例子:

    proc print data=test;
      var datestring / style=[tagattr='type:text'];
    
    * String also works;
    * var datestring / style=[tagattr='type:String'];
    run;
    

    【讨论】:

    • 很好,这行得通(猜想 SAS 格式现在就可以了)!但是您不知道有任何可能告诉 Excel 这是Text format 以防止自动单元格呈现(我知道在 proc 导出中这也不起作用)?我阅读了有关 tagattr 样式选项的信息,但在文档中迷路了。
    【解决方案2】:

    例如,您可以使用格式。它工作正常:

    data test;
    input date $;
    datalines;
    04.2000
    10.2001
    ; 
    run;
    ods excel file="c:\temp\date.xlsx";
    proc print data=test;
    format date $20.;
    run;
    ods excel close;
    

    【讨论】:

    • 谢谢,Richard 已经提到了这一点——事实上,只要 Excel 中没有单元格渲染,它就可以工作。所以我真的很想知道如何告诉 Excel 单元格格式是“文本”...
    【解决方案3】:

    如果您使用 PROC REPORT,您可能可以通过您的 DEFINE 语句执行此操作。

    define date/ 'Date' format = $20.  style(column)=[tagattr="type:text"];
    

    【讨论】:

    • 我会检查并报告!
    • 我可以确认:与proc print var datestring / style=[tagattr='type:text']; 中的行为完全相同——这意味着单元格渲染也会恢复格式
    • 这是什么意思?
    • Excel 显示的行为与 Richard 在他的回答中已经描述的行为相同:这意味着 Excel 工作表在 04.2000 格式和类似 number as text formatted 的小指示符下看起来会很好,但作为一旦访问单元格,单元格将自动渲染(F2 具有相同的效果)并且单元格输出将不同,在此示例中是在我的 PC 上 42.000
    • 然后尝试将反引号作为公式添加到您的文本字符串中。 =`04.2000
    猜你喜欢
    • 1970-01-01
    • 2017-10-11
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    • 2017-07-31
    • 1970-01-01
    • 2010-09-21
    相关资源
    最近更新 更多