2012-06-27 15 views
15

Tôi có thể tạo tệp excel bằng cách sử dụng apache poi. tuy nhiên, tôi muốn người dùng có thể tải xuống tệp này dưới dạng tệp excel "đúng". hiệu ứng tôi muốn đạt được sẽ là có một hộp bật lên cho phép người dùng tải xuống tệp. điều này tương tự như việc sử dụngTạo một tệp excel để người dùng tải xuống bằng Apache POI

<%@ page contentType="application/vnd.ms-excel" pageEncoding="ISO-8859-1"%> 
<%response.setHeader("Content-Disposition", "attachment;filename=myfile.xls"); %> 

với một ngoại lệ quan trọng: tôi phải cho phép người dùng tải xuống tệp excel phù hợp. tôi đọc ở đâu đó mã trên chỉ đơn giản nói với khách hàng rằng máy chủ đang gửi một tệp excel

Trả lời

32

Thực hiện công việc trong một servlet bình thường thay vì tệp JSP. Một tệp JSP có nghĩa là để tạo mã HTML động và đang sử dụng một trình ghi ký tự cho thay vì luồng đầu ra nhị phân và do đó sẽ chỉ làm hỏng tệp Excel do POI tạo của bạn, đó là bản chất của luồng nhị phân.

Vì vậy, về cơ bản tất cả các bạn cần làm trong phương pháp doGet() của servlet như sau:

response.setContentType("application/vnd.ms-excel"); 
response.setHeader("Content-Disposition", "attachment; filename=filename.xls"); 
HSSFWorkbook workbook = new HSSFWorkbook(); 
// ... 
// Now populate workbook the usual way. 
// ... 
workbook.write(response.getOutputStream()); // Write workbook to response. 
workbook.close(); 

Bây giờ, để tải nó, gọi servlet bằng URL của nó thay vì các tập tin JSP.

+0

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

+0

@ user571099 sổ làm việc là một 'HSSFWorkbook' ở đây, không phải là' WritableWorkbook'. –

+0

Đâ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

20

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.

+0

Cảm ơn bạn đã trả lời nhưng tôi có thể hỏi bạn bạn định nghĩa đường dẫn đến tệp xls ở đâu? Tôi có nghĩa là, làm thế nào jsp biết, nơi để chọn tập tin xls đó từ đâu? Nó có thể làm việc với pdf, được tạo ra bởi chương trình java trước đây không? –

0

nếu bạn muốn tải về don, t sử dụng HSSF workbook nó sẽ chậm hơn và tiêu thụ thêm không gian sử dụng apche POI 3.17 beta-1

SXSSFWorkbook workbook = new SXSSFWorkbook(100); 
workbook.setCompressTempFiles(true); 
Sheet sh = workbook.createSheet(); 
//write your data on sheet 

//below code will download file in browser default download folder 
response.setContentType("application/vnd.ms-excel"); 
      response.setHeader("Content-Disposition", "attachment; filename="+filename+".xlsx"); 
      workbook.write(response.getOutputStream()); 
      workbook.close(); 
      workbook.dispose(); 

Đối Pdf Sử dụng iText

 Document document = new Document(); 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      PdfWriter.getInstance(document, baos); 
      document.open(); 
//write your code 

document.add("content"); 
      document.close(); 
      response.setHeader("Expires", "0"); 
      response.setHeader("Cache-Control","must-revalidate, post-check=0, pre-check=0"); 
      response.setHeader("Pragma", "public"); 
      response.setContentType("application/pdf"); 
      response.addHeader("Content-Disposition", "attachment; filename="+filename+".pdf"); 
      response.setContentLength(baos.size()); 
      OutputStream os = response.getOutputStream(); 
      baos.writeTo(os); 
      os.flush(); 
      os.close();