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

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

我使用 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();
}

谁能帮我解决这个问题

结合使用 ByteArrayOutputStream 方法和 Workbook.createWorkbook(OutputStream os) 方法在内存中创建工作簿,并将创建的字节数组转储到您想要的任何输出流。

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

// ...

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

或者,您可以在不使用中间字节数组的情况下即时完成:

WritableWorkbook workbook = Workbook.createWorkbook(out);

// ...

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

这种方法可能更可取,因为 JXL 无论如何都会将工作簿保存在内存中,并且仅在工作簿关闭时才将其刷新到输出流。

这里是使用 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();