rails导出excel插件 spreadsheet的标准使用

本文是对spreadsheet基本知识的介绍,该插件可以读取和生成excel文件

如果,你想看更复杂的例子, 请点击这里

如果,你想看更简单的解析excel文件的例子,请点击这里

如果,你想下载spreadsheet的gem包,请点击这里

如果,你想了解windows下操作excel的特有方法,使用ruby来操作excel文件 Win32ole

如果,你想考虑另外的插件roo来操作excel,请点击这里

如果,你还想考虑rails的一个插件railsxls,请点击这里

1. 使用Spreadsheet

本向导将介绍Spreadsheets的基本使用,看完本文您将掌握最基本的使用rails读写excel。

2. 读取excel文件

首先,保证加载库文件,否则功能没法用

Ruby代码 2009年8月5日 - yan - 从冰天雪地中走来的人

require "spreadsheet"

require "spreadsheet"

excel工作文件(Worksheets)通常有多种编码格式,这里需要手动表明格式如下:

Ruby代码 2009年8月5日 - yan - 从冰天雪地中走来的人

Spreadsheet.client_encoding = "UTF-8"

Spreadsheet.client_encoding = "UTF-8"

打开一个excel的文件

Ruby代码 2009年8月5日 - yan - 从冰天雪地中走来的人

book = Spreadsheet.open "/path/to/an/excel-file.xls"

book = Spreadsheet.open "/path/to/an/excel-file.xls"

这时,我们已经可以对excel文件的worksheets进行读写

Ruby代码 2009年8月5日 - yan - 从冰天雪地中走来的人

book.worksheets

book.worksheets

或者,增加标识的进行读写:

Ruby代码 2009年8月5日 - yan - 从冰天雪地中走来的人

sheet1 = book.worksheet 0
sheet2 = Book.worksheet "Sheet1"

sheet1 = book.worksheet 0 sheet2 = Book.worksheet "Sheet1"

那么,现在我们可以使用迭代来遍历所有的行列,Worksheet.each自身会跳过空值。

Ruby代码 2009年8月5日 - yan - 从冰天雪地中走来的人

sheet1.each do |row|
# do something interesting with a row
end

sheet1.each do |row| # do something interesting with a row end

或者,手动跳过前面的空值

Ruby代码 2009年8月5日 - yan - 从冰天雪地中走来的人

sheet2.each 2 do |row|
# do something interesting with a row
end

sheet2.each 2 do |row| # do something interesting with a row end

或者,通过顺序号访问,

Ruby代码 2009年8月5日 - yan - 从冰天雪地中走来的人

row = sheet1.row(3)

row = sheet1.row(3)

读取行中一个单元格的值

Code代码 2009年8月5日 - yan - 从冰天雪地中走来的人

row[0]

row[0]

-> 这里将返回一个String字符串,Float或者整形(Integer)或者Formula或者Link或者Date或者DateTime。甚至nil值,如果表单值本来就是空值。

3. 生成excel文件

如果,你想生成一个excel文件,那么首先,就像写文件一个先加载spreadsheet类库,然后,指定编码接着,就可以创建一个Workbook了

Ruby代码 2009年8月5日 - yan - 从冰天雪地中走来的人

book = Spreadsheet::Workbook.new

book = Spreadsheet::Workbook.new

在workbook基础上创建Worksheet表单

Ruby代码 2009年8月5日 - yan - 从冰天雪地中走来的人

sheet1 = book.create_worksheet

sheet1 = book.create_worksheet

当然,你也可以用如下方式创建表单:

Ruby代码 2009年8月5日 - yan - 从冰天雪地中走来的人

sheet2 = book.create_worksheet :name => 'My Second Worksheet'
sheet1.name = 'My First Worksheet'

sheet2 = book.create_worksheet :name => 'My Second Worksheet' sheet1.name = 'My First Worksheet'

那么,这时我们可以采用如下方式加载数据到表单Worksheet#[]=,

Worksheet#update_row, 或者直接给一个指定单元格复制

Ruby代码 2009年8月5日 - yan - 从冰天雪地中走来的人

sheet1.row(0).concat %w{Name Country Acknowlegement}
sheet1[1,0] = 'Japan'
row = sheet1.row(1)
row.push 'Creator of Ruby'
row.unshift 'Yukihiro Matsumoto'
sheet1.row(2).replace [ 'Daniel J. Berger', 'U.S.A.',
'Author of original code for Spreadsheet::Excel' ]
sheet1.row(3).push 'Charles Lowe', 'Author of the ruby-ole Library'
sheet1.row(3).insert 1, 'Unknown'
sheet1.update_row 4, 'Hannes Wyss', 'Switzerland', 'Author'

