workbook 0.8.1 → 0.8.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +21 -0
  3. data/.gitignore +4 -1
  4. data/.ruby-version +1 -1
  5. data/.travis.yml +4 -4
  6. data/CHANGELOG.md +7 -0
  7. data/Gemfile +2 -2
  8. data/README.md +9 -7
  9. data/Rakefile +6 -6
  10. data/lib/workbook/book.rb +73 -62
  11. data/lib/workbook/cell.rb +58 -13
  12. data/lib/workbook/column.rb +31 -28
  13. data/lib/workbook/format.rb +23 -24
  14. data/lib/workbook/generatetypes.rb +4 -4
  15. data/lib/workbook/modules/cache.rb +6 -7
  16. data/lib/workbook/modules/cell.rb +77 -100
  17. data/lib/workbook/modules/diff_sort.rb +92 -83
  18. data/lib/workbook/modules/raw_objects_storage.rb +6 -8
  19. data/lib/workbook/modules/type_parser.rb +30 -22
  20. data/lib/workbook/nil_value.rb +4 -9
  21. data/lib/workbook/readers/csv_reader.rb +7 -10
  22. data/lib/workbook/readers/ods_reader.rb +48 -50
  23. data/lib/workbook/readers/txt_reader.rb +6 -8
  24. data/lib/workbook/readers/xls_reader.rb +21 -33
  25. data/lib/workbook/readers/xls_shared.rb +106 -117
  26. data/lib/workbook/readers/xlsx_reader.rb +45 -46
  27. data/lib/workbook/row.rb +99 -84
  28. data/lib/workbook/sheet.rb +47 -38
  29. data/lib/workbook/table.rb +96 -72
  30. data/lib/workbook/template.rb +12 -15
  31. data/lib/workbook/types/false.rb +0 -1
  32. data/lib/workbook/types/nil.rb +0 -1
  33. data/lib/workbook/types/nil_class.rb +1 -1
  34. data/lib/workbook/types/numeric.rb +1 -1
  35. data/lib/workbook/types/string.rb +1 -1
  36. data/lib/workbook/types/time.rb +1 -1
  37. data/lib/workbook/types/true.rb +0 -1
  38. data/lib/workbook/types/true_class.rb +1 -1
  39. data/lib/workbook/version.rb +2 -3
  40. data/lib/workbook/writers/csv_table_writer.rb +10 -13
  41. data/lib/workbook/writers/html_writer.rb +34 -38
  42. data/lib/workbook/writers/json_table_writer.rb +8 -11
  43. data/lib/workbook/writers/xls_writer.rb +30 -36
  44. data/lib/workbook/writers/xlsx_writer.rb +45 -29
  45. data/lib/workbook.rb +16 -15
  46. data/test/helper.rb +6 -5
  47. data/test/test_book.rb +41 -38
  48. data/test/test_column.rb +26 -24
  49. data/test/test_format.rb +51 -55
  50. data/test/test_functional.rb +7 -8
  51. data/test/test_modules_cache.rb +18 -17
  52. data/test/test_modules_cell.rb +47 -46
  53. data/test/test_modules_table_diff_sort.rb +55 -64
  54. data/test/test_modules_type_parser.rb +61 -31
  55. data/test/test_readers_csv_reader.rb +48 -42
  56. data/test/test_readers_ods_reader.rb +28 -31
  57. data/test/test_readers_txt_reader.rb +21 -23
  58. data/test/test_readers_xls_reader.rb +20 -23
  59. data/test/test_readers_xls_shared.rb +2 -3
  60. data/test/test_readers_xlsx_reader.rb +44 -37
  61. data/test/test_row.rb +105 -109
  62. data/test/test_sheet.rb +41 -35
  63. data/test/test_table.rb +82 -60
  64. data/test/test_template.rb +16 -15
  65. data/test/test_types_date.rb +4 -6
  66. data/test/test_writers_csv_writer.rb +24 -0
  67. data/test/test_writers_html_writer.rb +42 -41
  68. data/test/test_writers_json_writer.rb +9 -9
  69. data/test/test_writers_xls_writer.rb +50 -35
  70. data/test/test_writers_xlsx_writer.rb +62 -34
  71. data/workbook.gemspec +26 -27
  72. metadata +92 -27
