workbook 0.7.3 → 0.7.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +10 -1
  3. data/lib/workbook.rb +1 -1
  4. data/lib/workbook/book.rb +7 -15
  5. data/lib/workbook/cell.rb +1 -1
  6. data/lib/workbook/column.rb +4 -1
  7. data/lib/workbook/format.rb +7 -2
  8. data/lib/workbook/generatetypes.rb +1 -0
  9. data/lib/workbook/modules/cache.rb +1 -0
  10. data/lib/workbook/modules/cell.rb +86 -76
  11. data/lib/workbook/modules/diff_sort.rb +1 -0
  12. data/lib/workbook/modules/raw_objects_storage.rb +1 -0
  13. data/lib/workbook/modules/type_parser.rb +1 -0
  14. data/lib/workbook/nil_value.rb +1 -0
  15. data/lib/workbook/readers/csv_reader.rb +5 -9
  16. data/lib/workbook/readers/ods_reader.rb +1 -1
  17. data/lib/workbook/readers/txt_reader.rb +2 -1
  18. data/lib/workbook/readers/xls_reader.rb +64 -51
  19. data/lib/workbook/readers/xls_shared.rb +1 -1
  20. data/lib/workbook/readers/xlsx_reader.rb +1 -0
  21. data/lib/workbook/row.rb +1 -1
  22. data/lib/workbook/sheet.rb +1 -0
  23. data/lib/workbook/table.rb +1 -0
  24. data/lib/workbook/template.rb +1 -0
  25. data/lib/workbook/types/date.rb +1 -0
  26. data/lib/workbook/types/false.rb +1 -0
  27. data/lib/workbook/types/false_class.rb +1 -0
  28. data/lib/workbook/types/nil.rb +1 -0
  29. data/lib/workbook/types/nil_class.rb +1 -0
  30. data/lib/workbook/types/numeric.rb +1 -0
  31. data/lib/workbook/types/string.rb +1 -0
  32. data/lib/workbook/types/time.rb +1 -0
  33. data/lib/workbook/types/true.rb +1 -0
  34. data/lib/workbook/types/true_class.rb +1 -0
  35. data/lib/workbook/version.rb +2 -1
  36. data/lib/workbook/writers/csv_table_writer.rb +1 -0
  37. data/lib/workbook/writers/html_writer.rb +1 -0
  38. data/lib/workbook/writers/json_table_writer.rb +5 -4
  39. data/lib/workbook/writers/xls_writer.rb +1 -0
  40. data/lib/workbook/writers/xlsx_writer.rb +1 -0
  41. data/test/test_modules_cell.rb +7 -1
  42. data/workbook.gemspec +2 -6
  43. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 846bbc1bb424740727e3c5e98266f94d68b573df
4
- data.tar.gz: 1c693585981610ce41e7e1116e3e1a6a039cd72a
3
+ metadata.gz: 11e8d0a279d7da324133ad5d1451518716049334
4
+ data.tar.gz: d0501d220b67ce8cd0161a2fdf600fe7834504f9
5
5
  SHA512:
6
- metadata.gz: d63c0365b55650a33608b21282b0b7ebb2ad7dcb37ec9e0eda0e2c72eec093923c136dc82ebd48a4a077ed333734f6ac2dbda65ca0228a5d6b672d034eb4fce6
7
- data.tar.gz: 57c222deddfbb73a3027aa185f94f23e4bd1978e7f9d49a02e3b017a599682ab266a5bd3302983ab7610c3695dd2b3b87a108094ee45baafea92112aec78e602
6
+ metadata.gz: eeec53fc99efc09a2aebd0a0b7a2429dabaa20fd9efd33e878c63a5b6948ffc8762741e89ec68dbea4232d3b932f21b4422d3cfa190d29c82847a786ce9eeb17
7
+ data.tar.gz: e983e2a8e83bec46581240c4a1645ff2c181bf01a7541d7f530a83897e9d8c8191a98253651a6108076c7747b34aba92d8d358416ad3f50c1367fc7dbfc83da6
@@ -1,10 +1,19 @@
1
+ env:
2
+ global:
3
+ - CC_TEST_REPORTER_ID=f208db3cda3089cf4020651d7500fe34389b97d65ccb5b23b674a2f828fa5abb
1
4
  sudo: false
2
5
  language: ruby
3
6
  rvm:
4
- - 2.0.0
5
7
  - 2.1.0
6
8
  - 2.2.0
7
9
  - 2.3.0
8
10
  - 2.4.0
11
+ - 2.5.0
9
12
  before_install:
10
13
  - gem install bundler
14
+ before_script:
15
+ - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
16
+ - chmod +x ./cc-test-reporter
17
+ - ./cc-test-reporter before-build
18
+ after_script:
19
+ - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
@@ -1,5 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
- $KCODE="u" if RUBY_VERSION < "1.9"
2
+ # frozen_string_literal: true
3
3
  require_relative 'workbook/modules/cache'
4
4
  require_relative 'workbook/modules/cell'
5
5
  require_relative 'workbook/types/date'
@@ -1,4 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
+ # frozen_string_literal: true
2
3
  require 'open-uri'
3
4
  require 'workbook/writers/xls_writer'
4
5
  require 'workbook/writers/xlsx_writer'
@@ -160,22 +161,13 @@ module Workbook
160
161
  #
161
162
  # @param [String] text a string to convert
162
163
  def text_to_utf8 text
163
- if RUBY_VERSION < '1.9'
164
- require 'rchardet'
165
- require 'iconv'
166
- detected_encoding = CharDet.detect(text)
167
- detected_encoding = detected_encoding['encoding']
168
- text = Iconv.conv("UTF-8//TRANSLIT//IGNORE",detected_encoding,text)
169
- text = text.gsub("\xEF\xBB\xBF", '') # removing the BOM...
170
- else
171
- unless text.valid_encoding? and text.encoding == "UTF-8"
172
- # TODO: had some ruby 1.9 problems with rchardet ... but ideally it or a similar functionality will be reintroduced
173
- source_encoding = text.valid_encoding? ? text.encoding : "US-ASCII"
174
- text = text.encode('UTF-8', source_encoding, {:invalid=>:replace, :undef=>:replace, :replace=>""})
175
- text = text.gsub("\u0000","") # TODO: this cleanup of nil values isn't supposed to be needed...
176
- end
164
+ unless text.valid_encoding? and text.encoding == "UTF-8"
165
+ # TODO: had some ruby 1.9 problems with rchardet ... but ideally it or a similar functionality will be reintroduced
166
+ source_encoding = text.valid_encoding? ? text.encoding : "US-ASCII"
167
+ text = text.encode('UTF-8', source_encoding, {:invalid=>:replace, :undef=>:replace, :replace=>""})
168
+ text = text.gsub("\u0000","") # TODO: this cleanup of nil values isn't supposed to be needed...
177
169
  end
178
- return text
170
+ text
179
171
  end
180
172
 
181
173
  # @param [String, File] filename The full filename, or path
@@ -1,5 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
-
2
+ # frozen_string_literal: true
3
3
  require 'workbook/modules/cell'
4
4
 
5
5
  module Workbook
@@ -1,4 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
+ # frozen_string_literal: true
2
3
  module Workbook
3
4
 
4
5
  # Column helps us to store general properties of a column, and lets us easily perform operations on values within a column
@@ -17,10 +18,12 @@ module Workbook
17
18
  table[1..500].each do |row|
18
19
  if row[ind] and row[ind].cell_type
19
20
  cel_column_type = row[ind].cell_type
20
- if !defined?(@column_type) or @column_type.nil? or cel_column_type == @column_type
21
+ if !defined?(@column_type) or @column_type.nil?
21
22
  @column_type = cel_column_type
23
+ elsif cel_column_type == @column_type or cel_column_type == :nil
22
24
  else
23
25
  @column_type = :string
26
+ break
24
27
  end
25
28
  end
26
29
  end
@@ -1,4 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
+ # frozen_string_literal: true
2
3
  require 'workbook/modules/raw_objects_storage'
3
4
 
4
5
  module Workbook
@@ -34,8 +35,12 @@ module Workbook
34
35
 
35
36
  # Does the current format feature a background *color*? (not black or white or transparant).
36
37
  def has_background_color? color=:any
