我们有以下要求。
我们必须创建一个excel / pdf报告,然后单击java Web应用程序中的按钮下载它。 pdf / excel文件是使用应用程序数据动态创建的。
我们不应该在服务器上创建任何物理文件。
我们如何解决这个问题?是否有任何流可以通过它来读取和写入,而无需在两者之间关闭。
答案 0 :(得分:4)
您可以使用基于内存的流(例如ByteArrayInputStream
和ByteArrayOutputStream
)并使用相同的基础字节缓冲区来解决问题的同一部分中的读/写。
正如其他人所指出的那样,您可以直接写入响应的输出流。
答案 1 :(得分:2)
请看ServletResponse.getOutputStream()
。
您需要从报告API创建的流中写入此流。不要忘记使用同一类的content-type
方法设置正确的setContentType()
。
答案 2 :(得分:1)
在这里,您可以找到如何使用jxl API执行此操作,它也可能对您有所帮助。 How do I output an Excel file from a Servlet?
答案 3 :(得分:1)
无论您使用什么PDF或Excel API生成文件,都应该查找构造函数或方法,该构造函数或方法需要OutputStream
将生成的PDF / Excel内容写入。您应该只使用response.getOutputStream()
而不是 FileOutputStream
来提供。
例如,用于PDF的iText:
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
PdfWriter pdfWriter = PdfWriter.getInstance(document, response.getOutputStream());
// ...
Apache POI for Excel:
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
WritableWorkbook workBook = Workbook.createWorkbook(response.getOutputStream());
// ...
答案 4 :(得分:0)
让Servlet将pdf / excel文件作为字节数组提供。
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
byte[] bytes = null; // get this from somewhere in your app
String fileName = "filename.pdf"; // whatever you wish to name the file
ServletOutputStream out = response.getOutputStream();
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
response.setContentType("application/pdf");
response.setContentLength(bytes.length);
out.write(bytes);
out.flush();
}
MS Excel文件的MIME类型为application/vnd.ms-excel
。