@@ -1,25 +1,25 @@
1
1
  # frozen_string_literal: true
2
-
3
- # -*- encoding : utf-8 -*-
4
2
  # frozen_string_literal: true
3
+
5
4
  module Workbook
6
5
  # A Sheet is a container of tables
7
- class Sheet < Array
8
-
6
+ class Sheet
7
+ include Enumerable
9
8
  # Initialize a new sheet
10
9
  #
11
10
  # @param [Workbook::Table, Array<Array>] table The first table of this sheet
12
11
  # @param [Workbook::Book] book The book this sheet belongs to
13
12
  # @param [Hash] options are forwarded to Workbook::Table.new
14
13
  # @return [Workbook::Sheet] (self)
15
- def initialize table=Workbook::Table.new([], self), book=nil, options={}
16
- if table.is_a? Workbook::Table
17
- push table
14
+ def initialize table = Workbook::Table.new([], self), book = nil, options = {}
15
+ @tables = []
16
+
17
+ if table.is_a?(Workbook::Table)
18
+ @tables.push table
18
19
  else
19
- push Workbook::Table.new(table, self, options)
20
+ @tables.push(Workbook::Table.new(table, self, options))
20
21
  end
21
22
  self.book = book
22
- return self
23
23
  end
24
24
 
25
25
  # Returns true if the first table of this sheet contains anything
@@ -33,79 +33,88 @@ module Workbook
33
33
  #
34
34
  # @return [Workbook::Table] the first table of this sheet
35
35
  def table
36
- first
36
+ @tables.first
37
37
  end
38
38
 
39
39
  # Returns the name of this sheet
40
40
  #
41
41
  # @return [String] the name, defaulting to sheet#index when none is set
42
42
  def name
43
- @name ||= "Sheet #{book.index(self)+1}"
43
+ @name ||= "Sheet #{book.index(self) + 1}"
44
44
  end
45
45
 
46
46
  # Set the name of this sheet
47
47
  #
48
48
  # @param [String] the new name of the sheet
49
49
  # @return [String] the given name
50
- def name= name
51
- @name = name
52
- end
50
+ attr_writer :name
53
51
 
54
52
  # Set the first table of this sheet with a table or array of cells/values
55
53
  # @param [Workbook::Table, Array<Array>] table The new first table of this sheet
56
54
  # @param [Hash] options are forwarded to Workbook::Table.new
57
55
  # @return [Workbook::Table] the first table of this sheet
58
- def table= table, options={}
59
- if table.is_a? Workbook::Table
60
- self[0] = table
56
+ def table= table, options = {}
57
+ @tables[0] = if table.is_a? Workbook::Table
58
+ table
61
59
  else
62
- self[0] = Workbook::Table.new(table, self, options)
60
+ Workbook::Table.new(table, self, options)
63
61
  end
64
- return table
65
62
  end
66
63
 
67
- # Returns the book this sheet belongs to
64
+ # Returns the Book this Sheet belongs to
68
65
  #
69
66
  # @return [Workbook::Book] the book this sheet belongs to
70
67
  def book
71
- if @book
72
- return @book
73
- else
74
- self.book = Workbook::Book.new(self)
75
- return @book
76
- end
68
+ @book || (self.book = Workbook::Book.new(self))
69
+ end
70
+
71
+ # Returns a existing or new Table at the specified index
72
+ #
73
+ # @return [Workbook::Table]
74
+ def [] index
75
+ @tables[index] ||= Workbook::Table.new([], self)
76
+ end
77
+
78
+ # Inserts a new Table at the specified index
79
+ #
80
+ # @param [Integer] index of the table
81
+ # @param [Workbook::Table, Array<Array>] table The new first table of this sheet
82
+ #
83
+ # @return [Workbook::Table]
84
+ def []= index, value
85
+ table_to_insert = value.is_a?(Workbook::Table) ? value : Workbook::Table.new
86
+ table_to_insert.sheet = self
87
+ @tables[index] = table_to_insert
77
88
  end