37
- if flattened[:background_color]
38
- return (flattened[:background_color].downcase==color.to_s.downcase or (!(flattened[:background_color]==nil or (flattened[:background_color].is_a? String and (flattened[:background_color].downcase=='#ffffff' or flattened[:background_color]=='#000000'))) and color==:any))
38
+ bg_color = flattened[:background_color] ? flattened[:background_color].to_s.downcase : nil
39
+
40
+ if color != :any and bg_color
41
+ return bg_color == color.to_s.downcase
42
+ elsif bg_color
43
+ return !(flattened[:background_color].downcase=='#ffffff' or flattened[:background_color]=='#000000')
39
44
  else
40
45
  return false
41
46
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  ["Numeric","String","Time","Date","TrueClass","FalseClass","NilClass"].each do |type|
2
3
  f = File.open(File.join(File.dirname(__FILE__),"types","#{type}.rb"),'w+')
3
4
  puts f.inspect
@@ -1,4 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
+ # frozen_string_literal: true
2
3
  module Workbook
3
4
  module Modules
4
5
  # Adds simple caching
@@ -1,4 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
+ # frozen_string_literal: true
2
3
  require 'workbook/modules/type_parser'
3
4
  require 'workbook/nil_value'
4
5
  require 'date'
@@ -8,19 +9,59 @@ module Workbook
8
9
  module Cell
9
10
  include Workbook::Modules::TypeParser
10
11
 
11
-
12
-
12
+ CHARACTER_REPACEMENTS = {
13
+ [/[\(\)\.\?\,\!\=\$\:]/,] => '',
14
+ [/\&/] => 'amp',
15
+ [/\+/] => '_plus_',
16
+ [/\s/,'/_','/',"\\"] => '_',
17
+ ['–_','-_','+_','-'] => '',
18
+ ['__']=>'_',
19
+ ['>']=>'gt',
20
+ ['<']=>'lt',
21
+ ['á','à','â','ä','ã','å'] => 'a',
22
+ ['Ã','Ä','Â','À','�?','Å'] => 'A',
23
+ ['é','è','ê','ë'] => 'e',
24
+ ['Ë','É','È','Ê'] => 'E',
25
+ ['í','ì','î','ï'] => 'i',
26
+ ['�?','Î','Ì','�?'] => 'I',
27
+ ['ó','ò','ô','ö','õ'] => 'o',
28
+ ['Õ','Ö','Ô','Ò','Ó'] => 'O',
29
+ ['ú','ù','û','ü'] => 'u',
30
+ ['Ú','Û','Ù','Ü'] => 'U',
31
+ ['ç'] => 'c',
32
+ ['Ç'] => 'C',
33
+ ['š', 'ś'] => 's',
34
+ ['Š', 'Ś'] => 'S',
35
+ ['ž','ź'] => 'z',
36
+ ['Ž','Ź'] => 'Z',
37
+ ['ñ'] => 'n',
38
+ ['Ñ'] => 'N',
39
+ ['#'] => 'hash',
40
+ ['*'] => 'asterisk'
41
+ }
42
+ CLASS_CELLTYPE_MAPPING = {
43
+ 'Numeric' => :integer,
44
+ 'Integer' => :integer,
45
+ 'Fixnum' => :integer,
46
+ 'Float' => :float,
47
+ 'String' => :string,
48
+ 'Symbol' => :string,
49
+ 'Time' => :time,
50
+ 'Date' => :date,
51
+ 'DateTime' => :datetime,
52
+ 'TrueClass' => :boolean,
53
+ 'FalseClass' => :boolean,
54
+ 'NilClass' => :nil,
55
+ 'Workbook::NilValue' => :nil
56
+ }
13
57
  # Note that these types are sorted by 'importance'
14
- VALID_TYPES = [Numeric,String,Time,Date,TrueClass,FalseClass,NilClass,Workbook::NilValue,Symbol]
15
58
 
16
59
  # Evaluates a value for class-validity
17
60
  #
18
61
  # @param [Numeric,String,Time,Date,TrueClass,FalseClass,NilClass,Object] value the value to evaluate
19
62
  # @return [Boolean] returns true when the value is a valid cell value
20
63
  def valid_value? value
21
- valid_type = false
22
- VALID_TYPES.each {|t| return true if value.is_a? t}
23
- valid_type
64
+ !CLASS_CELLTYPE_MAPPING[value.class.to_s].nil?
24
65
  end
25
66
 
26
67
  def formula
@@ -64,22 +105,9 @@ module Workbook
64
105
  #
