CSVファイルを作成してダウンロードする必要があるJava EXTJSアプリケーションに取り組んでいます。
ボタンをクリックすると、クライアントマシンにCSVファイルがダウンロードされます。
ボタンリスナーでは、ajaxを使用してサーブレットを呼び出しています。そこでCSVファイルを作成しています。
CSVファイルをサーバーに保存したくない。ダウンロードオプションでファイルを動的に作成する必要があります。
ファイルのコンテンツを文字列として作成し、ブラウザーでダウンロードモードとして開くファイルとしてコンテンツを提供します。(これは他の言語で実現していますが、Java)
CSVファイルを作成するためのコードのみを次に示しますが、ファイルをCSVとしてのみダウンロードできる場合は、CSVファイルを作成または保存したくありません。
public String createCSV()
{
try
{
String filename = "c:\\test.csv";
FileWriter fw = new FileWriter(filename);
fw.append("XXXX");
fw.append(',');
fw.append("YYYY");
fw.append(',');
fw.append("ZZZZ");
fw.append(',');
fw.append("AAAA");
fw.append(',');
fw.append("BBBB");
fw.append('\n');
CSVResult.close();
return "Csv file Successfully created";
}
catch(Exception e)
{
return e.toString();
}
}
誰でもこれで私を助けることができます。
ありがとう
私は解決策を得て、以下に投稿しています。
public void doGet(HttpServletRequest request, HttpServletResponse response)
{
response.setContentType("text/csv");
response.setHeader("Content-Disposition", "attachment; filename=\"userDirectory.csv\"");
try
{
OutputStream outputStream = response.getOutputStream();
String outputResult = "xxxx, yyyy, zzzz, aaaa, bbbb, ccccc, dddd, eeee, ffff, gggg\n";
outputStream.write(outputResult.getBytes());
outputStream.flush();
outputStream.close();
}
catch(Exception e)
{
System.out.println(e.toString());
}
}
ここでは、サーバーにファイルを保存/保存する必要はありません。
ありがとう
まず、HttpServletResponseオブジェクトを取得して、そこにファイルをストリーミングできるようにする必要があります。
注:この例は、私のプロジェクトの1つで書いたもので、動作します。Java 7。
HttpServletResponseを取得したと仮定すると、ファイルをストリーミングするためにこのようなことができます。これにより、ファイルはクライアントのマシンに保存されます。
public void downloadFile(HttpServletResponse response){
String sourceFile = "c:\\source.csv";
try {
FileInputStream inputStream = new FileInputStream(sourceFile);
String disposition = "attachment; fileName=outputfile.csv";
response.setContentType("text/csv");
response.setHeader("Content-Disposition", disposition);
response.setHeader("content-Length", String.valueOf(stream(inputStream, response.getOutputStream())));
} catch (IOException e) {
logger.error("Error occurred while downloading file {}",e);
}
}
ストリームメソッドは次のようになります。
private long stream(InputStream input, OutputStream output) throws IOException {
try (ReadableByteChannel inputChannel = Channels.newChannel(input); WritableByteChannel outputChannel = Channels.newChannel(output)) {
ByteBuffer buffer = ByteBuffer.allocate(10240);
long size = 0;
while (inputChannel.read(buffer) != -1) {
buffer.flip();
size += outputChannel.write(buffer);
buffer.clear();
}
return size;
}
}
これは、ソースファイルから入力ストリームを取得し、そのストリームをHttpServletResponseの出力ストリームに書き込みます。私には完璧に機能するので、これは機能するはずです。お役に立てれば。悪い英語でごめんなさい。
Gauravの答えに何かを追加したいと思います。私は最近、私のプロジェクトでこの機能を実装する必要がありましたが、IE 9をサポートする必要があるため、javascriptの使用は問題外でした。IE 9の問題は何ですか? ( jQueryとhtmlを使用してCSVにエクスポート )、リンクの2番目の回答を参照してください。
データベースクエリのResultSetを、同じデータをCSV形式で表す文字列に変換する簡単な方法が必要でした。そのために http://opencsv.sourceforge.net/ を使用しました。これにより、ResultSetの文字列otを取得する簡単な方法が提供され、残りは上記のとおりです。
プロジェクトのsoruceフォルダーにある例は、良い例を示しています。