write_xlsx 0.64.1 → 0.65.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/README.rdoc +10 -1
  3. data/examples/conditional_format.rb +251 -18
  4. data/examples/demo.rb +2 -3
  5. data/examples/macros.rb +42 -0
  6. data/examples/outline_collapsed.rb +160 -0
  7. data/examples/republic.png +0 -0
  8. data/examples/shape3.rb +2 -2
  9. data/examples/shape4.rb +5 -5
  10. data/examples/shape5.rb +6 -6
  11. data/examples/shape6.rb +6 -6
  12. data/examples/shape7.rb +11 -11
  13. data/examples/shape8.rb +10 -10
  14. data/examples/shape_all.rb +0 -0
  15. data/examples/vbaProject.bin +0 -0
  16. data/lib/write_xlsx/chart.rb +656 -56
  17. data/lib/write_xlsx/chartsheet.rb +26 -2
  18. data/lib/write_xlsx/format.rb +50 -27
  19. data/lib/write_xlsx/formats.rb +32 -0
  20. data/lib/write_xlsx/package/packager.rb +45 -238
  21. data/lib/write_xlsx/package/table.rb +9 -18
  22. data/lib/write_xlsx/package/xml_writer_simple.rb +26 -9
  23. data/lib/write_xlsx/sheets.rb +223 -0
  24. data/lib/write_xlsx/sparkline.rb +140 -4
  25. data/lib/write_xlsx/version.rb +1 -1
  26. data/lib/write_xlsx/workbook.rb +34 -121
  27. data/lib/write_xlsx/worksheet/data_validation.rb +291 -0
  28. data/lib/write_xlsx/worksheet/hyperlink.rb +111 -0
  29. data/lib/write_xlsx/worksheet/page_setup.rb +170 -0
  30. data/lib/write_xlsx/worksheet.rb +1112 -1334
  31. data/test/helper.rb +1 -1
  32. data/test/package/styles/test_styles_01.rb +1 -10
  33. data/test/package/styles/test_styles_02.rb +1 -10
  34. data/test/package/styles/test_styles_03.rb +1 -10
  35. data/test/package/styles/test_styles_04.rb +1 -10
  36. data/test/package/styles/test_styles_05.rb +1 -10
  37. data/test/package/styles/test_styles_06.rb +1 -10
  38. data/test/package/styles/test_styles_07.rb +1 -10
  39. data/test/package/styles/test_styles_08.rb +1 -10
  40. data/test/package/styles/test_styles_09.rb +1 -10
  41. data/test/perl_output/conditional_format.xlsx +0 -0
  42. data/test/perl_output/outline_collapsed.xlsx +0 -0
  43. data/test/perl_output/protection.xlsx +0 -0
  44. data/test/regression/test_chart_gap01.rb +47 -0
  45. data/test/regression/test_chart_gap02.rb +47 -0
  46. data/test/regression/test_chart_gap03.rb +47 -0
  47. data/test/regression/test_format05.rb +26 -0
  48. data/test/regression/test_rich_string12.rb +32 -0
  49. data/test/regression/xlsx_files/chart_gap01.xlsx +0 -0
  50. data/test/regression/xlsx_files/chart_gap02.xlsx +0 -0
  51. data/test/regression/xlsx_files/chart_gap03.xlsx +0 -0
  52. data/test/regression/xlsx_files/format05.xlsx +0 -0
  53. data/test/regression/xlsx_files/rich_string12.xlsx +0 -0
  54. data/test/test_example_match.rb +253 -20
  55. data/test/worksheet/test_set_column.rb +25 -0
  56. data/test/worksheet/test_worksheet_03.rb +1 -1
  57. data/test/worksheet/test_worksheet_04.rb +1 -1
  58. data/test/worksheet/test_write_array_formula_01.rb +7 -0
  59. data/test/worksheet/test_write_col_breaks.rb +2 -2
  60. data/test/worksheet/test_write_col_info.rb +8 -8
  61. data/test/worksheet/test_write_conditional_formatting.rb +4 -4
  62. data/test/worksheet/test_write_formula_does_not_change_formula_string.rb +18 -0
  63. data/test/worksheet/test_write_header_footer.rb +8 -3
  64. data/test/worksheet/test_write_hyperlink.rb +10 -5
  65. data/test/worksheet/test_write_merge_cells.rb +6 -6
  66. data/test/worksheet/test_write_page_set_up_pr.rb +1 -1
  67. data/test/worksheet/test_write_page_setup.rb +1 -1
  68. data/test/worksheet/test_write_row_breaks.rb +2 -2
  69. data/test/worksheet/test_write_row_element.rb +1 -1
  70. data/test/worksheet/test_write_sheet_pr.rb +2 -2
  71. data/test/worksheet/test_write_sheet_view.rb +0 -9
  72. data/test/worksheet/test_write_url.rb +19 -0
  73. data/test/worksheet/test_write_worksheet_attributes.rb +21 -0
  74. metadata +38 -5
  75. data/lib/write_xlsx/worksheet/print_style.rb +0 -51
  76. data/test/worksheet/test_write_worksheet.rb +0 -19
