導出csv文件,導出axlsx文件。gem 'Axlsx-Rails' (470🌟)
匯出 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🌟)