0

我有以下代码

require 'rubygems'
require 'roo'

class ExcelReader
    dataarray = Array.new();
    dataarray_new = Array.new();

    workbook = Roo::Spreadsheet.open('C:\data\testexcel.xlsx')
    worksheets = workbook.sheets
    worksheets.each do |worksheet|
        num_rows = 0
        workbook.sheet(worksheet).each_row_streaming do |row|
                if(num_rows>0) #skipping header

                    row_cells = row.map do |cell|
                        cell.value
                    end         
                    dataarray.push(row_cells)
                end
                num_rows += 1
            end
            puts dataarray.to_s;

            dataarray1, dataarray2 = dataarray.partition { |element| 
                for index in (0...dataarray.size)
                    element[index].first == dataarray1[index].first if(dataarray1!=nil)
                    dataarray_new.push(element[index]) if(element[index]!=nil)
                end
            }
        end
        puts dataarray_new.to_s;
    end

电流输出

[1, "Mia", 2, "Isha", 1, "Mia", 2, "Isha", 1, "Mango", "Apple", 2, "Banana", "Cashew"]

实际上excel看起来像:

sheet 1
No Name
1  Mia
2  Isha

Sheet 2
No Fruit1 Fruit2
1  Mango   Apple
2  Banana  Cashew  

我是 ruby​​ 新手,我希望输出

[[[1, "Mia"], [[1, "Mango", "Apple"]], [[2, "Isha"], [2, "Banana", "Cashew"]]]

我需要将工作表 1 的第 1 行和工作表 2 的第 1 行合并为我尝试使用分区的数组。工作表 1 和工作表 2 的列 1 相同。

4

1 回答 1

0

执行此操作的粗略代码:

xlsx = Roo::Spreadsheet.open("C:\data\testexcel.xlsx")
result = xlsx.sheets.map.with_index do |_, index|
  CSV.parse(xlsx.sheet(index).to_csv).drop(1)
end.transpose
#=> [[["1", "Mia"], ["1", "Mango", "Apple"]], [["2", "Isha"], ["2", "Banana", "Cashew"]]]

这基本上是从所有电子表格中获取数据并删除第一个标题行。在此之后,我将我从工作表中获得的数据转移到组中。

注意:不包括行数不等的情况等。您可以将其修改为您的用例。不使用 roo 流。

于 2017-11-06T10:15:33.430 回答