@@ -24,7 +24,7 @@ module Writexlsx
24
24
  @chart = nil
25
25
  @charts = [1]
26
26
  @zoom_scale_normal = 0
27
- @print_style.orientation = false
27
+ @page_setup.orientation = false
28
28
  end
29
29
 
30
30
  #
@@ -134,6 +134,26 @@ module Writexlsx
134
134
  @chart.show_hidden_data(*args)
135
135
  end
136
136
 
137
+ def set_size(*args)
138
+ @chart.set_size(*args)
139
+ end
140
+
141
+ def set_table(*args)
142
+ @chart.set_table(*args)
143
+ end
144
+
145
+ def set_up_down_bars(*args)
146
+ @chart.set_up_down_bars(*args)
147
+ end
148
+
149
+ def set_drop_lines(*args)
150
+ @chart.set_drop_lines(*args)
151
+ end
152
+
153
+ def set_high_low_lines(*args)
154
+ @chart.set_high_low_lines(*args)
155
+ end
156
+
137
157
  #
138
158
  # Set up chart/drawings.
139
159
  #
@@ -142,13 +162,17 @@ module Writexlsx
142
162
 
143
163
  drawing = Drawing.new
144
164
  @drawing = drawing
145
- @drawing.orientation = @print_style.orientation
165
+ @drawing.orientation = @page_setup.orientation
146
166
 
147
167
  @external_drawing_links << [ '/drawing', "../drawings/drawing#{drawing_id}.xml" ]
148
168
 
149
169
  @drawing_links << [ '/chart', "../charts/chart#{chart_id}.xml"]
150
170
  end
151
171
 
172
+ def external_links
173
+ [@external_drawing_links]
174
+ end
175
+
152
176
  private
153
177
 
154
178
  #
@@ -174,9 +174,8 @@ module Writexlsx
174
174
  attr_accessor :dxf_bg_color, :dxf_fg_color # :nodoc:
175
175
  attr_reader :rotation, :bold, :italic, :font_strikeout
176
176
 
177
- def initialize(xf_format_indices = {}, dxf_format_indices = {}, params = {}) # :nodoc:
178
- @xf_format_indices = xf_format_indices
179
- @dxf_format_indices = dxf_format_indices
177
+ def initialize(formats, params = {}) # :nodoc:
178
+ @formats = formats
180
179
 
181
180
  @xf_index = nil
182
181
  @dxf_index = nil
@@ -250,7 +249,6 @@ module Writexlsx
250
249
  reserve = [
251
250
  :xf_index,
252
251
  :dxf_index,
253
- :xf_format_indices,
254
252
  :xdf_format_indices,
255
253
  :palette
256
254
  ]
@@ -446,18 +444,10 @@ module Writexlsx
446
444
  def get_xf_index
447
445
  if @xf_index
448
446
  @xf_index
447
+ elsif @formats.xf_index_by_key(get_format_key)
448
+ @formats.xf_index_by_key(get_format_key)
449
449
  else
450
- key = get_format_key
451
- indices_href = @xf_format_indices
452
-
453
- if indices_href[key]
454
- indices_href[key]
455
- else
456
- index = 1 + indices_href.keys.size
457
- indices_href[key] = index
458
- @xf_index = index
459
- index
460
- end
450
+ @xf_index = @formats.set_xf_index_by_key(get_format_key)
461
451
  end
462
452
  end
463
453
 
@@ -466,19 +456,11 @@ module Writexlsx
466
456
  #
467
457
  def get_dxf_index
468
458
  if @dxf_index
