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 RunRun 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 24‑4.
Figure 24‑4 Creating the CSVEmitter run configuration
3 Choose the Arguments tab. Ensure that the following arguments appear:
*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 RunView ReportAs CSV, as shown in Figure 24‑5.
Figure 24‑5 Previewing a report in CSV format
A new browser window opens and a file download starts. Depending on the browser settings, you may be prompted to save the CSV report.
4 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 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 24‑6.
Figure 24‑6 Exporting plug-in options
2 In Destination, choose the directory, \birt-runtime-4_3_1\ReportEngine, as shown in Figure 24‑7. Choose Finish.
Figure 24‑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 FileNewProject.
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:
*In Project name, type:
ExecuteCSVReport
*Choose Next.
3 In Java Settings, choose Libraries.
4 In Libraries, perform the following tasks:
*Choose Add External JARS. JAR Selection opens.
In JAR Selection, navigate to \birt-runtime-4_3_1\ReportEngine\lib and use Ctrl+A to select all libraries. Choose Open.
*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 FileNewClass.
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:
*Select Public static void main(Strings[ ] args).
*Deselect Constructors from superclass.
*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 ProjectBuild 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 AsRun 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 24‑8.
Figure 24‑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 24‑9 shows the CSV output.
Figure 24‑9 CSV output
The XML source code for the report design used in this example is discussed later in this section.
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 24‑14 shows the code for the ExecuteCSVReport class in the CSV report rendering extension example.
Listing 24‑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( );
}
}
}
Report design XML code
The XML code 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 24‑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 24‑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 &lt;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>
The 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.