65
106
  # @return [Symbol] the type of cell, compatible with Workbook::Column'types
66
107
  def cell_type
67
- case value.class.to_s
68
- when "String" then :string
69
- when "FalseClass" then :boolean
70
- when "TrueClass" then :boolean
71
- when 'Time' then :time
72
- when "Date" then :date
73
- when "DateTime" then :datetime
74
- when "Float" then :float
75
- when "Integer" then :integer
76
- when "Numeric" then :integer
77
- when "Fixnum" then :integer
78
- when "Symbol" then :string
79
- end
108
+ CLASS_CELLTYPE_MAPPING[value.class.to_s]
80
109
  end
81
110
 
82
-
83
111
  # Returns the current value
84
112
  #
85
113
  # @return [Numeric,String,Time,Date,TrueClass,FalseClass,NilClass] a valid value
@@ -142,7 +170,15 @@ module Workbook
142
170
  # returns true when the value of the cell is nil.
143
171
  # @return [Boolean]
144
172
  def nil?
145
- return value.nil?
173
+ value.nil?
174
+ end
175
+
176
+ def nil_or_empty?
177
+ value.nil? || value.to_s == ""
178
+ end
179
+
180
+ def value_to_s
181
+ value.to_s.downcase
146
182
  end
147
183
 
148
184
  # returns a symbol representation of the cell's value
@@ -153,59 +189,25 @@ module Workbook
153
189
  def to_sym
154
190
  return @to_sym if @to_sym
155
191
  v = nil
156
- if value
157
- v = value.to_s.downcase
158
- if v.to_i != 0
159
- v = "num#{v}"
160
- end
161
- ends_with_exclamationmark = (v[-1] == '!')
162
- ends_with_questionmark = (v[-1] == '?')
163
-
164
- replacements = {
165
- [/[\(\)\.\?\,\!\=\$\:]/,] => '',
166
- [/\&/] => 'amp',
167
- [/\+/] => '_plus_',
168
- [/\s/,'/_','/',"\\"] => '_',
169
- ['–_','-_','+_','-'] => '',
170
- ['__']=>'_',
171
- ['>']=>'gt',
172
- ['<']=>'lt',
173
- ['á','à','â','ä','ã','å'] => 'a',
174
- ['Ã','Ä','Â','À','�?','Å'] => 'A',
175
- ['é','è','ê','ë'] => 'e',
176
- ['Ë','É','È','Ê'] => 'E',
177
- ['í','ì','î','ï'] => 'i',
178
- ['�?','Î','Ì','�?'] => 'I',
179
- ['ó','ò','ô','ö','õ'] => 'o',
180
- ['Õ','Ö','Ô','Ò','Ó'] => 'O',
181
- ['ú','ù','û','ü'] => 'u',
182
- ['Ú','Û','Ù','Ü'] => 'U',
183
- ['ç'] => 'c',
184
- ['Ç'] => 'C',
185
- ['š', 'ś'] => 's',
186
- ['Š', 'Ś'] => 'S',
187
- ['ž','ź'] => 'z',
188
- ['Ž','Ź'] => 'Z',
189
- ['ñ'] => 'n',
190
- ['Ñ'] => 'N',
191
- ['#'] => 'hash',
192
- ['*'] => 'asterisk'
193
- }
194
- replacements.each do |ac,rep|
195
- ac.each do |s|
196
- v = v.gsub(s, rep)
197
- end
198
- end
199
- if RUBY_VERSION < '1.9'
200
- v = v.gsub(/[^\x00-\x7F]/n,'')
192
+ unless nil_or_empty?
193
+ if cell_type == :integer
194
+ v = "num#{value}".to_sym
195
+ elsif cell_type == :float
196
+ v = "num#{value}".sub(".","_").to_sym
201
197
  else
202
- # See String#encode
203
- encoding_options = {:invalid => :replace, :undef => :replace, :replace => ''}
204
- v = v.encode(Encoding.find('ASCII'), encoding_options)
198
+ v = value_to_s
199
+
200
+ ends_with_exclamationmark = (v[-1] == '!')
201
+ ends_with_questionmark = (v[-1] == '?')
202
+
203
+ v = _replace_possibly_problematic_characters_from_string(v)
204
+
205
+ v = v.encode(Encoding.find('ASCII'), {:invalid => :replace, :undef => :replace, :replace => ''})
206
+
207
+ v = "#{v}!" if ends_with_exclamationmark
208
+ v = "#{v}?" if ends_with_questionmark
209
+ v = v.downcase.to_sym
205
210
  end