469
- @dxf_index
459
+ @dxf_index
460
+ elsif @formats.dxf_index_by_key(get_format_key)
461
+ @formats.dxf_index_by_key(get_format_key)
470
462
  else
471
- key = get_format_key
472
- indices = @dxf_format_indices
473
-
474
- if indices[key]
475
- indices[key]
476
- else
477
- index = indices.size
478
- indices[key] = index
479
- @dxf_index = index
480
- index
481
- end
463
+ @dxf_index = @formats.set_dxf_index_by_key(get_format_key)
482
464
  end
483
465
  end
484
466
 
@@ -752,5 +734,46 @@ module Writexlsx
752
734
  def [](attr)
753
735
  self.instance_variable_get("@#{attr}")
754
736
  end
737
+
738
+ def write_font(writer, worksheet) #:nodoc:
739
+ writer.tag_elements('rPr') do
740
+ writer.empty_tag('b') if bold?
741
+ writer.empty_tag('i') if italic?
742
+ writer.empty_tag('strike') if strikeout?
743
+ writer.empty_tag('outline') if outline?
744
+ writer.empty_tag('shadow') if shadow?
745
+
746
+ # Handle the underline variants.
747
+ write_underline(writer, underline) if underline?
748
+
749
+ write_vert_align(writer, 'superscript') if font_script == 1
750
+ write_vert_align(writer, 'subscript') if font_script == 2
751
+
752
+ writer.empty_tag('sz', ['val', size])
753
+
754
+ if ptrue?(theme)
755
+ write_color(writer, 'theme', theme)
756
+ elsif ptrue?(@color)
757
+ color = worksheet.get_palette_color(@color)
758
+ write_color(writer, 'rgb', color)
759
+ else
760
+ write_color(writer, 'theme', 1)
761
+ end
762
+
763
+ writer.empty_tag('rFont', ['val', font])
764
+ writer.empty_tag('family', ['val', font_family])
765
+
766
+ if font == 'Calibri' && hyperlink == 0
767
+ writer.empty_tag('scheme', ['val', font_scheme])
768
+ end
769
+ end
770
+ end
771
+
772
+ #
773
+ # Write the <vertAlign> font sub-element.
774
+ #
775
+ def write_vert_align(writer, val) #:nodoc:
776
+ writer.empty_tag('vertAlign', ['val', val])
777
+ end
755
778
  end
756
779
  end
@@ -0,0 +1,32 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'write_xlsx/package/xml_writer_simple'
3
+
4
+ module Writexlsx
5
+ class Formats
6
+ include Writexlsx::Utility
7
+
8
+ attr_reader :formats, :xf_format_indices, :dxf_format_indices
9
+
10
+ def initialize
11
+ @formats = []
12
+ @xf_format_indices = {}
13
+ @dxf_format_indices = {}
14
+ end
15
+
16
+ def xf_index_by_key(key)
17
+ @xf_format_indices[key]
18
+ end
19
+
20
+ def set_xf_index_by_key(key)
21
+ @xf_format_indices[key] ||= 1 + @xf_format_indices.size
22
+ end
23
+
24
+ def dxf_index_by_key(key)
25
+ @dxf_format_indices[key]
26
+ end
27
+
28
+ def set_dxf_index_by_key(key)
29
+ @dxf_format_indices[key] ||= @dxf_format_indices.size
30
+ end
31
+ end
32
+ end
@@ -18,43 +18,17 @@ module Writexlsx
18
18
 
19
19
  include Writexlsx::Utility
20
20
 
21
- def initialize
22
- @package_dir = ''
23
- @workbook = nil
24
- @sheet_names = []
25
- @worksheet_count = 0
26
- @chartsheet_count = 0
27
- @chart_count = 0
28
- @drawing_count = 0
29
- @table_count = 0
30
- @named_ranges = []
21
+ def initialize(workbook)
22
+ @workbook = workbook
23
+ @package_dir = ''
24
+ @table_count = @workbook.worksheets.tables_count
25
+ @named_ranges = []
31
26
  end
32
27
 
33
28
  def set_package_dir(package_dir)
34
29
  @package_dir = package_dir
35
30
  end
36
31
 
