I am running bunch of tobit models on SAS. I want to transfer the output to Excel, but I want the output from all models to be in one Excel book (as opposed to creating one book for each model.) How would one do that? Many thanks.
I have the following code, but it only reports on of the results
ODS TAGSETS.EXCELXP
file='C:\Documents and Settings\Administrator\My Documents\...\Results.xls'
STYLE=minimal
OPTIONS ( Orientation = 'landscape'
FitToPage = 'yes'
Pages_FitWidth = '1'
Pages_FitHeight = '100' );
Proc qlim Data=AD.Data;
class var1;
model don =var1 var2;
endogenous don ~ truncated (lb = 1);
Run;
Proc qlim Data=AD.Data;
class var1;
model don =var1 var2 var1*var2;
endogenous don ~ truncated (lb = 1);
Run;
quit;
ods tagsets.excelxp close;
The ODS statement controls where output is written. To begin writing to a new "worksheet", use a new ODS statement with a different sheet_name.
Here is a simple example:
ods tagsets.ExcelXP file="SASHELP.CARS Analysis.xls"
path="c:\temp" style=minimal;
ods tagsets.ExcelXP options(sheet_name="RawData" embedded_titles='Yes');
title "SASHELP.CARS Listing";
proc print data=SASHELP.CARS noobs;
run;
ods tagsets.ExcelXP options(sheet_name="MakeFreq" embedded_titles='Yes');
title "SASHELP.CARS Stats";
proc freq data=SASHELP.CARS;
table make;
run;
ods tagsets.ExcelXP close;
Note the first ODS statement just defines the workbook destination and style. A separate ODS statement is used to define each work sheet.
Related
I got a problem with Hyperlink generated by SAS ODS EXCEl.
I'm using SAS9.4TM3 and EXCEL 2013.
I coded this
data lst_tie;
NUM_TIE = '2900004227803';
output;
NUM_TIE = '2900004233852';
output;
run;
data lst_tie(drop=HL);
set lst_tie;
format HL2 $500.;
HL = "http://tier-kh.cm-cic.fr/tie6_tiers/default.aspx?trt=tiesyn&banque=02297&caisse=38848&tiers="||NUM_TIE;
HL2 = '=LIEN_HYPERTEXTE("'||HL||'";"'||NUM_TIE||'")';
run;
ods excel file = "$GRPFPU/test_tiesyn.xlsx"
options (absolute_column_width="3cm,20cm,20cm");
proc report data=lst_tie
;
column NUM_TIE
HL2;
define num_tie / "Numero" style(column)={ width=100%};
define HL2 / "Tiers" style(column)={tagattr='wraptext:no' width=100%};
quit;
ods excel close;
The URL seems well encoded :
=LIEN_HYPERTEXTE("http://tier-kh.cm-cic.fr/tie6_tiers/default.aspx?trt=tiesyn&banque=02297&caisse=38848&tiers=2900004227803";"2900004227803")
without carriage return (CR).
But, on opening the XLSX file there is a CR characters just after LIEN_HYPERTEXTE (HYPERLINK in English)
XLSX Preview 1
But if I delete the CR so the hyperlink is OK.
XLSX OK
I tried several option as WIDTH_COLUMS, Wrap Option , but no way.
Thanks
ODS EXCEL is trying to make your printout pretty by inserting physical line breaks into long lines. Apparently it doesn't notice that your value is a formula instead of plain text.
Starting with SAS 9.4M4 you can add flow="tables" to the ODS statement. See this SAS Blog post
ods excel file = "$GRPFPU/test_tiesyn.xlsx"
options (absolute_column_width="3cm,20cm,20cm"
flow="tables"
)
;
For older versions of SAS, like yours, try making the column wider so it doesn't try to wrap it. Try adding width=1000% instead of width=100% to the column with the links.
define HL2 / "Tiers" style(column)={tagattr='wraptext:no' width=1000%};
To have a clickable hyperlink I add a format
``
data lst_tie;
NUM_TIE = '2900004227803';
output;
NUM_TIE = '2900004233852';
output;
run;
data lst_tie;
set lst_tie;
format HL2 $500.;
HL = "http://tier-kh.cm-cic.fr/tie6_tiers/default.aspx?trt=tiesyn&banque=02297&caisse=38848&tiers="||NUM_TIE;
run;
data one;
set lst_tie;
retain fmtname '$urltie';
rename NUM_TIE=start;
label = HL;
run;
proc format cntlin=one;
run;
ods excel file = "$GRPFPU/test_tiesyn.xlsx"
options (absolute_column_width="3cm,20cm,20cm" flow="tables");
proc report data=lst_tie
;
column NUM_TIE
;
define num_tie / "Numero" style(column)={TAGATTR='format:0' width=1.5in url=$urltie. color=cx0000FF textdecoration=underline /*tagattr='wraptext:no' width=100%*/
};
quit;
ods excel close;
``
ODS EXCEL FILE="/mypoath/myfile.xlsx" options(
frozen_headers="3"
sheet_name="#byval1");
PROC TABULATE data=out;
BY byVariable;
CLASS varA varB;
TABLES varA, varB;
RUN;
ODS EXCEL CLOSE;
The code above creates an excel-file with different sheets. There is one sheet for each value of the variable byVariable. Is there a way to create an additional sheet "ALL" which contains the results for all values of the byVariable together? I mean something like "ALL" (used in the TABLES-section). I tried BY ALL byVar already (which doesn't work).
Thanks for help!
The simple answer is NO. If you want all of the data then don't use the BY statement.
ODS EXCEL FILE="/mypoath/myfile.xlsx" options(frozen_headers="3");
ODS EXCEL options(sheet_name="ALL");
PROC TABULATE data=out;
CLASS varA varB;
TABLES varA, varB;
RUN;
ODS EXCEL options(sheet_name="#byval1");
PROC TABULATE data=out;
BY byVariable;
CLASS varA varB;
TABLES varA, varB;
RUN;
ODS EXCEL CLOSE;
There is no such option.
You can:
rerun the report without BY, or
stack the data on itself modifying the by variable to be ALL -- such that it is higher than all existant by values.
data stacked / view=stacked;
set
have
have (in=stackflag)
;
if stackflag then do;
byvar = 'A0'x || 'ALL'; * A0 forces value to be 'after' other original byVar values;
end
run;
proc tabulate data=stacked;
by byvar;
…
Note: 'A0'x is a hard space ASCII character
I'm trying to produce the below two worksheet "woe_con_out" and "woe_cat_out" into the same excel "woe_summary.xlsx". but after running this code, there is only one worksheet is generated (woe_cat_out). Where did I do wrong??
data translate;
format report $256.;
infile "out_con.out" dlm='09'x dsd;
input report $;
run;
ods excel file="woe_summary.xlsx" style = printer options(sheet_name = "woe_con_out") ;
proc print data = translate noobs
style(data) = {font_face = "courier_new" font_size = 11pt}
style(column) = {width = 1000%};
run;
ods excel close;
data translate;
format report $256.;
infile "out_cat.out" dlm='09'x dsd;
input report $;
run;
ods excel file="woe_summary.xlsx" style = printer options(sheet_name = "woe_cat_out") ;
proc print data = translate noobs
style(data) = {font_face = "courier_new" font_size = 11pt}
style(column) = {width = 1000%};
run;
ods excel close;
You need ods excel options statements for EACH proc print statement:
/* first ods excel statement includes the file and style */
ods excel file="C:\desktop\woe_summary.xlsx" style = printer;
/* include ods excel options sheet_name for each PROC PRINT statement */
ods excel options(sheet_name = "woe_con_out");
proc print data = sashelp.class noobs;
var _all_;
run;
/* same as above -- include ods excel options sheet_name for each PROC PRINT statement */
ods excel options(sheet_name = "woe_cat_out");
proc print data = sashelp.fish noobs;
var _all_;
run;
/* close your ods excel engine */
ods excel close;
Also, in your situation, I would create two translate datasets, i.e. translate_con and translate_cat so you don't overwrite them and be able to use the method described.
I'm trying to export one SAS table into multiple Excel worksheets based on the value of a field (parent_account). I want each worksheet to be named the same as the parent_account. I'm using the following code that I found at http://www.tek-tips.com/viewthread.cfm?qid=1335588, but I'm getting these error messages:
A character operand was found in the %EVAL function or %IF condition where a numeric operand is required.
Argument 2 to macro function %SCAN is not a number.
%macro export_to_excel();
%local varlist idx var;
proc sql noprint;
select distinct parent_account into: varlist separated by '||'
from todays_activity;
quit;
%let idx = 1;
%do %while ( %scan(&varlist, &idx, %str(||)) ne %str() );
%let var=%scan(&varlist, &idx, %str(||));
proc export data=sashelp.class (where=(parent_account="&var"))
outfile='My file location\Report.xls'
dbms=excel;
sheet="&var";
quit;
%let idx = %eval(&idx + 1);
%end;
%mend export_to_excel;
%export_to_excel;
You could try using ODS EXCEL. Here is an example use SASHELP.CLASS dataset.
First make sure the data is sorted by your grouping variables.
proc sort data=sashelp.class out=class ;
by sex ;
run;
Set up ODS to point to your target file. Tell it to make a new sheet for each BY group.
ods excel file="&path/class.xlsx" ;
ods excel options
(sheet_interval="bygroup"
suppress_bylines="yes"
sheet_name='GENDER'
);
You also might want to turn off other output destinations.
Then print the file using PAGEBY option. And close the ODS EXCEL destination
proc print data=class noobs;
by sex ;
pageby sex ;
var _all_;
run;
ods excel close;
To test it you could try reading it back in as data. But watch out that it will create member names with embedded spaces.
options validmemname=extend;
libname xx xlsx "&path/class.xlsx";
proc copy inlib=xx outlib=work; run;
libname xx clear ;
From SAS log
NOTE: The data set WORK.GENDER has 9 observations and 5 variables.
NOTE: The data set WORK.'GENDER 2'n has 10 observations and 5 variables.
This might be helpful
%macro export_to_excel;
proc sql noprint;
select distinct parent_account into: varlist separated by '#' from todays_activity;
select count(distinct parent_account) into:n from todays_activity;
quit;
%do i=1 %to &n;
%let var= %scan(&varlist,&i,"#");
proc export data=sashelp.class (where=(parent_account="&var"))
outfile='Your file location\Report.xls'
dbms=excel;
sheet="&var";
run;
%end;
%mend export_to_excel;
I am outputting several tables into several worksheets in one xml type Excel spreadsheet.
The problem I am having is that out of the six worksheets I am outputting, the final four are using a body=test.html as well, to allow certain style formats to work (which only work if I use the body= command). When it runs however, the first two worksheets are output and the final four are not.
eg.
ods tagsets.excelxp file='example.xls' options(...sheet_name=sheet1...);
proc report;
run;
ods tagsets.excelxp options(...sheet_name=sheet2...);
proc tabulate;
run;
ods tagsets.excelxp body='test1.html' options(...sheet_name=sheet3...);
proc report;
run;
ods tagsets.excelxp body='test2.html' options(...sheet_name=sheet4...);
proc report;
run;
ods tagsets.excelxp body='test3.html' options(...sheet_name=sheet5...);
proc report;
run;
ods tagsets.excelxp body='test4.html' options(...sheet_name=sheet6...);
proc report;
run;
ods tagsets.excelxp close;
The first two are output fine, but the final four are not. I have tried placing the body='test.html' for each ods tagsets.excelxp line, but it doesn't work and just outputs the first sheet. I cannot skip out the ods tagsets.excelxp lines as I need different options for each sheet...is there a way to output these in the same spreadsheet? I am not allowed to use VBA or any manual interventions.
You can't output tagsets.ExcelXP to an HTML file and expect it to work as the XML would.
You need to output the first two proc tabulate to the ExcelXP tagset destination, close the tagset, open a new HTML destination for each HTML file, run proc report, and the close the HTML.
ods tagsets.excelxp file='example.xls' options(...sheet_name=sheet1...);
proc report;
run;
ods tagsets.excelxp options(...sheet_name=sheet2...);
proc tabulate;
run;
ods tagsets.excelxp close;
ods html body='test1.html' ;
proc report;
run;
ods html close ;
ods html body='test1.html' ;
proc report;
run;
ods html close ;
ods html body='test2.html' ;
proc report;
run;
ods html close ;
ods html body='test4.html' ;
proc report;
run;
ods html close ;