Recently, I was presented with a requirement to export data from ICE Faces
ACE Data Table to a CSV file. ICE Faces provides an out of the box component -
Data Exporter to do just that, however in my case the requirement was to save the CSV file to a server location. Unfortunately, Data Exporter does not provide this option, instead sending the file back to the user in a response. Here is my workaround (which can be applied to other supported export types such as pdf and excel):
First, ace datatable needs to bound to the backing bean:
<ace:dataTable id="summaryTable" var="summary"
value="#{summaryReportBean.summaryList}"
binding="#{summaryReportBean.summaryDataTable}">
. . .
</ace:dataTable>
And the corresponding bean:
import java.util.List
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import com.jv.service.SummaryReportService;
import org.icefaces.ace.component.datatable.DataTable;
public class SummaryReportBean {
@Autowired
private SummaryReportService reportService;
private DataTable summaryDataTable;
public List<ReportLine> getSummaryList() {
return reportService.generateReport();
}
public DataTable getSummaryReportTable() {
return summaryReportTable;
}
public void setSummaryReportTable(DataTable summaryReportTable) {
this.summaryReportTable = summaryReportTable;
}
}
Now, we'll add a button which will trigger the CSV export file to be generated:
<h:commandButton id="SummaryReportExportButton"
value="Export Summary Report to CSV"
rendered="#{not empty summaryReportBean.summaryList}"
actionListener="#{summaryReportBean.exportSummaryReportToCSV}" />
And here is the code to generate the CSV file:
import javax.faces.context.FacesContext;
import org.apache.commons.io.IOUtils;
import org.icefaces.ace.component.dataexporter.CSVExporter;
import org.icefaces.ace.component.datatable.DataTable;
import org.icefaces.application.ResourceRegistry;
...
public void generateReport(ActionEvent event) throws IOException {
CSVExporter exporter = new CSVExporter();
String resourcePath =
exporter.export(FacesContext.getCurrentInstance(),
summaryDataTable, null, false,
null, null, null, null, true, false, false);
InputStream inputStream =
ResourceRegistry.getResourceByPath(
FacesContext.getCurrentInstance(), resourcePath)
.getInputStream();
String report = IOUtils.toString(inputStream));
saveReportToFile(report);
}
CSVExporter is a class ICEFaces uses to generate CSV exports. Here is the export method signature:
public String export(FacesContext facesContext,
DataTable table,
String filename,
boolean pageOnly,
int[] excludeColumns,
String encodingType,
MethodExpression preProcessor,
MethodExpression postProcessor,
boolean includeHeaders,
boolean includeFooters,
boolean selectedRowsOnly) throws IOException {
CVSExporter wraps the resulting CSV text into org.icefaces.ace.component.dataexporter.ExporterResource and puts it into org.icefaces.application.ResourceRegistry. So all this is needed to do is to fetch the resource from the registry, get the InputStream and write it to a desired server location.