37
- #
38
- # Add the Workbook object to the package.
39
- #
40
- def add_workbook(workbook)
41
- @workbook = workbook
42
- @sheet_names = workbook.sheetnames
43
- @chart_count = workbook.charts.size
44
- @drawing_count = workbook.drawings.size
45
- @num_vml_files = workbook.num_vml_files
46
- @num_comment_files = workbook.num_comment_files
47
- @named_ranges = workbook.named_ranges
48
-
49
- workbook.worksheets.each do |worksheet|
50
- if worksheet.is_chartsheet?
51
- @chartsheet_count += 1
52
- else
53
- @worksheet_count += 1
54
- end
55
- end
56
- end
57
-
58
32
  #
59
33
  # Write the xml files that make up the XLXS OPC package.
60
34
  #
@@ -98,27 +72,12 @@ module Writexlsx
98
72
  # Write the worksheet files.
99
73
  #
100
74
  def write_worksheet_files
101
- FileUtils.mkdir_p("#{@package_dir}/xl/worksheets")
102
-
103
- index = 1
104
- @workbook.worksheets.each do |worksheet|
105
- next if worksheet.is_chartsheet?
106
- worksheet.set_xml_writer("#{@package_dir}/xl/worksheets/sheet#{index}.xml")
107
- index += 1
108
- worksheet.assemble_xml_file
109
- end
75
+ @workbook.worksheets.write_worksheet_files(@package_dir)
110
76
  end
111
77
 
112
78
  #
113
79
  def write_chartsheet_files
114
- index = 1
115
- @workbook.worksheets.each do |worksheet|
116
- next unless worksheet.is_chartsheet?
117
- FileUtils.mkdir_p("#{@package_dir}/xl/chartsheets")
118
- worksheet.set_xml_writer("#{@package_dir}/xl/chartsheets/sheet#{index}.xml")
119
- index += 1
120
- worksheet.assemble_xml_file
121
- end
80
+ @workbook.worksheets.write_chartsheet_files(@package_dir)
122
81
  end
123
82
 
124
83
  #
@@ -136,14 +95,11 @@ module Writexlsx
136
95
  end
137
96
 
138
97
  def write_chart_or_drawing_files(objects, filename)
139
- return if objects.empty?
140
-
141
- FileUtils.mkdir_p("#{@package_dir}/xl/#{filename}s")
98
+ dir = "#{@package_dir}/xl/#{filename}s"
142
99
 
143
- index = 1
144
- objects.each do |object|
145
- object.set_xml_writer("#{@package_dir}/xl/#{filename}s/#{filename}#{index}.xml")
146
- index += 1
100
+ objects.each_with_index do |object, index|
101
+ FileUtils.mkdir_p(dir)
102
+ object.set_xml_writer("#{dir}/#{filename}#{index+1}.xml")
147
103
  object.assemble_xml_file
148
104
  end
149
105
  end
@@ -152,33 +108,14 @@ module Writexlsx
152
108
  # Write the comment VML files.
153
109
  #
154
110
  def write_vml_files
155
- index = 1
156
- @workbook.worksheets.each do |worksheet|
157
- next unless worksheet.has_vml?
158
- FileUtils.mkdir_p("#{@package_dir}/xl/drawings")
159
-
160
- vml = Package::Vml.new
161
- vml.set_xml_writer("#{@package_dir}/xl/drawings/vmlDrawing#{index}.vml")
162
- index += 1
163
- vml.assemble_xml_file(worksheet)
164
- end
111
+ @workbook.worksheets.write_vml_files(@package_dir)
165
112
  end
166
113
 
167
114
  #
168
115
  # Write the comment files.
169
116
  #
170
117
  def write_comment_files
171
- index = 1
172
- @workbook.worksheets.each do |worksheet|
173
- next unless worksheet.has_comments?
174
-
175
- FileUtils.mkdir_p("#{@package_dir}/xl/drawings")
176
-
177
- worksheet.comments_xml_writer = "#{@package_dir}/xl/comments#{index}.xml"
178
- index += 1
179
-
180
- worksheet.comments_assemble_xml_file
181
- end
118
+ @workbook.worksheets.write_comment_files(@package_dir)
182
119
  end
183
120
 
184
121
  #
@@ -206,31 +143,27 @@ module Writexlsx
206
143
  FileUtils.mkdir_p("#{@package_dir}/docProps")
207
144
 
208
145
  # Add the Worksheet heading pairs.
209
- app.add_heading_pair(['Worksheets', @worksheet_count])
146
+ app.add_heading_pair(['Worksheets', @workbook.worksheets.reject {|s| s.is_chartsheet?}.count])
210
147
 
