質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Q&A

解決済

1回答

7087閲覧

OrangeSignalでCSV出力ができない

k499778

総合スコア599

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

0グッド

0クリップ

投稿2016/07/16 16:11

編集2016/07/17 00:37

現在上記タグの技術やOrangeSignalを使ってCSVファイルダウンロード機能を実装しようとしています。

CsvEntityListHandlerを使って実装しているのですが、
CSV出力されている気配がありません。

コンソールには何も出力されておらず、エラーログも出ていません。

ちなみに以下リンクを参考にしました。
http://okwave.jp/qa/q8048832.html

CSV出力できない原因を調べていますが、なかなか解決には至りません。
もし何かアドバイスいただける方がいましたらよろしくお願い致します。

実際のコードは以下です。

○Entity

Java

1package jp.co.test; 2 3import com.orangesignal.csv.annotation.CsvColumn; 4import com.orangesignal.csv.annotation.CsvEntity; 5 6@CsvEntity(header = false) 7public class TestBean { 8 @CsvColumn(position = 0) 9 int id; 10 @CsvColumn(position = 1) 11 String name; 12 13 public TestBean(int id, String name) { 14 this.name = name; 15 this.id = id; 16 } 17}

○Controller

java

1package jp.co.test; 2 3import java.io.File; 4import java.io.IOException; 5import java.io.PrintWriter; 6import java.util.ArrayList; 7import java.util.List; 8 9import javax.servlet.http.HttpServletResponse; 10 11import org.springframework.stereotype.Controller; 12import org.springframework.web.bind.annotation.RequestMapping; 13 14import com.orangesignal.csv.CsvWriter; 15import com.orangesignal.csv.handlers.CsvEntityListHandler; 16 17@Controller 18public class OrangeSignalCsv { 19 20 @RequestMapping("/orangeSignal/csvDown") 21 public void csvDown(HttpServletResponse response) throws IOException { 22 23 CsvWriter writer = new CsvWriter(new PrintWriter(new File("test.csv"))); 24 CsvEntityListHandler<TestBean> handler = new CsvEntityListHandler<TestBean>( 25 TestBean.class); 26 List<TestBean> list = new ArrayList<TestBean>(); 27 list.add(new TestBean(1, "A")); 28 list.add(new TestBean(2, "B")); 29 list.add(new TestBean(3, "C")); 30 handler.save(list, writer); 31 writer.close(); 32 33 } 34} 35

[DLできるようになったコード]

java

1package jp.co.test; 2 3import java.io.File; 4import java.io.IOException; 5import java.io.PrintWriter; 6import java.net.URLEncoder; 7import java.nio.charset.StandardCharsets; 8import java.nio.file.Files; 9import java.util.ArrayList; 10import java.util.List; 11 12import javax.servlet.http.HttpServletResponse; 13 14import org.springframework.stereotype.Controller; 15import org.springframework.web.bind.annotation.RequestMapping; 16 17import com.orangesignal.csv.CsvWriter; 18import com.orangesignal.csv.handlers.CsvEntityListHandler; 19 20@Controller 21public class OrangeSignalCsv { 22 23 @RequestMapping("/orangeSignal/csvDown") 24 public void csvDown(HttpServletResponse response) throws IOException { 25 26 File file = new File("test.csv"); 27// System.out.println("CSV file: " + file.getAbsolutePath()); // DLしない場合の保存先を出力 28 response.addHeader("Content-Disposition", "attachment; filename*=UTF-8''" + URLEncoder.encode(file.getName(), StandardCharsets.UTF_8.name())); 29 Files.copy(file.toPath(), response.getOutputStream()); 30 31 CsvWriter writer = new CsvWriter(new PrintWriter(file)); 32 CsvEntityListHandler<TestBean> handler = new CsvEntityListHandler<TestBean>( 33 TestBean.class); 34 List<TestBean> list = new ArrayList<TestBean>(); 35 list.add(new TestBean(1, "A")); 36 list.add(new TestBean(2, "B")); 37 list.add(new TestBean(3, "C")); 38 handler.save(list, writer); 39 writer.close(); 40 41 } 42} 43

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

今のコードでは、ファイルtest.csvにCSVを出力するだけで終わってしまっています。
参考にされているページの処理は単にローカル環境にCSVファイルを保存しているだけですので、ダウンロードをさせるにはそれだけでは足りません。

test.csvがどこに保存されているのかは、以下のコードをcsvDown()メソッドに追加して確認してください。

lang

1File file = new File("test.csv"); 2System.out.println("CSV file: " + file.getAbsolutePath());

とりあえず今の状態でダウンロードをさせるには、responseに対してファイルを書き出す処理を行う必要があります。
下記ページを参考にして下さい。

Spring Bootで日本語ファイル名のファイルダウンロード | システム開発メモ
http://progmemo.wp.xdomain.jp/archives/869

さらに、複数の人が同時にダウンロードするときのことを考えると、同じファイルに出力するのは不都合があると思います。(同時に同じファイルに複数の人が書き込みを行う可能性があります。)
できればファイルに書き出さずに直接responseに書き出すようにしたいですね。
でも、これの実現は次のステップにしましょう。
まずはここまでできるかどうか試してみて下さい。

投稿2016/07/16 16:48

argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k499778

2016/07/16 16:50

回答ありがとうございます。 詳しく説明していただき、感謝してもし尽くせません。 自分の方で整理したり調べたり実際動作確認したのちまた報告させていただきます。
k499778

2016/07/17 00:09

提供いただいたコードで保存場所のパスを確認することができ、 そこにCSVファイルがあることを確認できました。 ありがとうございます。 DLできていない点に関してはもう少し調べてみます。
k499778

2016/07/17 00:34 編集

DLするところまでできました。 ご提示頂いたリンク先を参考に実装を組み上げることができました。 ありがとうございました。 実装できたコードを投稿の「DLできるようになったコード」に添付しておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問