Excel Rails Ruby Windows Blog
update (2011/4/29) :
Rails 3.0.7 ruby 1.9.2 spreadsheet 0.6.5.4可以用
update(2010/8/29):
一年之后本文出了个后继篇,是关于Rails的excel导入,导出的一些插件介绍
诸位看官,如果用到请赏脸移步参考
在Rails项目中导入excel 导出excel 实用rails解析excel
—————————— 老猪的小分割———————————
本文是对spreadsheet基本知识的介绍,该插件可以读取和生成excel文件
如果,你想看更复杂的例子, 请点击这里
如果,你想看更简单的解析excel文件的例子, 请点击这里
如果,你想下载spreadsheet的gem包, 请点击这里
如果,你想了解windows下操作excel的特有方法, 使用ruby来操作excel文件 Win32ole
如果,你想考虑另外的插件roo来操作excel, 请点击这里
如果,你还想考虑rails的一个插件railsxls, 请点击这里
1. 使用Spreadsheet
本向导将介绍Spreadsheets的基本使用,看完本文您将掌握最基本的使用rails读写excel。
2. 读取excel文件
首先,保证加载库文件,否则功能没法用
excel工作文件(Worksheets)通常有多种编码格式,这里需要手动表明格式如下:
- Spreadsheet.client_encoding = "UTF-8"
打开一个excel的文件
- book = Spreadsheet.open "/path/to/an/excel-file.xls"
这时,我们已经可以对excel文件的worksheets进行读写
或者,增加标识的进行读写:
- sheet1 = book.worksheet 0
- sheet2 = Book.worksheet "Sheet1"
那么,现在我们可以使用迭代来遍历所有的行列,Worksheet.each自身会跳过空值。
或者,手动跳过前面的空值
- sheet2.each 2 do |row|
-
- end
或者,通过顺序号访问,
读取行中一个单元格的值
-> 这里将返回一个String字符串,Float或者整形(Integer)或者Formula或者Link或者Date或者DateTime。甚至nil值,如果表单值本来就是空值。
3. 生成excel文件
如果,你想生成一个excel文件,那么首先,就像写文件一个先加载spreadsheet类库,然后,指定编码接着,就可以创建一个Workbook了
- book = Spreadsheet::Workbook.new
在workbook基础上创建Worksheet表单
- sheet1 = book.create_worksheet
当然,你也可以用如下方式创建表单:
- sheet2 = book.create_worksheet :name => 'My Second Worksheet'
- sheet1.name = 'My First Worksheet'
那么,这时我们可以采用如下方式加载数据到表单Worksheet#[]=,
Worksheet#update_row, 或者直接给一个指定单元格复制
- 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).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文件
- book.write '/path/to/output/excel-file.xls'
4. 修改已经存在的excel文件
对于修改excel文件而言是有限制的。下面是
可以进行的修改操作:
* 添加、修改和删除单元格
* 可以在预定义数据的情况下添加数据
不可以进行的操作:
* Spreadsheet 只能对BIFF8数据(Dxcel97以后版本的excel)进行写操作
* Spreadsheet 不能修改以百分比定义的格式.
* 虽然理论上是可行的,但是非常不建议把修改后的文件保存回原文件。
修改演示:
- 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 并没有单独的日期标识类型,依靠浮点类型格式显示
- row.format(3).number_format
如果,日起识别失败,就需要自己解码:
- row.date(3)
- row.datetime(3)
- row[4] = Date.new 1975, 8, 21
-
- book.add_format Format.new(:number_format => 'DD.MM.YYYY hh:mm:ss')
- row[5] = DateTime.new 2008, 10, 12, 11, 59
-
- row.set_format 6, Format.new(:number_format => 'D-MMM-YYYY')
- row[6] = Time.new 2008, 10, 12
-
6. 更多关于文档的编码格式
设置多种编码格式:
- Spreadsheet.client_encoding = 'LATIN1//TRANSLIT//IGNORE'
7. 兼容性问题
Spreadsheet是设计来代替ParseExcel 和Spreadsheet::Excel,但是他们还是兼容的。例如你的工程理还有parseexcel那么,你可以这样写
- require 'parseexcel'
- require 'parseexcel/parseexcel'
- require 'parseexcel/parser'