211
148
  # Add the Chartsheet heading pairs.
212
- app.add_heading_pair(['Charts', @chartsheet_count])
149
+ app.add_heading_pair(['Charts', @workbook.chartsheet_count])
213
150
 
214
151
  # Add the Worksheet parts.
215
- @workbook.worksheets.each do |worksheet|
216
- next if worksheet.is_chartsheet?
217
- app.add_part_name(worksheet.name)
218
- end
152
+ @workbook.worksheets.reject { |sheet| sheet.is_chartsheet? }.
153
+ each { |sheet| app.add_part_name(sheet.name) }
219
154
 
220
155
  # Add the Chartsheet parts.
221
- @workbook.worksheets.each do |worksheet|
222
- next unless worksheet.is_chartsheet?
223
- app.add_part_name(worksheet.name)
224
- end
156
+ @workbook.worksheets.select { |sheet| sheet.is_chartsheet? }.
157
+ each { |sheet| app.add_part_name(sheet.name) }
225
158
 
226
159
  # Add the Named Range heading pairs.
227
- range_count = @named_ranges.size
160
+ range_count = @workbook.named_ranges.size
228
161
  if range_count != 0
229
162
  app.add_heading_pair([ 'Named Ranges', range_count ])
230
163
  end
231
164
 
232
165
  # Add the Named Ranges parts.
233
- @named_ranges.each { |named_range| app.add_part_name(named_range) }
166
+ @workbook.named_ranges.each { |named_range| app.add_part_name(named_range) }
234
167
 
235
168
  app.set_properties(properties)
236
169
 
@@ -258,27 +191,23 @@ module Writexlsx
258
191
  content = Package::ContentTypes.new
259
192
 
260
193
  content.add_image_types(@workbook.image_types)
261
-
262
- worksheet_index = 1
263
- chartsheet_index = 1
264
- @workbook.worksheets.each do |worksheet|
265
- if worksheet.is_chartsheet?
266
- content.add_chartsheet_name("sheet#{chartsheet_index}")
267
- chartsheet_index += 1
268
- else
269
- content.add_worksheet_name("sheet#{worksheet_index}")
270
- worksheet_index += 1
271
- end
194
+ @workbook.worksheets.reject { |sheet| sheet.is_chartsheet? }.
195
+ each_with_index do |sheet, index|
196
+ content.add_worksheet_name("sheet#{index+1}")
197
+ end
198
+ @workbook.worksheets.select { |sheet| sheet.is_chartsheet? }.
199
+ each_with_index do |sheet, index|
200
+ content.add_chartsheet_name("sheet#{index+1}")
272
201
  end
273
202
 
274
- (1 .. @chart_count).each { |i| content.add_chart_name("chart#{i}") }
275
- (1 .. @drawing_count).each { |i| content.add_drawing_name("drawing#{i}") }
203
+ (1 .. @workbook.charts.size).each { |i| content.add_chart_name("chart#{i}") }
204
+ (1 .. @workbook.drawings.size).each { |i| content.add_drawing_name("drawing#{i}") }
276
205
 
277
- content.add_vml_name if @num_vml_files > 0
206
+ content.add_vml_name if @workbook.num_vml_files > 0
278
207
 
279
208
  (1 .. @table_count).each { |i| content.add_table_name("table#{i}") }
280
209
 
281
- (1 .. @num_comment_files).each { |i| content.add_comment_name("comments#{i}") }
210
+ (1 .. @workbook.num_comment_files).each { |i| content.add_comment_name("comments#{i}") }
282
211
 
283
212
  # Add the sharedString rel if there is string data in the workbook.
284
213
  content.add_shared_strings unless @workbook.shared_strings_empty?
@@ -294,32 +223,15 @@ module Writexlsx
294
223
  # Write the style xml file.
295
224
  #
296
225
  def write_styles_file
297
- dir = @package_dir
298
- xf_formats = @workbook.xf_formats
299
- palette = @workbook.palette
300
- font_count = @workbook.font_count
301
- num_format_count = @workbook.num_format_count
302
- border_count = @workbook.border_count
303
- fill_count = @workbook.fill_count
304
- custom_colors = @workbook.custom_colors
305
- dxf_formats = @workbook.dxf_formats
226
+ dir = "#{@package_dir}/xl"
306
227
 
