使用列标题使用 roo 解析 excel 工作表 - Ruby
Posted
技术标签:
【中文标题】使用列标题使用 roo 解析 excel 工作表 - Ruby【英文标题】:Using Column headers to parse excel sheets using roo - Ruby 【发布时间】:2011-07-20 17:44:26 【问题描述】:我们可以使用列标题来指定使用roo
gem 解析Excel 工作表的列号吗?我现在的代码是这样的:
oo = Openoffice.new("simple_spreadsheet.ods")
oo.default_sheet = oo.sheets.first
(2..oo.last_row).each do |line|
date = oo.cell(line,'A')
start_time = oo.cell(line,'B')
end_time = oo.cell(line,'C')
pause = oo.cell(line,'D')
...
end
我想从列标题进行解析,而不是将列指定为'A' 'B' 'C' ..
。我可以使用Roo
来实现这一点吗?
【问题讨论】:
据我所知,只能使用数字或字母来访问单元格。 为什么roo website 这么讨厌我的眼睛? @mu 太短了..是的..你是对的..他们到达那里的奇妙色彩:P 【参考方案1】:您可以将整个标题行作为一个数组抓取,并对标题行上的整个行键进行哈希处理。
oo = Openoffice.new("simple_spreadsheet.ods")
oo.default_sheet = oo.sheets.first
header = oo.row(1)
2.upto(oo.last_row) do |line|
row_data = Hash[header.zip oo.row(line)]
...
end
您也可以使用row_data[line]
嵌套哈希以供以后使用。
【讨论】:
你能告诉我如何使用 roo 写入 xlsx 和 xls 文件 不能,目前 roo 只支持 Excel 读取。您可以使用 axlsx gem 进行写作。我知道 - 这并不理想,但到目前为止,我还找不到能同时兼顾这两件事的宝石。【参考方案2】:上述的更清晰/更清晰的版本是
oo = Openoffice.new("simple_spreadsheet.ods")
oo.default_sheet = file.sheets.first
header = oo.first_row
2.upto(oo.last_row) do |line|
row_data = Hash[*header.zip(row).flatten]
...
end
原版让我有点理解,因为特别是因为我认为 hash 是一个名为 hash 而不是类 Hash 的局部变量
【讨论】:
【参考方案3】:这将使用标题行作为键。有用的部分是转置和剥离。
def self.excel_to_hash(folder_name, file_name, tab_name)
# Takes an excel file name and a tab name, and returns an array of stripped, transposed rows
# Sample call: my_data = excel_to_hash File.join(Rails.root,'db/data/data_to_import.xlsx'), 'models'
rows = []
file = File.open(File.join(folder_name, file_name), mode = 'r')
excel = Excelx.new(file.path, nil, :ignore)
excel.default_sheet = excel.sheets.index(tab_name) + 1
header = excel.row(1)
(2..excel.last_row).each do |i|
next unless excel.row(i)[0]
row = Hash[[header, excel.row(i)].transpose]
row.each_key|x| row[x] = row[x].to_s.strip if row[x]
rows << row
end
return rows
end
通过 Roo gem 1.10.2 有效
【讨论】:
以上是关于使用列标题使用 roo 解析 excel 工作表 - Ruby的主要内容,如果未能解决你的问题,请参考以下文章
使用列映射将 Excel 工作表导入到 Mongodb 数据库
如何在python中使用pandas在现有的excel工作表中追加列