2012-06-27 4 views
15

Я могу создать файл excel с помощью apache poi. однако, я хочу, чтобы пользователи могли загрузить это как «истинный» файл excel. эффект, который я хочу достичь, будет иметь всплывающее окно, позволяющее пользователю загрузить файл. это похоже на использованиеСоздайте файл excel для загрузки пользователями с помощью Apache POI

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

с одним критическим исключением: я должен разрешить пользователю загружать надлежащий файл excel. я читал где-то выше код просто говорит клиенту, что сервер отправляет файл excel

ответ

32

Выполнение задания в обычном сервлете вместо JSP-файла. JSP-файл предназначен для динамического генерирования HTML-кода и использует для этого символ-символ вместо двоичного потока вывода и, таким образом, только повреждает ваш Excel-файл, созданный POI, который по сути является двоичным потоком.

Таким образом, в основном все, что вам нужно сделать в doGet() метод сервлета является следующее:

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(); 

, чтобы загрузить его, вызовите сервлет его URL вместо файла JSP.

+0

writableworkbook является частью jexcel api правильно? это должно работать, даже если я использую poi правильно? – user571099

+0

@ user571099 рабочая книга - это «HSSFWorkbook» здесь, а не «WritableWorkbook». –

+0

Это именно то, что я искал! Я предполагаю, что это можно сделать с помощью веб-сервиса Джерси RESTful? – Brian

20

Хотя верно, что писать двоичное вложение с использованием сервлета, а не jsp, более обычным является запись двоичного вложения из jsp. И преимущество этого в том, что вам не нужно беспокоиться о настройке web.xml или перезагрузке приложения. Это может быть важным фактором в зависимости от среды вашего веб-сервера.

Вот пример jsp, который использует poi для отправки двоичного вложения в браузер.

<%@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(); 

%> 

Важная Хитрость заключается в том, чтобы убедиться, что есть только одна строки со всем импортом и другими директивами до начала «<%», который начинается ваш код. В противном случае jsp может выводить некоторые начальные новые строки и испортить ваш вывод.

Кроме того, я предлагаю вам всегда устанавливать длину содержимого. Некоторые браузеры не будут работать правильно, если они не установлены. Вот почему я сначала выводил свою таблицу в массив байтов, поэтому я мог установить длину до фактической отправки данных.

+0

Благодарим за ответ, но могу ли я спросить вас, где вы определяете путь к файлу xls? Я имею в виду, как jsp знает, где взять этот файл xls? Может ли он работать с pdf, который был создан java-программой раньше? –

0

, если вы хотите скачать дон, т использовать hssf книгу он будет медленнее и потреблять больше пространства использовать apche пои 3,17 бета-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(); 

Для Pdf Использование 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(); 
Смежные вопросы