0

This is what I need to do.

1) Accept an xlsx/xls file from client.
2) Backend will receive it in the form of multipart file
3) The file will be processed and if the format of the data is invalid, that same file will be updated and the error message will be written in the side of the input of the client.
4) this modified file will be sent back to the user.

So far this is what i've done.

def generateErrorReport(ServletResponse response, Map messageCollections, MultipartFile file, String ext){

    FileInputStream fileIn = file.getInputStream()
    Workbook workbook = (ext.equalsIgnoreCase("xls")) ? new HSSFWorkbook(fileIn) : new XSSFWorkbook(fileIn)

    workbook = this.getWorkbook((MultipartFile) file, ext.equalsIgnoreCase("xls"));
    try {
        Sheet sheet = workbook.getSheetAt(0)
        Long lastCellNum = sheet.getRow(0).getLastCellNum();

        for(int i=1; i<sheet.getLastRowNum(); i++){
            if(messageCollections[i]!=null && messageCollections[i]!=[] ) {
                Cell cell = sheet.getRow(i).getCell(lastCellNum + 1)
                cell.setCellValue(messageCollections[i]);
            }
        }

        fileIn.close()

        FileOutputStream fileOut = new FileOutputStream((File) file)
        workbook.write(fileOut);

        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
        response.setHeader("Content-Disposition", "Attachment;Filename=error.xlsx")
        response.outputStream << fileOut
        response.outputStream.flush()

        fileOut.close()
    }catch(Exception ex){
        println ex
    }
}

This code didn't work because you cannot cast MultipartFile to File. I was wondering if there is even a hope to this code.

Is it possible to modify Multipartfile and send it back to the client without saving the file to the server or do I really need to save it to the server first so I can do what I need to do? If it is possible, how can I do that? And what is the best way to do it?

user3714598
  • 1,733
  • 5
  • 28
  • 45
  • The short answer is yes. Once you get multiPartFile from `request.getFile("")`, you can modify the file and output stream it to user. There is no need to save the file. What is the best way? The answer depends on the use case, number of files you want to modify, load on your application, etc. – Armaiti Jan 20 '16 at 15:19
  • @Aramiti Could you tell me how to do that?? Thank you! – user3714598 Jan 21 '16 at 06:54
  • This may help you out: [Converting MultipartFile to java.io.File without copying to local machine](http://stackoverflow.com/questions/21089106/converting-multipartfile-to-java-io-file-without-copying-to-local-machine) – Armaiti Jan 21 '16 at 17:40

1 Answers1

0

This solved my problem

private void createReport(ServletResponse response, Map message, MultipartFile file, String ext){
        InputStream is = file.getInputStream();
        OutputStream os = response.outputStream;

        String fileName = "desiredFilename." + ext

        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setHeader("Content-Disposition", "Attachment;Filename=${fileName}");

            PoiTransformer transformer = PoiTransformer.createTransformer(is, os);
            org.apache.poi.ss.usermodel.Workbook workbook = transformer.getWorkbook()
            Sheet sheet = workbook.getSheetAt(workbook.getActiveSheetIndex())
            int lastColNum = sheet.getRow(0).getLastCellNum()

            Cell cell;

            cell = sheet.getRow(0).getCell(lastColNum);
            if(cell==null){
                cell = sheet.getRow(0).createCell(lastColNum);
            }
            cell.setCellType(1)
            cell.setCellValue("Message")
            cell.setCellStyle(getStyle(workbook, 2))

            for(int it=1; it<sheet.getLastRowNum(); it++) {
                if (message.get(new Long(it))!=null && message.get(new Long(it))!=[]) {
                    cell = sheet.getRow(it).getCell(lastColNum);
                    if(cell==null){
                        cell = sheet.getRow(it).createCell(lastColNum);
                    }
                    cell.setCellType(1)
                    cell.setCellValue(message.get(new Long(it)).join(', '))
                    cell.setCellStyle(getStyle(workbook, 1))
                }
            }

            sheet.autoSizeColumn(lastColNum);
            transformer.write();
}
user3714598
  • 1,733
  • 5
  • 28
  • 45