2010-10-29 30 views
22

Tôi đang sử dụng đá quý Spreadsheet để xuất tệp xls này.Tải xuống trực tiếp tệp xls mà không cần phải ghi nó vào thư mục bằng đá quý Bảng tính

tôi có các mã sau đây trong điều khiển của tôi:

def export 
    @data = Data.all 

    book = Spreadsheet::Workbook.new 
    sheet = book.create_worksheet :name => "data" 

    contruct_body(sheet, @data) 

    book.write "data.xls" 
end 

Bằng cách này, tôi có thể điền thông tin vào dữ liệu và lưu nó trong thư mục gốc.

Nhưng tôi muốn tải xuống thay vì lưu nó. Làm thế nào tôi có thể sửa đổi mã để người dùng nhắc nhở để chọn thư mục địa phương của mình để lưu các tập tin? (tốt hơn nếu không lưu bản sao ở phía máy chủ)

Xin vui lòng trợ giúp!

Trả lời

46

Bạn có thể gửi nó vào trình duyệt mà không lưu nó như một tập tin địa phương ở tất cả như sau

spreadsheet = StringIO.new 
book.write spreadsheet 
send_data spreadsheet.string, :filename => "yourfile.xls", :type => "application/vnd.ms-excel" 
+0

Nó thực sự hoạt động tốt. Cảm ơn! – PeterWong

+0

@DanSingerman bạn có thể giúp tôi làm như vậy với csv không? – RAJ

+0

@RAJ tạo một câu hỏi SO mới và tôi sẽ xem xét – DanSingerman

2

Bạn có thể thử mã này

book.write "data.xls" 

send_file "/path/to/data.xls", :type => "application/vnd.ms-excel", :filename => "data.xls", :stream => false 

# and then delete the file 

File.delete("path/to/data.xls") 

Đi qua :stream => false để send_file sẽ hướng dẫn Rails để sao chép toàn bộ tập tin vào bộ nhớ trước khi trực tuyến, vì vậy sử dụng File.delete ngay sau khi send_file sẽ là tốt kể từ send_file lợi nhuận ngay lập tức mà không cần chờ đợi tải xuống để hoàn tất. Có nói rằng, với các tập tin rất lớn, bạn có thể thấy một số cổ chai bộ nhớ tùy thuộc vào số lượng bộ nhớ có sẵn.

HTH

+0

Bravo! Trong thực tế, tôi chỉ phát hiện ra chính xác cùng một cách này vào buổi chiều nhưng chờ đợi thử nghiệm thêm. Câu trả lời của bạn đã cho tôi sự tự tin vì vậy tôi nghĩ rằng tôi không cần phải lo lắng nữa ^^ Cảm ơn! – PeterWong

+0

Vui vì tôi có thể giúp :) –

+0

Điều này dường như không hoạt động nữa (Tôi chỉ thừa kế một ứng dụng sử dụng giải pháp này ...). Nếu tôi loại bỏ phần 'File.delete', nó sẽ hoạt động. Tôi đã cố gắng xóa tập tin trong một bộ lọc sau, nhưng nó cũng không hoạt động. Như tôi đã hiểu, 'stream: false' không còn là một lựa chọn cho phương thức này, và tập tin sẽ KHÔNG được lưu trữ ... Bất kỳ cái nhìn sâu sắc nào? hoặc tôi nên sử dụng send_data? –

0

Vụ việc xảy ra trên mybody. Tôi đã sử dụng yêu cầu ajax bằng remote :: true to export excel file, không có gì hiển thị trên trình duyệt mà không có bất kỳ thông báo lỗi nào trên console. Xóa các thông số từ xa khỏi biểu mẫu, nó hoạt động tốt.

Các vấn đề liên quan