使用Java在内存中创建Excel文件并将其作为字节传递以下载

12

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

有人能帮我解决这个问题吗?


你好,你代码中的 out 是什么意思?谢谢。 - mehnet ali
2个回答

16

这里有一个使用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();

15

结合 ByteArrayOutputStreamWorkbook.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在任何情况下都将工作簿保存在内存中,仅在关闭工作簿时才将其刷新到输出流,因此此方法可能更可取。


有没有一种使用Apache POI实现这个的方法?谢谢 - Akshay Lokur
关闭工作簿和输出流的顺序在这里非常重要,如果在关闭工作簿之前关闭输出流,则会在许多浏览器的最新版本中出现错误。 - Rodin10
你好,你的代码中输出是什么?谢谢。 - mehnet ali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接