Figure 1.  Columns in the SAS Adverse Event Table 
Paper 136-30 
Moving Data and Analytical Results between SAS® 
and Microsoft Office 
Vincent DelGobbo, SAS Institute Inc., Cary, NC 
ABSTRACT 
Transferring data between SAS and Microsoft Office can be difficult, especially when SAS is not installed on a 
Windows platform.  This paper discusses using the HTML and XML support in Base SAS software to move data 
between SAS and Microsoft Office (versions 2002 and later).  You can use the techniques described here regardless 
of the platform on which SAS software is installed.  
INTRODUCTION 
After reading this paper, you should be able to import most SAS output into a Microsoft Excel or Word document, as 
well as import Excel workbooks into SAS.  The data and sample SAS code that’s used in this paper reveal formatting 
issues that you might encounter when attempting to import HTML and XML output that’s generated by the Output 
Delivery System (ODS) into Microsoft Office documents.  The TEMPLATE procedure is used to correct these 
problems by modifying an ODS style.  This paper also explains and provides code for importing Excel workbooks 
into SAS tables.  All code was tested with SAS 9.1 and Microsoft Office XP Service Pack 3. 
For information about generating other types of output and techniques for using that output in Excel and Word, see 
”Techniques for SAS Enabling Microsoft Office in a Cross-Platform Environment” in the Proceedings of the Twenty-
Seventh Annual SUGI Conference (DelGobbo, 2002). 
SAMPLE SAS DATA 
Figure 1 shows the column 
properties of the data that we 
are going to move to Excel and 
Word.  The data is adverse 
event information for a fictitious 
drug. 
Notice that labels were applied 
to each column in order to 
create a more attractive table 
when imported into the 
Microsoft Office applications. 
The two columns AESEV and 
AESEVC represent the severity 
of the adverse event.  As 
illustrated in Figure 2, the same 
data is represented in two ways: 
the AESEV column contains a 
numeric value for the severity, 
and the AESEVC column 
contains a character value for 
the severity.  Later in this paper, 
the SAS code uses both 
columns. 
Hands-on Workshops
SUGI30
0
Rotate one page in pdf - rotate PDF page permanently in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Empower Users to Change the Rotation Angle of PDF File Page Using C#
pdf rotate one page; rotate pages in pdf
Rotate one page in pdf - VB.NET PDF Page Rotate Library: rotate PDF page permanently in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
PDF Document Page Rotation in Visual Basic .NET Class Application
rotate individual pages in pdf; pdf save rotated pages
Figure 2.  Partial View of the SAS Adverse Event Table 
Notice that the Code column contains values that have leading zeros.  By using an ODS style override, you can 
retain the leading zeros when importing the Code data into Excel.  Microsoft Word retains leading zeros by default. 
ODS BASICS 
ODS is the part of Base SAS software that enables you to generate different types of output from your procedure 
code.  An ODS tagset controls the type of output that’s generated (HTML, RTF, PDF, etc.); an ODS style controls the 
appearance of the output.  In this paper, we use a tagset that creates HTML output that can be opened with Excel 
and Word, and a tagset that creates XML that can be opened by Excel.  The latter tagset creates an Excel workbook 
that has multiple worksheets. 
Extensible Markup Language (XML) defines and formats data for easy exchange. XML is similar to HTML in that it 
uses tags. Unlike HTML tags that control how data is rendered, XML tags describe the structure and meaning of data 
but do not control how it is rendered.  
The ODS statements that generate content that’s compatible with Microsoft Office follow this general form: 
! ods listing close; 
" ods TagsetName style=StyleName file= ... ; 
 your SAS code here; 
