Файл Excel не открывается, когда возвращается как InputStreamResource - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь создать API, который отправляет InputStreamResource из файла Excel. который создается на стороне сервера из данных таблицы.

, когда я нажимаю на этот API от почтальона, файл Excel не открывается и говорит, что не имеет правильного расширения или файл поврежден.

Я сохранил файл на стороне сервера, который открывается нормально.

также попытался отправить HTTP ENTITY. все еще получил тот же ответ

Это мой контроллер

@GetMapping(path = RestMappingConstants.AdminRequestUri.DOWNLOAD_A2TO_INTERVIEWER_EXCEL)
public ResponseEntity<InputStreamResource> downloadA2ToInterviewPaymentExcel( ) throws IOException{
    ByteArrayInputStream in = a2AdminService.downloadA2ToInterviewPaymentExcel();
    HttpHeaders headers = new HttpHeaders();
    //InputStream res=A2AdminController.class.getClassLoader().getResourceAsStream("payment.xlsx");
    headers.add("Content-Disposition", "attachment; filename=PaymentDetails.xlsx");
    headers.setContentType(new MediaType("application", "vnd.openxmlformats-officedocument.spreadsheetml.sheet"));
    return ResponseEntity
            .ok()
            .headers(headers)
            .body(new InputStreamResource(in));
}

Это мой класс обслуживания

@Override
public ByteArrayInputStream downloadA2ToInterviewPaymentExcel() throws IOException {
    List<A2ToInterviewerPaymentEntity> a2ToInterviewerPaymentEntityList = a2AdminDao.getApprovedPaymentList();
    // FileOutputStream file=new FileOutputStream("payment.xlsx");
    // convert to excel
    String[] columns = { "Id", "Amount", "PaymentMode", "PaymentType", "TransactionId", "InterviewScheduleId",
            "EmployerToPaymentEntityId", "PaymentStatus" };
    try (Workbook workbook = new XSSFWorkbook(); ByteArrayOutputStream out = new ByteArrayOutputStream();) {
        Sheet sheet = workbook.createSheet("payment");
        Font headerFont = workbook.createFont();
        headerFont.setBold(true);
        headerFont.setColor(IndexedColors.BLUE.getIndex());
        CellStyle headerCellStyle = workbook.createCellStyle();
        headerCellStyle.setFont(headerFont);
        // Row for Header
        Row headerRow = sheet.createRow(0);
        // Header
        for (int col = 0; col < columns.length; col++) {
            Cell cell = headerRow.createCell(col);
            cell.setCellValue(columns[col]);
            cell.setCellStyle(headerCellStyle);
        }
        int rowIdx = 1;
        for (A2ToInterviewerPaymentEntity paymentEntity : a2ToInterviewerPaymentEntityList) {
            Row row = sheet.createRow(rowIdx++);
            row.createCell(0).setCellValue(paymentEntity.getId());
            row.createCell(1).setCellValue(paymentEntity.getAmount());
            row.createCell(2).setCellValue("UPI");
            row.createCell(3).setCellValue("TRANSFER");
            row.createCell(4).setCellValue(paymentEntity.getTransactionId());
            row.createCell(5).setCellValue(paymentEntity.getInterviewSchedule().getId());
            row.createCell(6).setCellValue(paymentEntity.getEmployerToA2PaymentEntity().getId());
            row.createCell(7).setCellValue(paymentEntity.getPaymentStatus().toString());
        }
        workbook.write(out);
        // workbook.write(file);
        byte[] arr = out.toByteArray();out.flush();out.close();
        return new ByteArrayInputStream(arr);
    }
}

Ответы [ 3 ]

0 голосов
/ 18 октября 2019

попробуйте этот код в вашем контроллере:

ResponseEntity.ok()
            .contentType(MediaType.parseMediaType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"))
            .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" +yourFileName".xlsx")
            .body(yourFileInByteArray);
0 голосов
/ 21 октября 2019

Я решил это. Это была проблема почтальона. Когда я пытался использовать тот же API в браузере, превосходя уровень безопасности, он работал нормально.

Я думаю, почтальон создавал проблему с загруженным файлом Excel

0 голосов
/ 18 октября 2019

Файл, загруженный с почтальона, является потоком входного массива. вам нужно обработать этот поток в коде внешнего интерфейса для преобразования в соответствующий файл. Для этого угловой код внешнего интерфейса, как показано ниже

var result = this.budgetService.downloadEstimates(this.userDetail.userId);
          result.subscribe(
            data => {
              this.utilitiesService.hideLoader();
              const blob = new Blob([data], { type: 'text/csv' });
              if (typeof window.navigator.msSaveBlob !== 'undefined') {
                window.navigator.msSaveBlob(blob, 'results.xlsx');
              }else{
              //let blob = data;
              let a = document.createElement("a");
              a.href = URL.createObjectURL(blob);
              a.download = 'results.xlsx';
              document.body.appendChild(a);
              a.click();
            }
          },
            error => {
              this.utilitiesService.showInformation('Download has failed', 'Error');

            })
        }
        downloadResultSubscriber.unsubscribe();
      });

Для загрузки файла непосредственно из контроллера используйте приведенный ниже фрагмент кода, но это следует изменить, как только API внешнего интерфейса начнет интегрировать API.

@GetMapping(path = /download)
    public void downloadFile(HttpServletResponse httpServletResponse) throws IOException{
        File  f =  // your file here;
        httpServletResponse.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        httpServletResponse.setContentLength(f.length);
        httpServletResponse.setHeader("Content-Disposition", "attachment; filename=PaymentDetails.xlsx");
        FileCopyUtils.copy(f, httpServletResponse.getOutputStream());
        httpServletResponse.flushBuffer();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...