Как убрать пробелы из чисел с помощью dataExporter? - PullRequest
0 голосов
/ 03 июля 2019

В моем приложении много таблиц данных (используемых в качестве пользовательских тегов), и все они могут быть экспортированы в один файл Excel с помощью функции dataExporter. Моя проблема заключается в том, что столбцы, содержащие числа, отформатированы на внешнем интерфейсе (например, 124 284,4) и, если они экспортируются в Excel, они не могут быть обработаны (для краткого изложения) как числа. Итак ... как я могу удалить пробелы только из этих столбцов, который содержит только цифры в функции postProcess? Это вообще возможно?

Я нашел эту функцию postProcessor, но она конвертирует ВСЕ, а не только числовые строки:

public void postProcessXLS(Object document) {

        HSSFWorkbook wb = (HSSFWorkbook) document;
        HSSFSheet sheet = wb.getSheetAt(0);
        HSSFRow header = sheet.getRow(0);

        Iterator<Row> rowIterator = sheet.iterator();

        if (rowIterator.hasNext()) {
            rowIterator.next();
        }

        while (rowIterator.hasNext()) {
            Row row = rowIterator.next();
            Iterator<Cell> cellIterator = row.cellIterator();
            while (cellIterator.hasNext()) {
                Cell cell = cellIterator.next();
                if (cell.getColumnIndex() > 1) {
                    if (!cell.getStringCellValue().isEmpty()) {
                        cell.setCellValue(Double.valueOf(cell.getStringCellValue().replace("'", "")));
                    }
                }
            }
        }
    }

Это моя кнопка dataExporter:

            <h:commandLink style="float:right">
                <p:graphicImage name="/images/excel.png" width="24"/>
                <p:dataExporter type="xls" target="#{id}" fileName="list" />
            </h:commandLink>

Ожидаемый результат: например, 98 923,5 будет экспортировано как 98923,5 в Excel. Все остальные строки не будут затронуты.

1 Ответ

2 голосов
/ 04 июля 2019

Лучший вариант будет включать расширение org.primefaces.component.export.ExcelExporter и переопределение метода exportValue для применения вашей настройки.Там у вас есть полный доступ к компонентам вывода.Укажите свой собственный экземпляр расширения экспортера для атрибута p:dataExporter customExporter.

Пример может выглядеть следующим образом:

<h:form>
    <h:commandLink title="hejjj!">
        Export to XLS
        <p:dataExporter type="xls" customExporter="#{myBean.customExporter}"
            target="tbl" fileName="anyFilename" />
    </h:commandLink>

    <p:dataTable id="tbl" value="#{myBean.rows}" var="row">
        <p:column headerText="Formatted Numbers with Spaces">
            <h:outputText value="#{row.number}">
                <f:converter .../>
                <f:attribute name="isFormattedNumber" value="1" />
            </h:outputText>
        </p:column>
    </p:dataTable>
</h:form>

Обратите внимание на <f:attribute name="isFormattedNumber" value="1" />, добавленный кh:outputText, который поможет различить компонент при экспорте, используя CustomExcelExporter ниже:

package my.package;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;

import org.primefaces.component.export.ExcelExporter;

public class CustomExcelExporter extends ExcelExporter {

    @Override
    protected String exportValue(FacesContext context, UIComponent component) {
        String exportedValue = super.exportValue(context, component);
        if (component.getAttributes().containsKey("isFormattedNumber")) {
            return exportedValue.replace(" ", "");
        } else {
            return exportedValue;
        }
    }
}

MyBean, просто чтобы показать, где создается экспорт:

package my.package;

import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;

import org.primefaces.component.export.Exporter;

@Named
@RequestScoped
public class MyBean {
    private Exporter customExporter;

    @PostConstruct
    public void init() {
        customExporter = new CustomExcelExporter();
    }
    /** getters, setters */
}

Другой вариант будетпопробовать функциональность custom export , добавив пользовательский атрибут exportFunction во все рассматриваемые столбцы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...