web-dev-qa-db-ja.com

CSVファイルJava(サーブレット)の作成とダウンロード

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

誰でもこれで私を助けることができます。

ありがとう

10
Gourav

私は解決策を得て、以下に投稿しています。

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

ここでは、サーバーにファイルを保存/保存する必要はありません。

ありがとう

27
Gourav

まず、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の出力ストリームに書き込みます。私には完璧に機能するので、これは機能するはずです。お役に立てれば。悪い英語でごめんなさい。

4
Nithya

Gauravの答えに何かを追加したいと思います。私は最近、私のプロジェクトでこの機能を実装する必要がありましたが、IE 9をサポートする必要があるため、javascriptの使用は問題外でした。IE 9の問題は何ですか? ( jQueryとhtmlを使用してCSVにエクスポート )、リンクの2番目の回答を参照してください。

データベースクエリのResultSetを、同じデータをCSV形式で表す文字列に変換する簡単な方法が必要でした。そのために http://opencsv.sourceforge.net/ を使用しました。これにより、ResultSetの文字列otを取得する簡単な方法が提供され、残りは上記のとおりです。

プロジェクトのsoruceフォルダーにある例は、良い例を示しています。

0