Testing the CSV report rendering plug-in
You can use the new CSV emitter directly in BIRT Report Designer or programmatically when you run and render reports using the BIRT Report Engine API. This section provides instructions on how to test the CSV emitter in both scenarios.
How to launch the CSV report rendering plug-in
1 From the Eclipse PDE menu, choose Run—Run Configurations. On Run Configurations, right-click Eclipse Application. Choose New.
2 Create a configuration to launch an Eclipse application by performing the following tasks:
1 In Name, type:
CSVEmitter
2 On Main, in Location, type:
C:\Test\CSVEmitter
Run Configurations—Main appears as shown in
Figure 19‑4.
Figure 19‑4 Creating the CSVEmitter run configuration
3 Choose the Arguments tab and ensure that the following arguments are entered:

Program arguments:
-os ${target.os} -ws ${target.ws} -arch ${target.arch}
-nl ${target.nl} -consoleLog

VM arguments:
-Dosgi.requiredJavaVersion=1.6 -Xms40m -Xmx512m
-XX:MaxPermSize=256M
4 Choose the Plug-ins tab to select the list of plug-ins that you want to launch with the run configuration.
5 In Launch with, from the drop-down list, choose:
plug-ins selected below only
6 In Plug-ins, select Workspace and Target Platform. Deselect other plug-ins you are currently working on in the same workspace.
7 Choose Run to launch the run-time Eclipse Workbench. A new instance of Eclipse opens.
How to preview a BIRT report in CSV format in BIRT Report Designer
BIRT Report Designer discovers the new CSV custom emitter and displays the new rendering format in the Run➛ViewReport menu.
To preview a BIRT report in CSV format, perform the following tasks:
1 In the new Eclipse Workbench, switch to BIRT Report Design perspective.
2 In BIRT Report Design perspective, open the BIRT report you want to render in CSV format.
3 Choose Run
➛View Report
➛As CSV from the main menu, as shown in
Figure 19‑5.
Figure 19‑5 Previewing a report in CSV format
4 A new browser window opens and a file download starts. Depending on the browser, you may be prompted to save and select the location to save the CSV report.
5 Open the downloaded CSV file using an editor or Excel to validate the output.
How to render a BIRT report in CSV format programmatically
To test the CSV report rendering example, you create a Java application that runs a report design in an installation of the BIRT run-time engine. BIRT provides a run-time engine that runs in a stand-alone Java EE application server environment and a preview engine that runs in BIRT Report Designer.
To test the CSV report rendering plug-in, you perform the following tasks:

Build the org.eclipse.birt.report.engine.emitter.csv plug-in.

Deploy the plug-in to the BIRT run-time engine directory.

Create a report design containing a table that maps to a data source and data set.

Create a Java application that runs the report design and writes the table data to a CSV file.

Run the application and examine the output in the CSV file.
The test environment must include the BIRT run-time engine.
The following sections describe the steps required to build and export the plug‑ins, create the Java application and report design, and test the plug-in example.
How to build and export the org.eclipse.birt.report.engine.emitter.csv plug-in
On PDE Manifest Editor, perform the following tasks:
1 Choose the Build tab, and specify the binary build configuration for the plug-in to include the following items:

META-INF\MANIFEST.MF

bin\org.eclipse.birt.report.engine.emitter.csv

