2013-02-10 52 views
0

我想使用Rails和randym/axlsx将Excel文件保存到保存箱中。将Axlsx保存在保存箱中

我可以创建一个Axlsx :: Package对象,我甚至可以序列化它,所以在开发环境中将它保存到我的磁盘。

但我想使用futuresimple/dropbox-api将其上传到保管箱。

它有多难?

def save_in_dropbox(project) 
    Dropbox::API::Config.app_key = ENV['DROPBOX_APP_KEY'] 
    Dropbox::API::Config.app_secret = ENV['DROPBOX_APP_SECRET'] 
    Dropbox::API::Config.mode = ENV['DROPBOX_ACCESS_TYPE'] 

    dropbox_client = Dropbox::API::Client.new(:token => ENV['DROPBOX_CLIENT_TOKEN'], :secret => ENV['DROPBOX_CLIENT_SECRET']) 
    logger.info "#{dropbox_client.account}" 

    # create Excel file 
    p = Axlsx::Package.new 
    p.workbook.add_worksheet(:name => "Basic Worksheet") do |sheet| 
     sheet.add_row ["First Column", "Second", "Third"] 
     sheet.add_row [1, 2, 3] 
    end 
    p.use_shared_strings = true 

    # Next line causes Error: undefined method `length' for true:TrueClass 
    # because p.serialize('file.xlsx')) is true 
    # but I don't want to save to my disk, on heroku I couldn't 
    # I want to save to my dropbox 
    dropbox_client.upload("#{ENV['DROPBOX_ROOT_PATH']}/file.xlsx", p.serialize('file.xlsx')) 

    #p.serialize('c:\file.xlsx') # that saves it to my development env disk :-(

    #uploaded_file = dropbox_client.upload "#{ENV['DROPBOX_ROOT_PATH']}/file.txt", "#{1.second.ago.to_s}\n\r#{project.title}" # Upload to Dropbox works fine 

    end 

回答

2

我建议你在这种情况下使用Package#to_stream。它会给你IO对象,然后你可以读入上传呼叫。

另一种方法是使用Package#serialize将其写入磁盘,然后从文件系统读取它。

我对dropbox_client并不熟悉,但如果它没有正确处理IO流,我会感到惊讶。

最佳

-randym

+0

真棒! [to_stream](http://rubydoc.info/github/randym/axlsx/Axlsx/Package#to_stream-instance_method)工作原理:'dropbox_client.upload(“#{ENV ['DROPBOX_ROOT_PATH']}/file.xlsx”,p .to_stream()) '感谢您的帮助和这个伟大的宝石! – 2013-02-11 17:35:58