307
228
  rels = Package::Styles.new
308
229
 
309
- FileUtils.mkdir_p("#{@package_dir}/xl")
230
+ FileUtils.mkdir_p(dir)
310
231
 
311
- rels.set_style_properties(
312
- xf_formats,
313
- palette,
314
- font_count,
315
- num_format_count,
316
- border_count,
317
- fill_count,
318
- custom_colors,
319
- dxf_formats
320
- )
321
-
322
- rels.set_xml_writer("#{@package_dir}/xl/styles.xml" )
232
+ rels.set_style_properties(*@workbook.style_properties)
233
+
234
+ rels.set_xml_writer("#{dir}/styles.xml" )
323
235
  rels.assemble_xml_file
324
236
  end
325
237
 
@@ -339,23 +251,7 @@ module Writexlsx
339
251
  # Write the table files.
340
252
  #
341
253
  def write_table_files
342
- dir = @package_dir
343
-
344
- index = 1
345
- @workbook.worksheets.each do |worksheet|
346
- table_props = worksheet.tables
347
-
348
- next if table_props.empty?
349
-
350
- FileUtils.mkdir_p("#{dir}/xl/tables")
351
-
352
- table_props.each do |table|
353
- table.set_xml_writer("#{dir}/xl/tables/table#{index}.xml")
354
- table.assemble_xml_file
355
- index += 1
356
- @table_count += 1
357
- end
358
- end
254
+ @workbook.worksheets.write_table_files(@package_dir)
359
255
  end
360
256
 
361
257
  #
@@ -415,103 +311,21 @@ module Writexlsx
415
311
  # data such as hyperlinks or drawings.
416
312
  #
417
313
  def write_worksheet_rels_files
418
- existing_rels_dir = false
419
-
420
- index = 0
421
- @workbook.worksheets.each do |worksheet|
422
- next if worksheet.is_chartsheet?
423
-
424
- index += 1
425
-
426
- external_links = [
427
- worksheet.external_hyper_links,
428
- worksheet.external_drawing_links,
429
- worksheet.external_vml_links,
430
- worksheet.external_table_links,
431
- worksheet.external_comment_links
432
- ].select {|a| a != []}
433
-
434
- next if external_links.size == 0
435
-
436
- # Create the worksheet .rels dir if required.
437
- if !existing_rels_dir
438
- FileUtils.mkdir_p("#{@package_dir}/xl/worksheets")
439
- FileUtils.mkdir_p("#{@package_dir}/xl/worksheets/_rels")
440
- existing_rels_dir = true
441
- end
442
-
443
- rels = Package::Relationships.new
444
-
445
- external_links.each do |link_datas|
446
- link_datas.each do |link_data|
447
- type, target, target_mode = link_data
448
- rels.add_worksheet_relationship(type, target, target_mode)
449
- end
450
- end
451
-
452
- # Create the .rels file such as /xl/worksheets/_rels/sheet1.xml.rels.
453
- rels.set_xml_writer(
454
- "#{@package_dir}/xl/worksheets/_rels/sheet#{index}.xml.rels")
455
- rels.assemble_xml_file
456
- end
314
+ @workbook.worksheets.write_worksheet_rels_files(@package_dir)
457
315
  end
458
316
 
459
317
  #
460
318
  # Write the chartsheet .rels files for links to drawing files.
461
319
  #
462
320
  def write_chartsheet_rels_files
463
- existing_rels_dir = false
464
- index = 0
465
- @workbook.worksheets.each do |worksheet|
466
- next unless worksheet.is_chartsheet?
467
- index += 1
468
-
469
- external_links = worksheet.external_drawing_links
470
-
471
- next if external_links.empty?
472
-
473
- # Create the chartsheet .rels dir if required.
474
- if !existing_rels_dir
475
- FileUtils.mkdir_p("#{@package_dir}/xl/chartsheets/_rels")
476
- existing_rels_dir = true
477
- end
478
-
479
- rels = Package::Relationships.new
480
-
481
- external_links.each do |link_data|
482
- rels.add_worksheet_relationship(*link_data)
483
- end
484
-
485
- # Create the .rels file such as /xl/chartsheets/_rels/sheet1.xml.rels.
486
- rels.set_xml_writer(
487
- "#{@package_dir}/xl/chartsheets/_rels/sheet#{index}.xml.rels")
488
- rels.assemble_xml_file
489
- end
321
+ @workbook.worksheets.write_chartsheet_rels_files(@package_dir)
490
322
  end
