使用java在内存中创建excel文件并传递为字节以供下载

时间:2022-01-02 10:00:34

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")

我使用jxl库创建了一个excel文件。代码工作正常,但唯一的问题是,每次从服务的动态值构建excel文件时,excel内容都会覆盖到test.xls上,如下所示。有没有办法在内存中构建一个excel并传递该字节以便下载它而不是创建一个外部文件(“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

任何人都可以请帮助我

2 个解决方案

#1


3  

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与Workbook.createWorkbook(OutputStream os)方法结合使用可在内存中创建工作簿,并将创建的字节数组转储到所需的任何输出流。

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.

此方法可能是优选的,因为JXL无论如何都将工作簿保留在内存中,并且仅在工作簿关闭时将其刷新到输出流。

#2


0  

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

下面是使用POI创建excel并将其转换为字节的示例。

    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();

#1


3  

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与Workbook.createWorkbook(OutputStream os)方法结合使用可在内存中创建工作簿,并将创建的字节数组转储到所需的任何输出流。

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.

此方法可能是优选的,因为JXL无论如何都将工作簿保留在内存中,并且仅在工作簿关闭时将其刷新到输出流。

#2


0  

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

下面是使用POI创建excel并将其转换为字节的示例。

    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();