Экспорт интерфейса: повтор списка в виде файла CSV - PullRequest
1 голос
/ 03 апреля 2012

Я использую <ui:repeat> для отображения списка.Теперь я хочу экспортировать весь список в файл CSV.Есть ли способ сделать это в JSF 2.0?

1 Ответ

2 голосов
/ 03 апреля 2012

Да, есть способ. Добавьте командную кнопку с надписью «экспорт».

<h:form>
    <h:commandButton value="export" action="#{bean.export}" />
</h:form>

Затем, в методе export(), выполните итерацию по List<Something>, отображаемому там в <ui:repeat>, и напечатайте каждую строку / столбец в допустимом формате CSV. Правила формата CSV очень просты, их всего 3:

  • Поля разделены запятой.
  • Если в поле встречается запятая, то поле должно быть заключено в двойные кавычки.
  • Если в поле встречается двойная кавычка, то поле должно быть окружено двойными кавычками, а двойная кавычка внутри поля должна быть экранирована другой двойной кавычкой.

Так что это будет выглядеть примерно так:

public void export() throws IOException {
    FacesContext fc = FacesContext.getCurrentInstance();
    ExternalContext ec = fc.getExternalContext();
    String filename = "somename.csv";

    ec.responseReset();
    ec.setResponseContentType("text/csv");
    ec.setResponseHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
    Writer writer = ec.getResponseOutputWriter();

    for (Something something : somethings) { // somethings is your List<Something>
        writer.append(toCsvField(something.getFoo()))
              .append(',')
              .append(toCsvField(something.getBar()))
              .append(',');
              .append(toCsvField(something.getBaz()))
              .append('\n');
    }       

    fc.responseComplete(); // Important! Otherwise JSF will perform navigation.
}

public static String toCsvField(Object value) {
    if (value == null) {
        return "";
    }

    String field = String.valueOf(value).replace("\"", "\"\"");

    if (field.indexOf(',') > -1 || field.indexOf('"') > -1) {
        field = '"' + field + '"';
    }

    return field;
}
...