原文:http://www.mattephraim.com/blog/2008/12/31/a-quick-little-extension-to-the-spreadsheet-gem/
由于公司业务需要上传大量EXCEL数据,以前使用ASP上传,控件会把EXCEL当做数据集来进行处理,现在换SPREADSHEET,只能当做数组,非常不方便,希望能够处理成HASH,搜了半天,貌似这篇是在说这个问题。小翻译一下,方便自己也方便别人。
-----------------------------------------
对Spreadsheet GEM的扩展
问题: 我工作中最无聊的事情之一就是把EXCEL传到数据库里面。通常,顾客会把一个需要导入数据库的电子表格给我。如果我足够幸运的话,需要导入的数据是已经按照格式整理好的了。在我使用RUBY Spreadsheet gem来导入并调整这些电子表格之前我尝试了很多种不同的方法来完成这项工作。然后我使用RUBY DBI库来把数据导入到数据库。
Spreadsheet在从一个EXCEL中读取数据方面非常出色,但是经常让我感到头痛的是我必须在读取之前知道字段的顺序。比如:如果EXCEL在第三列的值是"First Name",我就必须知道每行的第三列都存放的是名的值。我想如果我能够使用row[:first_name]来读取某行中的first name的值。我最近有点空闲时间,因此我决定看看有没有可能实现这个问题。
我的解决方案:我首先要做的事情就是在Spreadsheet库中创建我自己的row类。我决定我要创建一个叫做 HashRow的类,你可以通过使用以每列第一行的值作为符号来存取每行的值。简单的说,我假设第一行是标题行。[这句没看懂]因此,表头叫做First Name的会被翻译成符号 :first_name.
同时,我为HashRow增加了一些方便的方法,header?方法可以返回这行是否为标题行。empty?返回这行是否完全为空。
# Wraps Spreadsheet::Excel::Row row array with extra functionality
class Spreadsheet::HashRow < Spreadsheet::Excel::Row
attr_reader :index
# Keeps the original row value array
# and also creates a hash of values
def initialize(row, col_hash, index)
@val_array = row
@val_hash = get_val_hash(col_hash)
@index = index
end
# Is this row the first row in the spreadsheet?
def header?
@index === 0
end
# Checks if every cell in the row is set to nil
def empty?
@val_array.compact.length === 0
end
# Returns the value in the row based on the index
# or key passed in. Integer values returns the row value
# by index in the array and symbols return the value
# for the symbol or string
def [](value)
if value.is_a? Integer
@val_array[value]
else
@val_hash[value.to_s.downcase]
end
end
private
# Uses a hash columns to build another hash for the
# values in the array with keys for the column heads
def get_val_hash(col_hash)
col_hash.keys.inject({}) do |acc, key|
acc.merge(key => @val_array[col_hash[key]])
end
end
end
现在我已经完成了我的HashRow类,现在我需要打开Spreadsheet::Excel::Worksheet 类,重写row方法,实现使用一个新方法来返回HashRow类的一个实例。我把原来旧row方法和我写的新方法混写在一起。同时我也写了一个私有方法来判断每个字段的索引以及一个规范字段名称的私有方法。
# Extends Spreadsheet::Excel::Worksheet so that the Rows become HashRows
class Spreadsheet::Excel::Worksheet
# Override the original row method with a new method
# that returns the custom HashRow class instead of an array
alias_method :old_row, :row
def row(value)
Spreadsheet::HashRow.new(old_row(value), get_col_indexes, value)
end
private
# Returns a hash that contains key/value pairs for the column
# headers and the the index of each header
def get_col_indexes
@col_indexes ||= old_row(0).inject({}) do |hash, cell|
hash.merge(get_col_key(cell.to_s) => hash.length)
end
end
# Converts the name of a column header to a
# specially formatted string
def get_col_key(col)
col.gsub(/[\(\)]+/, "").
gsub(/\s/, "_").
downcase
end
一旦我把我新写的Spreadsheet扩展文件写好了,我就可以像以前那样使用Spreadsheet库,我可以通过行和索引来存取数据,也可以使用标题行。
Spreadsheet.open(FILE).worksheet(0).each do |row|
unless row.empty? || row.header?
puts row[:first_name]
puts row[:last_name]
end
end
分享到:
相关推荐
【标题】"GemBox.Spreadsheet.Examples-master_GEM_TheMaster_" 提供了一组示例,展示了如何使用 GemBox.Spreadsheet 库在 .NET 应用程序中操作电子表格。这个库是一个强大的组件,它允许开发人员以编程方式创建、...
$spreadsheet = IOFactory::load('path_to_your_file.xlsx'); $worksheet = $spreadsheet->getActiveSheet(); ``` - 然后,你可以遍历工作表中的行和列,访问单元格的值: ```php foreach ($worksheet->...
### SpreadSheet 控件主要属性、方法和事件 #### 一、概述 SpreadSheet 控件作为 Office Web 组件的一部分,广泛应用于各种需要展示和编辑表格数据的网页应用中。该控件的功能强大,提供了丰富的属性、方法及事件...
安装将其添加到您的Gemfile中: gem 'to_spreadsheet'用法在控制器中: # my_thingies_controller.rbclass MyThingiesController < ApplicationController respond_to :xlsx , :...
"table-to-spreadsheet-crx插件"是一个专为处理网页中的表格数据而设计的浏览器扩展程序,尤其适用于那些需要将网页上的表格快速导出为常见的电子表格格式,如CSV或XLSX的用户。这款插件的主要功能是将网页上的表格...
Mathematica is an incredibly powerful and ...qualities for the PCs that we found them of little utility. Mathematica, on the other hand, gave people a whole new power that had heretofore been unrealized.
在Microsoft Visual Basic for Applications(VBA)中,Spreadsheet控件是一种非常有用的工具,它允许开发者在用户界面中嵌入电子表格功能。本资源“VBA_ 使用spreadsheet控件.rar”显然提供了一些关于如何在VBA项目...
Fundamental Excel: A Complete Spreadsheet Guide 2017 | English | ASIN: B06XX9P6T5 | 688 pages | PDF | 58.1 Mb Whether you are just starting out or an Excel novice, this book is your comprehensive, go...
<script src="path/to/table2excel.min.js"> ``` 一旦引入了必要的库,你就可以开始使用`table2excel`了。这个库的核心方法是`.table2excel()`, 它接受一个参数,即你要导出的HTML表格的选择器。以下是一个简单的...
Add Formatted Data to a Spreadsheet 在数据分析和处理中,添加格式化数据到电子表格是非常常见的操作。电子表格作为数据存储和分析的重要工具,对于快速处理和分析数据非常重要。在本篇文章中,我们将探讨如何...
### OWC中SpreadSheet控件的操作方法集合 在OWC(Open Web Clent)系统中,SpreadSheet控件被广泛应用于实现类似Excel的功能,为用户提供一个直观的数据处理平台。本文档将详细介绍如何通过代码操作SpreadSheet控件...
下面将详细解释`SpreadSheet.cpp`和`SpreadSheet.h`这两个关键文件以及如何在VC++中操作Excel的知识点。 `SpreadSheet.cpp`和`SpreadSheet.h`是C++源代码文件,它们一起定义了一个类或一组功能,以便于程序员可以...
### R Through Excel: A Spreadsheet Interface for Statistics, Data Analysis, and Graphics #### 核心知识点概述 本书《R Through Excel: A Spreadsheet Interface for Statistics, Data Analysis, and ...
It places a much heavier burden on the mail server, requiring the server to receive the new messages, deliver them to users when requested, and maintain them in multiple folders for each user. ...
Perl SpreadSheet_Excel 是一个基于Perl编程语言的库,用于解析和操作Microsoft Excel电子表格文件。这个库的核心组件是 `Spreadsheet::ParseExcel` 模块,它允许开发者读取Excel文件的内容,包括单元格的数据、公式...
1、SpreadSheet是一个Excel操作封装类,使用起来比其他的更为方便。 2、修正了原版SpreadSheet几个错误问题 3、压缩包里面包含了SpreadSheet的简单使用示例。 4、使用vs2008编译通过
### C#中Spreadsheet的使用详解 在C#开发中,处理Excel文件是非常常见的需求之一。本文档将详细介绍如何在C#中使用Spreadsheet技术来读取、操作和展示Excel文件的内容。 #### 一、环境准备与前置知识 在开始之前...
**OWC11 Spreadsheet 全面解析** OWC11 Spreadsheet 是一款强大的电子表格应用程序,由微软在Office Web Components 2010中提供,它允许用户创建、编辑和共享电子表格,类似于Microsoft Excel。本篇文章将深入探讨...
Perl Spreadsheet 是一个Perl编程语言中的模块,用于处理电子表格文件,特别是Microsoft Excel的.xls和.xlsx格式。这个模块允许程序员在Perl脚本中创建、读取和修改Excel工作簿,为数据处理和自动化提供了极大的便利...
$spreadsheet = new Spreadsheet(); // 设置活动sheet索引为0,创建新工作表 $worksheet = $spreadsheet->getActiveSheet(); $worksheet->setCellValue('A1', 'Hello World!'); $worksheet->setCellValue('B2', '这...