`
xitong
  • 浏览: 6177077 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多
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文件

首先,保证加载库文件,否则功能没法用
Ruby代码 收藏代码
  1. require"spreadsheet"

excel工作文件(Worksheets)通常有多种编码格式,这里需要手动表明格式如下:
Ruby代码 收藏代码
  1. Spreadsheet.client_encoding="UTF-8"

打开一个excel的文件
Ruby代码 收藏代码
  1. book=Spreadsheet.open"/path/to/an/excel-file.xls"

这时,我们已经可以对excel文件的worksheets进行读写
Ruby代码 收藏代码
  1. book.worksheets

或者,增加标识的进行读写:
Ruby代码 收藏代码
  1. sheet1=book.worksheet0
  2. sheet2=Book.worksheet"Sheet1"

那么,现在我们可以使用迭代来遍历所有的行列,Worksheet.each自身会跳过空值。
Ruby代码 收藏代码
  1. sheet1.eachdo|row|
  2. #dosomethinginterestingwitharow
  3. end

或者,手动跳过前面的空值
Ruby代码 收藏代码
  1. sheet2.each2do|row|
  2. #dosomethinginterestingwitharow
  3. end

或者,通过顺序号访问,
Ruby代码 收藏代码
  1. row=sheet1.row(3)

读取行中一个单元格的值
Code代码 收藏代码
  1. row[0]

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

3. 生成excel文件
如果,你想生成一个excel文件,那么首先,就像写文件一个先加载spreadsheet类库,然后,指定编码接着,就可以创建一个Workbook了
Ruby代码 收藏代码
  1. book=Spreadsheet::Workbook.new

在workbook基础上创建Worksheet表单
Ruby代码 收藏代码
  1. sheet1=book.create_worksheet

当然,你也可以用如下方式创建表单:
Ruby代码 收藏代码
  1. sheet2=book.create_worksheet:name=>'MySecondWorksheet'
  2. sheet1.name='MyFirstWorksheet'

那么,这时我们可以采用如下方式加载数据到表单Worksheet#[]=,
Worksheet#update_row, 或者直接给一个指定单元格复制
Ruby代码 收藏代码
  1. sheet1.row(0).concat%w{NameCountryAcknowlegement}
  2. sheet1[1,0]='Japan'
  3. row=sheet1.row(1)
  4. row.push'CreatorofRuby'
  5. row.unshift'YukihiroMatsumoto'
  6. sheet1.row(2).replace['DanielJ.Berger','U.S.A.',
  7. 'AuthoroforiginalcodeforSpreadsheet::Excel']
  8. sheet1.row(3).push'CharlesLowe','Authoroftheruby-oleLibrary'
  9. sheet1.row(3).insert1,'Unknown'
  10. sheet1.update_row4,'HannesWyss','Switzerland','Author'

对于格式的处理,可以如下:
Ruby代码 收藏代码
  1. sheet1.row(0).height=18
  2. format=Spreadsheet::Format.new:color=>:blue,
  3. :weight=>:bold,
  4. :size=>18
  5. sheet1.row(0).default_format=format
  6. bold=Spreadsheet::Format.new:weight=>:bold
  7. 4.timesdo|x|sheet1.row(x+1).set_format(0,bold)end

最后,保存excel文件
Ruby代码 收藏代码
  1. book.write'/path/to/output/excel-file.xls'


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

对于修改excel文件而言是有限制的。下面是
可以进行的修改操作:
* 添加、修改和删除单元格
* 可以在预定义数据的情况下添加数据
不可以进行的操作:
* Spreadsheet 只能对BIFF8数据(Dxcel97以后版本的excel)进行写操作
* Spreadsheet 不能修改以百分比定义的格式.
* 虽然理论上是可行的,但是非常不建议把修改后的文件保存回原文件。

修改演示:
Ruby代码 收藏代码
  1. book=Spreadsheet.open'/path/to/an/excel-file.xls'
  2. sheet=book.worksheet0
  3. sheet.eachdo|row|
  4. row[0]*=2
  5. end
  6. book.write'/path/to/output/excel-file.xls'


5. 如何处理时间

Excel 并没有单独的日期标识类型,依靠浮点类型格式显示
Ruby代码 收藏代码
  1. row.format(3).number_format

如果,日起识别失败,就需要自己解码:
Ruby代码 收藏代码
  1. row.date(3)
  2. row.datetime(3)
  3. row[4]=Date.new1975,8,21
  4. #->日起类型:'M/D/YY'
  5. book.add_formatFormat.new(:number_format=>'DD.MM.YYYYhh:mm:ss')
  6. row[5]=DateTime.new2008,10,12,11,59
  7. #->指定时间类型:'DD.MM.YYYYhh:mm:ss'
  8. row.set_format6,Format.new(:number_format=>'D-MMM-YYYY')
  9. row[6]=Time.new2008,10,12
  10. #->theFormatofcell6isleftunchanged.

6. 更多关于文档的编码格式
设置多种编码格式:
Ruby代码 收藏代码
  1. Spreadsheet.client_encoding='LATIN1//TRANSLIT//IGNORE'

7. 兼容性问题

Spreadsheet是设计来代替ParseExcel 和Spreadsheet::Excel,但是他们还是兼容的。例如你的工程理还有parseexcel那么,你可以这样写
Ruby代码 收藏代码
  1. require'parseexcel'
  2. require'parseexcel/parseexcel'
  3. require'parseexcel/parser'

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics