天天看點

rails導出excel插件 spreadsheet的标準使用

[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'