0

我有一个 XPage,它使用服务器端 javascript(感谢 Russ Maher)创建一个 Excel 文件。如果我在浏览器中本地运行 XPage,我知道如何将其保存到 C: 驱动器,但不知道如何在服务器上运行时将其保存到用户计算机,而无需先将其保存到服务器。以下代码用于从服务器的角度保存它。

var fileOut = new java.io.FileOutputStream(directory+fileName);
xl.write(fileOut);
fileOut.close();

有什么想法可以将其引导到用户的驱动器上吗?

4

2 回答 2

1

不应将 Excel 工作簿写入 FileOutputStream,而应将其写入 ByteArrayOutputStream:

ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
xl.write(outputStream);

您可能需要使用 XAgent 创建输出,然后从 XPage 链接到 XAgent。也许Declan Lynch 的这篇博客文章结合这个关于如何在 servlet 中执行此操作的答案可以引导您朝着正确的方向前进。

于 2012-08-01T20:49:26.873 回答
0

Paul Calhoun 向我发送了一些示例代码,我对其进行了按摩以生成我想要的电子表格。我不知道他做了什么我没有做过的事情,但是,就目前而言,我认为这是解决方案的核心,只是利用 OutputStream 而不是 FileOutputStream 或 ByteArrayOutputStream。

// The Faces Context global object provides access to the servlet environment via the external content
var extCont = facesContext.getExternalContext(); 
// The servlet's response object provides control to the response object
var pageResponse = extCont.getResponse();
//Get the output stream to stream binary data
var pageOutput = pageResponse.getOutputStream();

// Set the content type and headers
pageResponse.setContentType("application/x-ms-excel");
pageResponse.setHeader("Cache-Control", "no-cache");
pageResponse.setHeader("Content-Disposition","inline; filename=" + fileName);
//Write the output, flush the buffer and close the stream
wb.write(pageOutput);
pageOutput.flush();
pageOutput.close();

//  Terminate the request processing lifecycle.
facesContext.responseComplete();

如果其他人遇到此问题,我将很乐意提供帮助,并且希望在有人问的时候,我会更多地了解有什么不同之处......

于 2012-09-13T20:59:52.993 回答