1. 程式人生 > >導出csv文件,導出axlsx文件。gem 'Axlsx-Rails' (470🌟)

導出csv文件,導出axlsx文件。gem 'Axlsx-Rails' (470🌟)

lena format option eve 分隔 產生 .com 字串 processor

匯出 CSV 檔案

需求:後臺可以匯出報名資料

有時候後臺功能做再多,也不如 Microsoft Excel 或 Apple Numbers 試算表軟件提供的分析功能,這時候如果有匯出功能,就可以很方便地把資料匯出來,用軟件來打開瀏覽。

CSV 逗號分隔值(Comma-separated-values)是一種簡單的資料格式,其文件以純文本形式存儲表格數據(數字和文本)。一行一筆資料,不同字段用逗號隔開。

例子:

app/views/admin/event_registrations/index.html.erb

  <p>
    <%= link_to "匯出 CSV", admin_event_registrations_path(:format => :csv
) %> </p>

app/controllers/admin/event_registrations_controller.rb

+  require ‘csv‘
   class Admin::EventRegistrationsController < AdminController

     def index
       # (略)

+      respond_to do |format|
+        format.html
+        format.csv {
+          @registrations = @registrations.reorder("id ASC")
+          csv_string = CSV.generate
do |csv| + csv << ["報名ID", "票種", "姓名", "狀態", "Email", "報名時間"] + @registrations.each do |r| + csv << [r.id, r.ticket.name, r.name, t(r.status, :scope => "registration.status"), r.email, r.created_at] + end + end + send_data
csv_string, :filename => "#{@event.friendly_id}-registrations-#{Time.now.to_s(:number)}.csv" + }
+ end end

CSV 是 Ruby 內建的庫,這裏第一行需要先 require 它。使用 CSV.generate 可以產生出 csv_string 字符串,也就是要輸出的 CSV 資料,接著透過 send_data 傳給瀏覽器進行檔案下載。

Time.now.to_s(:number)生成"20180811174126", to_s是簡寫:to_formatted_s(format=:default)

time = Time.now                    # => 2007-01-18 06:10:17 -06:00

time.to_formatted_s(:time)         # => "06:10"
time.to_s(:time)                   # => "06:10"

time.to_formatted_s(:db)           # => "2007-01-18 06:10:17"
time.to_formatted_s(:number)       # => "20070118061017"
time.to_formatted_s(:short)        # => "18 Jan 06:10"

send_data(data, options={})


Axlsx-Rails — Spreadsheet templates for Rails(470??)

安裝看git

CSV 有個缺點,就是用 Microsoft Excel 打開時默認會變成亂碼。這是因為匯出的 CSV 的字串編碼是 UTF-8,但是 Excel 默認會用本地編碼,例如中國大陸地區用 GB 2312

解決辦法有二:

方法一: 以記事本開啟後儲存,再以 Excel 開啟即可正常顯示。

方法二: 開啟 Excel 軟件,新增空白活頁簿(Workbook),然後在上方功能選項中點選「資料(Data)」->「取得外部資料 Get External Data」->「從文字檔 From Text File...」→「選擇匯出的 CSV 檔案」→ 選擇符號分隔(Delimited)、選擇 File origin 編碼是 Unicode (UTF-8) → 選擇分隔符號是 Comma 逗點,即可正常顯示。

如果上述 Excel 打開 CSV 檔案的解法沒辦法接受的話,那只好想辦法匯出 Excel 專用的 xlsx 格式了。這需要額外裝 gem。

使用 axlsx_rails gem(470?)。

?? Rails 4.2, 5.0 or 5.1 (tested), 還不支持5.2

沿用上例子:安裝3個gem後:

app/views/admin/event_registrations/index.html.erb

+ <%= link_to "匯出 Excel", admin_event_registrations_path(:format => :xlsx)

app/controllers/admin/event_registrations_controller.rb

在index中加上 format.xlsx

創建template:

app/views/admin/event_registrations/index.xlsx.axlsx

??:需要使用action_name.xlsx.axlsx格式作為名字。

wb = xlsx_package.workbook
wb.add_worksheet(name: "Buttons") do |sheet|
  sheet.add_row ["報名ID", "票種", "姓名", "狀態", "Email", "報名時間"]
  @registrations.each do |r|
    sheet.add_row [r.id, r.ticket.name, r.name, t(r.status, :scope => "registration.status"), r.email, r.created_at]
  end
end


導出csv文件,導出axlsx文件。gem 'Axlsx-Rails' (470🌟)