1.修改Gemfile

# PDF generator
gem 'prawn'
gem 'prawn-table' # Excel generator
gem 'rubyXL' #Zip generator
gem 'rubyzip'

bundle install

2.生成附件

export.rb

requere 'csv'
class Export
def export file_type,data
file_name = "file_name"
attachment = case file_type
when 'csv'
generate_csv(data)
when 'zip'
generate_zip(data)
when 'excel'
generate_excel(data)
end
ExportMailer.with_attachment(attachment, file_name).deliver_now
end

#生成csv
def generate_csv data
file = Tempfile.new ['export', '.csv']
file.write(csv_data(data))
file
end

#生成excel
def generate_excel data
file = Tempfile.new ['export', '.xlsx']
file.write(excel_data(data))
file
end

#生成zip
def generate_zip data
pdf_files = Hash.new
data.find_each do |item|
file = Tempfile.new
pdf = Prawn::Document.new
pdf.font('path/to/font') do
pdf.text "item_data"
end
pdf.render_file file
pdf_files[item] = file
end
write_to_zip(pdf_files)
end def csv_data data
CSV.generate(encoding: 'gbk') do |csv|
data.each do |record|
csv << record.to_a
end
end
end def excel_data data
excel = RubyXL::Workbook.new
sheet = excel.worksheets.first
sheet.sheet_name = "sheet_1"
data.each_with_index do |record,m|
record.each.with_index{|content,n|
sheet.add_cell(m,n,content)
}
end
excel.stream.read
end def write_to_zip queue
file = Tempfile.new ['export', '.zip']
Zip::File.open file.path, Zip::File::CREATE do |zip|
zip.get_output_stream(".keep") { |os| os.write "keep file" }
queue.each do |name, pdf|
pdf.rewind
zip.get_output_stream("#{name}.pdf"){ |stream| stream.write pdf.read }
end
end
file
end end

3.发送邮件

export_mailer.rb

class ExportMailer < ApplicationMailer
def with_attachment attatchment_file, filename
attatchment_file.rewind
file_name = "#{filename}#{File.extname(attatchment_file.path)}"
attachments[file_name] = File.read(attatchment_file.path)
mail(to: test@email.com, subject: '发送附件测试')
end end