plugin.xml
2 On Overview, in Exporting, choose the Export wizard and perform the following tasks:
1 In Options, choose Package plug-ins as individual JAR archives and Allow for binary cycles in target platform, as shown in
Figure 19‑6.
Figure 19‑6 Exporting plug-in options
2 In Destination, choose the directory, \birt-runtime-4_3_1\ReportEngine, as shown in
Figure 19‑7. Choose Finish.
Figure 19‑7 Exporting a plug-in to the BIRT run-time engine
The org.eclipse.birt.report.engine.emitter.csv JAR file deploys to the birt-runtime-4_3_1\ReportEngine\plugins directory.
How to create the report execution Java project
1 In Eclipse Workbench, choose File➛New➛Project.
2 In New Project—Select a wizard, perform the following tasks:
1 In Wizards, choose Java Project. Choose Next.
2 In Create a Java Project, perform the following tasks:
1 In Project name, type:
ExecuteCSVReport
2 Choose Next.
3 In Java Settings, choose Libraries.
4 In Libraries, perform the following tasks:
1 Choose Add External JARS. JAR Selection opens.
On JAR Selection, navigate to \birt-runtime-4_3_1\ReportEngine\lib and use Ctrl-A to select all libraries. Choose Open.
2 Choose Add External JARs. On JAR Selection, navigate to birt‑runtime‑4_3_1\ReportEngine\plugins and select org.eclipse.birt.report.engine.emitter.csv.jar. Choose Open.
Choose Finish.
How to create the Java report execution class
1 In Eclipse Workbench, choose File➛New➛Class.
2 On New Java Class, perform the following tasks:
1 In Source folder, if necessary, type:
ExecuteCSVReport/src
2 In Package, type:
myCSVPackage
3 In Name, type:
ExecuteCSVReport
4 In Which method stubs would you like to create?, perform the following tasks:
1 Select Public static void main(Strings[ ] args).
2 Deselect Constructors from superclass.
3 Deselect Inherited abstract methods.
Choose Finish.
In Package Explorer, ExecuteCSVReport.java appears in the ExecuteCSVReport project and the file should open in the Java editor.
3 Add the required code. The ExecuteCSVReport code is discussed later in this section.
4 The project compiles automatically by default. If necessary, in Eclipse Workbench, compile the project by choosing Project➛Build Project.
How to run the CSV report rendering extension
To run the CSV report rendering extension, using the ExecuteCSVReport application, perform the following tasks:
1 In Package Explorer, right-click ExecuteCSVReport.java, and choose Run As➛Run Configurations.
2 In Run Configurations, perform the following tasks:
1 Right-click Java Application. Choose New.
2 A new configuration appears. Keep the values set by default, as shown in
Figure 19‑8.
Figure 19‑8 Creating the ExecuteCSVReport run configuration
3 Choose Run.
How to view the CSV report rendering extension file output
1 In Eclipse, navigate to the directory containing the CSV output file. The output CSV file is saved to the following location:
C:\Test\CSVEmitter\ExecuteCSVReport\reports
2 Using a text editor or other tool, open the file, and view its contents.
Figure 19‑9 CSV output
The XML source code for the report design used in this example is discussed later in this section.
About ExecuteCSVReport class
The ExecuteCSVReport class uses the BIRT Report Engine API to run a BIRT report and render the output in CSV format. The custom CSV emitter writes the text‑based elements of the report to a file. The ExecuteCSVReport class performs the following operations:

Configures the report engine

Sets the log configuration and logging level

Starts the platform and loads the plug-ins

Gets the report engine factory object from the platform and creates the report engine

Opens the report design

Creates a task to run and render the report

Set the rendering options, such as the output file and format

Runs the report and destroys the engine