sheet1.row(0).concat %w{Name Country Acknowlegement} sheet1[1,0] = 'Japan' row = sheet1.row(1) row.push 'Creator of Ruby' row.unshift 'Yukihiro Matsumoto' sheet1.row(2).replace [ 'Daniel J. Berger', 'U.S.A.', 'Author of original code for Spreadsheet::Excel' ] sheet1.row(3).push 'Charles Lowe', 'Author of the ruby-ole Library' sheet1.row(3).insert 1, 'Unknown' sheet1.update_row 4, 'Hannes Wyss', 'Switzerland', 'Author'

对于格式的处理,可以如下:

Ruby代码

sheet1.row(0).height = 18
format = Spreadsheet::Format.new :color => :blue,
:weight => :bold,
:size => 18
sheet1.row(0).default_format = format
bold = Spreadsheet::Format.new :weight => :bold
4.times do |x| sheet1.row(x + 1).set_format(0, bold) end

sheet1.row(0).height = 18 format = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 18 sheet1.row(0).default_format = format bold = Spreadsheet::Format.new :weight => :bold 4.times do |x| sheet1.row(x + 1).set_format(0, bold) end

最后,保存excel文件

Ruby代码

book.write '/path/to/output/excel-file.xls'

book.write '/path/to/output/excel-file.xls'

4. 修改已经存在的excel文件

对于修改excel文件而言是有限制的。下面是

可以进行的修改操作:

* 添加、修改和删除单元格

* 可以在预定义数据的情况下添加数据

不可以进行的操作:

* Spreadsheet 只能对BIFF8数据(Dxcel97以后版本的excel)进行写操作

* Spreadsheet 不能修改以百分比定义的格式.

* 虽然理论上是可行的,但是非常不建议把修改后的文件保存回原文件。

修改演示:

Ruby代码

book = Spreadsheet.open '/path/to/an/excel-file.xls'
sheet = book.worksheet 0
sheet.each do |row|
row[0] *= 2
end
book.write '/path/to/output/excel-file.xls'

book = Spreadsheet.open '/path/to/an/excel-file.xls' sheet = book.worksheet 0 sheet.each do |row| row[0] *= 2 end book.write '/path/to/output/excel-file.xls'

5. 如何处理时间

Excel 并没有单独的日期标识类型,依靠浮点类型格式显示

Ruby代码

row.format(3).number_format

row.format(3).number_format

如果,日起识别失败,就需要自己解码:

Ruby代码

row.date(3)
row.datetime(3)
row[4] = Date.new 1975, 8, 21
# -> 日起类型: 'M/D/YY'
book.add_format Format.new(:number_format => 'DD.MM.YYYY hh:mm:ss')
row[5] = DateTime.new 2008, 10, 12, 11, 59
# -> 指定时间类型: 'DD.MM.YYYY hh:mm:ss'
row.set_format 6, Format.new(:number_format => 'D-MMM-YYYY')
row[6] = Time.new 2008, 10, 12
# -> the Format of cell 6 is left unchanged.

row.date(3) row.datetime(3) row[4] = Date.new 1975, 8, 21 # -> 日起类型: 'M/D/YY' book.add_format Format.new(:number_format => 'DD.MM.YYYY hh:mm:ss') row[5] = DateTime.new 2008, 10, 12, 11, 59 # -> 指定时间类型: 'DD.MM.YYYY hh:mm:ss' row.set_format 6, Format.new(:number_format => 'D-MMM-YYYY') row[6] = Time.new 2008, 10, 12 # -> the Format of cell 6 is left unchanged.

6. 更多关于文档的编码格式

设置多种编码格式:

Ruby代码

Spreadsheet.client_encoding = 'LATIN1//TRANSLIT//IGNORE'

Spreadsheet.client_encoding = 'LATIN1//TRANSLIT//IGNORE'

7. 兼容性问题

Spreadsheet是设计来代替ParseExcel 和Spreadsheet::Excel,但是他们还是兼容的。例如你的工程理还有parseexcel那么,你可以这样写

Ruby代码

require 'parseexcel'
require 'parseexcel/parseexcel'
require 'parseexcel/parser'


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值