LoginSignup
4
10

More than 3 years have passed since last update.

RailsでCSVを出力する機能を実装(Shift_JIS対応)

Last updated at Posted at 2019-08-21

最近の勉強で学んだ事を、ノート代わりにまとめていきます。
主に自分の学習の流れを振り返りで残す形なので色々、省いてます。
Webエンジニアの諸先輩方からアドバイスやご指摘を頂けたらありがたいです!

CSVエクスポート(出力)

以下の記事を参考にさせて頂きました!
Ruby on RailsでCSV一覧出力する3つの方法

まずはcsvでしっかり出力できるかを試したかったので参考にした記事の
①csv出力用のアクションを作成する方法を行いました!
これは記事にも書いている通りREST設計に背く形となるので1つのデメリットですね。
なぜならRESTfulに設計するとindexで処理すべき内容だからです。

アクションはこのように定義しました。

def export
    @members = Member.all
    send_data render_to_string, filename: "members_#{Time.now.utc.strftime("%Y/%m/%d %H:%M:%S")}.csv", type: :csv
  end

いつ出力したのかをファイル名で確認できるようにこのようなコードを追記した感じです。

filename: "members_#{Time.now.utc.strftime("%Y/%m/%d %H:%M:%S")}.csv"

あとはルーティングを設定し、csv出力ファイルであるexport.csv.rubyファイルを作成して出力したい値を設定します!

require 'csv'

CSV.generate do |csv|

    csv_column_names = [
        "アカウントID",
        "ユーザー名",
        "メールアドレス",
        "姓",
        "名",
        "性別"
    ]
    csv << csv_column_names

    @members.each do |member|
        csv_column_values = [
            member.account_id,
            member.user_name,
            member.email,
            member.last_name,
            member.first_name,
            member.gender
      ]
     csv << csv_column_values
  end
end

これで最後にファイル出力する為のリンクを作成したら終了です。

<%= link_to "csv出力",csv_export_path(format: :csv) %>

エクセルで読み込むためのCSVファイルにする

csvファイルを無事出力できて喜んでいたのですがここで問題がなんとエクセルと開くと文字化けが発生!
原因を調査していると理由が判明

RailsアプリケーションでCSV出力をしたファイルをExcelで開くと文字化ける。
理由はExcelがUTF-8のファイルをShift_JISで開こうとしてしまうため。

エクセルはShift_JISしか対応してみたいな
なんやそれ〜めちゃくちゃめんどくさい笑

この記事に書いているみたいに文字コードの問題を解決する為に「BOM」を使えば上手くいくようなのですが僕の場合は上手くいかず。

参考ページを見てこのようにしたら上手くいきました!

send_data render_to_string.encode(Encoding::Windows_31J, undef: :replace, row_sep: "\r\n", force_quotes: true), filename: "members_#{Time.now.utc.strftime("%Y/%m/%d %H:%M:%S")}.csv", type: :csv

参考ページ

Rubyでエンコードのエラーの対処
RailsからShift-JISとUTF-8でCSV出力する
send_dataでファイルを書き出すときの日本語ファイル名の文字化け対策
ruby on rails で utf-8 から shift_jis にしたかった
[Rails] SJISのエクスポートでの「ActionView::Template::Error (U+2212 from UTF-8 to Windows-31J):」のエラー対応

4
10
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
10