Shuts down the engine
Listing 19‑14 shows the code for the ExecuteCSVReport class in the CSV report rendering extension example.
Listing 19‑14 The ExecuteCSVReport class code
import java.util.logging.Level;
import org.eclipse.birt.core.framework.Platform;
import org.eclipse.birt.report.engine.api.EngineConfig;
import org.eclipse.birt.report.engine.emitter.csv.CSVRenderOption;
import org.eclipse.birt.report.engine.api.IReportEngine;
import
org.eclipse.birt.report.engine.api.IReportEngineFactory;
import org.eclipse.birt.report.engine.api.IReportRunnable;
import org.eclipse.birt.report.engine.api.IRunAndRenderTask;
public class ExecuteCSVReport {
static void executeCSVReport( ) throws Exception
{
IReportEngine engine=null;
EngineConfig config = null;
config = new EngineConfig( );
config.setLogConfig( "c:/birt/logs", Level.FINE );
Platform.startup( config );
IReportEngineFactory factory =
( IReportEngineFactory ) Platform.createFactoryObject
( IReportEngineFactory
.EXTENSION_REPORT_ENGINE_FACTORY );
engine = factory.createReportEngine( config );
engine.changeLogLevel( Level.FINEST );
IReportRunnable design =
engine.openReportDesign
( "reports/csvTest.rptdesign" );
IRunAndRenderTask task =
engine.createRunAndRenderTask( design );
String format = "CSV";
CSVRenderOption csvOptions = new CSVRenderOption( );
csvOptions.setOutputFormat( format );
csvOptions.setOutputFileName( "reports/csvTest.csv" );
task.setRenderOption( csvOptions );
task.run( );
task.close( );
engine.destroy( );
Platform.shutdown( );
System.out.println("We are done!!!");
}
public static void main(String[] args) {
try
{
executeCSVReport( );
}
catch ( Exception e )
{
e.printStackTrace();
}
}
}
About the report design XML code
The XML file for the report design, csvTest.reportdesign, contains the following source code settings, as specified in the report design:

Data sources, including the ODA plug-in extension ID, driver class, URL, and user

Data sets, including the ODA JDBC plug-in extension ID, result set properties, and query text

Page setup, including the page footer