491
323
 
492
324
  #
493
325
  # Write the drawing .rels files for worksheets that contain charts or drawings.
494
326
  #
495
327
  def write_drawing_rels_files
496
- index = 0
497
- @workbook.worksheets.each do |worksheet|
498
- next if worksheet.drawing_links.empty?
499
- index += 1
500
-
501
- # Create the drawing .rels dir if required.
502
- FileUtils.mkdir_p("#{@package_dir}/xl/drawings/_rels")
503
-
504
- rels = Package::Relationships.new
505
-
506
- worksheet.drawing_links.each do |drawing_data|
507
- rels.add_document_relationship(*drawing_data)
508
- end
509
-
510
- # Create the .rels file such as /xl/drawings/_rels/sheet1.xml.rels.
511
- rels.set_xml_writer(
512
- "#{@package_dir}/xl/drawings/_rels/drawing#{index}.xml.rels")
513
- rels.assemble_xml_file
514
- end
328
+ @workbook.worksheets.write_drawing_rels_files(@package_dir)
515
329
  end
516
330
 
517
331
 
@@ -519,18 +333,11 @@ module Writexlsx
519
333
  # Write the /xl/media/image?.xml files.
520
334
  #
521
335
  def add_image_files
522
- return if @workbook.images.empty?
523
-
524
- index = 1
525
-
526
- FileUtils.mkdir_p("#{@package_dir}/xl/media")
527
-
528
- @workbook.images.each do |image|
529
- filename = image[0]
530
- extension = ".#{image[1]}"
336
+ dir = "#{@package_dir}/xl/media"
531
337
 
532
- FileUtils.cp(filename, "#{@package_dir}/xl/media/image#{index}#{extension}")
533
- index += 1
338
+ @workbook.images.each_with_index do |image, index|
339
+ FileUtils.mkdir_p(dir)
340
+ FileUtils.cp(image[0], "#{dir}/image#{index+1}.#{image[1]}")
534
341
  end
535
342
  end
536
343
 
@@ -24,7 +24,7 @@ module Writexlsx
24
24
  end
25
25
  end
26
26
 
27
- attr_reader :id
27
+ # attr_reader :id
28
28
 
29
29
  def initialize(worksheet, id, *args)
30
30
  @worksheet = worksheet
@@ -61,16 +61,11 @@ module Writexlsx
61
61
  def assemble_xml_file
62
62
  write_xml_declaration
63
63
  # Write the table element.
64
- write_table
65
- # Write the autoFilter element.
66
- write_auto_filter
67
- # Write the tableColumns element.
68
- write_table_columns
69
- # Write the tableStyleInfo element.
70
- write_table_style_info
71
-
72
- # Close the table tag
73
- @writer.end_tag('table')
64
+ @writer.tag_elements('table', write_table_attributes) do
65
+ write_auto_filter
66
+ write_table_columns
67
+ write_table_style_info
68
+ end
74
69
 
75
70
  # Close the XML writer object and filehandle.
76
71
  @writer.crlf
@@ -290,7 +285,7 @@ module Writexlsx
290
285
  @name = @param[:name]
291
286
  else
292
287
  # Set a default name.
293
- @name = "Table#{id}"
288
+ @name = "Table#{@id}"
294
289
  end
295
290
  end
296
291
 
@@ -310,16 +305,13 @@ module Writexlsx
310
305
  @writer.xml_decl('UTF-8', 1)
311
306
  end
312
307
 
313
- #
314
- # Write the <table> element.
315
- #
316
- def write_table
308
+ def write_table_attributes
317
309
  schema = 'http://schemas.openxmlformats.org/'
318
310
  xmlns = "#{schema}spreadsheetml/2006/main"
319
311
 
320
312
  attributes = [
321
313
  'xmlns', xmlns,
322
- 'id', id,
314
+ 'id', @id,
323
315
  'name', @name,
324
316
  'displayName', @name,
325
317
  'ref', @range
@@ -334,7 +326,6 @@ module Writexlsx
334
326
  else
335
327
  attributes << 'totalsRowShown' << 0
336
328
  end
337
- @writer.start_tag('table', attributes)
338
329
  end
339
330
 
340
331
  #