oxcelix 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2013 gbiczo
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,35 @@
1
+ Oxcelix
2
+ =======
3
+
4
+ Oxcelix - A fast and simple .xlsx file parser
5
+
6
+ Description
7
+ -----------
8
+
9
+ Oxcelix is an xlsx (Excel 2007/2010) parser. The result of the parsing is a
10
+ Workbook which is an array of Sheet objects, which in turn store the data in
11
+ Matrix objects. Matrices consist of Cell objects to maintain comments and
12
+ formatting/style data
13
+
14
+ Oxcelix uses the great Ox gem (http://rubygems.org/gems/ox) for fast SAX-parsing.
15
+
16
+ Synopsis
17
+ --------
18
+
19
+ To process an xlsx file:
20
+
21
+ `require 'oxcelix'`
22
+
23
+ `w = Oxcelix::Workbook.new('whatever.xlsx')`
24
+
25
+ To omit certain sheets:
26
+
27
+ `w = Oxcelix::Workbook.new('whatever.xlsx', :exclude => ['sheet1', 'sheet2'])`
28
+
29
+ To include only some of the sheets:
30
+
31
+ `w = Oxcelix::Workbook.new('whatever.xlsx', :include => ['sheet1', 'sheet2', 'sheet3'])`
32
+
33
+ To have the values of the merged cells copied over the mergegroup:
34
+
35
+ `w = Oxcelix::Workbook.new('whatever.xlsx', :mergecells => true)`
data/README.rdoc ADDED
@@ -0,0 +1,30 @@
1
+ = \Oxcelix - A fast .xlsx file parser
2
+
3
+ == Description
4
+
5
+ Oxcelix is an xlsx (Excel 2007/2010) parser. The result of the parsing is a
6
+ Workbook which is an array of Sheet objects, which in turn store the data in
7
+ Matrix objects. Matrices consist of Cell objects to maintain comments and
8
+ formatting/style data
9
+ .
10
+ Oxcelix uses the great Ox gem (http://rubygems.org/gems/ox) for fast SAX-parsing.
11
+
12
+ == Synopsis
13
+
14
+ To process an xlsx file:
15
+
16
+ require 'oxcelix'
17
+
18
+ w = Oxcelix::Workbook.new('whatever.xlsx')
19
+
20
+ To omit certain sheets to be processed:
21
+
22
+ w = Oxcelix::Workbook.new('whatever.xlsx', :exclude => ['sheet1', 'sheet2'])
23
+
24
+ To include only some of the sheets:
25
+
26
+ w = Oxcelix::Workbook.new('whatever.xlsx', :include => ['sheet1', 'sheet2', 'sheet3'])
27
+
28
+ To have the values of the merged cells copied over the mergegroup:
29
+
30
+ w = Oxcelix::Workbook.new('whatever.xlsx', :mergecells => true)
@@ -0,0 +1,17 @@
1
+ module Oxcelix
2
+ # Simple class representing an excel cell.
3
+ # @!attribute [rw] xlcoords
4
+ # @return [String] The Excel-style coordinates of the cell object
5
+ # @!attribute [rw] type
6
+ # @return [String] Cell content type
7
+ # @!attribute [rw] value
8
+ # @return [String] the type of the cell
9
+ # @!attribute [rw] comment
10
+ # @return [String] Comment text
11
+ # @!attribute [rw] style
12
+ # @return [String] Excel style attribute
13
+ class Cell
14
+ attr_accessor :xlcoords, :type, :value, :comment, :style
15
+ include Cellhelper
16
+ end
17
+ end
@@ -0,0 +1,45 @@
1
+
2
+ module Oxcelix
3
+ # The Cellhelper module defines some methods useful to manipulate Cell objects
4
+ module Cellhelper
5
+ # Set the excel cell name (eg: 'A2')
6
+ # @param [String] val Excel cell address name
7
+ def r(val); @xlcoords = val; end;
8
+ # Set cell type
9
+ def t(val); @type = val; end;
10
+ # Set cell value
11
+ def v(val); @value = val; end;
12
+ # Set cell style (number format and style)
13
+ def s(val); @style = val; end;
14
+
15
+ # When called without parameters, returns the x coordinate of the calling cell object based on the value of #@xlcoords
16
+ # If a parameter is given, #x will return the x coordinate corresponding to the parameter
17
+ # @example find x coordinate (column number) of a cell
18
+ # c = Cell.new
19
+ # c.xlcoords = ('B3')
20
+ # c.x #=> 1
21
+ # @param [String] coord Optional parameter used when method is not called from a Cell object
22
+ # @return [Integer] x coordinate
23
+ def x(coord=nil)
24
+ if coord.nil?
25
+ coord = @xlcoords
26
+ end
27
+ ('A'..(coord.scan(/\p{Alpha}+|\p{Digit}+/u)[0])).to_a.length-1
28
+ end
29
+
30
+ # When called without parameters, returns the y coordinate of the calling cell object based on the value of #@xlcoords
31
+ # If a parameter is given, #y will return the y coordinate corresponding to the parameter
32
+ # @example find y coordinate (row number) of a cell
33
+ # c = Cell.new
34
+ # c.xlcoords = ('B3')
35
+ # c.y #=> 2
36
+ # @param [String] coord Optional parameter used when method is not called from a Cell object
37
+ # @return [Integer] x coordinate
38
+ def y(coord=nil)
39
+ if coord.nil?
40
+ coord = @xlcoords
41
+ end
42
+ coord.scan(/\p{Alpha}+|\p{Digit}+/u)[1].to_i-1
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,24 @@
1
+ module Oxcelix
2
+ # The Comments class is a parser which builds an array of comments
3
+ class Comments < ::Ox::Sax
4
+ attr_accessor :commarray, :comment
5
+ def initialize
6
+ @commarray=[]
7
+ @comment={}
8
+ end
9
+
10
+ # Push Cell comment hash (comment + reference) to @commarray
11
+ def text(str)
12
+ @comment[:comment]=str.gsub('&#10;', '')
13
+ @commarray << @comment
14
+ @comment = Hash.new
15
+ end
16
+
17
+ # Returns reference
18
+ def attr(name, str)
19
+ if name == :ref
20
+ @comment[:ref]=str
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,15 @@
1
+ module Oxcelix
2
+ # Ox based SAX parser which pushes shared strings (taken from the sharedString.xml file) to an array
3
+ # These strings will replace the references in the cells (interpolation).
4
+ class Sharedstrings < ::Ox::Sax
5
+ attr_accessor :stringarray
6
+ def initialize
7
+ @stringarray=[]
8
+ end
9
+
10
+ # Push the comment string into @stringarray
11
+ def text(str)
12
+ @stringarray << str
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,77 @@
1
+
2
+ module Oxcelix
3
+ ##
4
+ # The Xlsheet class is a SAX parser based on the Ox library. It parses a
5
+ # SpreadsheetML (AKA Office Open XML) formatted XML file and returns an array
6
+ # of Cell objects {#cellarray} and an array of merged cells {#mergedcells}.
7
+ #
8
+ # Xlsheet will omit the following:
9
+ # * empty cells
10
+ # * cells containing formulas
11
+ #
12
+ # Only non-empty cells of merged groups will be added to {#cellarray}. A separate array
13
+ # {#mergedcells} is reserved for merging.
14
+ class Xlsheet < ::Ox::Sax
15
+ # @!attribute [rw] xmlstack
16
+ # @return [Array] Stores the state machine's actual state
17
+ # @!attribute [rw] mergedcells
18
+ # @return [Array] the array of merged cells
19
+ # @!attribute [rw] cellarray
20
+ # @return [Array] the array of non-empty (meaningful) cells of the current sheet
21
+ # @!attribute [rw] cell
22
+ # @return [Cell] the cell currently being processed.
23
+ attr_accessor :xmlstack, :mergedcells, :cellarray, :cell
24
+ def initialize()
25
+ @xmlstack = []
26
+ @mergedcells = []
27
+ @cellarray = []
28
+ @cell = Cell.new
29
+ end
30
+
31
+ # Save SAX state-machine state to {#xmlstack} if and only if the processed
32
+ # element is a :c (column) or a :mergeCell (merged cell)
33
+ # @param [String] name Start element
34
+ def start_element(name)
35
+ if name == :c || name == :mergeCell
36
+ @xmlstack << name
37
+ end
38
+ end
39
+
40
+ # Step back in the stack ({#xmlstack}.pop), clear actual cell information
41
+ # @param [String] name Element ends
42
+ def end_element(name)
43
+ @xmlstack.pop
44
+ if name == :c || name == :mergeCell
45
+ @cell=Cell.new
46
+ end
47
+ end
48
+
49
+ # Set cell value, style, etc. This will only happen if the cell has an
50
+ # actual value AND the parser's state is :c.
51
+ # If the state is :mergeCell AND the actual attribute name is :ref the
52
+ # attribute will be added to the merged cells array.
53
+ # The attribute name is tested against the Cell object: if the cell
54
+ # has a method named the same way, that method is called with the str parameter.
55
+ # @param [String] name of the attribute.
56
+ # @param [String] str Content of the attribute
57
+ def attr(name, str)
58
+ if @xmlstack.last == :c
59
+ @cell.send name, str if @cell.respond_to?(name)
60
+ elsif xmlstack.last == :mergeCell && name == :ref
61
+ @mergedcells << str
62
+ end
63
+ end
64
+
65
+ # String type cell content is parsed here. String interpolation using the
66
+ # sharedStrings.xml file is done in the #Sharedstrings class
67
+ def text(str)
68
+ if @xmlstack.last == :c
69
+ if @cell.type != "shared" && @cell.type != "e" && str.numeric?
70
+ @cell.v str
71
+ @cellarray << @cell
72
+ end
73
+ cell=Cell.new
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,17 @@
1
+
2
+ module Oxcelix
3
+ # The Sheet class represents an excel sheet.
4
+ # @!attribute [rw] name
5
+ # @return [String] Sheet name
6
+ # @!attribute [rw] sheetId
7
+ # @return [String] returns the sheetId SheetML internal attribute
8
+ # @!attribute [rw] relationId
9
+ # @return [String] returns the relation key used to reference the comments file related to a certain sheet.
10
+ # @!attribute [rw] data
11
+ # @return [Array] stores the collection of cells of a certain sheet. This is the copy of the sum of cellarray and mergedcells.
12
+ # This is laterconverted to a matrix
13
+ class Sheet
14
+ attr_accessor :name, :sheetId, :relationId, :data
15
+ def initialize; @data=[]; end
16
+ end
17
+ end
@@ -0,0 +1,219 @@
1
+ # The namespace for all classes and modules included on Oxcelix.
2
+ module Oxcelix
3
+ # Helper methods for the Workbook class
4
+ module Workbookhelper
5
+ # returns a sheet based on its name
6
+
7
+ # @example Select a sheet
8
+ # w = Workbook.new('Example.xlsx')
9
+ # sheet = w["Examplesheet"]
10
+ def [] (sheetname=String)
11
+ @sheets.select{|s| s.name==sheetname}[0]
12
+ end
13
+ end
14
+
15
+ # The Workbook class will open the excel file, and convert it to a collection of
16
+ # Matrix objects
17
+ # @!attribute [rw] sheetbase
18
+ # @return [Hash] sheetbase Single sheet metadata - will be obsolete in the future
19
+ # @!attribute [rw] sheets
20
+ # @return [Array] sheets Collection of {Sheet} objects
21
+ # @!attribute [rw] sharedstrings
22
+ # @return [Sharedstrings] sharedstrings returns a {Sharedstrings} object used to interpolate string indexes with their actual value.
23
+ class Workbook
24
+ include Cellhelper
25
+ include Workbookhelper
26
+ attr_accessor :sheetbase, :sheets, :sharedstrings
27
+ ##
28
+ # Create a new Workbook object.
29
+ #
30
+ # filename is the name of the Excel 2007/2010 file to be opened (xlsx)
31
+ #
32
+ # options is a collection of options that can be passed to Workbook.
33
+ # Options may include:
34
+ # * :copymerge (=> true/false) - Copy and repeat the content of the merged cells into the whole group, e.g.
35
+ # the group of three merged cells <tt>| a |</tt> will become <tt>|a|a|a|</tt>
36
+ # * :include (Ary) - an array of sheet names to be included
37
+ # * :exclude (Ary) - an array of sheet names not to be processed
38
+ #
39
+ # The excel file is first getting unzipped, then the workbook.xml file gets
40
+ # processed. This file stores sheet metadata, which will be filtered (by including
41
+ # and excluding sheets from further processing)
42
+ #
43
+ # The next stage is building sheets.
44
+ # This includes:
45
+ # * Parsing the XML files representing the sheets
46
+ # * Interpolation of the shared strings
47
+ # * adding comments to the cells
48
+ # * Converting each sheet to a Matrix object
49
+ def initialize(filename, options={})
50
+ @destination = Dir.pwd+'/tmp'
51
+ FileUtils.mkdir(@destination)
52
+ Zip::File.open(filename){ |zip_file|
53
+ zip_file.each{ |f|
54
+ f_path=File.join(@destination, f.name)
55
+ FileUtils.mkdir_p(File.dirname(f_path))
56
+ zip_file.extract(f, f_path) unless File.exists?(f_path)
57
+ }
58
+ }
59
+ @sheets=[]
60
+ @sheetbase={}
61
+ @a=Ox::load_file(@destination+'/xl/workbook.xml')
62
+
63
+ sheetdata(options); commentsrel; shstrings;
64
+ @sheets.each do |x|
65
+ sname="sheet#{x[:sheetId]}"
66
+ @sheet = Xlsheet.new()
67
+ File.open(@destination+"/xl/worksheets/#{sname}.xml", 'r') do |f|
68
+ Ox.sax_parse(@sheet, f)
69
+ end
70
+ comments=
71
+ mkcomments(x[:comments])
72
+ @sheet.cellarray.each do |sh|
73
+ if sh.type=="s"
74
+ sh.value = @sharedstrings[sh.value.to_i]
75
+ end
76
+ if !comments.nil?
77
+ comm=comments.select {|c| c[:ref]==(sh.xlcoords)}
78
+ if comm.size > 0
79
+ sh.comment=comm
80
+ end
81
+ comments.delete_if{|c| c[:ref]==(sh.xlcoords)}
82
+ end
83
+ end
84
+ x[:cells] = @sheet.cellarray
85
+ x[:mergedcells] = @sheet.mergedcells
86
+ end
87
+ FileUtils.remove_dir(@destination, true)
88
+ matrixto(options[:copymerge])
89
+ end
90
+
91
+ private
92
+ # @private
93
+ # Given the data found in workbook.xml, create a hash and push it to the sheets
94
+ # array.
95
+ #
96
+ # The hash will not be pushed into the array if the sheet name is blacklisted
97
+ # (it appears in the *excluded_sheets* array) or does not appear in the list of
98
+ # included sheets.
99
+ #
100
+ # If *included_sheets* (the array of whitelisted sheets) is *nil*, the hash is added.
101
+ def sheetdata options={}
102
+ @a.locate("workbook/sheets/*").each do |x|
103
+ @sheetbase[:name] = x[:name]
104
+ @sheetbase[:sheetId] = x[:sheetId]
105
+ @sheetbase[:relationId] = x[:"r:id"]
106
+ @sheets << @sheetbase
107
+ @sheetbase=Hash.new
108
+ end
109
+ sheetarr=@sheets.map{|i| i[:name]}
110
+ if options[:include].nil?; options[:include]=[]; end
111
+ if options[:include].to_a.size>0
112
+ sheetarr.keep_if{|item| options[:include].to_a.detect{|d| d==item}}
113
+ end
114
+ sheetarr=sheetarr-options[:exclude].to_a
115
+ @sheets.keep_if{|item| sheetarr.detect{|d| d==item[:name]}}
116
+ @sheets.uniq!
117
+ end
118
+
119
+ # Build the relationship between sheets and the XML files storing the comments
120
+ # to the actual sheet.
121
+ def commentsrel #!!!MI VAN HA NINCS KOMMENT???????
122
+ unless Dir[@destination + '/xl/worksheets/_rels'].empty?
123
+ Find.find(@destination + '/xl/worksheets/_rels') do |path|
124
+ if File.basename(path).split(".").last=='rels'
125
+ f=Ox.load_file(path)
126
+ f.locate("Relationships/*").each do |x|
127
+ if x[:Target].include?"comments"
128
+ @sheets.each do |s|
129
+ if File.basename(path,".rels")=="sheet"+s[:sheetId]+".xml"
130
+ s[:comments]=x[:Target]
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end
136
+ end
137
+ else
138
+ @sheets.each do |s|
139
+ s[:comments]=nil
140
+ end
141
+ end
142
+ end
143
+
144
+ # Invokes the Sharedstrings helper class
145
+ def shstrings
146
+ strings = Sharedstrings.new()
147
+ File.open(@destination + '/xl/sharedStrings.xml', 'r') do |f|
148
+ Ox.sax_parse(strings, f)
149
+ end
150
+ @sharedstrings=strings.stringarray
151
+ end
152
+
153
+ # Parses the comments related to the actual sheet.
154
+ # @param [String] commentfile
155
+ # @return [Array] a collection of comments relative to the Excel sheet currently processed
156
+ def mkcomments(commentfile)
157
+ unless commentfile.nil?
158
+ comms = Comments.new()
159
+ File.open(@destination + '/xl/'+commentfile.gsub('../', ''), 'r') do |f|
160
+ Ox.sax_parse(comms, f)
161
+ end
162
+ return comms.commarray
163
+ end
164
+ end
165
+
166
+ # Returns an array of Matrix objects.
167
+ # For each sheet, matrixto first checks the address (xlcoords) of the
168
+ # last cell in the cellarray, then builds a *nil*-filled Matrix object of
169
+ # size *xlcoords.x, xlcoords.y*.
170
+ #
171
+ # The matrix will then be filled with Cell objects according to their coordinates.
172
+ #
173
+ # If the *copymerge* parameter is *true*, it creates a submatrix (minor)
174
+ # of every mergegroup (based on the mergedcells array relative to the actual
175
+ # sheet), and after the only meaningful cell of the minor is found, it is
176
+ # copied back to the remaining cells of the group. The coordinates (xlcoords)
177
+ # of each copied cell is changed to reflect the actual Excel coordinate.
178
+ #
179
+ # The matrix will replace the array of cells in the actual sheet.
180
+ # @param [Bool ] copymerge
181
+ # @return [Matrix] a Matrix that stores the cell values, and, depending on the copymerge parameter, will copy the merged value
182
+ # into every merged cell
183
+ def matrixto(copymerge)
184
+ @sheets.each_with_index do |sheet, i|
185
+ m=Matrix.build(sheet[:cells].last.y+1, sheet[:cells].last.x+1) {nil}
186
+ sheet[:cells].each do |c|
187
+ m[c.y, c.x]=c
188
+ end
189
+ if copymerge==true
190
+ sheet[:mergedcells].each do |mc|
191
+ a = mc.split(':')
192
+ x1=x(a[0])
193
+ y1=y(a[0])
194
+ x2=x(a[1])
195
+ y2=y(a[1])
196
+ mrange=m.minor(y1..y2, x1..x2)
197
+ valuecell=mrange.to_a.flatten.compact[0]
198
+ (x1..x2).each do |col|
199
+ (y1..y2).each do |row|
200
+ if valuecell != nil
201
+ valuecell.xlcoords=(col.col_name)+(row+1).to_s
202
+ m[col, row]=valuecell
203
+ else
204
+ valuecell=Cell.new
205
+ valuecell.xlcoords=(col.col_name)+(row+1).to_s
206
+ m[col, row]=valuecell
207
+ end
208
+ end
209
+ end
210
+ end
211
+ end
212
+ s=Sheet.new
213
+ s.name=@sheets[i][:name]; s.sheetId=@sheets[i][:sheetId]; s.relationId=@sheets[i][:relationId]
214
+ s.data=m
215
+ @sheets[i]=s
216
+ end
217
+ end
218
+ end
219
+ end
data/lib/oxcelix.rb ADDED
@@ -0,0 +1,44 @@
1
+ require 'ox'
2
+ require 'find'
3
+ require 'matrix'
4
+ require 'fileutils'
5
+ require 'zip'
6
+ require 'oxcelix/cellhelper'
7
+ require 'oxcelix/cell'
8
+ require 'oxcelix/sheet'
9
+ require 'oxcelix/workbook'
10
+ require 'oxcelix/sax/sharedstrings'
11
+ require 'oxcelix/sax/comments'
12
+ require 'oxcelix/sax/xlsheet'
13
+
14
+ class String
15
+ # Returns true if the given String represents a numeric value
16
+ # @return [Bool]
17
+ def numeric?
18
+ Float(self) != nil rescue false
19
+ end
20
+ end
21
+
22
+ class Matrix
23
+ # Set the cell value i,j to x, where i=row, and j=column.
24
+ # @param i [Integer] Row
25
+ # @param j [Integer] Column
26
+ # @param x [Object] New cell value
27
+ def []=(i, j, x)
28
+ @rows[i][j]=x
29
+ end
30
+ end
31
+
32
+ class Fixnum
33
+ # Returns the column name corresponding to the given number. e.g: 1.col_name => 'B'
34
+ # @return [String]
35
+ def col_name
36
+ val=self/26
37
+ (val > 0 ? (val - 1).col_name : "") + (self % 26 + 65).chr
38
+ end
39
+ end
40
+
41
+ # The namespace for all classes and modules included in Oxcelix.
42
+ module Oxcelix
43
+
44
+ end
data/oxcelix.gemspec ADDED
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'rake'
4
+ Gem::Specification.new do |s|
5
+ s.name = 'oxcelix'
6
+ s.version = '0.1.0'
7
+ s.date = '2013-10-06'
8
+ s.summary = 'A fast Excel 2007/2010 file parser'
9
+ s.description = 'A fast .xlsx file parser that returns a collection of Matrix objects'
10
+ s.authors = 'Giovanni Biczo'
11
+ s.homepage = 'http://github.com/gbiczo/oxcelix'
12
+ s.rubyforge_project = 'oxcelix'
13
+
14
+ s.files = FileList["LICENSE", "README.rdoc", "README.md",
15
+ "lib/*", "lib/oxcelix/*", "lib/oxcelix/sax/*",
16
+ "oxcelix.gemspec", "spec/*"].to_a
17
+ s.license = 'MIT'
18
+
19
+ s.add_runtime_dependency "ox", [">= 2.0.6"]
20
+ s.add_runtime_dependency "rubyzip", [">= 0.9.9"]
21
+ end
data/spec/cell_spec.rb ADDED
@@ -0,0 +1,13 @@
1
+ #require './spec_helper'
2
+ require '../oxcelix.rb'
3
+ describe "Cell object" do
4
+ describe '#r' do
5
+ it "sets the value of xlcoords" do
6
+ c=Oxcelix::Cell.new
7
+ c.r('H276')
8
+ c.xlcoords.should=='H276'
9
+ c.x.should==7
10
+ c.y.should==275
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ #require './spec_helper'
2
+ require '../oxcelix.rb'
3
+ describe "Fixnum object" do
4
+ describe '#col_name' do
5
+ it "returns a string representing an excel column name" do
6
+ (0..25).each do |x|
7
+ x.col_name.should == ('A'..'Z').to_a[x]
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ #require './spec_helper'
2
+ require '../oxcelix.rb'
3
+ describe "Matrix object" do
4
+ describe '#[]=' do
5
+ it "should set a cell to a new value" do
6
+ m_obj=Matrix.build(4, 4){nil}
7
+ m_obj[3,3]='foo'
8
+ m_obj[3,3].should == 'foo'
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,36 @@
1
+ #require './spec_helper'
2
+ require '../oxcelix.rb'
3
+ describe "Oxcelix module" do
4
+ # before :all do
5
+ describe 'Workbook' do
6
+ context 'normal' do
7
+ it "should open the excel file and return a Workbook object" do
8
+ file = './test.xlsx'
9
+ w=Oxcelix::Workbook.new(file)
10
+ w.sheets.size.should == 2
11
+ w.sheets[0].name.should=="Testsheet1"
12
+ w.sheets[1].name.should=="Testsheet2"
13
+ end
14
+ end
15
+ context 'with excluded sheets' do
16
+ it "should open the sheets not excluded of the excel file" do
17
+ file = './test.xlsx'
18
+ w=Oxcelix::Workbook.new(file, {:exclude=>['Testsheet2']})
19
+ w.sheets.size.should==1
20
+ w.sheets[0].name.should=="Testsheet1"
21
+ end
22
+ end
23
+ context 'with included sheets' do
24
+ it "should open only the included sheets of the excel file" do
25
+ file = './test.xlsx'
26
+ w=Oxcelix::Workbook.new(file, {:include=>['Testsheet2']})
27
+ w.sheets.size.should==1
28
+ w.sheets[0].name.should=="Testsheet2"
29
+ end
30
+ end
31
+ context 'with merged cells copied group-wide'
32
+ it "should open the excel file and copy the merged cells trough the mergegroup" do
33
+ end
34
+ end
35
+ # end
36
+ end
@@ -0,0 +1,3 @@
1
+ require_relative '../oxcelix'
2
+
3
+ require 'yaml'
@@ -0,0 +1,19 @@
1
+ #require './spec_helper'
2
+ require '../oxcelix.rb'
3
+ describe "String object" do
4
+ describe 'numeric?' do
5
+ context "with numbers" do
6
+ it "should return true" do
7
+ (1..100).each do |x|
8
+ x.to_s.numeric?.should == true
9
+ end
10
+ end
11
+ context "with strings"
12
+ it "should return false" do
13
+ ('a'..'zz').each do |x|
14
+ x.numeric?.should == false
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
data/spec/test.xlsx ADDED
Binary file
metadata ADDED
@@ -0,0 +1,97 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: oxcelix
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Giovanni Biczo
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-10-06 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: ox
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 2.0.6
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 2.0.6
30
+ - !ruby/object:Gem::Dependency
31
+ name: rubyzip
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: 0.9.9
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 0.9.9
46
+ description: A fast .xlsx file parser that returns a collection of Matrix objects
47
+ email:
48
+ executables: []
49
+ extensions: []
50
+ extra_rdoc_files: []
51
+ files:
52
+ - LICENSE
53
+ - README.rdoc
54
+ - README.md
55
+ - lib/oxcelix.rb
56
+ - lib/oxcelix/cell.rb
57
+ - lib/oxcelix/workbook.rb
58
+ - lib/oxcelix/sheet.rb
59
+ - lib/oxcelix/cellhelper.rb
60
+ - lib/oxcelix/sax/sharedstrings.rb
61
+ - lib/oxcelix/sax/xlsheet.rb
62
+ - lib/oxcelix/sax/comments.rb
63
+ - oxcelix.gemspec
64
+ - spec/test.xlsx
65
+ - spec/spec_helper.rb
66
+ - spec/fixnum_spec.rb
67
+ - spec/oxcelix_spec.rb
68
+ - spec/cell_spec.rb
69
+ - spec/matrix_spec.rb
70
+ - spec/string_spec.rb
71
+ homepage: http://github.com/gbiczo/oxcelix
72
+ licenses:
73
+ - MIT
74
+ post_install_message:
75
+ rdoc_options: []
76
+ require_paths:
77
+ - lib
78
+ required_ruby_version: !ruby/object:Gem::Requirement
79
+ none: false
80
+ requirements:
81
+ - - ! '>='
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ requirements: []
91
+ rubyforge_project: oxcelix
92
+ rubygems_version: 1.8.25
93
+ signing_key:
94
+ specification_version: 3
95
+ summary: A fast Excel 2007/2010 file parser
96
+ test_files: []
97
+ has_rdoc: