Primefaces экспортирует только одну расширяемую таблицу - PullRequest
1 голос
/ 06 марта 2019

Я пытаюсь экспортировать представление в xlsx, используя расширения PrimeFaces. У меня есть основная таблица и расширяемая строка с 2 таблицами внутри.

Экспортер отлично работает для первой таблицы данных в расширяемой строке, но не для другой. Есть идеи?

<p:dataTable id="mainTable" var="mainObject" value="#{mainBean.mainList}">
    <p:column exportable="false" width="5%">  
        <p:rowToggler />  
    </p:column>

    <p:column>
        <f:facet name="header">
            <h:outputText value="main column A"/>
        </f:facet>
        <h:outputText value="#{mainObject.columnA}" />
    </p:column>

    <p:column>
        <f:facet name="header">
            <h:outputText value="main column B"/>
        </f:facet>
        <h:outputText value="#{mainObject.columnB}" />
    </p:column>

    <p:rowExpansion>

        <p:datTable id="relatedTableA" var="relatedA" value="#{mainObject.relatedA}">
            <f:facet name="header">
                <h:outputText value="Related A"/>
            </f:facet>

            <p:column>
                <f:facet name="header">
                    <h:outputText value="Related A column A"/>
                </f:facet>
                <h:outputText value="#{relatedA.columnA}" />
            </p:column>
            <p:column>
                <f:facet name="header">
                    <h:outputText value="Related A column B"/>
                </f:facet>
                <h:outputText value="#{relatedA.columnB}" />
            </p:column>
        </p:dataTable>

        <p:datTable id="relatedTableB" var="relatedB" value="#{mainObject.relatedB}">
            <f:facet name="header">
                <h:outputText value="Related B"/>
            </f:facet>

            <p:column>
                <f:facet name="header">
                    <h:outputText value="Related B column A"/>
                </f:facet>
                <h:outputText value="#{relatedB.columnA}" />
            </p:column>
            <p:column>
                <f:facet name="header">
                    <h:outputText value="Related B column B"/>
                </f:facet>
                <h:outputText value="#{relatedB.columnB}" />
            </p:column>
        </p:dataTable>

    </p:rowExpansion>

</p:dataTable>

<h:commandLink>
   <p:graphicImage url="/resources/images/Excel32.png" width="32"/>
   <pe:exporter type="xlsx" target="mainTable" fileName="fileExport" facetBackground="#AAFFBB" datasetPadding="4" />   
</h:commandLink>

Я следовал этому руководству: https://www.primefaces.org/showcase-ext/sections/exporter/expandableTable.jsf

В моем приложении вид работает идеально. Я использую переключатель, а затем он показывает 2 таблицы. Единственная проблема заключается в том, что он экспортирует только один из расширяемых.

Спасибо за ваше время.

1 Ответ

3 голосов
/ 06 марта 2019

Кажется, это просто не поддерживается.

В исходном коде компонента экспортера, когда дело доходит до при экспорте затрат на строки они жестко запрограммированы на то, чтобы рассматривать первого потомка только для каждой строки Расширение:

if (rowExpansion.getChildren().get(0) instanceof DataTable) {
    final DataTable childTable = (DataTable) rowExpansion.getChildren().get(0);
    // ...
}

Вот почему вы получаете только первую подстолью в своем выводе.

Используя функцию customExporter , у вас есть возможность расширить ExcelExporter и переопределить метод exportCells, который, по-видимому, отвечает за вашу проблему. Затем измените поведение, чтобы сделать цикл на rowExpansion.getChildren() вместо того, чтобы просто получить первый элемент.

Общие шаги по настройке пользовательского экспортера из связанного сайта :

Шаг 1. Создайте папку с именем META-INF в папке resouces. Ниже Папка META-INF создает другую папку с именем services.

Шаг 2: создание файл с именем "ExporterFactory" в качестве службы (полностью двоичное имя сервис). Здесь должен быть org.primefaces.extensions.component.exporter.ExporterFactory.

Шаг 3: Предоставить свои собственные реализации / поставщиков фабрики экспортеров в любом месте в вашем проекте. И скопируйте абсолютный путь реализации фабрики пользовательских экспортеров в файл ExporterFactory Как это сделать: скопировать содержимое файла DefaultExporterFactory и переименовать файл в CustomExporterFactory. Скопировать абсолютный путь org.primefaces.extensions.showcase.util.CustomExporterFactory в Файл ExporterFactory.

Шаг 4. Скопируйте реализации экспортера и добавьте свои собственные изменения. И вызовите эти пользовательские реализации (например, PDFCustomExporter, ExcelCustomExporter) вместо встроенного имплементации (например, PDFExporter, ExcelExporter)

...