- ベストアンサー
C#からエクセルに保存する際の文字化けの問題
- C#で結果をエクセルに保存する際に文字化けが発生する問題について質問です。
- 現在作成中のコードの一部を載せました。
- ハッシュタグを5つ生成しました。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
これは、Excelを起動しておいて、そこにC#のプログラム上から ズバーっとセルを埋めていく……とかって事じゃないですよね? 「エクセルに保存する」という事ではなく、「CSVファイル形式で データを出力する」という風に理解しましたが、OKでしょうか? 文字化けは、おそらく文字のエンコーディングを指定していない 為ですね。以下に出力例を書いてみます。 double[] dat = new double[] { 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 }; string[] stData = new string[] { "あいうえお", "かきくけこ", "さしすせそ"}; StreamWriter sw = new StreamWriter("test.csv", false, System.Text.Encoding.GetEncoding("SHIFT-JIS")); string stbuf = ""; // 数値の場合 for (int i = 0; i < dat.Length; i++) { stbuf += dat[i].ToString() + ", "; } sw.WriteLine(stbuf); // 文字列の場合 stbuf = ""; for (int i = 0; i < stData.Length; i++) { stbuf += stData[i] + ", "; } sw.WriteLine(stbuf); sw.Close(); 上の例では、数値配列と文字列配列を、それぞれカンマ区切りで出力して います。ただし、最後の項目のお尻にまで "," を付けちゃってますが。 そこは手抜きです(笑) CSVファイルって単純なフォーマットに思えますが、真面目に処理をすると 地味にメンドクサイ部分もあります。例えば「区切り文字ではなくて、 項目自体がカンマを含んでいる」文字列がありえるならば、注意が必要です。
その他の回答 (2)
- hiropuri
- ベストアンサー率55% (24/43)
おはようございます。要請を頂きましたので再登場しました。 コードを拝見した限り、目立ったミスはないと思います。もしかしたら StreamWriter をクローズしていないという事はありますか? sw.Close(); を記述しないと、データがFlushされないかと思います。 (詳細は割愛しますが、WriteLine() を実行した瞬間にファイル出力が されるワケではないのですね。) ※オブジェクトに Close や Dispose が存在する場合は、最後に実行した方が 無難です。これは「使い終わった後の後片付け」みたいなモノです。 C#のマネージドコードであれば「後片付けをしなかった為に即メモリリーク」 とはならない場合が多いですが、状況によっては思わぬ落とし穴になるかも。 それと、質問とは無関係な話ですが……。 解決した場合には「解決済み」にして、質問を Close した方がいいと 思いますよ。放置された質問が多い場合やマルチポストされている場合等は、 あえて回答は避ける回答者もいると思います。そのあたりを気をつけてあげると、 より多くの回答が貰えるかもしれませんので(^^
- Tacosan
- ベストアンサー率23% (3656/15482)
どう「文字化け」するのかにもよるけど, まず最初に文字コードを疑ってみる.
お礼
毎度ありがとうございます!! 大変参考になりました!! ありがとうございました!!
補足
追加質問お願いしたいです♪☆ 任意のファイルに出力したいと思って改良していたのですが 上手く表示できません。。 以下は保存参照先ボタンの中身です。 private void button7_Click(object sender, EventArgs e) { SaveFileDialog od = new SaveFileDialog(); od.Filter = "テキストファイル(*.txt) | *.txt"; if (od.ShowDialog() == DialogResult.OK) { cl_filename = od.FileName; textBox8.Text = cl_filename; if (flg_in == 1) { label3.Text = "初期分割を行ってください"; } else { label3.Text = "データ数を入力してください"; } } } このようにして保存先を選択して 別ボタンで StreamWriter sw = new StreamWriter(cl_filename, false, System.Text.Encoding.GetEncoding("shift_jis")); と宣言しています。保存先のところには先ほどのcl_filenameを指定しています。 そしてこのボタン内で // Write the data to a file // 分析情報をファイルに書く stbuf = "データ数:" + kosu_i.ToString(); sw.WriteLine(stbuf); stbuf = ""; stbuf = "次元数:" + zigen_i.ToString(); sw.WriteLine(stbuf); stbuf = ""; stbuf = "クラスター数:" + cl_i.ToString(); sw.WriteLine(stbuf); stbuf = ""; stbuf = "初期分割:"; sw.WriteLine(stbuf); stbuf = ""; としているのですが全く表示されません。。;; 上手く行くはずなのですが・・;; お願い致します;;