# ods TagsetName close; 
The first ODS statement (!) turns off the standard "line printer" ODS destination.  We only want to generate HTML 
and XML output for use with Excel and Word. 
The second ODS statement (") generates the HTML or XML output, depending on the tagset that you use, and 
stores the output in a file of your choosing.  The STYLE option controls the appearance of the output, such as the 
font and color scheme.  To see a list of ODS styles that are available for use at your site, submit the following SAS 
code: 
ods listing; 
proc template; list styles; run; quit; 
The third ODS statement (#) closes and releases the HTML or XML file so that it can be opened with Excel or Word. 
Hands-on Workshops
SUGI30
0
VB.NET PDF Page Delete Library: remove PDF pages in vb.net, ASP.
If you are looking for a solution to conveniently delete one page from your PDF document, you can use this VB.NET PDF Library, which supports a variety of PDF
how to reverse pages in pdf; pdf rotate just one page
C# PDF File Merge Library: Merge, append PDF files in C#.net, ASP.
C# developers can easily merge and append one PDF document to document imaging toolkit, also offers other advanced PDF document page processing and
rotate single page in pdf file; how to rotate all pages in pdf at once
Later in this paper, we discuss using both the ODS tagset named MSOffice2K to create HTML output and the 
ExcelXP tagset to create XML output from the PRINT and TABULATE procedures.  In both cases, appearance 
characteristics such as colors and fonts are controlled by the ODS style named Banker. 
Although you can store your output on a local disk (where SAS software is installed), a network-accessible disk, or a 
Web server, here are some good reasons to store your SAS output on a Web server: 
•  The files are
available to anyone who has network access. 
•  The HTML and XML files can be accessed by a Web browser in addition to Excel and Word. 
•  You can take advantage of Web-server authentication and security models. 
If you place the files where others can access them over a network, you should set file permissions to prevent 
accidental alteration. 
OPENING ODS OUTPUT WITH EXCEL AND WORD 
To open an ODS-generated file that’s stored on a Web server, follow these steps: 
1.  In Excel or Word, select File  Open. 
2.  In the "File name" field, specify  http://Web-server/directory/  
where Web-server corresponds to the domain name for your Web server.   
3.  Click Open.  (You should see a list of files that are available on your Web server.) 
4.  Select the file that you want to open and click Open to import the HTML or XML file. 
If you don't see a list of available files after step 3, you might have to configure your Web server to allow directory 
listing.  Alternatively, you can specify the full path to the file that you want to open. 
http://Web-server/directory/filename 
To open ODS-generated files from a local or network-accessible disk, follow the same steps, except in step 2 you 
should either navigate to the desired file or type the filename and path in the "File name" field. 
Excel and Word will read and convert the HTML or XML file (Excel only) to their respective native formats.  After that, 
you can perform any Excel or Word function on the data. 
USING ODS TO GENERATE HTML FOR EXCEL AND WORD 
The following SAS code generates HTML output for use with Excel and Word: 
ods listing close; 
ods tagsets.MSOffice2K style=Banker file='aedata.htm'; 
title; footnote; 
proc print data=pharma.phcae noobs label; 
by protocol; 
var patient visit aedate aecode aetext aesev aesevc frequency; 
run; quit; 
proc tabulate data=pharma.phcae; 
by protocol; 
var aesev; 
class aetext aesevc; 
table aetext*aesevc,aesev*pctn; 
keyword all pctn; 
keylabel pctn='Percent'; 
run; quit; 
ods tagsets.MSOffice2K close; 
The preceding code uses the MSOffice2K tagset to generate the HTML file and the Banker style to control the 
appearance of the HTML.  Figure 3 shows the resulting HTML file that’s opened in Word. 
Hands-on Workshops
SUGI30
0
VB.NET PDF File Merge Library: Merge, append PDF files in vb.net
all. This guiding page will help you merge two or more PDF documents into a single one in a Visual Basic .NET imaging application.
how to rotate a single page in a pdf document; reverse page order pdf
VB.NET PDF Annotate Library: Draw, edit PDF annotation, markups in
to display it. Thus, PDFPage, derived from REPage, is a programming abstraction for representing one PDF page. Annotating Process.
how to rotate a page in pdf and save it; pdf rotate page and save
Figure 3.  ODS HTML Output Viewed Using Microsoft Word 
Word does a good job of preserving the format and nature of the SAS output.  The results shown in Figure 3 very 
closely match what you would see if you opened the HTML file with a Web browser.  Note that all the SAS output is 
in a single document; Figure 3 shows two different views of the single document. 
However, opening the same HTML output in Excel (Figure 4) reveals that there are some formatting and data issues.  
The background color for some of the cells is gray instead of green.  The dates are formatted differently than they 
were in Word.  The leading zeros in the adverse event code have been dropped.  The cause and a means of 
correcting these problems are discussed in the section "Correcting Common Formatting Problems".  Notice that all 
the SAS output is in a single worksheet.  Figure 4 displays two different views of the single worksheet. 
Hands-on Workshops
SUGI30
0
C# PDF Page Extract Library: copy, paste, cut PDF pages in C#.net
Extract PDF Pages, Copy Pages from One PDF File and Paste into Others in C#.NET Program. Free PDF document processing SDK supports PDF page extraction, copying
pdf page order reverse; change orientation of pdf page
C# PDF Page Delete Library: remove PDF pages in C#.net, ASP.NET
Using RasterEdge Visual C# .NET PDF page deletion component, developers can easily select one or more PDF pages and delete it/them in both .NET web and Windows
rotate pdf page permanently; rotate pdf pages on ipad
Figure 4.  ODS HTML Output Viewed Using Microsoft Excel 
USING ODS TO GENERATE XML FOR EXCEL 
Up to this point, we used an ODS tagset to create HTML that is imported into Excel, but Excel is also capable of 
reading XML files.  It does an especially good job of handling files that conform to the Microsoft XML Spreadsheet 
Specification ("XML Spreadsheet Reference", Microsoft Corp.).  The SAS®9 ExcelXP tagset generates this form of 
XML for use with Microsoft Excel.  The main benefit of using the ExcelXP (XML) tagset is that each table of the SAS 
output is placed into a separate worksheet in the workbook, in contrast to a single worksheet as shown in Figure 4 
when using the MSOffice2K (HTML) tagset. 
Hands-on Workshops
SUGI30
0
C# PDF copy, paste image Library: copy, paste, cut PDF images in
This C#.NET example describes how to copy an image from one page of PDF document and paste it into another page. // Define input and output documents.
how to rotate just one page in pdf; how to rotate a pdf page in reader
C# PDF: C# Code to Process PDF Document Page Using C#.NET PDF
for developers on how to rotate PDF page in different two different PDF documents into one large PDF C# PDF Page Processing: Split PDF Document - C#.NET PDF
reverse page order pdf online; how to rotate page in pdf and save
However, there are some disadvantages to using the ExcelXP tagset that you should be aware of: 
•  The tagset is experimental.  This means that limited testing has been performed on it, and its functionality 
might change in the future. 
•  The tagset has not yet been optimized.  It can take an unexpectedly long time to generate an XML file.  
This problem was partially rectified in SAS® 9.1.3. 
•  You cannot use graphics in your SAS XML output because Excel does not support embedded graphics in 
an XML file. 
•  Because Excel does not automatically resize text-based columns when reading an XML file, when you first 
open the XML file, most of the columns are not wide enough to show all the data or headings.  A future 
release of the ExcelXP tagset may correct this problem. 
Significant enhancements have been made to the ExcelXP tagset since the initial release of SAS 9.1.  You can 
download a recent version of the ExcelXP tagset from the SAS Presents Web site at 
http://support.sas.com/saspresents Find the entry "From SAS to Excel via XML".  The download contains a file 
named "excelxp.sas", which contains the SAS code for creating the ExcelXP tagset.  Save a copy of this file, and 
submit the following SAS code to make the tagset available: 
! libname myLib 'directory-for-tagset'; * location to store the tagset; 
" ods path myLib.tmplmst(update) sashelp.tmplmst(read); 
%include 'excelxp.sas'; 
The LIBNAME statement (!) specifies where to store the tagset.  Although you can store the tagset in the WORK 
library temporarily, it’s more efficient to create the tagset and store it in a permanent library so that you can reference 
it in other SAS programs.  
The ODS PATH statement (") specifies the locations and the order in which to search for ODS tagsets and styles. 
Notice that the access mode for myLib.tmplmst is specified as "update" and the access mode for 
sashelp.tmplmst is specified as "read".  Because ODS searches the PATH in the order given and because the 
access mode for myLib.tmplmst is “update”, PROC TEMPLATE will store the tagset in a file named 
tmplmst.sas7bitm in the directory that’s associated with the MYLIB library. 
You can use the ExcelXP tagset by specifying the tagset name in an ODS statement and open the resulting XML file 
with Excel.  To continue using the sample code shown earlier (page 3), simply change the ODS statement as shown 
here: 
ods listing close; 
ods tagsets.ExcelXP style=Banker file='aedata.xml'; 
*  PROC PRINT and PROC TABULATE code here; 
ods tagsets.ExcelXP close; 
Figure 5 shows the results of opening the XML file with Excel.  As was the case with the HTML file, some cell 
background colors appear gray instead of green, and the leading zeros in the adverse event code have been 
dropped.  Additionally, border lines are missing from all cells.  However, unlike HTML, all the tables created by the 
PRINT and TABULATE procedures appear in their own worksheet. 
The next section discusses how to correct the formatting issues noted previously. 
Hands-on Workshops
SUGI30
0
Figure 5.  ODS XML Output Viewed Using Microsoft Excel after Resizing Columns Manually 
CORRECTING COMMON FORMATTING PROBLEMS 
When Excel and Word import HTML or XML files, the files are converted to native Excel or Word format.  Sometimes 
this conversion process is less than perfect, with Word generally handling the conversion better than Excel.  
Although you can use the features of Excel and Word to manually correct the appearance of the file, doing so will be 
cumbersome if you have a large number of files to correct.  It’s much more efficient to have ODS generate a file 
that’s compatible with Microsoft Office in the first place.  This is accomplished by creating custom ODS styles and by 
using ODS style overrides. 
USING STYLE OVERRIDES TO CORRECT OUTPUT-SPECIFIC PROBLEMS 
Although ODS styles define a particular appearance for your SAS output, you can change the attributes that are 
defined in the style at run time by using a "style override".  Style overrides are supported by the PRINT, TABULATE, 
and REPORT procedures, and are best used for changing a small number of features that are associated with a 
particular output.  In this example case, style overrides can be used to correct the missing leading zeros and 
improperly formatted date columns in the HTML and XML files that were imported into Excel. 
When an HTML or XML file is opened, Excel automatically assigns an Excel format based on the data in the cells.  
Sometimes, the default format is not the best choice.  Fortunately, we can use a style override to instruct ODS to 
assign a specific Excel format to a column.  Because only the output from the PRINT procedure was affected, the 
VAR statement is the only line of code that needs to be changed. 
To correct the date formatting and the missing leading zeros problems in the HTML file in Figure 4, change the 
single VAR statement, in the sample code given earlier (page 3), to the following: 
Hands-on Workshops
SUGI30
0
Figure 6.  Default HTML Colors Supported by  
Excel 2000 and Later 
var patient visit; 
var aedate / style={htmlstyle="mso-number-format:ddmmmyyyy"}; 
var aecode / style={htmlstyle="mso-number-format:00000000"}; 
var aetext aesev aesevc frequency; 
The VAR statements instruct ODS to assign the special Excel format "ddmmmyyyy" for the AEDATE column and the 
"00000000" format for the AECODE column.  The first format is self-explanatory; the second format is comparable to 
the SAS Z8. format.  The HTML file that’s created by ODS can be viewed in Excel, Word, or a Web browser, 
because Web browsers ignore the proprietary Microsoft mso-number-format style information when they render the 
HTML.  Complete code for correcting the HTML output can be found in the Appendix in the section "Corrected Code 
to Export SAS Output to Excel or Word as HTML". 
You can use the same concept to correct the leading zeros problem in the XML file shown in Figure 5, but the syntax 
is slightly different: 
var patient visit aedate; 
var aecode / style={tagattr="\00000000"}; 
var aetext aesev aesevc frequency; 
The next section describes how to correct the remainder of the formatting problems.  The complete program for 
correcting the XML output can be found in the Appendix in the section "Corrected Code to Export SAS Output to 
Excel as XML".  For more information about Excel formats, see ”A Beginner’s Guide to Incorporating SAS® Output in 
Microsoft Office Applications” in the Proceedings of the Twenty-Eighth Annual  SUGI Conference (DelGobbo, 2003). 
USING PROC TEMPLATE TO CORRECT GLOBAL STYLE PROBLEMS 
Global problems are those that affect all output that’s generated by ODS.  For example, all header and row header 
cell background colors are wrong in all ODS output, as illustrated by Figures 4 and 5.  Because these problems 
affect all output that’s generated by ODS, it’s more efficient to make a correction to the ODS style, rather than using 
an override in each of your SAS programs. 
Excel mapped the green to gray because the shade of green that’s specified by ODS is not supported by Excel by 
default.  If you view the HTML source code and identify the cells that are affected, you’ll notice that the cells are 
assigned the Cascading Style Sheet (CSS) class Header or RowHeader.  That is, the HTML contains 
class="Header" or class="RowHeader" in the TH tags.  If you further examine the HTML file, you’ll see the following 
CSS definitions for the Header and RowHeader classes: 
.Header 
font-family: 'Times New Roman', Times, serif; 
font-size: 14pt; 
font-weight: bold; 
font-style: normal; 
color: #033366; 
background-color: #C4E4B8; 
.RowHeader 
font-family: 'Times New Roman', Times, serif; 
font-size: 14pt; 
font-weight: bold; 
font-style: normal; 
color: #033366; 
background-color: #C4E4B8; 
Both of these classes use the HTML color #C4E4B8.  However, in Figure 6, you’ll see that this color is not supported 
by Excel by default; therefore, Excel maps this color to gray.  Excel does support a shade of green, #CCFFCC, that’s 
very close to the original, and we’ll show you how to modify 
the Banker style to use this new shade of green by using 
the TEMPLATE procedure. 
The TEMPLATE procedure is part of Base SAS. PROC 
TEMPLATE can be used to list, create, and modify ODS 
styles and tagsets.   Because an in-depth discussion of 
this procedure is beyond the scope of this paper, see the 
chapters about the TEMPLATE Procedure in the ODS 
documentation (SAS Institute Inc., 1999, 2004). 
Hands-on Workshops
SUGI30
0
Before you can make a change to a style, you must first determine the nature of the change that needs to be made.  
Submit the following SAS code to list the source of the Banker style: 
ods listing; 
proc template; 
source styles.Banker; 
run; quit; 
By examining the output, you will see that the following colors are used: 
replace colors / 
'headerfgemph'   = cx033366 
'headerbgemph'   = cxFFFFCD 
'headerfgstrong' = cx033366 
'headerbgstrong' = cxFFFFCD 
'headerfg'       = cx033366 
'headerbg'       = cxC4E4B8 
. . . 
Notice that SAS uses the cx notation to represent hexadecimal color values and HTML uses the symbol #.  If you 
compare the preceding code to Figure 6, you’ll see that the Banker style is using 3 colors that are not supported by 
Excel: cx033366, cxFFFFCD, and cxC4E4B8.  However, Excel maps cx033366 to #003366, which is so close 
that you will probably not notice the difference.  Similarly, cxFFFFCD is mapped to #FFFFCC, which is also a very 
good match.  Thus, the only change that’s needed to the Banker style is to substitute cxCCFFCC for cxC4E4B8.  
This is accomplished with the following code (the complete code is in the Appendix in the section "Code for Creating 
the MSOBanker Style"): 
libname myLib 'directory-for-style'; * location to store the style; 
ods path myLib.tmplmst(update) sashelp.tmplmst(read); 
proc template; 
define style styles.MSOBanker; 
parent = styles.Banker; 
replace colors / 
'headerfgemph'   = cx033366 
'headerbgemph'   = cxFFFFCD 
'headerfgstrong' = cx033366 
'headerbgstrong' = cxFFFFCD 
'headerfg'       = cx033366 
'headerbg'       = cxCCFFCC 
. . . 
This new style, named MSOBanker, will be stored in myLib.tmplmst.  It has all the attributes of the parent Banker 
style; the only difference is that the header and row header cell background colors will be #CCFFCC instead of 
#C4E4B8. 
You can use the MSOBanker style to create a new HTML file by specifying the style name in an ODS statement and 
opening the resulting HTML file with Excel or Word.  To continue using the original sample code (page 3) with the 
style overrides discussed in the preceding section, change the ODS statement as shown next: 
ods listing close; 
ods tagsets.MSOffice2K style=MSOBanker file='aedata.htm'; 
*  PROC PRINT code w/ style overrides and PROC TABULATE code here; 
ods tagsets.MSOffice2K close; 
Figures 7 and 8 show the results of opening the HTML file with Word and Excel, respectively.  All the formatting 
problems have been corrected by using a combination of style overrides and the new MSOBanker style.  Complete 
code for correcting the HTML output can be found in the Appendix in the section "Corrected Code to Export SAS 
Output to Excel or Word as HTML". 
Hands-on Workshops
SUGI30
0
10 
Figure 7.  Corrected ODS HTML Output Viewed Using Microsoft Word 
Hands-on Workshops
SUGI30
0
Documents you may be interested
Documents you may be interested