78
89
 
79
- def book= b
80
- @book = b
90
+ # Returns an enumerator
91
+ def each(...)
92
+ @tables.each(...)
81
93
  end
82
94
 
95
+ attr_writer :book
96
+
83
97
  # Removes all lines from this table
84
98
  #
85
99
  # @return [Workbook::Table] (self)
86
100
  def delete_all
87
- self.delete_if{|b| true}
101
+ @tables.delete_if { |b| true }
88
102
  end
89
103
 
90
104
  # clones itself *and* the tables it contains
91
105
  #
92
106
  # @return [Workbook::Sheet] The cloned sheet
93
107
  def clone
94
- s = self
95
- c = super
96
- c.delete_all
97
- s.each{|t| c << t.clone}
98
- return c
108
+ clone = super
109
+ @tables = @tables.map(&:clone)
110
+ clone
99
111
  end
100
112
 
101
113
  # Create or open the existing table at an index value
102
114
  #
103
115
  # @param [Integer] index the index of the table
104
116
  def create_or_open_table_at index
105
- t = self[index]
106
- t = self[index] = Workbook::Table.new if t == nil
107
- t.sheet = self
108
- t
117
+ self[index]
109
118
  end
110
119
  end
111
120
  end
@@ -1,30 +1,35 @@
1
1
  # frozen_string_literal: true
2
-
3
- # -*- encoding : utf-8 -*-
4
2
  # frozen_string_literal: true
5
- require 'workbook/modules/diff_sort'
6
- require 'workbook/writers/csv_table_writer'
7
- require 'workbook/writers/json_table_writer'
8
- require 'workbook/writers/html_writer'
9
3
 
4
+ require "workbook/modules/diff_sort"
5
+ require "workbook/writers/csv_table_writer"
6
+ require "workbook/writers/json_table_writer"
7
+ require "workbook/writers/html_writer"
10
8
 
11
9
  module Workbook
12
10
  # A table is a container of rows and keeps track of the sheet it belongs to and which row is its header. Additionally suport for CSV writing and diffing with another table is included.
13
- class Table < Array
11
+ class Table
12
+ include Enumerable
13
+ extend Forwardable
14
+
14
15
  include Workbook::Modules::TableDiffSort
15
16
  include Workbook::Writers::CsvTableWriter
16
17
  include Workbook::Writers::JsonTableWriter
17
18
  include Workbook::Writers::HtmlTableWriter
18
19
 
20
+ delegate [:first, :last, :pop, :delete_at, :each, :collect, :each_with_index, :count, :index, :delete_if, :include?] => :@rows
21
+
19
22
  attr_accessor :name
23
+ attr_reader :rows
20
24
 
21
- def initialize row_cel_values=[], sheet=nil, options={}
22
- row_cel_values = [] if row_cel_values == nil
23
- row_cel_values.each_with_index do |r,ri|
25
+ def initialize row_cel_values = [], sheet = nil, options = {}
26
+ @rows = []
27
+ row_cel_values = [] if row_cel_values.nil?
28
+ row_cel_values.each_with_index do |r, ri|
24
29
  if r.is_a? Workbook::Row
25
30
  r.table = self
26
31
  else
27
- r = Workbook::Row.new(r,self, options)
32
+ r = Workbook::Row.new(r, self, options)
28
33
  end
29
34
  define_columns_with_row(r) if ri == 0
30
35
  end
@@ -44,9 +49,9 @@ module Workbook
44
49
  #
45
50
  # @return [Workbook::Row] The header
46
51
  def header
47
- if defined?(@header) and @header == false
52
+ if defined?(@header) && (@header == false)
48
53
  false
49
- elsif defined?(@header) and @header
54
+ elsif defined?(@header) && @header
50
55
  @header
51
56
  else
52
57
  first
@@ -59,10 +64,10 @@ module Workbook
59
64
  # @param [Workbook::Row, Integer] h should be the row or the index of this table's row
60
65
  # @return [Workbook::Row] The header
61
66
  def header= h
62
- if h.is_a? Numeric
63
- @header = self[h]
67
+ @header = if h.is_a? Numeric
68
+ self[h]
64
69
  else
