[译] Ruby如何访问Excel文件

Parsing Excel Files with Ruby

BY: MATT NEDRICH   翻译:佣工7001

本文中,我将会评判几种Ruby语言访问Excel文件的库。我将要讨论针对不同格式的Excel文件访问的现有的几个Ruby库。本文中更多地聚焦于读取Excel文件,但是也对与更改/写入Excel文件稍作了些讨论。

如果你迫不及待地想要查看代码,请移步我提交与Github上的 一个项目 ,项目中有一些读取Excel文件的代码片段,都是本文所提到的。

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.

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:

文件扩展名 说明
.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:

文件扩展名 说明
.xlsx OOXML Excel file
.xlst OOXML Excel file template
.xlsm OOXML Excel file with macros

确定你将要涉及何种格式的Excel文件(传统格式 或 OOOXML格式)非常的重要。如果你使用Excel软件工作,可能会经常地在各种格式之间转来转去,但是在我的场景中,是从外部收到Excel文件且不能掌控文件格式,但是我也不想依靠手工进行格式转换。而且也没有必要,现代的.xlsx格式一般都可以使用其他的电子表格软件访问,例如: Numbers 和 LibreOffice

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

基于你的需求,这其中的一个或多个库可能能帮上忙。考虑如下使用场景:

写入 .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文件提供些许地指引。如果你正在使用一种我没有提到的库,并且你很喜欢它,请务必告知我。

原文地址:https://www.cnblogs.com/dajianshi/p/11613060.html

时间: 2024-08-09 11:11:01

[译] Ruby如何访问Excel文件的相关文章

odi 12.2.1中访问excel文件

由于在odi 12.2.1中,必须使用jdk1.8,而jdk1.8中jdbc-odbc bridge已经不再支持,因此,可以使用Progress DataDirect SequeLink来充当jdbc-odbc驱动.架构如下: 原文地址: https://blogs.oracle.com/dataintegration/entry/how_to_load_data_from

JAVA中用POI组件访问EXCEL文档

对于用JAVA访问EXCEL文件,常用的组件有jxl和POI, jxl因为目前已无版本更新,并且仅能访问EXCEL2007以前的文件格式,对xlsx文件格式目前不支持, 故而推荐使用POI, POI的官方下载地址为: http://poi.apache.org/ 本质上来说, EXCEL2007文档是一个XML文档, 所以POI对EXCEL文件读操作有两种方式,一种是DOM, 一种是SAX, DOM对EXCEL操作简单,易上手, 但是占用较多的内存,尤其是表格超过10000行, 经常会出现内存溢

电脑小白学习第十课---excel文件设置访问密码

我们在工作中,office软件我们每天都在用,有时为了安全起见,需要把office文件进行设置访问密码或者修改密码.下面以excel 2013为例,word和ppt设置类似.具体操作如下:1.打开excel文件,点击左上角"文件".2.选择另存为,然后选择一个保存位置.3.在弹出的另存为窗口,点击"工具"按钮,然后选择"常规选项".4.在弹出的常规选项中,可以设置打开权限密码,也可以设置修改权限密码(修改密码设置的话,不输入只能以只读方式打开).

Java通过jxl解析Excel文件入库,及日期格式处理方式 (附源代码)

JAVA可以利用jxl简单快速的读取文件的内容,但是由于版本限制,只能读取97-03  xls格式的Excel. 本文是项目中用到的一个实例,先通过上传xls文件(包含日期),再通过jxl进行读取上传的xls文件(文件格式见下user.xls),解析不为空的行与列,写入数据库. 文件user.xls格式为: 下面来看代码实例演示: 一.前端jsp页面(本来内容很多,这里精简了) <%@ page language="java" contentType="text/htm

(1) 如何用Apache POI操作Excel文件-----入门

Apache POI项目的目标就是可以用Java API来创建和维护各种Office文件(MS Word,MS PowerPoint和MS Excel). 本系列文章主要是针对Excel文件的操作.对于Excel的操作,Apache POI提供两种模型:HSSF和XSSF. 其区别,请参考下面的图1.截止到2015年5月28日,当前的最新版本是3.12. 具体信息,我们可以访问其官方网站:http://poi.apache.org/ 1.下面是用Apache POI创建一个工作薄的基本的代码 i

初次用SqlServer查看本地的Excel文件时需要注意的地方

日常用到通过SqlServer 读取Excel文件的案例 ,记录下来 文件路径 :C:\Users\Administrator\Desktop\icd10.xls 1.查询语句: SELECT  *FROM    OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',                       'Data Source="C:\Users\Administrator\Desktop\icd10.xls";User ID=Admin;Pass

Java生成和操作Excel文件

JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该API非Windows操作系统也可以通过纯Java应用来处理Excel数据表.因为它是使用Java编写的,所以我们在Web应用中可以通过JSP.Servlet来调用API实现对Excel数据表的访问. 下载: 官方网站 http://www.andykhan.com/jexcelapi/ 下载最新版本(本人下的是jexcelapi_2_6

使用Perl读取Excel文件

1. 任务 为了实现一些机械分词算法,准备使用“国家语委语料库”的分词词表,在线下载到得词表文件是一个Excel文件.本文的任务就是使用Perl从该Execl文件中提取所有的词语. 词表文件格式如下: 需要的词语的位置在从第8行开始的,第B列的所有单元格.一共有14629个词语.(PS:语料库的分词词表包含8万多个词语,但是在线下载到是出现次数在50次以上的词语,只有这1万多). 2. 使用什么模块 通过阅读一些博文发现,PERL的Spreadsheet::ParseExcel模块支持Excel

java 操作excel 文件

JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该API非Windows操作系统也可以通过纯Java应用来处理Excel数据表.因为它是使用Java编写的,所以我们在Web应用中可以通过JSP.Servlet来调用API实现对Excel数据表的访问. 下载: 官方网站 http://www.andykhan.com/jexcelapi/ 下载最新版本(本人下的是jexcelapi_2_6