206
- v = "#{v}!" if ends_with_exclamationmark
207
- v = "#{v}?" if ends_with_questionmark
208
- v = v.downcase.to_sym
209
211
  end
210
212
  @to_sym = v
211
213
  return @to_sym
@@ -243,10 +245,7 @@ module Workbook
243
245
  #
244
246
  # @param value a potential value for a cell
245
247
  def importance_of_class value
246
- VALID_TYPES.each_with_index do |c,i|
247
- return i if value.is_a? c
248
- end
249
- return nil
248
+ CLASS_CELLTYPE_MAPPING.keys.index value.class.to_s
250
249
  end
251
250
 
252
251
  # Returns whether special formatting is present on this cell
@@ -302,6 +301,17 @@ module Workbook
302
301
  def rowspan
303
302
  @rowspan.to_i if defined?(@rowspan) and @rowspan.to_i > 1
304
303
  end
304
+
305
+ private
306
+
307
+ def _replace_possibly_problematic_characters_from_string(string)
308
+ Workbook::Modules::Cell::CHARACTER_REPACEMENTS.each do |ac,rep|
309
+ ac.each do |s|
310
+ string = string.gsub(s, rep)
311
+ end
312
+ end
313
+ string
314
+ end
305
315
  end
306
316
  end
307
317
  end
@@ -1,4 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
+ # frozen_string_literal: true
2
3
  module Workbook
3
4
  module Modules
4
5
  # Adds essential diffing and comparing support, as well as diffing entire books
@@ -1,4 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
+ # frozen_string_literal: true
2
3
  module Workbook
3
4
  module Modules
4
5
  # Adds support for storing raw objects, used in e.g. Format and Template
@@ -1,4 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
+ # frozen_string_literal: true
2
3
  module Workbook
3
4
  module Modules
4
5
  # Adds type parsing capabilities to e.g. a Cell.
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Workbook
2
3
 
3
4
  # Used in cases col or rowspans are used
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # -*- encoding : utf-8 -*-
2
3
 
3
4
  module Workbook
@@ -9,12 +10,7 @@ module Workbook
9
10
  end
10
11
 
11
12
  def csv_lib
12
- if RUBY_VERSION < '1.9'
13
- require 'faster_csv'
14
- return FasterCSV
15
- else
16
- return CSV
17
- end
13
+ return CSV
18
14
  end
19
15
 
20
16
  def parse_csv csv_raw, options={}
@@ -25,16 +21,16 @@ module Workbook
25
21
 
26
22
  csv=nil
27
23
  begin
28
- csv = csv_lib.parse(csv_raw,options)
24
+ csv = CSV.parse(csv_raw,options)
29
25
 
30
26
  rescue CSV::MalformedCSVError
31
- csv_excel = csv_lib.parse(csv_raw,options.merge({:col_sep=>';'}))
27
+ csv_excel = CSV.parse(csv_raw,options.merge({:col_sep=>';'}))
32
28
  csv = csv_excel if csv_excel[0].count > 1
33
29
 
34
30
  end
35
31
 
36
32
  if csv==nil or csv[0].count == 1
37
- csv_excel = csv_lib.parse(csv_raw,options.merge({:col_sep=>';'}))
33
+ csv_excel = CSV.parse(csv_raw,options.merge({:col_sep=>';'}))
38
34
  csv = csv_excel if csv_excel[0].count > 1
39
35
  end
40
36
 
@@ -1,5 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
-
2
+ # frozen_string_literal: true
3
3
  module Workbook
4
4
  module Readers
5
5
  module OdsReader
@@ -1,4 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
+ # frozen_string_literal: true
2
3
  module Workbook
3
4
  module Readers
4
5
  module TxtReader
@@ -9,7 +10,7 @@ module Workbook
9
10
 
10
11
  def parse_txt csv_raw, options={}
11
12
  csv = []