65
- @header = h
70
+ h
66
71
  end
67
72
  end
68
73
 
@@ -70,7 +75,7 @@ module Workbook
70
75
  #
71
76
  # @return [Integer] The index of the header row (typically 0)
72
77
  def header_row_index
73
- self.index(self.header)
78
+ @rows.map(&:object_id).index(header.object_id)
74
79
  end
75
80
 
76
81
  def define_columns_with_row(r)
@@ -83,16 +88,15 @@ module Workbook
83
88
  #
84
89
  # @param [Array, Workbook::Row] cell_values is an array or row of cell values
85
90
  # @return [Workbook::Row] the newly created row
86
- def new_row cell_values=[]
87
- r = Workbook::Row.new(cell_values,self)
88
- return r
91
+ def new_row cell_values = []
92
+ Workbook::Row.new(cell_values, self)
89
93
  end
90
94
 
91
95
  def create_or_open_row_at index
92
96
  r = self[index]
93
- if r == nil
97
+ if r.nil?
94
98
  r = Workbook::Row.new
95
- r.table=(self)
99
+ r.table = self
96
100
  end
97
101
  r
98
102
  end
@@ -101,28 +105,40 @@ module Workbook
101
105
  #
102
106
  # @return [Workbook::Table] self
103
107
  def remove_empty_lines!
104
- self.delete_if{|r| r.nil? or r.compact.empty?}
108
+ delete_if { |r| r.nil? || r.compact.empty? }
105
109
  self
106
110
  end
107
111
 
108
112
  # Add row
109
- # @param [Workbook::Table, Array] row to add
110
- def push(row)
111
- row = Workbook::Row.new(row) if row.class == Array
112
- super(row)
113
- row.set_table(self)
113
+ # @param [Workbook::Table, Array] row(s) to add
114
+ def push(*args)
115
+ args.each do |arg|
116
+ self.<<(arg)
117
+ end
114
118
  end
119
+ alias_method :append, :push
115
120
 
116
121
  # Add row
117
122
  # @param [Workbook::Table, Array] row to add
118
123
  def <<(row)
119
- row = Workbook::Row.new(row) if row.class == Array
120
- super(row)
124
+ row = row.is_a?(Workbook::Row) ? row : Workbook::Row.new(row)
121
125
  row.set_table(self)
126
+ @rows << row
127
+ end
128
+
129
+ # Insert row
130
+ # @param [Integer] index where to add
131
+ # @param [Array, Workbook::Row] row(s) to add
132
+ def insert index, *rows
133
+ rows.each_with_index do |row, i|
134
+ row = row.is_a?(Workbook::Row) ? row : Workbook::Row.new(row)
135
+ row.set_table(self)
136
+ row.insert(index + i, row)
137
+ end
122
138
  end
123
139
 
124
140
  def has_contents?
125
- self.clone.remove_empty_lines!.count != 0
141
+ clone.remove_empty_lines!.count != 0
126
142
  end
127
143
 
128
144
  # Returns true if the row exists in this table
@@ -131,42 +147,43 @@ module Workbook
131
147
  # @return [Boolean] whether the row exist in this table
132
148
  def contains_row? row
133
149
  raise ArgumentError, "table should be a Workbook::Row (you passed a #{t.class})" unless row.is_a?(Workbook::Row)
134
- self.collect{|r| r.object_id}.include? row.object_id
150
+ collect { |r| r.object_id }.include? row.object_id
135
151
  end
136
152
 
137
153
  # Returns the sheet this table belongs to, creates a new sheet if none exists
138
154
  #
139
155
  # @return [Workbook::Sheet] The sheet this table belongs to
140
156
  def sheet
141
- return @sheet if defined?(@sheet) and !@sheet.nil?
142
- self.sheet= Workbook::Sheet.new(self)
157
+ return @sheet if defined?(@sheet) && !@sheet.nil?
158
+ self.sheet = Workbook::Sheet.new(self)
143
159
  end
144
160
 
145
161
  # Returns the sheet this table belongs to, creates a new sheet if none exists
