[译] Ruby如何访问Excel文件

Parsing Excel Files with Ruby

 BY:  MATT NEDRICH   翻译:佣工7001 

    本文中,我将会评判几种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——可能太多了。当我研究这些不一样的库时,着实耗费了很多时间来搞清楚它们的功能和限制。我发现下面这些问题对于调研一个库来讲很是有用:性能

  1. 支持何种格式的Excel文件?
  2. 支持读取仍是写入,亦或读写都支持?
  3. 可否支持巨大的文件?速度够快吗?
  4. 是否必须读取文件?可否支持流模式?

根据应用的不一样,这些问题中的几个或所有可能很是重要。测试

选择合适的库

下面的表详细列出了六个不一样的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文件提供些许地指引。若是你正在使用一种我没有提到的库,而且你很喜欢它,请务必告知我。

相关文章
相关标签/搜索