12
- csv_raw.split("\n").each {|l| csv << csv_lib.parse_line(l,{:col_sep=>"\t"});nil}
13
+ csv_raw.split("\n").each {|l| csv << CSV.parse_line(l,{:col_sep=>"\t"});nil}
13
14
  self[0]=Workbook::Sheet.new(csv,self,{:parse_cells_on_batch_creation=>true, :cell_parse_options=>{:detect_date=>true}}) unless sheet.has_contents?
14
15
  end
15
16
  end
@@ -1,4 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
+ # frozen_string_literal: true
2
3
  require 'spreadsheet'
3
4
  require 'workbook/readers/xls_shared'
4
5
 
@@ -24,67 +25,79 @@ module Workbook
24
25
 
25
26
  end
26
27
 
28
+ def parse_xls_cell xls_cell, xls_row, ci
29
+ rv = Workbook::Cell.new nil
30
+ begin
31
+ rv = Workbook::Cell.new xls_cell
32
+ rv.parse!
33
+ rescue ArgumentError => e
34
+ if e.message.match('not a Spreadsheet::Formula')
35
+ v = xls_cell.value
36
+ if v.class == Float and xls_row.format(ci).date?
37
+ xls_row[ci] = v
38
+ v = xls_row.datetime(ci)
39
+ end
40
+ if v.is_a? Spreadsheet::Excel::Error
41
+ v = "----!"
42
+ end
43
+ rv = Workbook::Cell.new v
44
+ elsif e.message.match('not a Spreadsheet::Link')
45
+ rv = Workbook::Cell.new xls_cell.to_s
46
+ elsif e.message.match('not a Spreadsheet::Link')
47
+ rv = Workbook::Cell.new xls_cell.to_s
48
+ elsif e.message.match('not a Spreadsheet::Excel::Error')
49
+ rv = "._."
50
+ else
51
+ rv = "._." # raise e (we're going to be silent for now)
52
+ end
53
+ end
54
+ rv
55
+ end
56
+
57
+ def parse_xls_format xls_row, ci, ri, col_widths
58
+ xls_format = xls_row.format(ci)
59
+ col_width = nil
60
+
61
+ if ri == 0
62
+ col_width = col_widths[ci]
63
+ end
64
+
65
+ f = template.create_or_find_format_by "object_id_#{xls_format.object_id}",col_width
66
+ f[:width]= col_width
67
+ f[:rotation] = xls_format.rotation if xls_format.rotation
68
+ f[:background_color] = xls_color_to_html_hex(xls_format.pattern_fg_color)
69
+ f[:number_format] = ms_formatting_to_strftime(xls_format.number_format)
70
+ f[:text_direction] = xls_format.text_direction
71
+ f[:font_family] = "#{xls_format.font.name}, #{xls_format.font.family}"
72
+ f[:font_weight] = xls_format.font.weight
73
+ f[:color] = xls_color_to_html_hex(xls_format.font.color)
74
+
75
+ f.add_raw xls_format
76
+ f
77
+ end
78
+
79
+ def parse_xls_row ri, s, xls_sheet
80
+ xls_row = xls_sheet.row(ri)
81
+ r = s.table.create_or_open_row_at(ri)
82
+ col_widths = xls_sheet.columns.collect{|c| c.width if c}
83
+ xls_row.each_with_index do |xls_cell,ci|
84
+ r[ci] = parse_xls_cell xls_cell, xls_row, ci
85
+ r[ci].format = parse_xls_format xls_row, ci, ri, col_widths
86
+ end
87
+ end
27
88
 
28
89
  def parse_xls xls_spreadsheet=template.raws[Spreadsheet::Excel::Workbook], options={}
29
90
  options = {:additional_type_parsing=>true}.merge options
30
91
  number_of_worksheets = xls_spreadsheet.worksheets.count
31
- (0..number_of_worksheets-1).each do |si|
92
+ number_of_worksheets.times do |si|
32
93
  xls_sheet = xls_spreadsheet.worksheets[si]
33
94
  if [:visible, :hidden, nil].include? xls_sheet.visibility # don't read :strong_hidden sheets, symmetrical to the writer
34
95
  begin
35
96
  number_of_rows = xls_sheet.count
36
97
  s = create_or_open_sheet_at(si)
37
98
  s.name = xls_sheet.name
