JSP で開発しているこのアプリケーションがあり、データベースから XLS (MS Excel 形式) でデータをエクスポートしたいと考えています。
Tomcat の下で、あたかも通常の Java アプリケーションであるかのようにファイルを書き込んで、このファイルへのリンクを生成することは可能ですか? それとも、特定の API を使用する必要がありますか?
これを行うと、許可の問題が発生しますか?
application/vnd.ms-excel
コンテンツ タイプでプレーンな HTML テーブルを使用しないでください。次に、基本的に間違ったコンテンツ タイプで Excel をだますことになり、最新の Excel バージョンでエラーや警告が発生する可能性があります。また、元の HTML ソースを編集して Excel で保存すると、元の HTML ソースが台無しになります。それをしないでください。
同様に、CSV は標準形式であり、Excel からデフォルトで問題なくサポートされており、実際に生成するのは簡単でメモリ効率が良いです。ライブラリは存在しますが、実際には 20 行未満で簡単に作成することもできます (我慢できない人にとっては面白いことです)。基本的に 3 つのルールのみを含むRFC 4180仕様に準拠する必要があります。
キックオフの例を次に示します。
public static <T> void writeCsv (List<List<T>> csv, char separator, OutputStream output) throws IOException {
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output, "UTF-8"));
for (List<T> row : csv) {
for (Iterator<T> iter = row.iterator(); iter.hasNext();) {
String field = String.valueOf(iter.next()).replace("\"", "\"\"");
if (field.indexOf(separator) > -1 || field.indexOf('"') > -1) {
field = '"' + field + '"';
}
writer.append(field);
if (iter.hasNext()) {
writer.append(separator);
}
}
writer.newLine();
}
writer.flush();
}
これを使用する方法の例を次に示します。
public static void main(String[] args) throws IOException {
List<List<String>> csv = new ArrayList<List<String>>();
csv.add(Arrays.asList("field1", "field2", "field3"));
csv.add(Arrays.asList("field1,", "field2", "fie\"ld3"));
csv.add(Arrays.asList("\"field1\"", ",field2,", ",\",\",\""));
writeCsv(csv, ',', System.out);
}
そして、サーブレット (はい、サーブレット、これには JSP を使用しないでください!) 内では、基本的に次のことができます。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String filename = request.getPathInfo().substring(1);
List<List<Object>> csv = someDAO().findCsvContentFor(filename);
response.setHeader("content-type", "text/csv");
response.setHeader("content-disposition", "attachment;filename=\"" + filename + "\"");
writeCsv(csv, ';', response.getOutputStream());
}
このサーブレットを のようなものにマップし、 のような/csv/*
ものとして呼び出しhttp://example.com/context/csv/filename.csv
ます。それで全部です。
Excel がCSV フィールド区切り文字としてコンマ,
またはセミコロンを受け入れるかどうかは、使用されるロケールに依存する可能性があるため、区切り文字を個別に指定する可能性を追加したことに注意してください。;
URL パス情報にもファイル名を追加したことに注意してください。これは、レドモンドのチームによって開発された特定の Web ブラウザーが適切なファイル名でダウンロードを保存しないためです。
JExcelAPI ("jxl") やPOIなどの Excel ファイルを操作するには、おそらくライブラリが必要になるでしょう。私はjxlに慣れており、確かにファイルを書き込むことができます。URLを提供することでそれらを生成して保存することはできますが、私はしません。生成されたファイルは苦痛です。それらは、同時実行、クリーンアップ プロセスなどのフォームに複雑さを追加します。
オンザフライでファイルを生成し、標準のサーブレットメカニズムを介してクライアントにストリーミングできる場合。
何度も生成される場合、または生成にコストがかかる場合は、何らかの方法で結果をキャッシュできますが、ファイルとして保存するよりもメモリに保存する方がよいでしょう。できれば、生成されたファイルに URL で直接リンクすることは避けたいと思います。サーブレットを使用すると、後で実装を変更できます。オブジェクト指向設計と同じカプセル化の概念です。
POI または JExcel は優れた API です。個人的には、より良い POI が気に入っています。加えて、POI は常に更新されています。さらに、質問がある場合に備えて、JExcel よりも多くの POI に関するオンライン リソースがあります。ただし、どちらも素晴らしい仕事をします。
ファイルを XLS 形式にエクスポートするオプションを備えたレポート ツールの使用を検討する必要があるかもしれません。私の提案はJasperReportsです