Cynthia,
Sorry about my very belated response to this thread. I was able to do some DATA step post-processing on the XML code to modify the style elements that you pointed out. I just wanted to says thanks again for all the help and to offer a potential solution to this problem for anyone who might be interested.
ods listing close;
ods tagsets.excelxp file='class.xls' style=sansprinter;
proc report data=sashelp.class nowindows;
column name sex age height weight;
run;
ods tagsets.excelxp close;
ods listing;
/*** Store the new XML style definitions for StrikeThrough cells in a data set. One style definition is created for left-aligned data
and one style definition is created for right-aligned data. ***/
data strikethrough_styles;
length line $ 200;
infile datalines truncover;
input line &;
datalines;
<Style ss:ID="StrikeThrough_L" ss:Parent="data"><Alignment ss:WrapText="1" ss:Horizontal="Left"/><Font ss:StrikeThrough="1"/>
</Style>
<Style ss:ID="StrikeThrough_R" ss:Parent="data"><Alignment ss:WrapText="1" ss:Horizontal="Right"/><Font ss:StrikeThrough="1"/>
</Style>
;;;
run;
/*** Construct a macro variable containing the row numbers to strike through in the spreadsheet. The number one is added
to the _n_ variable to account for the row in the spreadsheet which will contain variable names. ***/
%let RowNums = ;
data _null_;
set sashelp.class;
if name in ('Barbara' 'Jeffrey' 'John') then call symput("RowNums", catx(' ', resolve('&RowNums'), _n_+1));
run;
data xml_code (keep=line);
/*** Read the XML code from the spreadsheet ***/
length line $ 200;
infile 'class.xls' truncover;
input line &;
/*** The line </Styles> denotes the end of the style definitions. Once this line is encountered, add the two new style
definitions we defined previously. ***/
if strip(line) = '</Styles>' then do;
do until(eof);
set strikethrough_styles end=eof;
output;
end;
line='</Styles>';
output xml_code;
end;
else do;
/*** Lines that begin with <Row denote a new row. Increment the row number counter by one. ***/
if substr(line, 1, 4) = '<Row' then RowNum + 1;
/*** Apply the a new strikethrough style if a cell is being defined in one of the previously established row numbers.
Numbers will be right-aligned and strings will be left-aligned. The names of the new style definitions will overwrite
the values which were previously defined in the StyleID attribute. ***/
if substr(line, 1, 5) = '<Cell' and RowNum in (&RowNums) then do;
if find(line, 'Type="Number"') then line=tranwrd(line, scan(substr(line, find(line, 'StyleID=')+8), 1, '"'), "StrikeThrough_R");
else if find(line, 'Type="String"') then line=tranwrd(line, scan(substr(line, find(line, 'StyleID=')+8), 1, '"'), "StrikeThrough_L");
end;
output xml_code;
end;
run;
/*** Recreate the spreadsheet using the modified XML code. ***/
data _null_;
file 'class.xls';
set xml_code;
put line;
run;
Glad you got it working. That's the approach I would have used.
cynthia
Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
Register now!
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.
Ready to level-up your skills? Choose your own adventure.