web-dev-qa-db-ja.com

Apache POIを使用してダウンロードするユーザー用のExcelファイルを作成する

Apache poiを使用してExcelファイルを作成できます。ただし、ユーザーがこれを「真の」Excelファイルとしてダウンロードできるようにしたいと思います。私が達成したい効果は、ユーザーがファイルをダウンロードできるポップアップボックスを持つことです。これは使用に似ています

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

1つの重大な例外があります。ユーザーに適切なExcelファイルのダウンロードを許可する必要があります。上記のコードは、サーバーがExcelファイルを送信していることをクライアントに伝えるだけです

18
user571099

JSPファイルではなく、通常のサーブレットでジョブを実行します。 JSPファイルは、HTMLコードを動的に生成するためのものであり、バイナリ出力ストリームの代わりにそのために文字ライターを使用しているため、本質的にバイナリストリームであるPOI生成のExcelファイルのみが破損します。

したがって、基本的に、サーブレットの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();

次に、ダウンロードするには、JSPファイルではなくURLでサーブレットを呼び出します。

37
BalusC

Jspではなくサーブレットを使用してバイナリ添付ファイルを記述するのがより一般的であることは事実ですが、jspからバイナリ添付ファイルを記述することは確かに可能です。また、そうすることの利点は、web.xmlの構成やアプリケーションのリロードを心配する必要がないことです。 Webサーバー環境によっては、これは重要な考慮事項になる場合があります。

これは、poiを使用してバイナリ添付ファイルをブラウザに送信するjspの例です。

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

%>

重要なトリックは、コードを開始する「<%」の前に、すべてのインポートと他のディレクティブを含む1行のみを含めることです。そうしないと、jspが最初の新しい行を出力し、出力が破損する可能性があります。

また、コンテンツの長さを常に設定することをお勧めします。一部のブラウザは、設定されていないと正しく動作しません。そのため、スプレッドシートを最初にバイト配列に出力したので、実際にデータを送信する前に長さを設定できました。

20

あなたがドンをダウンロードしたい場合は、hssfワークブックを使用してください。それは遅くなり、より多くのスペースを消費します

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