<style type="text/css"> .ui-paginator a { margin-right: 5px; } </style> <h:form> <p:dataTable id="tbl" var="car" value="#{dataExporterView.cars}" paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {Exporters}" paginator="true" rows="10" style="margin-bottom:20px"> <f:facet name="{Exporters}"> <div style="float:right;padding-top: 5px;"> <h:commandLink> <p:graphicImage name="/demo/images/excel.png" width="24"/> <p:dataExporter type="xls" target="tbl" fileName="cars" /> </h:commandLink> <h:commandLink> <p:graphicImage name="/demo/images/xlsx.png" width="24"/> <p:dataExporter type="xlsxstream" target="tbl" fileName="cars" /> </h:commandLink> <h:commandLink> <p:graphicImage name="/demo/images/pdf.png" width="24"/> <p:dataExporter type="pdf" target="tbl" fileName="cars"/> </h:commandLink> <h:commandLink> <p:graphicImage name="/demo/images/csv.png" width="24"/> <p:dataExporter type="csv" target="tbl" fileName="cars" /> </h:commandLink> <h:commandLink> <p:graphicImage name="/demo/images/xml.png" width="24"/> <p:dataExporter type="xml" target="tbl" fileName="cars" /> </h:commandLink> <h:commandLink> <p:graphicImage name="/demo/images/keyboardpencil.png" width="24"/> <p:dataExporter type="text" target="tbl" fileName="cars" exporter="#{dataExporterView.textExporter}"/> </h:commandLink> </div> </f:facet> <p:column> <f:facet name="header"> <h:outputText value="Id" /> </f:facet> <h:outputText value="#{car.id}" /> </p:column> <p:column> <f:facet name="header"> <h:outputText value="Year"/> </f:facet> <h:outputText value="#{car.year}" /> </p:column> <p:column> <f:facet name="header"> <h:outputText value="Brand" /> </f:facet> <h:outputText value="#{car.brand}" /> </p:column> <p:column> <f:facet name="header"> <h:outputText value="Color" /> </f:facet> <h:outputText value="#{car.color}" /> </p:column> </p:dataTable> <h3>Export Page Data Only</h3> <h:commandLink> <p:graphicImage name="/demo/images/excel.png" /> <p:dataExporter type="xls" target="tbl" fileName="cars" pageOnly="true"/> </h:commandLink> <h:commandLink> <p:graphicImage name="/demo/images/pdf.png" /> <p:dataExporter type="pdf" target="tbl" fileName="cars" pageOnly="true" /> </h:commandLink> <h:commandLink> <p:graphicImage name="/demo/images/csv.png" /> <p:dataExporter type="csv" target="tbl" fileName="cars" pageOnly="true" /> </h:commandLink> <h:commandLink> <p:graphicImage name="/demo/images/xml.png" /> <p:dataExporter type="xml" target="tbl" fileName="cars" pageOnly="true" /> </h:commandLink> </h:form>
@Named @RequestScoped public class DataExporterView implements Serializable { private List<Car> cars; private Exporter<DataTable> textExporter; @Inject private CarService service; @PostConstruct public void init() { cars = service.createCars(100); textExporter = new TextExporter(); } public List<Car> getCars() { return cars; } public void setService(CarService service) { this.service = service; } public Exporter<DataTable> getTextExporter() { return textExporter; } public void setTextExporter(Exporter<DataTable> textExporter) { this.textExporter = textExporter; } }
@Named @ApplicationScoped public class CarService { private final static String[] colors; private final static String[] brands; static { colors = new String[10]; colors[0] = "Black"; colors[1] = "White"; colors[2] = "Green"; colors[3] = "Red"; colors[4] = "Blue"; colors[5] = "Orange"; colors[6] = "Silver"; colors[7] = "Yellow"; colors[8] = "Brown"; colors[9] = "Maroon"; brands = new String[10]; brands[0] = "BMW"; brands[1] = "Mercedes"; brands[2] = "Volvo"; brands[3] = "Audi"; brands[4] = "Renault"; brands[5] = "Fiat"; brands[6] = "Volkswagen"; brands[7] = "Honda"; brands[8] = "Jaguar"; brands[9] = "Ford"; } public List<Car> createCars(int size) { List<Car> list = new ArrayList<Car>(); for(int i = 0 ; i < size ; i++) { list.add(new Car(getRandomId(), getRandomBrand(), getRandomYear(), getRandomColor(), getRandomPrice(), getRandomSoldState())); } return list; } private String getRandomId() { return UUID.randomUUID().toString().substring(0, 8); } private int getRandomYear() { return (int) (Math.random() * 50 + 1960); } private String getRandomColor() { return colors[(int) (Math.random() * 10)]; } private String getRandomBrand() { return brands[(int) (Math.random() * 10)]; } private int getRandomPrice() { return (int) (Math.random() * 100000); } private boolean getRandomSoldState() { return (Math.random() > 0.5) ? true: false; } public List<String> getColors() { return Arrays.asList(colors); } public List<String> getBrands() { return Arrays.asList(brands); } }
public class TextExporter extends DataTableExporter { private StringBuilder builder = new StringBuilder(); @Override protected void preExport(FacesContext context, ExportConfiguration config) throws IOException { ExternalContext externalContext = context.getExternalContext(); configureResponse(externalContext, config.getOutputFileName()); if (config.getPreProcessor() != null) { config.getPreProcessor().invoke(context.getELContext(), new Object[]{builder}); } } @Override protected void doExport(FacesContext context, DataTable table, ExportConfiguration config, int index) throws IOException { builder.append("" + table.getId() + "\n"); if (config.isPageOnly()) { exportPageOnly(context, table, builder); } else if (config.isSelectionOnly()) { exportSelectionOnly(context, table, builder); } else { exportAll(context, table, builder); } builder.append("" + table.getId() + ""); table.setRowIndex(-1); } @Override protected void postExport(FacesContext context, ExportConfiguration config) throws IOException { if (config.getPostProcessor() != null) { config.getPostProcessor().invoke(context.getELContext(), new Object[]{builder}); } OutputStream os = context.getExternalContext().getResponseOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(os, config.getEncodingType()); PrintWriter writer = new PrintWriter(osw); writer.write(builder.toString()); writer.flush(); writer.close(); builder.setLength(0); } @Override protected void preRowExport(DataTable table, Object document) { ((StringBuilder) document).append("\t" + table.getVar() + "\n"); } @Override protected void postRowExport(DataTable table, Object document) { ((StringBuilder) document).append("\t" + table.getVar() + "\n"); } @Override protected void exportCells(DataTable table, Object document) { StringBuilder builder = (StringBuilder) document; for (UIColumn col : table.getColumns()) { if (col instanceof DynamicColumn) { ((DynamicColumn) col).applyStatelessModel(); } if (col.isRendered() && col.isExportable()) { String columnTag = getColumnTag(col); addColumnValue(builder, col.getChildren(), columnTag, col); } } } protected String getColumnTag(UIColumn column) { String headerText = (column.getExportHeaderValue() != null) ? column.getExportHeaderValue() : column.getHeaderText(); UIComponent facet = column.getFacet("header"); String columnTag; if (headerText != null) { columnTag = headerText.toLowerCase(); } else if (facet != null) { columnTag = exportValue(FacesContext.getCurrentInstance(), facet).toLowerCase(); } else { throw new FacesException("No suitable xml tag found for " + column); } return EscapeUtils.forXmlTag(columnTag); } protected void addColumnValue(StringBuilder builder, List<UIComponent> components, String tag, UIColumn column) { FacesContext context = FacesContext.getCurrentInstance(); builder.append("\t\t" + tag + ""); if (column.getExportFunction() != null) { builder.append(EscapeUtils.forXml(exportColumnByFunction(context, column))); } else { for (UIComponent component : components) { if (component.isRendered()) { String value = exportValue(context, component); if (value != null) { builder.append(EscapeUtils.forXml(value)); } } } } builder.append("" + tag + "\n"); } protected void configureResponse(ExternalContext externalContext, String filename) { externalContext.setResponseContentType("text/plain"); externalContext.setResponseHeader("Expires", "0"); externalContext.setResponseHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0"); externalContext.setResponseHeader("Pragma", "public"); externalContext.setResponseHeader("Content-disposition", ComponentUtils.createContentDisposition("attachment", filename + ".txt")); externalContext.addResponseCookie(Constants.DOWNLOAD_COOKIE, "true", Collections.<String, Object>emptyMap()); } }