2013-06-11 75 views
2

我跟着這railscast視頻,但我很難將我的數據導出到Excel(或CSV爲這件事)。從複雜的導軌導出到CSV查詢

我使用will_paginate的一些數據,我就展示前端是這樣的:

sql = "select complex..." 
@data = paginate_by_sql([sql], 
       :per_page => params[:rows], 
       :page => params[:page]) 

所以,原樣,我想這應該工作:

respond_to do |format| 
    format.html 
    format.xls { send_data @data.to_csv(:col_sep => "\t") } 
end 

,它實際上下載了xls文件正確的內容都搞砸了,它每行顯示一行,像這樣內容:

#<Product:0x00000004c83328>

PS - >使用Rails最新版本

::編輯::每列 通過一排我的意思是一排只在我的Excel工作表,並在該行

COLUMN A = #<Product:0x00000004c83328>

COLUMN B = #<Product:0x00000004c83329>

COLUMN C = #<Product:0x00000004c8333>(30列)

UPDATE

有沒有一個簡單的練習測試,並在只有一列再次結束了所有列:

csv_string = CSV.generate(:col_sep => ",") do |csv| 
    csv << ["row", "of", "CSV", "data"] 
    csv << ["another", "row"] 
end 

respond_to do |format| 
    format.html 
    format.csv { send_data csv_string, 
     :type => 'text/csv; charset=iso-8859-1; header=present', 
     :disposition => "attachment; filename=records.csv" } 
end 

(:col_sep => ",")是可選的,我想。

結果:

excel output

回答

0

好吧,所以這就是我所做的。

修改響應這個...

respond_to do |format| 
    format.xls 
end 

,並創建了一個名爲nameofmethod.xls.erb與此模板...

<?xml version="1.0"?> 
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" 
    xmlns:o="urn:schemas-microsoft-com:office:office" 
    xmlns:x="urn:schemas-microsoft-com:office:excel" 
    xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" 
    xmlns:html="http://www.w3.org/TR/REC-html40"> 
    <Worksheet ss:Name="Sheet1"> 
    <Table> 
     <Row> 
     <% @data.first.attributes.keys.each do |column| %> 
     <Cell><Data ss:Type="String"><%=column%></Data></Cell> 
     <% end %> 
     </Row> 
    <% @data.each do |row| %> 
     <Row> 
     <% row.attributes.values.each do |column| %> 
     <Cell><Data ss:Type="String"><%= column %></Data></Cell> 
     <% end %> 
     </Row> 
    <% end %> 
    </Table> 
    </Worksheet> 
</Workbook> 

這是任何類型的ActiveRecord的漂亮動態目的。 現在,這將不得不做...

0

你就要成功了,你只需要,因爲你正在呼籲to_s在他們身上,這是不確定的映射每個Product模型對象。

所以,如果你只是想標題的列表,你可以重寫你的模型(app/models/product.rb)的to_s方法做這樣的事情:

def to_s 
    title 
end 

或者,要產生一個逗號分隔的列表,你可以做

def to_s 
    [title, price, availability].join(',') 
end 
+0

我很抱歉,我不明白你的意思是我調用'to_s' ......我打電話'paginate_by_sql'什麼。雖然我意識到輸出看起來像模型轉換爲字符串...這是奇怪的。我必須接近... – tostasqb

+0

是的,如果你在模型上調用to_s,比如'Person',你會得到類似'#'的輸出。哪一個是ActiveRecord模型的默認字符串轉換。所以,我建議你在你的模型中通過定義一個新的'to_s'方法來覆蓋這個方法。 – ipd