0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ExcelでCSV閲覧の際の0落ち問題

Last updated at Posted at 2021-01-22

概要

WEBアプリケーションからダウンロードしたCSVをエクセルで開くと
0埋めしている社員番号から0が消えて表示される問題があったので、
対応内容をまとめました

開発環境

  • ruby 2.6.5
  • Rails 5.1.7

まず、CSVを確認

出力されるCSVに問題はなく、0埋め済の社員番号が記載されていた。

sample.csv

employee_number,address
012345,tokyo

なのにエクセルで開くとこんな感じ
image.png

エクセルで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

出力されたエクセルファイルを確認

出力されたファイルを開いてみると
社員番号が正しく表示された。

image.png

0
1
0

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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?