Проблема с Primefaces p:dataExporter, которая экспортирует DataTable с SelectOneMenu не так, как ожидалось?

Я хочу экспортировать <p:dataTable> с SelectOneMenu, как показано в этом примере JSF Primefaces SelectOneMenu

Итак, я использовал простые лица <p:dataExporter type="xls" target="datatbleId" fileName="cars"/>

который generated a xls file в следующем формате:

------------------------------------
Name | Car 
----------------------------------------
ABC | 1
DDD | 2

Что я должен делать ? Итак, я могу сгенерировать xls в следующем формате:

------------------------------------
Name | Car 
----------------------------------------
ABC | Toyota
DDD | Ford

Мой код DataTable выглядит следующим образом:

<p:dataTable id="studentDtble" var="studentDetail" value="#{studentController.studentList}" emptyMessage="No records found">
    <p:column styleClass="ralign">
        <f:facet name="header">
            <h:outputText value="Student Id " />
        </f:facet>
        <p:commandLink id="studentCmdLnk" action="#{profileHandler.showStudentProfile}" update=":tabView:loanOvrviewForm">
            <h:outputText id="studentIdOutTxt" value="#{studentDetail.studentId}" />
        </p:commandLink>
    </p:column>
    <p:column>
        <f:facet name="header">
            <h:outputText value="Class" />
        </f:facet>
        <h:outputText id="classoutTxt" value="#{studentDetail.class}" />
    </p:column>
    <p:column>
        <f:facet name="header">
            <h:outputText value="Student Name" />
        </f:facet>
        <h:outputText id="nameoutTxt" value="#{studentDetail.studentName}" />
    </p:column>
    <p:column>
        <f:facet name="header">
            <h:outputText value="Contact No" />
        </f:facet>
        <h:inputText id="contactInTxt" value="#{studentDetail.studentContact}" />
    </p:column>
    <p:column>
        <f:facet name="header">
            <h:outputText value="DOJ" />
        </f:facet>
        <h:outputText id="dojDateOutTxt" value="#{studentDetail.dojDate}">
            <f:convertDateTime pattern="MM/dd/yyyy" />
        </h:outputText>
    </p:column>
    <p:column>
        <f:facet name="header">
            <h:outputText value="Group/Branch" />
        </f:facet>
        <p:selectOneMenu id="branchesLstBox" value="#{studentDetail.branchList.branchId}">
            <f:selectItems value="#{studentController.getAllBranches()}" var="branches" itemValue="#{branches.branchId}" itemLabel="#{branches.branchName}" />
        </p:selectOneMenu>
    </p:column>
    <p:column>
        <f:facet name="header">
            <h:outputText value="Remarks" />
        </f:facet>
        <p:inputText id="remarksInTxt" value="#{studentDetail.remarks}" />
    </p:column>

</p:dataTable>

person 09Q71AO534    schedule 22.07.2014    source источник
comment
@BalusC может вам помочь :) Я думаю, что для этого не нужен DataExporter, как определено Суджан ниже   -  person    schedule 23.07.2014


Ответы (1)


Я не уверен, что вы можете сделать это с помощью dataExporter, однако вы можете реализовать свой собственный экспортер, это довольно просто, вам просто нужен Apache POI.

Образец :

Кнопка для размещения на лицевой панели.

<p:commandButton icon="ui-icon-arrowstop-1-s" value="XLS" onclick="PrimeFaces.monitorDownload(start, stop)">
<p:fileDownload  value="#{dataExporter.generateXLS()}" />                       
</p:commandButton >

Управляемый компонент с областью запроса (но вы также можете реализовать веб-сервлет)

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLConnection;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

@ManagedBean(name="dataExporter")
@RequestScoped
public class DataExporter  {

