powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / JasperReports. Скачивание сгенеренного xlsx файла
25 сообщений из 43, страница 1 из 2
JasperReports. Скачивание сгенеренного xlsx файла
    #39917807
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начало проблемы:
https://www.sql.ru/forum/1321376/rest-controller-vozvrashhaushhiy-fayl-excel
https://www.sql.ru/forum/1321467/pokazat-v-brauzere-polzovatelu-otchet-sformirovannyy-na-servere-jasperreports

Сделано:
В браузере пользователь заполняет параметры отчета, нажимает кнопку "Сформировать отчет", в той же вкладке, ниже параметров, открывается сформированный отчет в html
Добавилась задача: добавить кнопку "Скачать отчет в формате xlsx", по по нажатию на которую начинается скачивание xlsx файла.

Делаю в сервисе так (не уверен, что это правильно):
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
ByteArrayOutputStream out = new ByteArrayOutputStream();
        File outputFile = new File(templateName + ".xlsx");
        OutputStream fileOutputStream = new FileOutputStream(outputFile);
        SimpleXlsxReportConfiguration configuration = new SimpleXlsxReportConfiguration();
        configuration.setOnePagePerSheet(true);
        configuration.setIgnoreGraphics(false);
        Exporter exporter = new JRXlsxExporter();
        exporter.setExporterInput(new SimpleExporterInput(print));
        exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(out));
        exporter.setConfiguration(configuration);
        exporter.exportReport();
        out.writeTo(fileOutputStream);
        return out.toByteArray();


Аналогично было сделано для html, и далее в контроллере Html обрабатывался следующим образом:
Код: java
1.
2.
3.
4.
5.
6.
7.
String content = new String(file); // file - это то, что я получаю из сервиса
res.setContentType("text/html");
res.setCharacterEncoding("UTF-8");
OutputStream out = res.getOutputStream();
out.write(content.getBytes("UTF-8"));
out.flush();
out.close();


Далее, на клиенте это попадает в JavaScript, там происходит следующее:
Код: javascript
1.
2.
3.
4.
5.
6.
    let xhr = new XMLHttpRequest();
    xhr.open("POST", url, true);
    xhr.setRequestHeader('Content-type','application/json; charset=utf-8');
    xhr.onload = function () {// здесь я получаю ответ от контроллера, в данном случае - html файл
        $("#report-content").html(xhr.responseText);
    }


Вопрос: как обработать в контроллере полученный byte[], чтобы на клиент отправился xlsx файл?
Как обработать этот файл на стороне клиента, чтобы он вызвал диалог сохранения файла в браузере?
Может быть я вообще неверно подхожу к скачиванию файла с сервера? Как, в таком случае, правильно?
...
Рейтинг: 0 / 0
JasperReports. Скачивание сгенеренного xlsx файла
    #39917813
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов,
Основы веб приложений это переходы по урл.
Есть альтернатива - приложения одного окна. Когда все пихают на один урл окно.
Даже если тебя заставляют делать что то по ajax в том же окне - старайся не делать так.
Да, без ajax окно моргнет и обновится за 0,1 сек. Но зато приложение будет большим, устойчивым к ошибкам и масштабируемым.
....
То есть скачку файла в отдельном окне. Отчет не во вкладке а в отдельном окне. Либо вкладки из отдельных контроллеров окон.
...
Рейтинг: 0 / 0
JasperReports. Скачивание сгенеренного xlsx файла
    #39917819
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,
А если не обсуждать архитектуру приложения, то что по моим вопросам:

как обработать в контроллере полученный byte[], чтобы на клиент отправился xlsx файл?
Как обработать этот файл на стороне клиента, чтобы он вызвал диалог сохранения файла в браузере?
...
Рейтинг: 0 / 0
JasperReports. Скачивание сгенеренного xlsx файла
    #39917820
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов
Добавилась задача: добавить кнопку "Скачать отчет в формате xlsx",

Отправить запрос на сервер сабмитом с перерисовкой страницы.
То есть на данной странице тег form html и кнопка action post
Чтобы потом получить то что надо на новую ModelView
...
Рейтинг: 0 / 0
JasperReports. Скачивание сгенеренного xlsx файла
    #39917822
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов,
Если не обсуждать то трудно вникать. Ты там намешал два отчета, upload download и параметры отчетов.
Извини.
...
Рейтинг: 0 / 0
JasperReports. Скачивание сгенеренного xlsx файла
    #39917824
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов,
если у тебя есть сформированный файл на диске
Код: html
1.
<a id="myid" href="путь до файла"  download style='display= none;'></a>



в кнопки на событие клик
Код: javascript
1.
document.getElementById('myid').click();



