Utwórz plik excel dla użytkowników do pobrania za pomocą Apache POI

Jestem w stanie utworzyć plik excel za pomocą Apache poi. chcę jednak, aby użytkownicy mogli pobrać to jako "prawdziwy" plik Excela. efekt, który chcę osiągnąć, to mieć wyskakujące okienko umożliwiające użytkownikowi pobranie pliku. jest to podobne do używania

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

Z jednym krytycznym wyjątkiem: muszę zezwolić użytkownikowi na pobranie odpowiedniego pliku excel. czytałem gdzieś powyższy kod po prostu mówi do klienta, że serwer wysyła plik excel

Author: Tiny, 2012-06-27

3 answers

Wykonaj zadanie w normalnym serwlecie zamiast pliku JSP. Plik JSP jest przeznaczony do dynamicznego generowania kodu HTML i używa do tego pisarza znaków zamiast binarnego strumienia wyjściowego, a zatem tylko uszkodzi generowany przez POI plik Excel, który jest w istocie strumieniem binarnym.

Więc w zasadzie wszystko, co musisz zrobić w metodzie doGet() servletu jest następujące:

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

Teraz, aby go pobrać, wywołaj servlet za pomocą adresu URL zamiast pliku JSP.

 35
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-05 15:20:52

Chociaż prawdą jest, że bardziej Zwykle zapisuje się załącznik binarny za pomocą servletu, a nie jsp, z pewnością jest możliwe zapisanie załącznika binarnego z jsp. Zaletą tego rozwiązania jest to, że nie musisz się martwić o konfigurację sieci.xml lub przeładowanie aplikacji. Może to być ważna kwestia, w zależności od środowiska serwera www.

Oto przykład jsp, który używa poi do wysyłania binarnego załącznika do przeglądarki.

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

%>

Ważne sztuką jest upewnienie się, że przed "

Sugeruję również, abyś zawsze ustawiał długość treści. Niektóre przeglądarki nie będą działać poprawnie, jeśli nie jest ustawiona. Dlatego po raz pierwszy wyjście mój arkusz kalkulacyjny do tablicy bajtów, więc mogę ustawić długość przed faktycznie wysyłanie danych.

 20
Author: Howard Schutzman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-28 16:31:53

Jeśli chcesz pobrać don, t użyj skoroszytu hssf, będzie wolniej i pochłonie więcej miejsca użyj 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();

Do Pdf Użyj 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();
 0
Author: abhinavxeon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-03 13:34:26