Body, containing the table structure and properties for the bound data columns, including the header, footer, and detail rows
The report design example specifies a data source that connects to org.eclipse.birt.report.data.oda.sampledb, the BIRT Classic Models, Inc. sample database.
Listing 19‑15 shows the XML source code for the report design used to test the CSV rendering example. The sample application runs the report from the reports subfolder in the ExecuteCSVReport project.
Listing 19‑15 The report design XML code
<?xml version="1.0" encoding="UTF-8"?>
<report xmlns="http://www.eclipse.org/birt/2005/design" version="3.2.23" id="1">
<property name="createdBy">Eclipse BIRT Designer Version 4.3.1.v201309091055 Build <4.3.1.v20130917-1035></property>
<property name="units">in</property>
<property name="iconFile">/templates/blank_report.gif</property>
<property name="bidiLayoutOrientation">ltr</property>
<property name="imageDPI">96</property>
<data-sources>
<oda-data-source extensionID="org.eclipse.birt.report.data.oda.jdbc" name="Data Source" id="7">
<list-property name="privateDriverProperties">
<ex-property>
<name>contentBidiFormatStr</name>
<value>ILYNN</value>
</ex-property>
<ex-property>
<name>metadataBidiFormatStr</name>
<value>ILYNN</value>
</ex-property>
</list-property>
<property name="odaDriverClass">org.eclipse.birt.report.data.oda.sampledb.Driver</property>
<property name="odaURL">jdbc:classicmodels:sampledb</property>
<property name="odaUser">ClassicModels</property>
</oda-data-source>
</data-sources>
<data-sets>
<oda-data-set extensionID="org.eclipse.birt.report.data.oda.jdbc.JdbcSelectDataSet" name="ProductInventory" id="8">
<list-property name="columnHints">
<structure>
<property name="columnName">PRODUCTCODE</property>
<text-property name="displayName">PRODUCTCODE</text-property>
<text-property name="heading">PRODUCTCODE</text-property>
</structure>
<structure>
<property name="columnName">PRODUCTNAME</property>
<text-property name="displayName">PRODUCTNAME</text-property>
<text-property name="heading">PRODUCTNAME</text-property>
</structure>
<structure>
<property name="columnName">PRODUCTLINE</property>
<text-property name="displayName">PRODUCTLINE</text-property>
<text-property name="heading">PRODUCTLINE</text-property>
</structure>
<structure>
<property name="columnName">PRODUCTSCALE</property>
<text-property name="displayName">PRODUCTSCALE</text-property>
<text-property name="heading">PRODUCTSCALE</text-property>
</structure>
<structure>
<property name="columnName">PRODUCTVENDOR</property>
<text-property name="displayName">PRODUCTVENDOR</text-property>
<text-property name="heading">PRODUCTVENDOR</text-property>
</structure>
<structure>
<property name="columnName">PRODUCTDESCRIPTION</property>
<text-property name="displayName">PRODUCTDESCRIPTION</text-property>
<text-property name="heading">PRODUCTDESCRIPTION</text-property>
</structure>
<structure>
<property name="columnName">QUANTITYINSTOCK</property>
<text-property name="displayName">QUANTITYINSTOCK</text-property>
<text-property name="heading">QUANTITYINSTOCK</text-property>
</structure>
<structure>
<property name="columnName">BUYPRICE</property>
<text-property name="displayName">BUYPRICE</text-property>
<text-property name="heading">BUYPRICE</text‑property>
</structure>
<structure>
<property name="columnName">MSRP</property>
<text-property name="displayName">MSRP</text-property>
<text-property name="heading">MSRP</text-property>
</structure>
</list-property>
<structure name="cachedMetaData">
<list-property name="resultSet">
<structure>
<property name="position">1</property>
<property name="name">PRODUCTCODE</property>
<property name="dataType">string</property>
</structure>
<structure>
<property name="position">2</property>
<property name="name">PRODUCTNAME</property>
<property name="dataType">string</property>
</structure>
<structure>
<property name="position">3</property>
<property name="name">PRODUCTLINE</property>
<property name="dataType">string</property>
</structure>
<structure>
<property name="position">4</property>
<property name="name">PRODUCTSCALE</property>
<property name="dataType">string</property>
</structure>
<structure>
<property name="position">5</property>
<property name="name">PRODUCTVENDOR</property>
<property name="dataType">string</property>
</structure>
<structure>
<property name="position">6</property>
<property name="name">PRODUCTDESCRIPTION</property>
<property name="dataType">string</property>
</structure>
<structure>
<property name="position">7</property>
<property name="name">QUANTITYINSTOCK</property>
<property name="dataType">integer</property>
</structure>
<structure>
<property name="position">8</property>
<property name="name">BUYPRICE</property>
<property name="dataType">float</property>
</structure>
<structure>
<property name="position">9</property>
<property name="name">MSRP</property>
<property name="dataType">float</property>
</structure>
</list-property>
</structure>
<property name="dataSource">Data Source</property>
<list-property name="resultSet">
<structure>
<property name="position">1</property>
<property name="name">PRODUCTCODE</property>
<property name="nativeName">PRODUCTCODE</property>
<property name="dataType">string</property>
<property name="nativeDataType">12</property>
</structure>
<structure>
<property name="position">2</property>
<property name="name">PRODUCTNAME</property>
<property name="nativeName">PRODUCTNAME</property>
<property name="dataType">string</property>
<property name="nativeDataType">12</property>
</structure>
<structure>
<property name="position">3</property>
<property name="name">PRODUCTLINE</property>
<property name="nativeName">PRODUCTLINE</property>
<property name="dataType">string</property>
<property name="nativeDataType">12</property>
</structure>
<structure>
<property name="position">4</property>
<property name="name">PRODUCTSCALE</property>
<property name="nativeName">PRODUCTSCALE</property>
<property name="dataType">string</property>
<property name="nativeDataType">12</property>
</structure>
<structure>
<property name="position">5</property>
<property name="name">PRODUCTVENDOR</property>
<property name="nativeName">PRODUCTVENDOR</property>
<property name="dataType">string</property>
<property name="nativeDataType">12</property>
</structure>
<structure>
<property name="position">6</property>
<property name="name">PRODUCTDESCRIPTION</property>
<property name="nativeName">PRODUCTDESCRIPTION</property>
<property name="dataType">string</property>
<property name="nativeDataType">12</property>
</structure>
<structure>
<property name="position">7</property>
<property name="name">QUANTITYINSTOCK</property>
<property name="nativeName">QUANTITYINSTOCK</property>
<property name="dataType">integer</property>
<property name="nativeDataType">4</property>
</structure>
<structure>
<property name="position">8</property>
<property name="name">BUYPRICE</property>
<property name="nativeName">BUYPRICE</property>
<property name="dataType">float</property>
<property name="nativeDataType">8</property>
</structure>
<structure>
<property name="position">9</property>
<property name="name">MSRP</property>
<property name="nativeName">MSRP</property>
<property name="dataType">float</property>
<property name="nativeDataType">8</property>
</structure>
</list-property>
<xml-property name="queryText"><![CDATA[select * from CLASSICMODELS.PRODUCTS]]></xml-property>
<xml-property name="designerValues"><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<model:DesignValues xmlns:design="http://www.eclipse.org/datatools/connectivity/oda/design" xmlns:model="http://www.eclipse.org/birt/report/model/adapter/odaModel">
<Version>2.0</Version>
<design:ResultSets derivedMetaData="true">
<design:resultSetDefinitions>
<design:resultSetColumns>
<design:resultColumnDefinitions>
<design:attributes>
<design:identifier>
<design:name>PRODUCTCODE</design:name>
<design:position>1</design:position>
</design:identifier>
<design:nativeDataTypeCode>12</design:nativeDataTypeCode>
<design:precision>15</design:precision>
<design:scale>0</design:scale>
<design:nullability>Nullable</design:nullability>
<design:uiHints>
<design:displayName>PRODUCTCODE</design:displayName>
</design:uiHints>
</design:attributes>
<design:usageHints>
<design:label>PRODUCTCODE</design:label>
<design:formattingHints>
<design:displaySize>15</design:displaySize>
</design:formattingHints>
</design:usageHints>
</design:resultColumnDefinitions>
<design:resultColumnDefinitions>
<design:attributes>
<design:identifier>
<design:name>PRODUCTNAME</design:name>
<design:position>2</design:position>
</design:identifier>
<design:nativeDataTypeCode>12</design:nativeDataTypeCode>
<design:precision>70</design:precision>
<design:scale>0</design:scale>
<design:nullability>Nullable</design:nullability>
<design:uiHints>
<design:displayName>PRODUCTNAME</design:displayName>
</design:uiHints>
</design:attributes>
<design:usageHints>
<design:label>PRODUCTNAME</design:label>
<design:formattingHints>
<design:displaySize>70</design:displaySize>
</design:formattingHints>
</design:usageHints>
</design:resultColumnDefinitions>
<design:resultColumnDefinitions>
<design:attributes>
<design:identifier>
<design:name>PRODUCTLINE</design:name>
<design:position>3</design:position>
</design:identifier>
<design:nativeDataTypeCode>12</design:nativeDataTypeCode>
<design:precision>50</design:precision>
<design:scale>0</design:scale>
<design:nullability>Nullable</design:nullability>
<design:uiHints>
<design:displayName>PRODUCTLINE</design:displayName>
</design:uiHints>
</design:attributes>
<design:usageHints>
<design:label>PRODUCTLINE</design:label>
<design:formattingHints>
<design:displaySize>50</design:displaySize>
</design:formattingHints>
</design:usageHints>
</design:resultColumnDefinitions>
<design:resultColumnDefinitions>
<design:attributes>
<design:identifier>
<design:name>PRODUCTSCALE</design:name>
<design:position>4</design:position>
</design:identifier>
<design:nativeDataTypeCode>12</design:nativeDataTypeCode>
<design:precision>10</design:precision>
<design:scale>0</design:scale>
<design:nullability>Nullable</design:nullability>
<design:uiHints>
<design:displayName>PRODUCTSCALE</design:displayName>
</design:uiHints>
</design:attributes>
<design:usageHints>
<design:label>PRODUCTSCALE</design:label>
<design:formattingHints>
<design:displaySize>10</design:displaySize>
</design:formattingHints>
</design:usageHints>
</design:resultColumnDefinitions>
<design:resultColumnDefinitions>
<design:attributes>
<design:identifier>
<design:name>PRODUCTVENDOR</design:name>
<design:position>5</design:position>
</design:identifier>
<design:nativeDataTypeCode>12</design:nativeDataTypeCode>
<design:precision>50</design:precision>
<design:scale>0</design:scale>
<design:nullability>Nullable</design:nullability>
<design:uiHints>
<design:displayName>PRODUCTVENDOR</design:displayName>
</design:uiHints>
</design:attributes>
<design:usageHints>
<design:label>PRODUCTVENDOR</design:label>
<design:formattingHints>
<design:displaySize>50</design:displaySize>
</design:formattingHints>
</design:usageHints>
</design:resultColumnDefinitions>
<design:resultColumnDefinitions>
<design:attributes>
<design:identifier>
<design:name>PRODUCTDESCRIPTION</design:name>
<design:position>6</design:position>
</design:identifier>
<design:nativeDataTypeCode>12</design:nativeDataTypeCode>
<design:precision>32700</design:precision>
<design:scale>0</design:scale>
<design:nullability>Nullable</design:nullability>
<design:uiHints>
<design:displayName>PRODUCTDESCRIPTION</design:displayName>
</design:uiHints>
</design:attributes>
<design:usageHints>
<design:label>PRODUCTDESCRIPTION</design:label>
<design:formattingHints>
<design:displaySize>32700</design:displaySize>
</design:formattingHints>
</design:usageHints>
</design:resultColumnDefinitions>
<design:resultColumnDefinitions>
<design:attributes>
<design:identifier>
<design:name>QUANTITYINSTOCK</design:name>
<design:position>7</design:position>
</design:identifier>
<design:nativeDataTypeCode>4</design:nativeDataTypeCode>
<design:precision>10</design:precision>
<design:scale>0</design:scale>
<design:nullability>Nullable</design:nullability>
<design:uiHints>
<design:displayName>QUANTITYINSTOCK</design:displayName>
</design:uiHints>
</design:attributes>
<design:usageHints>
<design:label>QUANTITYINSTOCK</design:label>
<design:formattingHints>
<design:displaySize>11</design:displaySize>
</design:formattingHints>
</design:usageHints>
</design:resultColumnDefinitions>
<design:resultColumnDefinitions>
<design:attributes>
<design:identifier>
<design:name>BUYPRICE</design:name>
<design:position>8</design:position>
</design:identifier>
<design:nativeDataTypeCode>8</design:nativeDataTypeCode>
<design:precision>15</design:precision>
<design:scale>0</design:scale>
<design:nullability>Nullable</design:nullability>
<design:uiHints>
<design:displayName>BUYPRICE</design:displayName>
</design:uiHints>
</design:attributes>
<design:usageHints>
<design:label>BUYPRICE</design:label>
<design:formattingHints>
<design:displaySize>22</design:displaySize>
</design:formattingHints>
</design:usageHints>
</design:resultColumnDefinitions>
<design:resultColumnDefinitions>
<design:attributes>
<design:identifier>
<design:name>MSRP</design:name>
<design:position>9</design:position>
</design:identifier>
<design:nativeDataTypeCode>8</design:nativeDataTypeCode>
<design:precision>15</design:precision>
<design:scale>0</design:scale>
<design:nullability>Nullable</design:nullability>
<design:uiHints>
<design:displayName>MSRP</design:displayName>
</design:uiHints>
</design:attributes>
<design:usageHints>
<design:label>MSRP</design:label>
<design:formattingHints>
<design:displaySize>22</design:displaySize>
</design:formattingHints>
</design:usageHints>
</design:resultColumnDefinitions>
</design:resultSetColumns>
<design:criteria/>
</design:resultSetDefinitions>
</design:ResultSets>
</model:DesignValues>]]></xml-property>
</oda-data-set>
</data-sets>
<styles>
<style name="report" id="4">
<property name="fontFamily">sans-serif</property>
<property name="fontSize">10pt</property>
</style>
<style name="crosstab-cell" id="5">
<property name="borderBottomColor">#CCCCCC</property>
<property name="borderBottomStyle">solid</property>
<property name="borderBottomWidth">1pt</property>
<property name="borderLeftColor">#CCCCCC</property>
<property name="borderLeftStyle">solid</property>
<property name="borderLeftWidth">1pt</property>
<property name="borderRightColor">#CCCCCC</property>
<property name="borderRightStyle">solid</property>
<property name="borderRightWidth">1pt</property>
<property name="borderTopColor">#CCCCCC</property>
<property name="borderTopStyle">solid</property>
<property name="borderTopWidth">1pt</property>
</style>
<style name="crosstab" id="6">
<property name="borderBottomColor">#CCCCCC</property>
<property name="borderBottomStyle">solid</property>
<property name="borderBottomWidth">1pt</property>
<property name="borderLeftColor">#CCCCCC</property>
<property name="borderLeftStyle">solid</property>
<property name="borderLeftWidth">1pt</property>
<property name="borderRightColor">#CCCCCC</property>
<property name="borderRightStyle">solid</property>
<property name="borderRightWidth">1pt</property>
<property name="borderTopColor">#CCCCCC</property>
<property name="borderTopStyle">solid</property>
<property name="borderTopWidth">1pt</property>
</style>
</styles>
<page-setup>
<simple-master-page name="Simple MasterPage" id="2">
<page-footer>
<text id="3">
<property name="contentType">html</property>
<text-property name="content"><![CDATA[<value‑of>new Date()</value-of>]]></text-property>
</text>
</page-footer>
</simple-master-page>
</page-setup>
<body>
<table id="9">
<property name="dataSet">ProductInventory</property>
<list-property name="boundDataColumns">
<structure>
<property name="name">PRODUCTNAME</property>
<text-property name="displayName">PRODUCTNAME
</text-property>
<expression name="expression" type="javascript">dataSetRow["PRODUCTNAME"]</expression>
<property name="dataType">string</property>
</structure>
<structure>
<property name="name">QUANTITYINSTOCK</property>
<text-property name="displayName">QUANTITYINSTOCK</text-property>
<expression name="expression" type="javascript">dataSetRow["QUANTITYINSTOCK"]</expression>
<property name="dataType">integer</property>
</structure>
<structure>
<property name="name">MSRP</property>
<text-property name="displayName">MSRP</text-property>
<expression name="expression" type="javascript">dataSetRow["MSRP"]</expression>
<property name="dataType">float</property>
</structure>
</list-property>
<column id="28"/>
<column id="29"/>
<column id="30"/>
<header>
<row id="10">
<cell id="11">
<label id="12">
<text-property name="text">PRODUCTNAME</text-property>
</label>
</cell>
<cell id="13">
<label id="14">
<text-property name="text">QUANTITYINSTOCK</text-property>
</label>
</cell>
<cell id="15">
<label id="16">
<text-property name="text">MSRP</text-property>
</label>
</cell>
</row>
</header>
<detail>
<row id="17">
<cell id="18">
<data id="19">
<property name="resultSetColumn">PRODUCTNAME</property>
</data>
</cell>
<cell id="20">
<data id="21">
<property name="resultSetColumn">QUANTITYINSTOCK</property>
</data>
</cell>
<cell id="22">
<data id="23">
<property name="resultSetColumn">MSRP</property>
</data>
</cell>
</row>
</detail>
<footer>
<row id="24">
<cell id="25"/>
<cell id="26"/>
<cell id="27"/>
</row>
</footer>
</table>
</body>
</report>
BIRT Report Engine can render a report design for output using a standard emitter extension or a customized emitter extension, such as this CSV rendering example.