本文中,我將會評判幾種Ruby語言訪問Excel文件的庫。我將要討論針對不一樣格式的Excel文件訪問的現有的幾個Ruby庫。本文中更多地聚焦於讀取Excel文件,可是也對與更改/寫入Excel文件稍做了些討論。
python
若是你火燒眉毛地想要查看代碼,請移步我提交與Github上的 一個項目 ,項目中有一些讀取Excel文件的代碼片斷,都是本文所提到的。git
Excel文件類型
Before we get into the different Ruby libraries, let’s talk about Excel files. It is important to identify the type of Excel files that you are going to be using. There are two main types: legacy files and the newer OOXML file format introduced in Microsoft Office 2007.github
There is a nice description of the differences on Wikipedia. The tldr; version is that the legacy file format includes files with the following extensions:ruby
文件擴展名 | 說明 |
---|---|
.xls | 傳統格式的Excel文件 |
.xlt | 傳統格式的Excel模板 |
.xlm | 帶有宏代碼的傳統格式的Excel文件 |
Microsoft Excel 2007 abandoned the legacy binary format and switched to the Open Office XML (OOXML) format that is used today. These files use the following extensions:ide
文件擴展名 | 說明 |
---|---|
.xlsx | OOXML Excel file |
.xlst | OOXML Excel file template |
.xlsm | OOXML Excel file with macros |
肯定你將要涉及何種格式的Excel文件(傳統格式 或 OOOXML格式)很是的重要。若是你使用Excel軟件工做,可能會常常地在各類格式之間轉來轉去,可是在個人場景中,是從外部收到Excel文件且不能掌控文件格式,可是我也不想依靠手工進行格式轉換。並且也沒有必要,現代的.xlsx格式通常均可以使用其餘的電子表格軟件訪問,例如: Numbers 和 LibreOffice。
post
Ruby下的Excel 庫
有不少Ruby庫用來訪問Excel——可能太多了。當我研究這些不一樣的庫時,着實耗費了很多時間來搞清楚它們的功能和限制。我發現下面這些問題對於調研一個庫來講很是有用:性能
- 支持何種格式的Excel文件?
- 支持讀取仍是寫入,亦或讀寫都支持?
- 可否支持巨大的文件?速度夠快嗎?
- 是否必須讀取文件?可否支持流模式?
根據應用的不一樣,這些問題中的幾個或所有可能很是重要。測試
選擇合適的庫
下面的表詳細列出了六個不一樣的Ruby Excel訪問庫的功能特色:大數據
庫 | 許可證 | 支持.xlsx |
支持.xls |
能力 |
---|---|---|---|---|
axlsx | MIT | yes | no | write |
rubyXL | MIT | yes | no | read/write |
roo | MIT | yes | yes | read |
creek | MIT | yes | no | read |
spreadsheet | GPLv3 | no | yes | read/write |
simple_xlsx_reader | MIT | yes | no | read |
基於你的需求,這其中的一個或多個庫可能能幫上忙。考慮以下使用場景:ui
寫入 .xlsx 文件
若是你須要寫入 .xlsx文件,
axslx是一個不錯的選擇。它支持寫單元格數值生成統計圖表。若是你須要一個輕量級的庫,rubyXL 是個不錯的選項。
讀取 .xlsx 文件
若是你只是須要讀取 .xlsx
文件,你能夠在rubyXL、roo、creek和simple_xlsx_reader之中選擇一個。roo是個很是廣泛的選擇,由於它還支持傳統的.xls格式。然而,若是你關注速度,
creek和simple_xlsx_reader顯然更善於處理大文件。若是你想要從IO
數據流(而不是文件)中讀取數據,rubyXL 就成了惟一的選擇了。
讀取和寫入 .xlsx 文件
若是你須要讀取並寫入.xlsx
文件,你有兩個選項。你可使用 rubyXL,它支持讀取和寫入。另外一個選項就是,你可使用兩個不一樣的庫,一個用於讀取,一個用於寫入。
讀取和寫入傳統Excel文件
要想支持傳統的.xls
格式會有更多的約束。若是你僅僅須要支持傳統 .xls,我推薦
spreadsheet,它支持讀取和寫入。若是你同時須要支持.xlsx格式,我更推薦選擇第二個gem來作此事......除非你僅僅須要讀取功能,這樣的話
你能夠選擇 roo ,它既支持讀取傳統格式也支持現代格式。
好消息是,不管最終你選擇了那種庫,打開文件並讀取的代碼仍是很簡單的,而且使用不一樣庫看上去很是地類似。例如,下面是使用creek的代碼。
require 'creek' workbook = Creek::Book.new 'path/to/file.xlsx' worksheets = workbook.sheets worksheets.each do |worksheet| worksheet.rows.each do |row| row_cells = row.values # do something with row_cells end end
我提交到GitHub上的項目中,有使用每種庫讀取.xlsx 的示例代碼。
性能
若是須要讀取巨大數據量的Excel文件,你可能相應比較各類庫的性能。我創建了一個快速地有些髒代碼的性能測試程序,測試了上面表格中的4種可以讀取 .xlsx格式的庫
。
我建立了示例.xlsx文件,分別含有
500、10000、50000、200000和500000行數據。而後,我運行了代碼來讀取每一個文件(即讀取文件中每一行數據)。使用各類庫讀取每一個示例文件的代碼能夠再這裏 得到。
我每種庫讀取各個文件都跑了3遍,記錄了平均時間(每一遍時間變化都不是很大)。
rubyXL 和 roo性能大致至關, 讀取500000行的Excel文件須要2分多鐘。 creek 和simple_xlsx_reader 則都快的多了,只須要不足一分鐘就能讀取 500000行的Excel文件。
我但願本文能爲你使用Ruby語言訪問Excel文件提供些許地指引。若是你正在使用一種我沒有提到的庫,而且你很喜歡它,請務必告知我。