JSP генерация электронной таблицы Excel (XLS) для загрузки

Проверьте, не определили ли вы свой базовый URL в файле config.php. Если нет, определите его как-

$config['base_url'] = 'your-base-url';

в файле config.php в папке application / config.

5
задан Burhan Ali 29 February 2012 в 20:57
поделиться

4 ответа

В то время как можно пользоваться абсолютной библиотекой как JExcelAPI, Excel также считает CSV и простые HTML-таблицы, если Вы устанавливаете ответ Тип MIME на что-то как "application/vnd.ms-excel".

В зависимости от того, насколько сложный электронная таблица должна быть, CSV или HTML могут сделать задание для Вас без сторонней библиотеки.

9
ответ дан 18 December 2019 в 07:11
поделиться

Вам, вероятно, будет нужна библиотека для управления файлами Excel, как JExcelAPI ("jxl") или ПОИ. Я более знаком с jxl, и он может, конечно, записать файлы. Можно генерировать их и сохранить их путем обслуживания URL им, но я не был бы. Сгенерированные файлы являются болью. Они добавляют сложность в форме на параллелизме, процессах очистки, и т.д.

Если можно генерировать файл на лету и передать его потоком клиенту через стандартные механизмы сервлета.

Если это генерировало многих, можете, времена или поколение являются дорогими затем, можно кэшировать результат так или иначе, но я был бы более склонен сохранить его в памяти, чем как файл. Я, конечно, избежал бы, если Вы можете, связываясь непосредственно со сгенерированным файлом URL. Если Вы пойдете через сервлет, то он позволит Вам изменить свой impleemntation позже. Это - то же понятие инкапсуляции как в OO dsign.

3
ответ дан 18 December 2019 в 07:11
поделиться

возможно, необходимо рассмотреть использование некоторого инструмента создания отчетов с опцией экспорта файлов в формат XLS. моим предложением является JasperReports

0
ответ дан 18 December 2019 в 07:11
поделиться

Не используйте простые таблицы HTML с типом содержимого application / vnd.ms-excel . Затем вы вводите в заблуждение Excel неверным типом содержимого, что может вызвать сбой и / или предупреждения в последних версиях Excel. Это также испортит исходный источник HTML, когда вы его отредактируете и сохраните в Excel. Только не делай этого.

CSV, в свою очередь, является стандартным форматом, который по умолчанию поддерживает Excel без каких-либо проблем, и на самом деле его легко и эффективно с точки зрения памяти генерировать. Хотя существуют библиотеки, вы также можете легко написать одну менее чем из 20 строк (забавно для тех, кто не может устоять). Вам просто нужно придерживаться спецификации RFC 4180 , которая в основном содержит только 3 правила:

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

Вот начальный пример:

public static <T> void writeCsv (List<List<T>> csv, char separator, OutputStream output) throws IOException {
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output, "UTF-8"));
    for (List<T> row : csv) {
        for (Iterator<T> iter = row.iterator(); iter.hasNext();) {
            String field = String.valueOf(iter.next()).replace("\"", "\"\"");
            if (field.indexOf(separator) > -1 || field.indexOf('"') > -1) {
                field = '"' + field + '"';
            }
            writer.append(field);
            if (iter.hasNext()) {
                writer.append(separator);
            }
        }
        writer.newLine();
    }
    writer.flush();
}

Вот пример того, как вы могли бы это использовать:

public static void main(String[] args) throws IOException {
    List<List<String>> csv = new ArrayList<List<String>>();
    csv.add(Arrays.asList("field1", "field2", "field3"));
    csv.add(Arrays.asList("field1,", "field2", "fie\"ld3"));
    csv.add(Arrays.asList("\"field1\"", ",field2,", ",\",\",\""));
    writeCsv(csv, ',', System.out);
}

А внутри сервлета (да, сервлета, не используйте для этого JSP!) Вы можете в основном:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String filename = request.getPathInfo().substring(1);
    List<List<Object>> csv = someDAO().findCsvContentFor(filename);
    response.setHeader("content-type", "text/csv");
    response.setHeader("content-disposition", "attachment;filename=\"" + filename + "\"");
    writeCsv(csv, ';', response.getOutputStream());
}

Map этот сервлет на чем-то вроде / csv / * и вызвать его как что-то вроде http://example.com/context/csv/filename.csv . Это все.

Обратите внимание, что я добавил возможность указывать символ-разделитель отдельно, потому что это может зависеть от используемой локали, примет ли Excel запятую , или точку с запятой ; в качестве разделителя полей CSV. . Обратите внимание, что я также добавил имя файла в URL pathinfo, потому что определенный веб-браузер, разработанный командой в Редмонде, в противном случае не сохранил бы загрузку с правильным именем файла.

9
ответ дан 18 December 2019 в 07:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: