[color=red]update (2011/4/29) :[/color]
Rails 3.0.7 ruby 1.9.2 spreadsheet 0.6.5.4可以用
[color=red]update(2010/8/29):[/color]
一年之後本文出了個後繼篇,是關于Rails的excel導入,導出的一些插件介紹
諸位看官,如果用到請賞臉移步參考
[url=http://hlee.iteye.com/admin/blogs/749972]在Rails項目中導入excel 導出excel 實用rails解析excel[/url]
——————————[url=http://hlee.iteye.com]老豬[/url]的小分割———————————
本文是對spreadsheet基本知識的介紹,該插件可以讀取和生成excel檔案
如果,你想看更複雜的例子, [url=http://lmxbitihero.iteye.com/blog/334032]請點選這裡[/url]
如果,你想看更簡單的解析excel檔案的例子,[url=/blog/356460]請點選這裡[/url]
如果,你想下載下傳spreadsheet的gem包,[url=/topics/download/256c4dbd-6db9-3a01-9c1c-342ff07cf66b]請點選這裡[/url]
如果,你想了解windows下操作excel的特有方法,[url=http://hlee.iteye.com/admin/blogs/407450]使用ruby來操作excel檔案 Win32ole[/url]
如果,你想考慮另外的插件roo來操作excel,[url=http://roo.rubyforge.org/]請點選這裡[/url]
如果,你還想考慮rails的一個插件railsxls,[url=http://github.com/thechrisoshow/railsxls/tree/2.1]請點選這裡[/url]
1. 使用Spreadsheet
本向導将介紹Spreadsheets的基本使用,看完本文您将掌握最基本的使用rails讀寫excel。
2. 讀取excel檔案
首先,保證加載庫檔案,否則功能沒法用
require "spreadsheet"
excel工作檔案(Worksheets)通常有多種編碼格式,這裡需要手動表明格式如下:
Spreadsheet.client_encoding = "UTF-8"
打開一個excel的檔案
book = Spreadsheet.open "/path/to/an/excel-file.xls"
這時,我們已經可以對excel檔案的worksheets進行讀寫
book.worksheets
或者,增加辨別的進行讀寫:
sheet1 = book.worksheet 0
sheet2 = Book.worksheet "Sheet1"
那麼,現在我們可以使用疊代來周遊所有的行列,Worksheet.each自身會跳過空值。
sheet1.each do |row|
# do something interesting with a row
end
或者,手動跳過前面的空值
sheet2.each 2 do |row|
# do something interesting with a row
end
或者,通過順序号通路,
row = sheet1.row(3)
讀取行中一個單元格的值
row[0]
-> 這裡将傳回一個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
如果,日起識别失敗,就需要自己解碼:
6. 更多關于文檔的編碼格式
設定多種編碼格式:
Spreadsheet.client_encoding = 'LATIN1//TRANSLIT//IGNORE'
7. 相容性問題
Spreadsheet是設計來代替ParseExcel 和Spreadsheet::Excel,但是他們還是相容的。例如你的工程理還有parseexcel那麼,你可以這樣寫
require 'parseexcel'
require 'parseexcel/parseexcel'
require 'parseexcel/parser'