38
- (0..number_of_rows-1).each do |ri|
39
- xls_row = xls_sheet.row(ri)
40
- r = s.table.create_or_open_row_at(ri)
41
- col_widths = xls_sheet.columns.collect{|c| c.width if c}
42
- xls_row.each_with_index do |xls_cell,ci|
43
-
44
- begin
45
- r[ci] = Workbook::Cell.new xls_cell
46
- r[ci].parse!
47
- rescue ArgumentError => e
48
- if e.message.match('not a Spreadsheet::Formula')
49
- v = xls_cell.value
50
- if v.class == Float and xls_row.format(ci).date?
51
- xls_row[ci] = v
52
- v = xls_row.datetime(ci)
53
- end
54
- if v.is_a? Spreadsheet::Excel::Error
55
- v = "----!"
56
- end
57
- r[ci] = Workbook::Cell.new v
58
- elsif e.message.match('not a Spreadsheet::Link')
59
- r[ci] = Workbook::Cell.new xls_cell.to_s
60
- elsif e.message.match('not a Spreadsheet::Link')
61
- r[ci] = Workbook::Cell.new xls_cell.to_s
62
- elsif e.message.match('not a Spreadsheet::Excel::Error')
63
- r[ci] = "._."
64
- else
65
- r[ci] = "._." # raise e (we're going to be silent for now)
66
- end
67
- end
68
- xls_format = xls_row.format(ci)
69
- col_width = nil
70
-
71
- if ri == 0
72
- col_width = col_widths[ci]
73
- end
74
- f = template.create_or_find_format_by "object_id_#{xls_format.object_id}",col_width
75
- f[:width]= col_width
76
- f[:rotation] = xls_format.rotation if xls_format.rotation
77
- f[:background_color] = xls_color_to_html_hex(xls_format.pattern_fg_color)
78
- f[:number_format] = ms_formatting_to_strftime(xls_format.number_format)
79
- f[:text_direction] = xls_format.text_direction
80
- f[:font_family] = "#{xls_format.font.name}, #{xls_format.font.family}"
81
- f[:font_weight] = xls_format.font.weight
82
- f[:color] = xls_color_to_html_hex(xls_format.font.color)
83
-
84
- f.add_raw xls_format
85
-
86
- r[ci].format = f
87
- end
99
+ number_of_rows.times do |ri|
100
+ parse_xls_row ri, s, xls_sheet
88
101
  end
89
102
  rescue TypeError
90
103
  puts "WARNING: Failed at worksheet (#{si})... ignored"
@@ -1,5 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
-
2
+ # frozen_string_literal: true
3
3
  require 'date'
4
4
 
5
5
  module Workbook
@@ -1,4 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
+ # frozen_string_literal: true
2
3
  require 'workbook/readers/xls_shared'
3
4
 
4
5
  module Workbook
@@ -1,5 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
-
2
+ # frozen_string_literal: true
3
3
  module Workbook
4
4
  class Row < Array
5
5
  include Workbook::Modules::Cache
@@ -1,4 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
+ # frozen_string_literal: true
2
3
  module Workbook
3
4
  # A Sheet is a container of tables
4
5
  class Sheet < Array
@@ -1,4 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
+ # frozen_string_literal: true
2
3
  require 'workbook/modules/diff_sort'
3
4
  require 'workbook/writers/csv_table_writer'
4
5
  require 'workbook/writers/json_table_writer'
@@ -1,4 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
+ # frozen_string_literal: true
2
3
  require 'workbook/modules/raw_objects_storage'
3
4
 
4
5
  module Workbook
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Workbook
2
3
  module Types
3
4
  class Date < Date
@@ -0,0 +1 @@
1
+ # frozen_string_literal: true
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Workbook
2
3
  module Types
3
4
  class FalseClass < FalseClass
@@ -0,0 +1 @@
1
+ # frozen_string_literal: true
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'workbook/cell'
2
3
 
3
4
  module Workbook
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'workbook/cell'
2
3
 
3
4
  module Workbook
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'workbook/cell'
2
3
 
3
4
  module Workbook
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'workbook/cell'
2
3
 
3
4
  module Workbook
@@ -0,0 +1 @@
1
+ # frozen_string_literal: true
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'workbook/cell'
2
3
 
3
4
  module Workbook
@@ -1,4 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
+ # frozen_string_literal: true
2
3
  module Workbook
3
- VERSION = '0.7.3'
4
+ VERSION = '0.7.5'
4
5
  end
