Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

creating an excel file in memory using java and pass as bytes for downloading

I have created a excel file using jxl library. The code is working fine but the only problem is that each time for building an excel file from the dynamic values coming from a service, the excel content is overwriting onto a test.xls like as shown below. Is there any way to build an excel in memory and pass the byte for downloading it instead of creating an external file ("test.xls")

File file = new File("test.xls");
WritableWorkbook workbook = Workbook.createWorkbook(file);
:
:
:
:

InputStream in = new FileInputStream(file);

if (in == null) {
    out.close();
}
else 
{
    byte[] buffer = new byte[4096];
    int len;

    while ((len = in.read(buffer)) != -1) {
        out.write(buffer, 0, len);
    }

    out.flush();
    in.close();
    out.close();
}

Can anyone please help me on this

like image 511
Alex Man Avatar asked Oct 26 '16 04:10

Alex Man


People also ask

How do you save a Excel file to users download path in Java?

getExamName()+". xlsx"); FileOutputStream fileOut = new FileOutputStream(file); hwb. write(fileOut); The above code works(saves workbook to download path) only when the application is local, but it does not work when the application is on VPS.

How do I download an XLSX file from Java?

file = new File(home + "/Downloads/" + "excel" + filename + ". xls"); Runtime. getRuntime(). exec("cmd.exe /C start " + file);


2 Answers

Use a ByteArrayOutputStream in combination with the Workbook.createWorkbook(OutputStream os) method to create the workbook in memory, and dump the created byte array to whatever output stream you want.

ByteArrayOutputStream baos = new ByteArrayOutputStream();
WritableWorkbook workbook = Workbook.createWorkbook(baos);

// ...

workbook.close();
out.write(baos.toByteArray());
out.flush();
out.close();

Alternatively, you could do it on the fly, without using the intermediate byte array:

WritableWorkbook workbook = Workbook.createWorkbook(out);

// ...

workbook.close();
out.flush();
out.close();

This method may be preferable as JXL is keeping the workbook in memory anyway, and only flushes it to he output stream when the workbook is closed.

like image 180
Robby Cornelissen Avatar answered Sep 30 '22 11:09

Robby Cornelissen


Here is example to create excel using POI and converting it to bytes.

    XSSFWorkbook workbook = new XSSFWorkbook();
    XSSFSheet sheet = workbook.createSheet("Sheet 1");

    Row row = sheet.createRow(1);
    Cell cell = row.createCell(cellnum++);
    cell.setCellValue((String) obj);
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    try {
        workbook.write(bos);
    } catch (IOException e) {
    } finally {
        try {
            bos.close();
            workbook.close();
        } catch (IOException e) {
        }
    }
    byte[] bytes = bos.toByteArray();
like image 29
usr_11 Avatar answered Sep 30 '22 13:09

usr_11