Trong khi đúng hơn là viết một tệp đính kèm nhị phân bằng cách sử dụng một servlet chứ không phải là jsp, thì chắc chắn có thể viết một tệp đính kèm nhị phân từ một jsp. Và lợi thế của việc đó là bạn không cần phải lo lắng về việc cấu hình web.xml hoặc tải lại ứng dụng của bạn. Đó có thể là một cân nhắc quan trọng, tùy thuộc vào môi trường máy chủ web của bạn.
Dưới đây là một ví dụ jsp sử dụng poi để gửi tệp đính kèm nhị phân cho trình duyệt.
<%@page import="org.apache.poi.hssf.usermodel.*" %><%@page import="java.io.*" %><%
// create a small spreadsheet
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet();
HSSFRow row = sheet.createRow(0);
HSSFCell cell = row.createCell(0);
cell.setCellValue("Some text");
// write it as an excel attachment
ByteArrayOutputStream outByteStream = new ByteArrayOutputStream();
wb.write(outByteStream);
byte [] outArray = outByteStream.toByteArray();
response.setContentType("application/ms-excel");
response.setContentLength(outArray.length);
response.setHeader("Expires:", "0"); // eliminates browser caching
response.setHeader("Content-Disposition", "attachment; filename=testxls.xls");
OutputStream outStream = response.getOutputStream();
outStream.write(outArray);
outStream.flush();
%>
Bí quyết quan trọng là để đảm bảo chỉ có một phù hợp với tất cả các hàng nhập khẩu của bạn, chỉ khác trước khi "<%" bắt đầu mã của bạn. Nếu không, jsp có thể xuất ra một số dòng mới ban đầu và làm hỏng đầu ra của bạn.
Ngoài ra, tôi khuyên bạn luôn đặt độ dài nội dung. Một số trình duyệt sẽ không hoạt động chính xác nếu không được đặt. Đó là lý do tại sao tôi lần đầu tiên xuất bảng tính của tôi thành một mảng byte, vì vậy tôi có thể thiết lập độ dài trước khi thực sự gửi dữ liệu.
Nguồn
2012-06-28 16:31:53
writableworkbook là một phần của jexcel api đúng không? điều này nên làm việc ngay cả khi im sử dụng poi phải không? – user571099
@ user571099 sổ làm việc là một 'HSSFWorkbook' ở đây, không phải là' WritableWorkbook'. –
Đây chính xác là những gì tôi đang tìm kiếm! Tôi cho rằng điều này có thể được thực hiện tương tự với dịch vụ web Jersey RESTful? – Brian