ну заполнение тега a , с помощью ajax сделаешь?
...
Рейтинг: 0 / 0
JasperReports. Скачивание сгенеренного xlsx файла
    #39917828
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,
1. Что мне надо вернуть контроллеру из сервиса? Сейчас возвращается byte[].
2. Сейчас я при экспорте указываю имя файла для экспорта. Правильно ли я понимаю, что в таком случае файл создается не на диске сервера, т.к. нет полного пути, а только в памяти?
3. В любом случае я отправляю с клиента HTTPRequest, как обработать полученную им из контроллера информацию?
...
Рейтинг: 0 / 0
JasperReports. Скачивание сгенеренного xlsx файла
    #39917833
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов,

вам нужно указать клиенту, что делать с тем, что ему отдаёте:
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition
...
Рейтинг: 0 / 0
JasperReports. Скачивание сгенеренного xlsx файла
    #39917835
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов,
этим ты создаёшь файл на диске
Код: java
1.
  File outputFile = new File(templateName + ".xlsx");


всё бы нормально, но если несколько юзеров нажмут на скачивание - что будет в файле?
я б добавил логин юзера к имени файла.
...
Рейтинг: 0 / 0
JasperReports. Скачивание сгенеренного xlsx файла
    #39917838
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

можно проще
при нажатии кнопки отправить на сервер "команду скачать" , сервер , в ответе ajax вернёт путь до файла,
в ajax в обработке ответа вставить в тег a путь и програмно нажать на тег
Код: javascript
1.
document.getElementById('myid').click();
...
Рейтинг: 0 / 0
JasperReports. Скачивание сгенеренного xlsx файла
    #39917840
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,
Добавлю к имени милисекунды времени создания
...
Рейтинг: 0 / 0
JasperReports. Скачивание сгенеренного xlsx файла
    #39917843
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,
авторпри нажатии кнопки отправить на сервер "команду скачать" , сервер , в ответе ajax вернёт путь до файла,

В таком случае можно сделать, чтобы сервис передавал в контроллер имя файла, и контроллер возвращал его аяксу?
...
Рейтинг: 0 / 0
JasperReports. Скачивание сгенеренного xlsx файла
    #39917846
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если использовать spring boot, то загуглите
ResponseEntity<Resource>
копипастну вам сюда метод из нашего контроллера, думаю разберетесь, ну или нет :) ApiOperation это аннотация сваггера, она не обязательна вам.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  @ApiOperation(value = "Гeнeрaция отчeтa", httpMethod = "POST")
    @RequestMapping(value = "generate", method = RequestMethod.POST)
    public ResponseEntity<Resource> generateReport(@RequestBody ReportRequestDTO reportRequest) throws DataRetrieveException, InvalidParamsException, ObjectNotFoundException {
        ReportDTO report = reportService.generateReport(reportRequest);
        byte[] reportData = report.getFile().getData();
        ByteArrayResource resource = new ByteArrayResource(reportData);
        return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION, reportService.getContentDispositionFromReport(report))
                .contentLength(reportData.length)
                .contentType(MediaType.parseMediaType("application/octet-stream; charset=" + fileEncoding))
                .body(resource);

    }



отдельно метод getContentDispositionFromReport
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  @Override
    public String getContentDispositionFromReport(ReportDTO report) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(fileNameDatePattern);

        String fileName = (report.getName() != null ? report.getName() : report.getFile().getName()) + "_"
                + report.getCreateDate().format(formatter) + "." + report.getFormat().getFormatType().getName();

        try {
            return "attachment; filename=\"" + URLEncoder.encode(fileName, fileEncoding) + "\"";
        } catch (UnsupportedEncodingException e) {
            LOGGER.error("Invalid encoding ", e);
        }
        return null;
    }
...
Рейтинг: 0 / 0
JasperReports. Скачивание сгенеренного xlsx файла
    #39917850
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: javascript
1.
2.
3.
4.
5.
6.
7.
let xhr = new XMLHttpRequest();
    xhr.open("POST", url, true);
    xhr.setRequestHeader('Content-type','text/html; charset=utf-8');
    xhr.onload = function () {
        document.getElementByID('myid').setAttribute('href', xhr.responseText);
        document.getElementById('myid').click();
    }
...
Рейтинг: 0 / 0
JasperReports. Скачивание сгенеренного xlsx файла
    #39917853
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов,
Ты же первый файл делал отчета?
По урлу
/REPORT1
Зачем тебе ajax для второго?
...
Рейтинг: 0 / 0
JasperReports. Скачивание сгенеренного xlsx файла
    #39917855
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов
вадя,
авторпри нажатии кнопки отправить на сервер "команду скачать" , сервер , в ответе ajax вернёт путь до файла,

В таком случае можно сделать, чтобы сервис передавал в контроллер имя файла, и контроллер возвращал его аяксу?ты на диске не создавал. Откуда он?
...
Рейтинг: 0 / 0
JasperReports. Скачивание сгенеренного xlsx файла
    #39917856
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
ты на диске не создавал. Откуда он?

