19

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

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

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

4

3 に答える 3

40

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でサーブレットを呼び出します。

于 2012-06-27T13:27:35.230 に答える
21

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が最初の新しい行を出力して、出力を破損する可能性があります。

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

于 2012-06-28T16:31:53.250 に答える
0

ダウンロードしたい場合は、hssfブックを使用しないでください。速度が遅くなり、より多くのスペースを消費します。apche poi3.17beta-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();
于 2017-11-03T13:34:26.493 に答える