146
162
  #
147
163
  # @param [Workbook::Sheet] sheet this table belongs to
148
164
  # @return [Workbook::Sheet] The sheet this table belongs to
149
- def sheet= sheet
150
- @sheet = sheet
151
- end
165
+ attr_writer :sheet
152
166
 
153
167
  # Removes all lines from this table
154
168
  #
155
169
  # @return [Workbook::Table] (self)
156
170
  def delete_all
157
- self.delete_if{|b| true}
171
+ delete_if { |b| true }
158
172
  end
159
173
 
160
174
  # clones itself *and* the rows it contains
161
175
  #
162
176
  # @return [Workbook::Table] The cloned table
163
177
  def clone
164
- t = self
165
- c = super
166
- c.delete_all
167
- t.each{|r| c << r.clone}
168
- c.header = c[header_row_index] if header_row_index
169
- return c
178
+ table_clone = super
179
+ @rows = @rows.map { |row|
180
+ cloned_row = row.clone
181
+ cloned_row.set_table(self)
182
+ cloned_row
183
+ }
184
+ self.header = @rows[header_row_index] if header_row_index
185
+ table_clone.header = table_clone.rows[header_row_index] if header_row_index
186
+ table_clone
170
187
  end
171
188
 
172
189
  # Overrides normal Array's []-function with support for symbols that identify a column based on the header-values
@@ -175,19 +192,25 @@ module Workbook
175
192
  # table[0] #=> <Row [a,2,3,4]> (first row)
176
193
  # table["A1"] #=> <Cell value="a"> (first cell of first row)
177
194
  #
178
- # @param [Fixnum, String] index_or_string to reference to either the row, or the cell
195
+ # @param [Integer, String] index_or_string to reference to either the row, or the cell
179
196
  # @return [Workbook::Row, Workbook::Cell, nil]
180
197
  def [] index_or_string
181
198
  if index_or_string.is_a? String
182
199
  match = index_or_string.match(/([A-Z]+)([0-9]*)/i)
183
200
  col_index = Workbook::Column.alpha_index_to_number_index(match[1])
184
- row_index = match[2].to_i - 1
185
- return self[row_index][col_index]
201
+ if match[2] == ""
202
+ columns[col_index]
203
+ else
204
+ row_index = match[2].to_i - 1
205
+ @rows[row_index][col_index]
206
+ end
207
+ elsif index_or_string.is_a? Symbol
208
+ header[index_or_string].column
186
209
  elsif index_or_string.is_a? Range
187
- collection = to_a[index_or_string].collect{|a| a.clone}
188
- return Workbook::Table.new collection
210
+ collection = @rows[index_or_string].collect { |a| a.clone }
211
+ Workbook::Table.new collection
189
212
  elsif index_or_string.is_a? Integer
190
- return to_a[index_or_string]
213
+ @rows[index_or_string]
191
214
  end
192
215
  end
193
216
 
@@ -198,7 +221,7 @@ module Workbook
198
221
  # `table[0] = <Row [a,2,3,4]>` (set first row)
199
222
  # `table["A1"] = 2` (set first cell of first row to 2)
200
223
  #
201
- # @param [Fixnum, String] index_or_string to reference to either the row, or the cell
224
+ # @param [Integer, String] index_or_string to reference to either the row, or the cell
202
225
  # @param [Workbook::Table, Array] new_value to set
203
226
  # @return [Workbook::Cell, nil]
204
227
  def []= index_or_string, new_value
@@ -206,65 +229,66 @@ module Workbook
206
229
  match = index_or_string.upcase.match(/([A-Z]*)([0-9]*)/)
207
230
  cell_index = Workbook::Column.alpha_index_to_number_index(match[1])
208
231
  row_index = match[2].to_i - 1
209
- self[row_index][cell_index].value = new_value
232
+ @rows[row_index][cell_index].value = new_value
210
233
  else
211
- row = new_value
212
- row = Workbook::Row.new(row) unless row.is_a? Workbook::Row
213
- super(index_or_string,row)
214
- row.set_table(self)
234
+ row = new_value.is_a?(Workbook::Row) ? new_value : Workbook::Row.new(new_value)
235
+ row.table = self
215
236
  end