отсюда
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
ByteArrayOutputStream out = new ByteArrayOutputStream();
        File outputFile = new File(templateName + ".xlsx");
        OutputStream fileOutputStream = new FileOutputStream(outputFile);
        SimpleXlsxReportConfiguration configuration = new SimpleXlsxReportConfiguration();
        configuration.setOnePagePerSheet(true);
        configuration.setIgnoreGraphics(false);
        Exporter exporter = new JRXlsxExporter();
        exporter.setExporterInput(new SimpleExporterInput(print));
        exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(out));
        exporter.setConfiguration(configuration);
        exporter.exportReport();
        out.writeTo(fileOutputStream);
...
Рейтинг: 0 / 0
JasperReports. Скачивание сгенеренного xlsx файла
    #39917860
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов
Добавлю к имени милисекунды времени создания
тогда у тебя будут копиться эти файлы - тебе это надо?
...
Рейтинг: 0 / 0
JasperReports. Скачивание сгенеренного xlsx файла
    #39917863
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя
отсюда
я же говорю, намешал лапшекода.
...
Рейтинг: 0 / 0
JasperReports. Скачивание сгенеренного xlsx файла
    #39917871
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
я же говорю, намешал лапшекода.
почему так решил?
ТС использует JasperReports, а он создаёт файл на диске.
у него есть работающий код для html
небольшие изменения и файл на скачивание
всё просто и логично
...
Рейтинг: 0 / 0
JasperReports. Скачивание сгенеренного xlsx файла
    #39917873
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,
Прочти его прошлый топик
...
Рейтинг: 0 / 0
JasperReports. Скачивание сгенеренного xlsx файла
    #39917883
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
Прочти его прошлый топик
ну это его дело, я ответил на данный вопрос
...
Рейтинг: 0 / 0
JasperReports. Скачивание сгенеренного xlsx файла
    #39917954
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал так.
Контроллер:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    @PostMapping(value = "getReportXlsx")
    public ResponseEntity<Resource> getReportXlsx(@RequestBody MainRequest<WebReportRequestDTO> request) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, IOException {
        WebReportRequestDTO req = request.getRequest();
        ReportExcelDataDTO report = webReportService.createReportFile(req.getParams(), req.getTemplateName());
        byte[] reportData = report.getOut();
        ByteArrayResource resource = new ByteArrayResource(reportData);
        return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + URLEncoder.encode(report.getFileName(), charset ) + "\"")
                .contentLength(reportData.length)
                .contentType(MediaType.parseMediaType("application/octet-stream; charset=" + charset))
                .body(resource);



Сервис:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 public ReportExcelDataDTO createReportFile(List<WebReportParamsDTO> params, String templateName) throws IOException, ParseException, JRException {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        File outputFile = new File(templateName + ".xlsx");
        OutputStream fileOutputStream = new FileOutputStream(outputFile);
        SimpleXlsxReportConfiguration configuration = new SimpleXlsxReportConfiguration();
        configuration.setOnePagePerSheet(true);
        configuration.setIgnoreGraphics(false);
        Exporter exporter = new JRXlsxExporter();
        exporter.setExporterInput(new SimpleExporterInput(getSalesDebetCardMkbReportPrint(params, templateName)));
        exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(out));
        exporter.setConfiguration(configuration);
        exporter.exportReport();
        out.writeTo(fileOutputStream);
        ReportExcelDataDTO result = new ReportExcelDataDTO();
        result.setFileName(templateName + ".xlsx");
        result.setOut(out.toByteArray());
        return result;
    }



JavaScript:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
let xhr = new XMLHttpRequest();
    xhr.open("POST", url, true);
    xhr.setRequestHeader('Content-type','application/json; charset=utf-8');
    xhr.onload = function () {
        console.log(xhr.response);
    }
    xhr.send(getJSONParams());



В логе браузера получаю:
PK����������7P����������������xl/drawings/drawing1.xml��M
�0��ཧ(���.DJ�6�����f���I�D[oo�Ե�|<��7U��9{Q�㸆S^@F�;mx��q����ID�8;���$�6�jա\���,�,e�5L1�R)�'�(��ĩ�\��S�����D�Y�����B-�Q��v���,���?����Թ�i����1�w�d�@ڪ����PK����i�����/���PK����������7P����������������xl/_rels/workbook.xml.rels���j�0�@�� ...
Насколько я понимаю, это желаемый мной файл xlsx.
Можно ли как-то в браузере вызвать для него диалог сохранения?
...
Рейтинг: 0 / 0
JasperReports. Скачивание сгенеренного xlsx файла
    #39917956
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов,
я ж тебе код показал!!!!
...
Рейтинг: 0 / 0
JasperReports. Скачивание сгенеренного xlsx файла
    #39917958
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов,

тебе не надо передавать файл, надо передать только путь к файлу
...
Рейтинг: 0 / 0
25 сообщений из 43, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / JasperReports. Скачивание сгенеренного xlsx файла
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]