 public StreamedContent generateXLS() {

        if (list != null) { // the list you are using in the data Table
            if (!list.isEmpty()) {
                String filePath = "E:\\tmp\\";
                String fileName = "xlsFile";
                String a = filePath + fileName;
                XSSFWorkbook new_workbook = new XSSFWorkbook(); 
                XSSFSheet sheet = new_workbook.createSheet("SAMPLE"); 
                int cellnum = 0;
                int rownum = 0 ;
                Row row = sheet.createRow(0);

                 for (Object object : list) { //loop through the data and add them to the cell
                    row = sheet.createRow(rownum++);
                    cellnum = 0;

                    cell = row.createCell(cellnum++);
                    if (object.getColumn1() == null) {
                        cell.setCellValue("");
                    } else {
                        cell.setCellValue(object.getColumn1());
                    }

                    cell = row.createCell(cellnum++);
                    if (object.getColumn2() == null) {
                        cell.setCellValue("");
                    } else {
                        cell.setCellValue(object.getColumn2());
                    }
                   }

                   FileOutputStream output_file = null;
                try {
                    output_file = new FileOutputStream(new File(a)); 
                } catch (FileNotFoundException ex) {

                }

                try {
                    new_workbook.write(output_file);
                } catch (IOException ex) {

                }

                try {
                    output_file.close(); //close the file
                } catch (IOException ex) {

                }
                FileInputStream fis = null;
                try {
                    fis = new FileInputStream(a);
                } catch (FileNotFoundException ex) {

                }
                InputStream is = fis;
                String mimeType = "";
                try {
                    mimeType = URLConnection.guessContentTypeFromStream(is);
                } catch (IOException ex) {

                }

                return new DefaultStreamedContent(is, mimeType, fileName);
            }    

Отказ от ответственности: не тестировалось, и вам необходимо адаптировать код с вашими собственными объектами и сущностями.

person Community    schedule 22.07.2014
comment
Спасибо за ответ :) поработаю над этим и опубликую обратно - person 09Q71AO534; 23.07.2014
comment
При работе с опубликованным кодом, я думаю, это становится сложным, если у нас есть таблица данных с «n» без определенных столбцов. У нас нет другого способа сгенерировать Excel с помощью самого p: dataExporter. - person 09Q71AO534; 23.07.2014
comment
@Robin Hood's Пробовали ли вы решение, предложенное Sujan. Это хорошая практика? - person 09Q71AO534; 23.07.2014
comment
@ 09Q71AO534 Нет, я не пробовал решение ;), я просто упомянул о проблеме, я надеюсь, что генератор Excel от #Sujan должен работать :), но, думая об этом глобально, я могу сказать, что они могут быть проблемой, пока у нас нет динамических столбцов. в таблице данных. - person ; 23.07.2014
comment
@Sujan, так ли важно создать новый DataExporter только из-за метки элемента SelectOneMenu, я думаю, это можно было бы обработать каким-то другим способом :). я не очень разбираюсь в первичных лицах, но я погуглил и заметил, что BalusC имеет репутацию, отвечающую на такие вопросы. - person ; 23.07.2014
comment
@ 09Q71AO534 Вы можете изменить код, чтобы сделать его динамичным. то есть: найти все поля объекта, создать столбцы и соответствующим образом заполнить строки. - person ; 23.07.2014
comment
@ Робин Гуд, я не думаю, что это работает из коробки. В любом случае, в dataExporter передается, конечно же, не метка, а значение. - person ; 23.07.2014
comment
@ 09Q71AO534 Вам нужно опубликовать свой код для таблицы данных. - person ; 23.07.2014
comment
@SujanSivagurunathan Я полагал, что только из-за одной неудачи мы не должны возвращаться к начальной фазе проектирования. - person ; 24.07.2014
comment
@SujanSivagurunathan Я попытался исправить код, который вы разместили, но мое затмение находит трудности в (// просматривает данные и добавляет их в ячейку). Можете ли вы сделать сообщение более понятным. - person ; 24.07.2014
comment
@SujanSivagurunathan да, я прочитал заявление об отказе от ответственности, но как вы думаете, публикация непроверенного кода в RealWorld может сработать;). Я сказал, что только что попробовал, а затем код, который вы написали, выбрасывается eclipse: P. Поэтому я предложил проверить его один раз, ничего особенного, сэр :) - person ; 24.07.2014
comment
@RobinHood's Я не могу публиковать настоящий код без реального кода, поэтому я попросил ОП опубликовать его код dataTable;) PS: у меня есть аналогичный метод в одном из моих приложений, и он отлично работает. - person ; 24.07.2014
comment
@SujanSivagurunathan, я согласен;) с вами :) ОП должен был опубликовать код - person ; 24.07.2014
comment
@ Во-первых, извините за опоздание. я думаю, что дискуссия между сэром Суджан и сэром Робином крутая. Я отредактирую свой вопрос с данными через несколько минут. :) - person 09Q71AO534; 24.07.2014
comment
@SujanSivagurunathan может помочь вам сейчас с кодом, который вы разместили. 09Q71A0534 :) - person ; 24.07.2014
comment
@SujanSivagurunathan, сэр, вы нашли какой-нибудь обходной путь :) по этой проблеме? - person 09Q71AO534; 28.07.2014
comment
@ 09Q71AO534 Здравствуйте, вы решили проблему или все еще боретесь с ? - person ; 14.10.2014
comment
@SujanSivagurunathan Я еще не нашел решения для этого :( но у меня было частичное исправление, которое мы можем назвать жестким кодом. - person 09Q71AO534; 05.11.2014