rails - 将xls文件附加到电子邮件中

时间:2016-02-27 11:39:50

标签: ruby-on-rails excel spreadsheet xls

我创建了一个生成xls文件的代码,然后我将它传递给Mailer以将其作为附件发送。但是,我一次又一次地得到同样的错误:

TypeError: no implicit conversion of Spreadsheet::Workbook into String

或者

NoMethodError: undefined method `length' for #<Spreadsheet::Workbook:0x007fe937e4fe80>

我的代码是:

def xls_mailer (data)
attachments['HelloWorld.xlsx'] = data
mail(subject: "Hi", to: @gmail.email)
end

***数据 - 是我传递给此方法的xls文件。

先谢谢你们,

3 个答案:

答案 0 :(得分:1)

Action Mailer希望您将File之类的对象作为附件传递,但您的代码会直接将电子表格数据传递给它。幸运的是,Ruby有一个名为StringIO的类,我们可以使用它将电子表格转换为类似File的内容:

def xls_mailer (spreadsheet)
  spreadsheet_file = StringIO.new
  spreadsheet.write(spreadsheet_file)
  attachments['HelloWorld.xls'] = spreadsheet_file
  mail(subject: "Hi", to: @gmail.email)
end

答案 1 :(得分:1)

好的伙计们,我找到了答案。 代码应该是这样的:

 spreadsheet_file = StringIO.new
 data.write(spreadsheet_file)
 attachments['HelloWorld.xls'] = spreadsheet_file.read

答案 2 :(得分:0)

下面的代码块就像一个魅力。我试过这个,在一个工作的应用程序中使用。

def send_excel_report(file_name, emails, subject, email_content, file_path, bcc_emails = [])

    attachments["#{file_name}.xls"] = File.read(file_path)

    mail(to: emails, subject: subject, from: "my_email@gmail.com", bcc: bcc_emails) do |format|
      format.html { render :partial => "users/mail_body"}
    end
  end

仅供参考:我使用了电子表格gem来创建excel