We use cookies, including third-party cookies from Google to serve personalized ads through AdSense, to operate this site and understand how it is used. By continuing to browse, you accept this use. See our Privacy Policy and Terms of Use for details, including how to opt out of personalized advertising.
Accept
SmartData CollectiveSmartData Collective
  • Analytics
    AnalyticsShow More
    What Kind of Problem-Solving Distinguishes Data Analysts From Software Engineers -- AI-generated illustration
    What Kind of Problem-Solving Distinguishes Data Analysts From Software Engineers
    7 Min Read
    chatgpt image jul 21, 2026, 04 34 30 pm
    4 Core Benefits of Predictive Maintenance after Vibration Analysis
    10 Min Read
    How Does Data Mining Boost Customer Satisfaction in Logistics? Harnessing Analytics for Results -- AI-generated illustration
    How Does Data Mining Boost Customer Satisfaction in Logistics? Harnessing Analytics for Results
    11 Min Read
    chatgpt image jul 13, 2026, 04 23 45 pm
    How Data Analytics Helps Companies Improve User Engagement
    19 Min Read
    chatgpt image jul 13, 2026, 03 59 46 pm
    How Data Analytics Improves Multi-Location Search Strategies
    10 Min Read
  • Big Data
  • BI
  • Exclusive
  • IT
  • Marketing
  • Software
Search
© 2008-25 SmartData Collective. All Rights Reserved.
Reading: SAS ODS Report Writing Interface: A Quick Demo
Share
Notification
Font ResizerAa
SmartData CollectiveSmartData Collective
Font ResizerAa
Search
  • About
  • Help
  • Privacy
Follow US
© 2008-23 SmartData Collective. All Rights Reserved.
SmartData Collective > Big Data > Data Visualization > SAS ODS Report Writing Interface: A Quick Demo
Big DataData VisualizationSoftware

SAS ODS Report Writing Interface: A Quick Demo

JiangtangHu
JiangtangHu
5 Min Read
SAS ODS Report Writing Interface: A Quick Demo
Illustrative image generated with OpenAI gpt-image-1.
SHARE

I personally nominated SAS ODS Report Writing Interface as one of the best technologies I found in SAS in 2012. It can generate reports cell by cell and row by row and provides a lot of flexibility to produce highly customized reports. Basically, to use it,

  • first assign an ODS destination. Nothing new, and I prefer HTML like

ods html   file=”output.html” style=sasweb;

  • then create a object(instance) based on the ODS Report Writing class, odsout,

declare odsout myout();

ODS Report Writing Interface holds some so-called object-oriented features. Odsout is a predefined class (or, a SET, a CONTAINER), then you take from it an instance or an object, myout(or any other legal SAS variable names). Suppose Odsout is a class for apples, then myout is a specific apple.

More Read

Free BI for Higher Ed
Free BI for Higher Ed
Data Privacy Advocates Must Avoid GDPR Complacency at All Costs
5 Amazing Ways to Use Data Analytics to Become A Profitable Trader
Using Data Analytics to Optimize Your Cash Collection Approach
Saving Microseconds with Informatica’s Ultra Messaging
  • apply methods associated with the Odsout class, like CELL, ROW, TABLE to generate reports.

Roughly methods are just the functions (subroutines, procedures) in the object oriented world. For example, in SAS Data Steps, you use function weight(apple) to get the weight of the apple; in object oriented world, you use apple.weight() to return the same thing. In ODS Report Writing Interface, if you want to get a table, use TABLE methods:

    • myout.TABLE_START() to start a table
    • myout.TABLE_END to end a table

Then all we need to do next is to use the flexible SAS data steps to leverage the ODS Report Writing Interface methods (see docs). The codes, you can see below, are pretty verbose compared to its counterparts, PROC REPORT, but that’s why it gains power to build highly customized reports. It’s also very structural (and easy to build, like playing blocks):

/*making a sortable HTML table*/
%macro ods_html_sort_table;
   
   
   
%mend;

title ;
ods listing close;
ods html   file=”a:\test\iris.html” style=sasweb headtext=”%ods_html_sort_table”;

data _null;
    set sashelp.iris;
    by Species;
   
/*    create an object, obj, based on the ODS Report Writing class, odsout*/
    if _n_ = 1 then do;
        dcl odsout obj();
    end;

    if (first.Species) then do; *by group processing;
       obj.title(text: “Fisher’s Iris Data Set by Species”); *title;