216
237
  end
217
238
 
239
+ def == other
240
+ to_csv == other.to_csv
241
+ end
242
+
218
243
  # remove all the trailing empty-rows (returning a trimmed clone)
219
244
  #
220
245
  # @param [Integer] desired_row_length of the rows
221
246
  # @return [Workbook::Row] a trimmed clone of the array
222
- def trim desired_row_length=nil
223
- self.clone.trim!(desired_row_length)
247
+ def trim desired_row_length = nil
248
+ clone.trim!(desired_row_length)
224
249
  end
225
250
 
226
251
  # remove all the trailing empty-rows (returning a trimmed self)
227
252
  #
228
253
  # @param [Integer] desired_row_length of the new row
229
254
  # @return [Workbook::Row] self
230
- def trim! desired_row_length=nil
231
- max_length = self.collect{|a| a.trim.length }.max
232
- self_count = self.count-1
233
- self.count.times do |index|
255
+ def trim! desired_row_length = nil
256
+ max_length = collect { |a| a.trim.length }.max
257
+ self_count = count - 1
258
+ count.times do |index|
234
259
  index = self_count - index
235
- if self[index].trim.empty?
236
- self.delete_at(index)
260
+ if @rows[index].trim.empty?
261
+ delete_at(index)
237
262
  else
238
263
  break
239
264
  end
240
265
  end
241
- self.each{|a| a.trim!(max_length)}
266
+ each { |a| a.trim!(max_length) }
242
267
  self
243
268
  end
244
269
 
245
270
  # Returns The dimensions of this sheet based on longest row
246
271
  # @return [Array] x-width, y-height
247
272
  def dimensions
248
- height = self.count
249
- width = self.collect{|a| a.length}.max
250
- [width,height]
273
+ height = count
274
+ width = collect { |a| a.length }.max
275
+ [width, height]
251
276
  end
252
277
 
253
278
  # Returns an array of Column-classes describing the columns of this table
254
279
  # @return [Array<Column>] columns
255
280
  def columns
256
- @columns ||= header.collect do |header_cell|
281
+ @columns ||= header.collect { |header_cell|
257
282
  Column.new(self)
258
- end
283
+ }
259
284
  end
260
285
 
261
286
  # Returns an array of Column-classes describing the columns of this table
262
287
  # @param [Array<Column>] columns
263
288
  # @return [Array<Column>] columns
264
289
  def columns= columns
265
- columns.each{|c| c.table=self}
290
+ columns.each { |c| c.table = self }
266
291
  @columns = columns
267
292
  end
268
-
269
293
  end
270
294
  end
@@ -1,8 +1,7 @@
1
1
  # frozen_string_literal: true
2
-
3
- # -*- encoding : utf-8 -*-
4
2
  # frozen_string_literal: true
5
- require 'workbook/modules/raw_objects_storage'
3
+
4
+ require "workbook/modules/raw_objects_storage"
6
5
 
7
6
  module Workbook
8
7
  # Workbook::Template is a container for different Workbook::Format's and the storage of raw template data that isn't really supported by Workbook, but should survive a typical read/write cyclus.
@@ -25,9 +24,9 @@ module Workbook
25
24
  def add_format format
26
25
  if format.is_a? Workbook::Format
27
26
  if format.name
28
- @formats[format.name]=format
27
+ @formats[format.name] = format
29
28
  else
30
- @formats[@formats.keys.count]=format
29
+ @formats[@formats.keys.count] = format
31
30
  end
32
31
  else
33
32
  raise ArgumentError, "format should be a Workboot::Format"
@@ -36,31 +35,29 @@ module Workbook
36
35
 
37
36
  # Return the list of associated formats
38
37
  # @return [Hash] A keyed-hash of named formats
39
- def formats
40
- @formats
41
- end
38
+ attr_reader :formats
42
39
 
43
40
  # Create or find a format by name
44
41
  # @return [Workbook::Format] The new or found format
45
42
  # @param [String] name of the format (e.g. whatever you want, in diff names such as 'destroyed', 'updated' and 'created' are being used)