@@ -1,4 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
+ # frozen_string_literal: true
2
3
  require 'csv'
3
4
 
4
5
  module Workbook
@@ -1,4 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
+ # frozen_string_literal: true
2
3
  require 'spreadsheet'
3
4
 
4
5
  module Workbook
@@ -1,4 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
+ # frozen_string_literal: true
2
3
  require 'json'
3
4
 
4
5
  module Workbook
@@ -6,21 +7,21 @@ module Workbook
6
7
  module JsonTableWriter
7
8
  # Output the current workbook to JSON format
8
9
  #
9
- # @param [Hash] options
10
+ # @param [Hash] options
10
11
  # @return [String] json string
11
12
  def to_json options={}
12
13
  JSON.generate(to_array_of_hashes_with_values(options))
13
14
  end
14
-
15
+
15
16
  # Output the current workbook to an array_of_hashes_with_values format
16
17
  #
17
- # @param [Hash] options
18
+ # @param [Hash] options
18
19
  # @return [Array<Hash>] array with hashes (comma separated values in a string)
19
20
  def to_array_of_hashes_with_values options={}
20
21
  array_of_hashes = self.collect{|a| a.to_hash_with_values unless a.header?}.compact
21
22
  return array_of_hashes
22
23
  end
23
-
24
+
24
25
  # Write the current workbook to JSON format
25
26
  #
26
27
  # @param [String] filename
@@ -1,4 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
+ # frozen_string_literal: true
2
3
  require 'spreadsheet'
3
4
 
4
5
  module Workbook
@@ -1,4 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
+ # frozen_string_literal: true
2
3
  require 'axlsx'
3
4
  require 'workbook/readers/xls_shared'
4
5
 
@@ -33,6 +33,12 @@ class TestModulesCell < Minitest::Test
33
33
  assert_equal(Float,w.value.class)
34
34
  end
35
35
 
36
+ def test_importance_of_class
37
+ a = Workbook::Cell.new
38
+ assert_equal(4, a.importance_of_class("a"))
39
+ assert_equal(5, a.importance_of_class(:a))
40
+ end
41
+
36
42
  def test_comp
37
43
  a = Workbook::Cell.new 1
38
44
  b = Workbook::Cell.new 2
@@ -82,7 +88,7 @@ class TestModulesCell < Minitest::Test
82
88
  "A-B!" => :ab!,
83
89
  "éåšžÌ?" => :easzi?,
84
90
  1 => :num1,
85
- 1.0 => :num10
91
+ 1.0 => :num1_0
86
92
  }
87
93
  examples.each do |k,v|
88
94
  assert_equal(v, Workbook::Cell.new(k).to_sym)
@@ -18,16 +18,12 @@ Gem::Specification.new do |s|
18
18
  s.add_development_dependency("rake", '~> 10.0')
19
19
  s.add_development_dependency('minitest', '~> 5.4')
20
20
  s.add_dependency('spreadsheet', '~> 1.1')
21
- s.add_dependency('fastercsv') if RUBY_VERSION < "1.9"
22
21
  s.add_dependency("rchardet", "~> 1.3")
23
22
  s.add_dependency("json", '~> 2.1')
24
23
  # s.add_dependency("rubyzip", '~> 1.2', '>= 1.2.1')
25
24
  s.add_dependency('axlsx', '~> 3.0.0.pre')
26
- if RUBY_VERSION < "1.9"
27
- s.add_dependency('nokogiri', "~> 1.5.10")
28
- else
29
- s.add_dependency('nokogiri', '~> 1.6')
30
- end
25
+ s.add_dependency('nokogiri', '~> 1.8')
26
+
31
27
  s.platform = Gem::Platform::RUBY
32
28
  s.files = `git ls-files`.split($/)
33
29
  s.test_files = s.files.grep(%r{^(test|spec|features)/})
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: workbook
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.3
4
+ version: 0.7.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maarten Brouwers
@@ -114,14 +114,14 @@ dependencies:
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '1.6'
117
+ version: '1.8'
118
118
  type: :runtime
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '1.6'
124
+ version: '1.8'
125
125
  description: Workbook contains workbooks, as in a table, contains rows, contains cells,
126
126
  reads/writes excel, ods and csv and tab separated files, and offers basic diffing
127
127
  and sorting capabilities.