/*       start a table*/
       obj.table_start();
               obj.row_start();
              if (Species = “Setosa”) then
                 obj.image(file: “Iris_setosa.jpg” );*insert image;
              else if (Species = “Versicolor”) then
                 obj.image(file: “Iris_versicolor.jpg” );
              else if (Species = “Virginica”) then
                 obj.image(file: “Iris_virginica.jpg” );
            obj.row_end();

            obj.row_start();
                obj.format_cell(text: “Iris Species”,  overrides: “fontweight=bold just=right” );
                obj.format_cell(text: Species, column_span: 3, overrides: “just=left”);
            obj.row_end();

            obj.row_start();
                obj.format_cell(text: “Unit”,  overrides: “fontweight=bold just=right” );
                obj.format_cell(text: “(mm)”, column_span: 3, overrides: “just=left”);
            obj.row_end();
       obj.table_end();

       /* start another table */
       obj.table_start();
            obj.head_start();
                obj.row_start();
                    obj.format_cell(text: “Sepal Length” , overrides: “fontweight=bold”);
                    obj.format_cell(text: “Sepal Width” , overrides: “fontweight=bold”);
                    obj.format_cell(text: “Petal Length” , overrides: “fontweight=bold”);
                    obj.format_cell(text: “Petal Width” , overrides: “fontweight=bold”);
                obj.row_end();
            obj.head_end();
    end;

        obj.row_start();
            obj.format_cell(data: SepalLength);
            obj.format_cell(data: SepalWidth);
            obj.format_cell(data: PetalWidth);
            obj.format_cell(data: SepalLength);
        obj.row_end();

    if (last.Species) then do;
        obj.table_end();

        obj.note(data: “Note: These Tables are Sortable.”); *note;

        obj.foot_start(); *footer;
            obj.row_start();
                obj.cell_start();
                    obj.format_text(data: “Footer: Data from SAS V&sysver at &sysscp &sysscpl Sashelp.iris”,just:”C”);
                obj.cell_end();
            obj.row_end();
        obj.foot_end();

        obj.page();
    end;
run;

ods html close;
ods listing;

Note:

    • A flavor added to get a sortable HTML report. Thanks to Charlie Huang and then Andrew Z to introduce a Javascript library JQury to SAS HTML report.
    • The full report, see here.
    • If column spannings needed, use the following codes as header (and the report here):

obj.head_start();
    obj.row_start();
        obj.format_cell(text: “Sepal” , overrides: “fontweight=bold”,column_span: 2);
        obj.format_cell(text: “Petal” , overrides: “fontweight=bold”,column_span: 2);
    obj.row_end();

    obj.row_start();
        obj.format_cell(text: “Length” );
        obj.format_cell(text: “Width” );
        obj.format_cell(text: “Length” );
        obj.format_cell(text: “Width” );
    obj.row_end();
obj.head_end();

  • ODS Report Writing Interface will get rid of its preproduction hat since SAS 9.4, but you can use it somehow since SAS 9.1.3. For more, see the draft SAS 9.4 ODS documentation with ODS Report Writing Interface.
  • To get started, see the developer’s paper.
TAGGED:ODSprogrammingsas
Share This Article
Facebook Pinterest LinkedIn
Share

Follow us on Facebook

Latest News

Technical architecture diagram and decision framework for choosing an integration partner for data pipelines: service bus, brokers, and azure-native middleware compared
Choosing an Integration Partner for Data Pipelines: Service Bus, Brokers, and Azure-Native Middleware Compared
Development Exclusive
Technical architecture diagram and decision framework for data engineering for prize draws: building an audit trail
Data Engineering for Prize Draws: Building an Audit Trail
Big Data
Technical architecture diagram and decision framework for the trouble with ai that won’t leave a job unfinished
The Trouble With AI That Won’t Leave a Job Unfinished
Artificial Intelligence News
Technical architecture diagram and decision framework for ai-powered logo generation: design.com vs looka
AI-Powered Logo Generation: Design.com vs Looka
Artificial Intelligence Exclusive

Stay Connected

1.2KFollowersLike
33.7KFollowersFollow
222FollowersPin

You Might also Like

All About Source Code & Why You Need to Protect It for Data-Driven Projects
Big Data

All About Source Code & Why You Need to Protect It for Data-Driven Projects

10 Min Read
Interview with Anne Milley, SAS II
Data MiningPredictive Analytics

Interview with Anne Milley, SAS II

10 Min Read
Integrating data and text analysis
Business IntelligenceCRMData MiningPredictive Analytics

Integrating data and text analysis

9 Min Read
Which JS Framework Is Best For Big Data Development?
Big DataExclusiveProgramming

Which JS Framework Is Best For Big Data Development?

6 Min Read

SmartData Collective is one of the largest & trusted community covering technical content about Big Data, BI, Cloud, Analytics, Artificial Intelligence, IoT & more.

Artificial Intelligence for eCommerce: A Closer Look
Artificial Intelligence for eCommerce: A Closer Look
Artificial Intelligence
Chatbots and SEO: How Can Chatbots Improve Your SEO Ranking?
Chatbots and SEO: How Can Chatbots Improve Your SEO Ranking?
Artificial Intelligence Chatbots Exclusive

Quick Link

  • About
  • Contact
  • Privacy
Follow US
© 2008-26 SmartData Collective. All Rights Reserved.
Welcome Back!

Sign in to your account

Username or Email Address
Password

Lost your password?