概要
WEBアプリケーションからダウンロードしたCSVをエクセルで開くと
0埋めしている社員番号から0が消えて表示される問題があったので、
対応内容をまとめました
開発環境
- ruby 2.6.5
- Rails 5.1.7
まず、CSVを確認
出力されるCSVに問題はなく、0埋め済の社員番号が記載されていた。
sample.csv
employee_number,address
012345,tokyo
エクセルで0落ちされないようCSVを加工
0落ち問題対応策の記事は多く、その1つは
CSVに変更を加える方法だった。
エクセルで文字列として表示できるよう、以下の記述に変更すれば
確かに0落ち問題が起きなかった。
sample.csv
employee_number,address
="012345",tokyo
でも、CSVはいじりたくない。
CSV出力は大量データを閲覧する目的もあるが、
そのCSVをアプリケーション側にインポートする目的もあった。
社員番号のようにDBではキーとなる値をいじりたくなかった。
エクセルファイル出力機能をアプリケーションに追加
caxlsx gemをインストール
インストール方法はgithubを参照
https://github.com/caxlsx/caxlsx
各セルの表示形式を文字列に設定、エクセルファイルを出力
表示形式を指定しないと「標準」表示形式となり、
0落ち問題がおきるため、各セルの表示形式を
文字列として設定する必要がある。
- エクセルファイル出力の実装例
package = Axlsx::Package.new
package.workbook.add_worksheet do |sheet|
header = ['employee_number','address']
values = ['012345','tokyo']
sheet.add_row header
# types オプションで各セルの表示形式指定ができる
# https://github.com/caxlsx/caxlsx/blob/master/lib/axlsx/workbook/worksheet/worksheet.rb#L385
sheet.add_row values, types: Array.new(values.size, :string)
end
data = package.to_stream
File.open('/tmp/zero_test.xlsx', 'w') do |file|
file.write data.read
end
出力されたエクセルファイルを確認
出力されたファイルを開いてみると
社員番号が正しく表示された。