Rails中生成并在ActionMailer附件中发送csv、excel、pdf、zip文件的更多相关文章

  1. delphi中的idhttpserver如何才能收到idhttp发送来的exe\rar文件呢

    http://zhidao.baidu.com/link?url=-q2oXqYCKBZ9OgFDEHAcQwQEY_NroHcqGvVfKW67X5sF9LdjAAB_HPXQo04VxStFVS7 ...

  2. Python中,添加写入数据到已经存在的Excel的xls文件,即打开excel文件,写入新数据

    背景 Python中,想要打开已经存在的excel的xls文件,然后在最后新的一行的数据. 折腾过程 1.找到了参考资料: writing to existing workbook using xlw ...

  3. Android将日志信息自动发送到指定的邮箱中 邮件的内容以附件形式发送

    今日整合了网上一些大神的例子(具体看了那些大神的?这个真不好意思我忘记了.下次再整合一定给大家补上,这次也只有默默的给那几个大神说声抱歉了.)做了一个“记录android项目中的日志信息,并将日志信息 ...

  4. idel 中 生成 jar包 和项目中自己需要的包

    一.首先在自己的项目中创建一个类类中创建一个构造方法构造方法中传入一个字符串参数(这个字符串参数是为了传入路径) 在方法体内通过file类创建文件夹(换而言之就是项目中的包) 二 .就是对这个项目中的 ...

  5. 怎样在 Azure 应用服务中生成和部署 Java API 应用

    先决条件 Java 开发人员工具包 8(或更高版本) 已在开发计算机上安装 Maven 已在开发计算机上安装 Git Azure 订阅付费版或试用版 HTTP 测试应用程序,如 Postman 使用 ...

  6. EBS OAF中如何在多行表中实现附件功能

    EBS OAF中如何在多行表中实现附件功能 (版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处:否则请与本人联系,违者必究) 在OAF中使用附件功能之前,要先明白Entity( ...

  7. 内卷时代下的前端技术-使用JavaScript在浏览器中生成PDF文档

    背景 在计量领域中,计量检定是一种重要形式,主要用于评定计量器具的计量性能,确定其量值是否准确一致,实现手段包括计量检验.出具检定证书和加封盖印等. 在检定证书这一环节,存在一个难点,就是无法在线预览 ...

  8. 如何在高并发分布式系统中生成全局唯一Id

    月整理出来,有兴趣的园友可以关注下我的博客. 分享原由,最近公司用到,并且在找最合适的方案,希望大家多参与讨论和提出新方案.我和我的小伙伴们也讨论了这个主题,我受益匪浅啊…… 博文示例: 1.     ...

  9. C# 在Word文档中生成条形码

    C# 在Word文档中生成条形码 简介 条形码是由多个不同的空白和黑条按照一定的顺序组成,用于表示各种信息如产品名称.制造商.类别.价格等.目前,条形码在我们的日常生活中有着很广泛的应用,不管是在图书 ...

随机推荐

  1. Linux 下LNMP环境搭建_【all】

    LNMP = Linux + Nginx + Mysql + PHP 1.0 Linux环境搭建 Linux 系统安装[Redhat] 1.1. FastCGI介绍 1.什么是CGI(common g ...

  2. 将旧的时间字符串转换为新的string时间字符串

    旧的时间字符串-->simpledataformat1.parse(该字符串) 获得date类型 -->simpledataformat2.format(date) simpledatef ...

  3. 树-二叉搜索树-AVL树

    树-二叉搜索树-AVL树 树 树的基本概念 节点的度:节点的儿子数 树的度:Max{节点的度} 节点的高度:节点到各叶节点的最大路径长度 树的高度:根节点的高度 节点的深度(层数):根节点到该节点的路 ...

  4. WebDAV漏洞直接远程溢出拿下服务器

    以上是 我做的幻灯片 介绍什么是WebDAV 有什么用 漏洞测试需要的工具 http://pan.baidu.com/s/1o6DYxAE看到这里 说明直接远程溢出 提升权限为system 这些都很久 ...

  5. 二值形态学——腐蚀与膨胀 及 C语言代码实现

    参考文献:数字图像处理(第三版) 何东健 西安电子科技大学出版社 二值形态学中的运算对象是集合, 但实际运算中, 当涉及两个集合时并不把它们看作是互相对等的. 一般设A为图像集合, S为结构元素, 数 ...

  6. robotframework接口测试(二)—post request

    第5行:发起post请求.因为我写了好多的参数,所以这样写的. 也可以这样写 其他行:可见[robotframework接口测试(二)—get request json]

  7. spring中的default-lazy-init参数和lazy-init

    在spring的配置中的根节点上有个  default-lazy-init="true"配置:   1.spring的default-lazy-init参数  此参数表示延时加载, ...

  8. sqoop mysql--->hive 报错 (ERROR tool.ImportTool: Import failed: java.io.IOException: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf)

    ERROR tool.ImportTool: Import failed: java.io.IOException: java.lang.ClassNotFoundException: org.apa ...

  9. PAT——1054. 求平均值

    本题的基本要求非常简单:给定N个实数,计算它们的平均值.但复杂的是有些输入数据可能是非法的.一个“合法”的输入是[-1000,1000]区间内的实数,并且最多精确到小数点后2位.当你计算平均值的时候, ...

  10. MAPREDUCE框架结构及核心运行机制

    1.2.1 结构 一个完整的mapreduce程序在分布式运行时有三类实例进程: 1.MRAppMaster:负责整个程序的过程调度及状态协调 2.mapTask:负责map阶段的整个数据处理流程 3 ...