46
43
  # @param [Symbol] variant can also be a strftime formatting string (e.g. "%Y-%m-%d")
47
- def create_or_find_format_by name, variant=:default
44
+ def create_or_find_format_by name, variant = :default
48
45
  fs = @formats[name]
49
46
  fs = @formats[name] = {} if fs.nil?
50
47
  f = fs[variant]
51
48
  if f.nil?
52
- f = Workbook::Format.new
53
- if variant != :default and fs[:default]
54
- f = fs[:default].clone
49
+ @formats[name][variant] = if (variant != :default) && fs[:default]
50
+ fs[:default].clone
51
+ else
52
+ Workbook::Format.new
55
53
  end
56
- @formats[name][variant] = f
57
54
  end
58
- return @formats[name][variant]
55
+ @formats[name][variant]
59
56
  end
60
57
 
61
58
  def set_default_formats!
62
59
  header_fmt = create_or_find_format_by :header
63
- header_fmt[:font_weight] = 'bold'
60
+ header_fmt[:font_weight] = "bold"
64
61
  end
65
62
  end
66
63
  end
@@ -1,2 +1 @@
1
1
  # frozen_string_literal: true
2
-
@@ -1,2 +1 @@
1
1
  # frozen_string_literal: true
2
-
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'workbook/cell'
3
+ require "workbook/cell"
4
4
 
5
5
  module Workbook
6
6
  module Types
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'workbook/cell'
3
+ require "workbook/cell"
4
4
 
5
5
  module Workbook
6
6
  module Types
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'workbook/cell'
3
+ require "workbook/cell"
4
4
 
5
5
  module Workbook
6
6
  module Types
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'workbook/cell'
3
+ require "workbook/cell"
4
4
 
5
5
  module Workbook
6
6
  module Types
@@ -1,2 +1 @@
1
1
  # frozen_string_literal: true
2
-
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'workbook/cell'
3
+ require "workbook/cell"
4
4
 
5
5
  module Workbook
6
6
  module Types
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
-
3
- # -*- encoding : utf-8 -*-
4
2
  # frozen_string_literal: true
3
+
5
4
  module Workbook
6
- VERSION = '0.8.1'
5
+ VERSION = "0.8.2"
7
6
  end
@@ -1,8 +1,7 @@
1
1
  # frozen_string_literal: true
2
-
3
- # -*- encoding : utf-8 -*-
4
2
  # frozen_string_literal: true
5
- require 'csv'
3
+
4
+ require "csv"
6
5
 
7
6
  module Workbook
8
7
  module Writers
@@ -11,15 +10,14 @@ module Workbook
11
10
  #
12
11
  # @param [Hash] options (not used)
13
12
  # @return [String] csv (comma separated values in a string)
14
- def to_csv options={}
13
+ def to_csv options = {}
15
14
  csv = ""
16
- options = {}.merge options
17
- self.each_with_index do |r, ri|
18
- line=nil
15
+ @rows.each_with_index do |r, ri|
16
+ line = nil
19
17
  begin
20
- line = CSV::generate_line(r.collect{|c| c.value if c},{:row_sep=>""})
18
+ line = CSV.generate_line(r.cells.collect { |c| c&.value }, row_sep: "")
21
19
  rescue TypeError
22
- line = CSV::generate_line(r.collect{|c| c.value if c})
20
+ line = CSV.generate_line(r.cells.collect { |c| c&.value })
23
21
  end
24
22
  csv += "#{line}\n"
25
23
  end
@@ -31,11 +29,10 @@ module Workbook
31
29
  # @param [String] filename
32
30
  # @param [Hash] options see #to_csv
33
31
  # @return [String] filename
34
- def write_to_csv filename="#{title}.csv", options={}
35
- File.open(filename, 'w') {|f| f.write(to_csv(options)) }
36
- return filename
32
+ def write_to_csv filename = "untitled document.csv", options = {}
33
+ File.open(filename, "w") { |f| f.write(to_csv(options)) }
34
+ filename
37
35
  end
38
-
39
36
  end
40
37
  end
41
38
  end