caxlsx 3.2.0 → 3.3.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 (300) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +9 -9
  3. data/.yardopts_guide +18 -18
  4. data/CHANGELOG.md +385 -354
  5. data/LICENSE +21 -21
  6. data/README.md +165 -168
  7. data/Rakefile +29 -29
  8. data/examples/generate.rb +15 -15
  9. data/lib/axlsx/content_type/abstract_content_type.rb +32 -32
  10. data/lib/axlsx/content_type/content_type.rb +26 -26
  11. data/lib/axlsx/content_type/default.rb +25 -25
  12. data/lib/axlsx/content_type/override.rb +25 -25
  13. data/lib/axlsx/doc_props/app.rb +235 -235
  14. data/lib/axlsx/doc_props/core.rb +39 -39
  15. data/lib/axlsx/drawing/area_chart.rb +99 -99
  16. data/lib/axlsx/drawing/area_series.rb +110 -110
  17. data/lib/axlsx/drawing/ax_data_source.rb +26 -26
  18. data/lib/axlsx/drawing/axes.rb +61 -61
  19. data/lib/axlsx/drawing/axis.rb +190 -190
  20. data/lib/axlsx/drawing/bar_3D_chart.rb +148 -148
  21. data/lib/axlsx/drawing/bar_chart.rb +138 -138
  22. data/lib/axlsx/drawing/bar_series.rb +97 -97
  23. data/lib/axlsx/drawing/bubble_chart.rb +59 -59
  24. data/lib/axlsx/drawing/bubble_series.rb +63 -63
  25. data/lib/axlsx/drawing/cat_axis.rb +85 -85
  26. data/lib/axlsx/drawing/chart.rb +299 -276
  27. data/lib/axlsx/drawing/d_lbls.rb +91 -90
  28. data/lib/axlsx/drawing/drawing.rb +167 -167
  29. data/lib/axlsx/drawing/graphic_frame.rb +54 -54
  30. data/lib/axlsx/drawing/hyperlink.rb +100 -100
  31. data/lib/axlsx/drawing/line_3D_chart.rb +68 -68
  32. data/lib/axlsx/drawing/line_chart.rb +99 -99
  33. data/lib/axlsx/drawing/line_series.rb +110 -110
  34. data/lib/axlsx/drawing/marker.rb +84 -84
  35. data/lib/axlsx/drawing/num_data.rb +52 -52
  36. data/lib/axlsx/drawing/num_data_source.rb +62 -62
  37. data/lib/axlsx/drawing/num_val.rb +34 -34
  38. data/lib/axlsx/drawing/one_cell_anchor.rb +99 -99
  39. data/lib/axlsx/drawing/pic.rb +211 -211
  40. data/lib/axlsx/drawing/picture_locking.rb +42 -42
  41. data/lib/axlsx/drawing/pie_3D_chart.rb +47 -47
  42. data/lib/axlsx/drawing/pie_series.rb +74 -74
  43. data/lib/axlsx/drawing/scaling.rb +60 -60
  44. data/lib/axlsx/drawing/scatter_chart.rb +74 -74
  45. data/lib/axlsx/drawing/scatter_series.rb +129 -129
  46. data/lib/axlsx/drawing/ser_axis.rb +45 -45
  47. data/lib/axlsx/drawing/series.rb +69 -69
  48. data/lib/axlsx/drawing/series_title.rb +25 -25
  49. data/lib/axlsx/drawing/str_data.rb +42 -42
  50. data/lib/axlsx/drawing/str_val.rb +34 -34
  51. data/lib/axlsx/drawing/title.rb +107 -97
  52. data/lib/axlsx/drawing/two_cell_anchor.rb +97 -97
  53. data/lib/axlsx/drawing/val_axis.rb +37 -37
  54. data/lib/axlsx/drawing/view_3D.rb +115 -115
  55. data/lib/axlsx/drawing/vml_drawing.rb +42 -42
  56. data/lib/axlsx/drawing/vml_shape.rb +66 -66
  57. data/lib/axlsx/package.rb +398 -388
  58. data/lib/axlsx/rels/relationship.rb +130 -130
  59. data/lib/axlsx/rels/relationships.rb +32 -32
  60. data/lib/axlsx/stylesheet/border.rb +73 -73
  61. data/lib/axlsx/stylesheet/border_pr.rb +71 -71
  62. data/lib/axlsx/stylesheet/cell_alignment.rb +132 -132
  63. data/lib/axlsx/stylesheet/cell_protection.rb +41 -41
  64. data/lib/axlsx/stylesheet/cell_style.rb +72 -72
  65. data/lib/axlsx/stylesheet/color.rb +76 -76
  66. data/lib/axlsx/stylesheet/dxf.rb +79 -79
  67. data/lib/axlsx/stylesheet/fill.rb +35 -35
  68. data/lib/axlsx/stylesheet/font.rb +156 -156
  69. data/lib/axlsx/stylesheet/gradient_fill.rb +103 -103
  70. data/lib/axlsx/stylesheet/gradient_stop.rb +37 -37
  71. data/lib/axlsx/stylesheet/num_fmt.rb +86 -86
  72. data/lib/axlsx/stylesheet/pattern_fill.rb +73 -73
  73. data/lib/axlsx/stylesheet/styles.rb +535 -494
  74. data/lib/axlsx/stylesheet/table_style.rb +54 -54
  75. data/lib/axlsx/stylesheet/table_style_element.rb +77 -77
  76. data/lib/axlsx/stylesheet/table_styles.rb +46 -46
  77. data/lib/axlsx/stylesheet/xf.rb +147 -147
  78. data/lib/axlsx/util/accessors.rb +64 -64
  79. data/lib/axlsx/util/constants.rb +416 -410
  80. data/lib/axlsx/util/mime_type_utils.rb +11 -11
  81. data/lib/axlsx/util/options_parser.rb +16 -16
  82. data/lib/axlsx/util/serialized_attributes.rb +89 -89
  83. data/lib/axlsx/util/simple_typed_list.rb +179 -179
  84. data/lib/axlsx/util/storage.rb +146 -146
  85. data/lib/axlsx/util/validators.rb +312 -312
  86. data/lib/axlsx/util/zip_command.rb +73 -73
  87. data/lib/axlsx/version.rb +5 -5
  88. data/lib/axlsx/workbook/defined_name.rb +128 -128
  89. data/lib/axlsx/workbook/defined_names.rb +21 -21
  90. data/lib/axlsx/workbook/shared_strings_table.rb +77 -77
  91. data/lib/axlsx/workbook/workbook.rb +425 -395
  92. data/lib/axlsx/workbook/workbook_view.rb +80 -80
  93. data/lib/axlsx/workbook/workbook_views.rb +22 -22
  94. data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +77 -77
  95. data/lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb +94 -94
  96. data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +244 -244
  97. data/lib/axlsx/workbook/worksheet/border_creator.rb +76 -0
  98. data/lib/axlsx/workbook/worksheet/break.rb +35 -35
  99. data/lib/axlsx/workbook/worksheet/cell.rb +532 -506
  100. data/lib/axlsx/workbook/worksheet/cell_serializer.rb +164 -164
  101. data/lib/axlsx/workbook/worksheet/cfvo.rb +60 -60
  102. data/lib/axlsx/workbook/worksheet/cfvos.rb +18 -18
  103. data/lib/axlsx/workbook/worksheet/col.rb +145 -145
  104. data/lib/axlsx/workbook/worksheet/col_breaks.rb +35 -35
  105. data/lib/axlsx/workbook/worksheet/color_scale.rb +110 -110
  106. data/lib/axlsx/workbook/worksheet/cols.rb +23 -23
  107. data/lib/axlsx/workbook/worksheet/comment.rb +91 -91
  108. data/lib/axlsx/workbook/worksheet/comments.rb +82 -82
  109. data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +82 -82
  110. data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +220 -220
  111. data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +25 -25
  112. data/lib/axlsx/workbook/worksheet/data_bar.rb +129 -129
  113. data/lib/axlsx/workbook/worksheet/data_validation.rb +267 -246
  114. data/lib/axlsx/workbook/worksheet/data_validations.rb +28 -28
  115. data/lib/axlsx/workbook/worksheet/date_time_converter.rb +30 -30
  116. data/lib/axlsx/workbook/worksheet/dimension.rb +64 -64
  117. data/lib/axlsx/workbook/worksheet/header_footer.rb +52 -52
  118. data/lib/axlsx/workbook/worksheet/icon_set.rb +81 -81
  119. data/lib/axlsx/workbook/worksheet/merged_cells.rb +37 -37
  120. data/lib/axlsx/workbook/worksheet/outline_pr.rb +33 -33
  121. data/lib/axlsx/workbook/worksheet/page_margins.rb +97 -97
  122. data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +44 -44
  123. data/lib/axlsx/workbook/worksheet/page_setup.rb +240 -240
  124. data/lib/axlsx/workbook/worksheet/pane.rb +139 -139
  125. data/lib/axlsx/workbook/worksheet/pivot_table.rb +335 -296
  126. data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +66 -66
  127. data/lib/axlsx/workbook/worksheet/pivot_tables.rb +24 -24
  128. data/lib/axlsx/workbook/worksheet/print_options.rb +39 -39
  129. data/lib/axlsx/workbook/worksheet/protected_range.rb +47 -47
  130. data/lib/axlsx/workbook/worksheet/protected_ranges.rb +37 -37
  131. data/lib/axlsx/workbook/worksheet/rich_text.rb +55 -55
  132. data/lib/axlsx/workbook/worksheet/rich_text_run.rb +250 -250
  133. data/lib/axlsx/workbook/worksheet/row.rb +164 -164
  134. data/lib/axlsx/workbook/worksheet/row_breaks.rb +33 -33
  135. data/lib/axlsx/workbook/worksheet/selection.rb +101 -101
  136. data/lib/axlsx/workbook/worksheet/sheet_calc_pr.rb +29 -29
  137. data/lib/axlsx/workbook/worksheet/sheet_data.rb +27 -27
  138. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +87 -87
  139. data/lib/axlsx/workbook/worksheet/sheet_protection.rb +118 -118
  140. data/lib/axlsx/workbook/worksheet/sheet_view.rb +213 -213
  141. data/lib/axlsx/workbook/worksheet/table.rb +102 -102
  142. data/lib/axlsx/workbook/worksheet/table_style_info.rb +49 -49
  143. data/lib/axlsx/workbook/worksheet/tables.rb +34 -34
  144. data/lib/axlsx/workbook/worksheet/worksheet.rb +829 -786
  145. data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +58 -58
  146. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +58 -58
  147. data/lib/axlsx/workbook/worksheet/worksheet_hyperlink.rb +74 -74
  148. data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +38 -38
  149. data/lib/axlsx.rb +204 -185
  150. data/lib/caxlsx.rb +2 -2
  151. data/lib/schema/dc.xsd +118 -118
  152. data/lib/schema/dcmitype.xsd +51 -51
  153. data/lib/schema/dcterms.xsd +331 -331
  154. data/lib/schema/dml-chartDrawing.xsd +146 -146
  155. data/lib/schema/dml-compatibility.xsd +14 -14
  156. data/lib/schema/dml-lockedCanvas.xsd +11 -11
  157. data/lib/schema/dml-main.xsd +3048 -3048
  158. data/lib/schema/dml-picture.xsd +23 -23
  159. data/lib/schema/dml-spreadsheetDrawing.xsd +185 -185
  160. data/lib/schema/dml-wordprocessingDrawing.xsd +185 -185
  161. data/lib/schema/shared-additionalCharacteristics.xsd +28 -28
  162. data/lib/schema/shared-bibliography.xsd +144 -144
  163. data/lib/schema/shared-commonSimpleTypes.xsd +166 -166
  164. data/lib/schema/shared-customXmlDataProperties.xsd +25 -25
  165. data/lib/schema/shared-customXmlSchemaProperties.xsd +18 -18
  166. data/lib/schema/shared-documentPropertiesCustom.xsd +59 -59
  167. data/lib/schema/shared-documentPropertiesExtended.xsd +56 -56
  168. data/lib/schema/shared-documentPropertiesVariantTypes.xsd +195 -195
  169. data/lib/schema/shared-relationshipReference.xsd +25 -25
  170. data/lib/schema/vml-main.xsd +569 -569
  171. data/lib/schema/vml-officeDrawing.xsd +509 -509
  172. data/lib/schema/vml-presentationDrawing.xsd +12 -12
  173. data/lib/schema/vml-spreadsheetDrawing.xsd +108 -108
  174. data/lib/schema/vml-wordprocessingDrawing.xsd +96 -96
  175. data/lib/schema/xml.xsd +116 -116
  176. metadata +5 -252
  177. data/test/benchmark.rb +0 -72
  178. data/test/content_type/tc_content_type.rb +0 -76
  179. data/test/content_type/tc_default.rb +0 -16
  180. data/test/content_type/tc_override.rb +0 -14
  181. data/test/doc_props/tc_app.rb +0 -43
  182. data/test/doc_props/tc_core.rb +0 -42
  183. data/test/drawing/tc_area_chart.rb +0 -39
  184. data/test/drawing/tc_area_series.rb +0 -71
  185. data/test/drawing/tc_axes.rb +0 -8
  186. data/test/drawing/tc_axis.rb +0 -112
  187. data/test/drawing/tc_bar_3D_chart.rb +0 -86
  188. data/test/drawing/tc_bar_chart.rb +0 -86
  189. data/test/drawing/tc_bar_series.rb +0 -46
  190. data/test/drawing/tc_bubble_chart.rb +0 -44
  191. data/test/drawing/tc_bubble_series.rb +0 -21
  192. data/test/drawing/tc_cat_axis.rb +0 -31
  193. data/test/drawing/tc_cat_axis_data.rb +0 -27
  194. data/test/drawing/tc_chart.rb +0 -123
  195. data/test/drawing/tc_d_lbls.rb +0 -57
  196. data/test/drawing/tc_data_source.rb +0 -23
  197. data/test/drawing/tc_drawing.rb +0 -80
  198. data/test/drawing/tc_graphic_frame.rb +0 -27
  199. data/test/drawing/tc_hyperlink.rb +0 -64
  200. data/test/drawing/tc_line_3d_chart.rb +0 -47
  201. data/test/drawing/tc_line_chart.rb +0 -39
  202. data/test/drawing/tc_line_series.rb +0 -71
  203. data/test/drawing/tc_marker.rb +0 -44
  204. data/test/drawing/tc_named_axis_data.rb +0 -27
  205. data/test/drawing/tc_num_data.rb +0 -31
  206. data/test/drawing/tc_num_val.rb +0 -29
  207. data/test/drawing/tc_one_cell_anchor.rb +0 -66
  208. data/test/drawing/tc_pic.rb +0 -103
  209. data/test/drawing/tc_picture_locking.rb +0 -72
  210. data/test/drawing/tc_pie_3D_chart.rb +0 -28
  211. data/test/drawing/tc_pie_series.rb +0 -33
  212. data/test/drawing/tc_scaling.rb +0 -36
  213. data/test/drawing/tc_scatter_chart.rb +0 -48
  214. data/test/drawing/tc_scatter_series.rb +0 -74
  215. data/test/drawing/tc_ser_axis.rb +0 -31
  216. data/test/drawing/tc_series.rb +0 -23
  217. data/test/drawing/tc_series_title.rb +0 -54
  218. data/test/drawing/tc_str_data.rb +0 -18
  219. data/test/drawing/tc_str_val.rb +0 -30
  220. data/test/drawing/tc_title.rb +0 -70
  221. data/test/drawing/tc_two_cell_anchor.rb +0 -36
  222. data/test/drawing/tc_val_axis.rb +0 -24
  223. data/test/drawing/tc_view_3D.rb +0 -54
  224. data/test/drawing/tc_vml_drawing.rb +0 -25
  225. data/test/drawing/tc_vml_shape.rb +0 -106
  226. data/test/fixtures/image1.gif +0 -0
  227. data/test/fixtures/image1.jpeg +0 -0
  228. data/test/fixtures/image1.jpg +0 -0
  229. data/test/fixtures/image1.png +0 -0
  230. data/test/fixtures/image1_fake.jpg +0 -0
  231. data/test/profile.rb +0 -24
  232. data/test/rels/tc_relationship.rb +0 -52
  233. data/test/rels/tc_relationships.rb +0 -37
  234. data/test/stylesheet/tc_border.rb +0 -37
  235. data/test/stylesheet/tc_border_pr.rb +0 -32
  236. data/test/stylesheet/tc_cell_alignment.rb +0 -81
  237. data/test/stylesheet/tc_cell_protection.rb +0 -29
  238. data/test/stylesheet/tc_cell_style.rb +0 -57
  239. data/test/stylesheet/tc_color.rb +0 -43
  240. data/test/stylesheet/tc_dxf.rb +0 -81
  241. data/test/stylesheet/tc_fill.rb +0 -18
  242. data/test/stylesheet/tc_font.rb +0 -133
  243. data/test/stylesheet/tc_gradient_fill.rb +0 -72
  244. data/test/stylesheet/tc_gradient_stop.rb +0 -31
  245. data/test/stylesheet/tc_num_fmt.rb +0 -30
  246. data/test/stylesheet/tc_pattern_fill.rb +0 -43
  247. data/test/stylesheet/tc_styles.rb +0 -309
  248. data/test/stylesheet/tc_table_style.rb +0 -44
  249. data/test/stylesheet/tc_table_style_element.rb +0 -45
  250. data/test/stylesheet/tc_table_styles.rb +0 -29
  251. data/test/stylesheet/tc_xf.rb +0 -120
  252. data/test/tc_axlsx.rb +0 -109
  253. data/test/tc_helper.rb +0 -10
  254. data/test/tc_package.rb +0 -317
  255. data/test/util/tc_mime_type_utils.rb +0 -13
  256. data/test/util/tc_serialized_attributes.rb +0 -19
  257. data/test/util/tc_simple_typed_list.rb +0 -77
  258. data/test/util/tc_validators.rb +0 -210
  259. data/test/workbook/tc_defined_name.rb +0 -49
  260. data/test/workbook/tc_shared_strings_table.rb +0 -59
  261. data/test/workbook/tc_workbook.rb +0 -165
  262. data/test/workbook/tc_workbook_view.rb +0 -50
  263. data/test/workbook/worksheet/auto_filter/tc_auto_filter.rb +0 -38
  264. data/test/workbook/worksheet/auto_filter/tc_filter_column.rb +0 -76
  265. data/test/workbook/worksheet/auto_filter/tc_filters.rb +0 -50
  266. data/test/workbook/worksheet/tc_break.rb +0 -49
  267. data/test/workbook/worksheet/tc_cell.rb +0 -465
  268. data/test/workbook/worksheet/tc_cfvo.rb +0 -31
  269. data/test/workbook/worksheet/tc_col.rb +0 -93
  270. data/test/workbook/worksheet/tc_color_scale.rb +0 -58
  271. data/test/workbook/worksheet/tc_comment.rb +0 -72
  272. data/test/workbook/worksheet/tc_comments.rb +0 -57
  273. data/test/workbook/worksheet/tc_conditional_formatting.rb +0 -224
  274. data/test/workbook/worksheet/tc_data_bar.rb +0 -46
  275. data/test/workbook/worksheet/tc_data_validation.rb +0 -265
  276. data/test/workbook/worksheet/tc_date_time_converter.rb +0 -124
  277. data/test/workbook/worksheet/tc_header_footer.rb +0 -151
  278. data/test/workbook/worksheet/tc_icon_set.rb +0 -45
  279. data/test/workbook/worksheet/tc_outline_pr.rb +0 -19
  280. data/test/workbook/worksheet/tc_page_margins.rb +0 -97
  281. data/test/workbook/worksheet/tc_page_set_up_pr.rb +0 -15
  282. data/test/workbook/worksheet/tc_page_setup.rb +0 -143
  283. data/test/workbook/worksheet/tc_pane.rb +0 -54
  284. data/test/workbook/worksheet/tc_pivot_table.rb +0 -180
  285. data/test/workbook/worksheet/tc_pivot_table_cache_definition.rb +0 -62
  286. data/test/workbook/worksheet/tc_print_options.rb +0 -72
  287. data/test/workbook/worksheet/tc_protected_range.rb +0 -17
  288. data/test/workbook/worksheet/tc_rich_text.rb +0 -44
  289. data/test/workbook/worksheet/tc_rich_text_run.rb +0 -173
  290. data/test/workbook/worksheet/tc_row.rb +0 -160
  291. data/test/workbook/worksheet/tc_selection.rb +0 -55
  292. data/test/workbook/worksheet/tc_sheet_calc_pr.rb +0 -18
  293. data/test/workbook/worksheet/tc_sheet_format_pr.rb +0 -88
  294. data/test/workbook/worksheet/tc_sheet_pr.rb +0 -49
  295. data/test/workbook/worksheet/tc_sheet_protection.rb +0 -117
  296. data/test/workbook/worksheet/tc_sheet_view.rb +0 -214
  297. data/test/workbook/worksheet/tc_table.rb +0 -77
  298. data/test/workbook/worksheet/tc_table_style_info.rb +0 -53
  299. data/test/workbook/worksheet/tc_worksheet.rb +0 -632
  300. data/test/workbook/worksheet/tc_worksheet_hyperlink.rb +0 -55
@@ -1,73 +1,73 @@
1
- # encoding: UTF-8
2
- require 'open3'
3
- require 'shellwords'
4
-
5
- module Axlsx
6
-
7
- # The ZipCommand class supports zipping the Excel file contents using
8
- # a binary zip program instead of RubyZip's `Zip::OutputStream`.
9
- #
10
- # The methods provided here mimic `Zip::OutputStream` so that `ZipCommand` can
11
- # be used as a drop-in replacement. Note that method signatures are not
12
- # identical to `Zip::OutputStream`, they are only sufficiently close so that
13
- # `ZipCommand` and `Zip::OutputStream` can be interchangeably used within
14
- # `caxlsx`.
15
- class ZipCommand
16
- # Raised when the zip command exits with a non-zero status.
17
- class ZipError < StandardError; end
18
-
19
- def initialize(zip_command)
20
- @current_file = nil
21
- @files = []
22
- @zip_command = zip_command
23
- end
24
-
25
- # Create a temporary directory for writing files to.
26
- #
27
- # The directory and its contents are removed at the end of the block.
28
- def open(output, &block)
29
- Dir.mktmpdir do |dir|
30
- @dir = dir
31
- block.call(self)
32
- write_file
33
- zip_parts(output)
34
- end
35
- end
36
-
37
- # Closes the current entry and opens a new for writing.
38
- def put_next_entry(entry)
39
- write_file
40
- @current_file = "#{@dir}/#{entry.name}"
41
- @files << entry.name
42
- FileUtils.mkdir_p(File.dirname(@current_file))
43
- end
44
-
45
- # Write to a buffer that will be written to the current entry
46
- def write(content)
47
- @buffer << content
48
- end
49
- alias << write
50
-
51
- private
52
-
53
- def write_file
54
- if @current_file
55
- @buffer.rewind
56
- File.open(@current_file, "wb") { |f| f.write @buffer.read }
57
- end
58
- @current_file = nil
59
- @buffer = StringIO.new
60
- end
61
-
62
- def zip_parts(output)
63
- output = Shellwords.shellescape(File.absolute_path(output))
64
- inputs = Shellwords.shelljoin(@files)
65
- escaped_dir = Shellwords.shellescape(@dir)
66
- command = "cd #{escaped_dir} && #{@zip_command} #{output} #{inputs}"
67
- stdout_and_stderr, status = Open3.capture2e(command)
68
- if !status.success?
69
- raise(ZipError.new(stdout_and_stderr))
70
- end
71
- end
72
- end
73
- end
1
+ # encoding: UTF-8
2
+ require 'open3'
3
+ require 'shellwords'
4
+
5
+ module Axlsx
6
+
7
+ # The ZipCommand class supports zipping the Excel file contents using
8
+ # a binary zip program instead of RubyZip's `Zip::OutputStream`.
9
+ #
10
+ # The methods provided here mimic `Zip::OutputStream` so that `ZipCommand` can
11
+ # be used as a drop-in replacement. Note that method signatures are not
12
+ # identical to `Zip::OutputStream`, they are only sufficiently close so that
13
+ # `ZipCommand` and `Zip::OutputStream` can be interchangeably used within
14
+ # `caxlsx`.
15
+ class ZipCommand
16
+ # Raised when the zip command exits with a non-zero status.
17
+ class ZipError < StandardError; end
18
+
19
+ def initialize(zip_command)
20
+ @current_file = nil
21
+ @files = []
22
+ @zip_command = zip_command
23
+ end
24
+
25
+ # Create a temporary directory for writing files to.
26
+ #
27
+ # The directory and its contents are removed at the end of the block.
28
+ def open(output, &block)
29
+ Dir.mktmpdir do |dir|
30
+ @dir = dir
31
+ block.call(self)
32
+ write_file
33
+ zip_parts(output)
34
+ end
35
+ end
36
+
37
+ # Closes the current entry and opens a new for writing.
38
+ def put_next_entry(entry)
39
+ write_file
40
+ @current_file = "#{@dir}/#{entry.name}"
41
+ @files << entry.name
42
+ FileUtils.mkdir_p(File.dirname(@current_file))
43
+ end
44
+
45
+ # Write to a buffer that will be written to the current entry
46
+ def write(content)
47
+ @buffer << content
48
+ end
49
+ alias << write
50
+
51
+ private
52
+
53
+ def write_file
54
+ if @current_file
55
+ @buffer.rewind
56
+ File.open(@current_file, "wb") { |f| f.write @buffer.read }
57
+ end
58
+ @current_file = nil
59
+ @buffer = StringIO.new
60
+ end
61
+
62
+ def zip_parts(output)
63
+ output = Shellwords.shellescape(File.absolute_path(output))
64
+ inputs = Shellwords.shelljoin(@files)
65
+ escaped_dir = Shellwords.shellescape(@dir)
66
+ command = "cd #{escaped_dir} && #{@zip_command} #{output} #{inputs}"
67
+ stdout_and_stderr, status = Open3.capture2e(command)
68
+ if !status.success?
69
+ raise(ZipError.new(stdout_and_stderr))
70
+ end
71
+ end
72
+ end
73
+ end
data/lib/axlsx/version.rb CHANGED
@@ -1,5 +1,5 @@
1
- module Axlsx
2
-
3
- # The current version
4
- VERSION = "3.2.0"
5
- end
1
+ module Axlsx
2
+
3
+ # The current version
4
+ VERSION = "3.3.0"
5
+ end
@@ -1,128 +1,128 @@
1
- # <definedNames>
2
- # <definedName name="_xlnm.Print_Titles" localSheetId="0">Sheet1!$1:$1</definedName>
3
- # </definedNames>
4
-
5
- #<xsd:complexType name="CT_DefinedName">
6
- # <xsd:simpleContent>
7
- # <xsd:extension base="ST_Formula">
8
- # <xsd:attribute name="name" type="s:ST_Xstring" use="required"/>
9
- # <xsd:attribute name="comment" type="s:ST_Xstring" use="optional"/>
10
- # <xsd:attribute name="customMenu" type="s:ST_Xstring" use="optional"/>
11
- # <xsd:attribute name="description" type="s:ST_Xstring" use="optional"/>
12
- # <xsd:attribute name="help" type="s:ST_Xstring" use="optional"/>
13
- # <xsd:attribute name="statusBar" type="s:ST_Xstring" use="optional"/>
14
- # <xsd:attribute name="localSheetId" type="xsd:unsignedInt" use="optional"/>
15
- # <xsd:attribute name="hidden" type="xsd:boolean" use="optional" default="false"/>
16
- # <xsd:attribute name="function" type="xsd:boolean" use="optional" default="false"/>
17
- # <xsd:attribute name="vbProcedure" type="xsd:boolean" use="optional" default="false"/>
18
- # <xsd:attribute name="xlm" type="xsd:boolean" use="optional" default="false"/>
19
- # <xsd:attribute name="functionGroupId" type="xsd:unsignedInt" use="optional"/>
20
- # <xsd:attribute name="shortcutKey" type="s:ST_Xstring" use="optional"/>
21
- # <xsd:attribute name="publishToServer" type="xsd:boolean" use="optional" default="false"/>
22
- # <xsd:attribute name="workbookParameter" type="xsd:boolean" use="optional" default="false"/>
23
- # </xsd:extenstion>
24
- # </xsd:simpleContent>
25
-
26
- module Axlsx
27
- # This element defines the defined names that are defined within this workbook.
28
- # Defined names are descriptive text that is used to represents a cell, range of cells, formula, or constant value.
29
- # Use easy-to-understand names, such as Products, to refer to hard to understand ranges, such as Sales!C20:C30.
30
- # A defined name in a formula can make it easier to understand the purpose of the formula.
31
- # @example
32
- # The formula =SUM(FirstQuarterSales) might be easier to identify than =SUM(C20:C30
33
- #
34
- # Names are available to any sheet.
35
- # @example
36
- # If the name ProjectedSales refers to the range A20:A30 on the first worksheet in a workbook,
37
- # you can use the name ProjectedSales on any other sheet in the same workbook to refer to range A20:A30 on the first worksheet.
38
- # Names can also be used to represent formulas or values that do not change (constants).
39
- #
40
- # @example
41
- # The name SalesTax can be used to represent the sales tax amount (such as 6.2 percent) applied to sales transactions.
42
- # You can also link to a defined name in another workbook, or define a name that refers to cells in another workbook.
43
- #
44
- # @example
45
- # The formula =SUM(Sales.xls!ProjectedSales) refers to the named range ProjectedSales in the workbook named Sales.
46
- # A compliant producer or consumer considers a defined name in the range A1-XFD1048576 to be an error.
47
- # All other names outside this range can be defined as names and overrides a cell reference if an ambiguity exists.
48
- #
49
- # @example
50
- # For clarification: LOG10 is always a cell reference, LOG10() is always formula, LOGO1000 can be a defined name that overrides a cell reference.
51
- class DefinedName
52
- include Axlsx::SerializedAttributes
53
- include Axlsx::OptionsParser
54
- include Axlsx::Accessors
55
- # creates a new DefinedName.
56
- # @param [String] formula - the formula the defined name references
57
- # @param [Hash] options - A hash of key/value pairs that will be mapped to this instances attributes.
58
- #
59
- # @option [String] name - Specifies the name that appears in the user interface for the defined name.
60
- # This attribute is required.
61
- # The following built-in names are defined in this SpreadsheetML specification:
62
- # Print
63
- # _xlnm.Print_Area: this defined name specifies the workbook's print area.
64
- # _xlnm.Print_Titles: this defined name specifies the row(s) or column(s) to repeat
65
- # the top of each printed page.
66
- # Filter & Advanced Filter
67
- # _xlnm.Criteria: this defined name refers to a range containing the criteria values
68
- # to be used in applying an advanced filter to a range of data.
69
- # _xlnm._FilterDatabase: can be one of the following
70
- # a. this defined name refers to a range to which an advanced filter has been
71
- # applied. This represents the source data range, unfiltered.
72
- # b. This defined name refers to a range to which an AutoFilter has been
73
- # applied.
74
- # _xlnm.Extract: this defined name refers to the range containing the filtered output
75
- # values resulting from applying an advanced filter criteria to a source range.
76
- # Miscellaneous
77
- # _xlnm.Consolidate_Area: the defined name refers to a consolidation area.
78
- # _xlnm.Database: the range specified in the defined name is from a database data source.
79
- # _xlnm.Sheet_Title: the defined name refers to a sheet title.
80
- # @option [String] comment - A comment to optionally associate with the name
81
- # @option [String] custom_menu - The menu text for the defined name
82
- # @option [String] description - An optional description for the defined name
83
- # @option [String] help - The help topic to display for this defined name
84
- # @option [String] status_bar - The text to display on the application status bar when this defined name has focus
85
- # @option [String] local_sheet_id - Specifies the sheet index in this workbook where data from an external reference is displayed
86
- # @option [Boolean] hidden - Specifies a boolean value that indicates whether the defined name is hidden in the user interface.
87
- # @option [Boolean] function - Specifies a boolean value that indicates that the defined name refers to a user-defined function.
88
- # This attribute is used when there is an add-in or other code project associated with the file.
89
- # @option [Boolean] vb_proceedure - Specifies a boolean value that indicates whether the defined name is related to an external function, command, or other executable code.
90
- # @option [Boolean] xlm - Specifies a boolean value that indicates whether the defined name is related to an external function, command, or other executable code.
91
- # @option [Integer] function_group_id - Specifies the function group index if the defined name refers to a function.
92
- # The function group defines the general category for the function.
93
- # This attribute is used when there is an add-in or other code project associated with the file.
94
- # See Open Office XML Part 1 for more info.
95
- # @option [String] short_cut_key - Specifies the keyboard shortcut for the defined name.
96
- # @option [Boolean] publish_to_server - Specifies a boolean value that indicates whether the defined name is included in the
97
- # version of the workbook that is published to or rendered on a Web or application server.
98
- # @option [Boolean] workbook_parameter - Specifies a boolean value that indicates that the name is used as a workbook parameter on a
99
- # version of the workbook that is published to or rendered on a Web or application server.
100
- def initialize(formula, options={})
101
- @formula = formula
102
- parse_options options
103
- end
104
-
105
- attr_reader :local_sheet_id
106
-
107
- # The local sheet index (0-based)
108
- # @param [Integer] value the unsigned integer index of the sheet this defined_name applies to.
109
- def local_sheet_id=(value)
110
- Axlsx::validate_unsigned_int(value)
111
- @local_sheet_id = value
112
- end
113
-
114
- string_attr_accessor :short_cut_key, :status_bar, :help, :description, :custom_menu, :comment, :name, :formula
115
-
116
- boolean_attr_accessor :workbook_parameter, :publish_to_server, :xlm, :vb_proceedure, :function, :hidden
117
-
118
- serializable_attributes :short_cut_key, :status_bar, :help, :description, :custom_menu, :comment,
119
- :workbook_parameter, :publish_to_server, :xlm, :vb_proceedure, :function, :hidden, :local_sheet_id
120
-
121
- def to_xml_string(str='')
122
- raise ArgumentError, 'you must specify the name for this defined name. Please read the documentation for Axlsx::DefinedName for more details' unless name
123
- str << ('<definedName ' << 'name="' << name << '" ')
124
- serialized_attributes str
125
- str << ('>' << @formula << '</definedName>')
126
- end
127
- end
128
- end
1
+ # <definedNames>
2
+ # <definedName name="_xlnm.Print_Titles" localSheetId="0">Sheet1!$1:$1</definedName>
3
+ # </definedNames>
4
+
5
+ #<xsd:complexType name="CT_DefinedName">
6
+ # <xsd:simpleContent>
7
+ # <xsd:extension base="ST_Formula">
8
+ # <xsd:attribute name="name" type="s:ST_Xstring" use="required"/>
9
+ # <xsd:attribute name="comment" type="s:ST_Xstring" use="optional"/>
10
+ # <xsd:attribute name="customMenu" type="s:ST_Xstring" use="optional"/>
11
+ # <xsd:attribute name="description" type="s:ST_Xstring" use="optional"/>
12
+ # <xsd:attribute name="help" type="s:ST_Xstring" use="optional"/>
13
+ # <xsd:attribute name="statusBar" type="s:ST_Xstring" use="optional"/>
14
+ # <xsd:attribute name="localSheetId" type="xsd:unsignedInt" use="optional"/>
15
+ # <xsd:attribute name="hidden" type="xsd:boolean" use="optional" default="false"/>
16
+ # <xsd:attribute name="function" type="xsd:boolean" use="optional" default="false"/>
17
+ # <xsd:attribute name="vbProcedure" type="xsd:boolean" use="optional" default="false"/>
18
+ # <xsd:attribute name="xlm" type="xsd:boolean" use="optional" default="false"/>
19
+ # <xsd:attribute name="functionGroupId" type="xsd:unsignedInt" use="optional"/>
20
+ # <xsd:attribute name="shortcutKey" type="s:ST_Xstring" use="optional"/>
21
+ # <xsd:attribute name="publishToServer" type="xsd:boolean" use="optional" default="false"/>
22
+ # <xsd:attribute name="workbookParameter" type="xsd:boolean" use="optional" default="false"/>
23
+ # </xsd:extenstion>
24
+ # </xsd:simpleContent>
25
+
26
+ module Axlsx
27
+ # This element defines the defined names that are defined within this workbook.
28
+ # Defined names are descriptive text that is used to represents a cell, range of cells, formula, or constant value.
29
+ # Use easy-to-understand names, such as Products, to refer to hard to understand ranges, such as Sales!C20:C30.
30
+ # A defined name in a formula can make it easier to understand the purpose of the formula.
31
+ # @example
32
+ # The formula =SUM(FirstQuarterSales) might be easier to identify than =SUM(C20:C30
33
+ #
34
+ # Names are available to any sheet.
35
+ # @example
36
+ # If the name ProjectedSales refers to the range A20:A30 on the first worksheet in a workbook,
37
+ # you can use the name ProjectedSales on any other sheet in the same workbook to refer to range A20:A30 on the first worksheet.
38
+ # Names can also be used to represent formulas or values that do not change (constants).
39
+ #
40
+ # @example
41
+ # The name SalesTax can be used to represent the sales tax amount (such as 6.2 percent) applied to sales transactions.
42
+ # You can also link to a defined name in another workbook, or define a name that refers to cells in another workbook.
43
+ #
44
+ # @example
45
+ # The formula =SUM(Sales.xls!ProjectedSales) refers to the named range ProjectedSales in the workbook named Sales.
46
+ # A compliant producer or consumer considers a defined name in the range A1-XFD1048576 to be an error.
47
+ # All other names outside this range can be defined as names and overrides a cell reference if an ambiguity exists.
48
+ #
49
+ # @example
50
+ # For clarification: LOG10 is always a cell reference, LOG10() is always formula, LOGO1000 can be a defined name that overrides a cell reference.
51
+ class DefinedName
52
+ include Axlsx::SerializedAttributes
53
+ include Axlsx::OptionsParser
54
+ include Axlsx::Accessors
55
+ # creates a new DefinedName.
56
+ # @param [String] formula - the formula the defined name references
57
+ # @param [Hash] options - A hash of key/value pairs that will be mapped to this instances attributes.
58
+ #
59
+ # @option [String] name - Specifies the name that appears in the user interface for the defined name.
60
+ # This attribute is required.
61
+ # The following built-in names are defined in this SpreadsheetML specification:
62
+ # Print
63
+ # _xlnm.Print_Area: this defined name specifies the workbook's print area.
64
+ # _xlnm.Print_Titles: this defined name specifies the row(s) or column(s) to repeat
65
+ # the top of each printed page.
66
+ # Filter & Advanced Filter
67
+ # _xlnm.Criteria: this defined name refers to a range containing the criteria values
68
+ # to be used in applying an advanced filter to a range of data.
69
+ # _xlnm._FilterDatabase: can be one of the following
70
+ # a. this defined name refers to a range to which an advanced filter has been
71
+ # applied. This represents the source data range, unfiltered.
72
+ # b. This defined name refers to a range to which an AutoFilter has been
73
+ # applied.
74
+ # _xlnm.Extract: this defined name refers to the range containing the filtered output
75
+ # values resulting from applying an advanced filter criteria to a source range.
76
+ # Miscellaneous
77
+ # _xlnm.Consolidate_Area: the defined name refers to a consolidation area.
78
+ # _xlnm.Database: the range specified in the defined name is from a database data source.
79
+ # _xlnm.Sheet_Title: the defined name refers to a sheet title.
80
+ # @option [String] comment - A comment to optionally associate with the name
81
+ # @option [String] custom_menu - The menu text for the defined name
82
+ # @option [String] description - An optional description for the defined name
83
+ # @option [String] help - The help topic to display for this defined name
84
+ # @option [String] status_bar - The text to display on the application status bar when this defined name has focus
85
+ # @option [String] local_sheet_id - Specifies the sheet index in this workbook where data from an external reference is displayed
86
+ # @option [Boolean] hidden - Specifies a boolean value that indicates whether the defined name is hidden in the user interface.
87
+ # @option [Boolean] function - Specifies a boolean value that indicates that the defined name refers to a user-defined function.
88
+ # This attribute is used when there is an add-in or other code project associated with the file.
89
+ # @option [Boolean] vb_proceedure - Specifies a boolean value that indicates whether the defined name is related to an external function, command, or other executable code.
90
+ # @option [Boolean] xlm - Specifies a boolean value that indicates whether the defined name is related to an external function, command, or other executable code.
91
+ # @option [Integer] function_group_id - Specifies the function group index if the defined name refers to a function.
92
+ # The function group defines the general category for the function.
93
+ # This attribute is used when there is an add-in or other code project associated with the file.
94
+ # See Open Office XML Part 1 for more info.
95
+ # @option [String] short_cut_key - Specifies the keyboard shortcut for the defined name.
96
+ # @option [Boolean] publish_to_server - Specifies a boolean value that indicates whether the defined name is included in the
97
+ # version of the workbook that is published to or rendered on a Web or application server.
98
+ # @option [Boolean] workbook_parameter - Specifies a boolean value that indicates that the name is used as a workbook parameter on a
99
+ # version of the workbook that is published to or rendered on a Web or application server.
100
+ def initialize(formula, options={})
101
+ @formula = formula
102
+ parse_options options
103
+ end
104
+
105
+ attr_reader :local_sheet_id
106
+
107
+ # The local sheet index (0-based)
108
+ # @param [Integer] value the unsigned integer index of the sheet this defined_name applies to.
109
+ def local_sheet_id=(value)
110
+ Axlsx::validate_unsigned_int(value)
111
+ @local_sheet_id = value
112
+ end
113
+
114
+ string_attr_accessor :short_cut_key, :status_bar, :help, :description, :custom_menu, :comment, :name, :formula
115
+
116
+ boolean_attr_accessor :workbook_parameter, :publish_to_server, :xlm, :vb_proceedure, :function, :hidden
117
+
118
+ serializable_attributes :short_cut_key, :status_bar, :help, :description, :custom_menu, :comment,
119
+ :workbook_parameter, :publish_to_server, :xlm, :vb_proceedure, :function, :hidden, :local_sheet_id
120
+
121
+ def to_xml_string(str='')
122
+ raise ArgumentError, 'you must specify the name for this defined name. Please read the documentation for Axlsx::DefinedName for more details' unless name
123
+ str << ('<definedName ' << 'name="' << name << '" ')
124
+ serialized_attributes str
125
+ str << ('>' << @formula << '</definedName>')
126
+ end
127
+ end
128
+ end
@@ -1,21 +1,21 @@
1
- module Axlsx
2
- # a simple types list of DefinedName objects
3
- class DefinedNames < SimpleTypedList
4
-
5
- # creates the DefinedNames object
6
- def initialize
7
- super DefinedName
8
- end
9
-
10
- # Serialize to xml
11
- # @param [String] str
12
- # @return [String]
13
- def to_xml_string(str = '')
14
- return if empty?
15
- str << '<definedNames>'
16
- each { |defined_name| defined_name.to_xml_string(str) }
17
- str << '</definedNames>'
18
- end
19
- end
20
- end
21
-
1
+ module Axlsx
2
+ # a simple types list of DefinedName objects
3
+ class DefinedNames < SimpleTypedList
4
+
5
+ # creates the DefinedNames object
6
+ def initialize
7
+ super DefinedName
8
+ end
9
+
10
+ # Serialize to xml
11
+ # @param [String] str
12
+ # @return [String]
13
+ def to_xml_string(str = '')
14
+ return if empty?
15
+ str << '<definedNames>'
16
+ each { |defined_name| defined_name.to_xml_string(str) }
17
+ str << '</definedNames>'
18
+ end
19
+ end
20
+ end
21
+
@@ -1,77 +1,77 @@
1
- # encoding: UTF-8
2
- module Axlsx
3
-
4
- # The Shared String Table class is responsible for managing and serializing common strings in a workbook.
5
- # While the ECMA-376 spec allows for both inline and shared strings it seems that at least some applications like iWorks Numbers
6
- # and Google Docs require that the shared string table is populated in order to interoperate properly.
7
- # As a developer, you should never need to directly work against this class. Simply set 'use_shared_strings'
8
- # on the package or workbook to generate a package that uses the shared strings table instead of inline strings.
9
- # @note Serialization performance is affected by using this serialization method so if you do not need interoperability
10
- # it is recomended that you use the default inline string method of serialization.
11
- class SharedStringsTable
12
-
13
- # The total number of strings in the workbook including duplicates
14
- # Empty cells are treated as blank strings
15
- # @return [Integer]
16
- attr_reader :count
17
-
18
- # The total number of unique strings in the workbook.
19
- # @return [Integer]
20
- def unique_count
21
- @unique_cells.size
22
- end
23
-
24
- # An array of unique cells. Multiple attributes of the cell are used in comparison
25
- # each of these unique cells is parsed into the shared string table.
26
- # @see Cell#sharable
27
- attr_reader :unique_cells
28
-
29
- # The xml:space attribute
30
- # @see Workbook#xml_space
31
- attr_reader :xml_space
32
-
33
- # Creates a new Shared Strings Table agains an array of cells
34
- # @param [Array] cells This is an array of all of the cells in the workbook
35
- # @param [Symbol] xml_space The xml:space behavior for the shared string table.
36
- def initialize(cells, xml_space=:preserve)
37
- @index = 0
38
- @xml_space = xml_space
39
- @unique_cells = {}
40
- @shared_xml_string = ""
41
- shareable_cells = cells.flatten.select{ |cell| cell.plain_string? || cell.contains_rich_text? }
42
- @count = shareable_cells.size
43
- resolve(shareable_cells)
44
- end
45
-
46
- # Serializes the object
47
- # @param [String] str
48
- # @return [String]
49
- def to_xml_string(str='')
50
- Axlsx::sanitize(@shared_xml_string)
51
- str << ('<?xml version="1.0" encoding="UTF-8"?><sst xmlns="' << XML_NS << '"')
52
- str << (' count="' << @count.to_s << '" uniqueCount="' << unique_count.to_s << '"')
53
- str << (' xml:space="' << xml_space.to_s << '">' << @shared_xml_string << '</sst>')
54
- end
55
-
56
- private
57
-
58
- # Interate over all of the cells in the array.
59
- # if our unique cells array does not contain a sharable cell,
60
- # add the cell to our unique cells array and set the ssti attribute on the index of this cell in the shared strings table
61
- # if a sharable cell already exists in our unique_cells array, set the ssti attribute of the cell and move on.
62
- # @return [Array] unique cells
63
- def resolve(cells)
64
- cells.each do |cell|
65
- cell_hash = cell.value
66
- if index = @unique_cells[cell_hash]
67
- cell.send :ssti=, index
68
- else
69
- cell.send :ssti=, @index
70
- @shared_xml_string << '<si>' << CellSerializer.run_xml_string(cell) << '</si>'
71
- @unique_cells[cell_hash] = @index
72
- @index += 1
73
- end
74
- end
75
- end
76
- end
77
- end
1
+ # encoding: UTF-8
2
+ module Axlsx
3
+
4
+ # The Shared String Table class is responsible for managing and serializing common strings in a workbook.
5
+ # While the ECMA-376 spec allows for both inline and shared strings it seems that at least some applications like iWorks Numbers
6
+ # and Google Docs require that the shared string table is populated in order to interoperate properly.
7
+ # As a developer, you should never need to directly work against this class. Simply set 'use_shared_strings'
8
+ # on the package or workbook to generate a package that uses the shared strings table instead of inline strings.
9
+ # @note Serialization performance is affected by using this serialization method so if you do not need interoperability
10
+ # it is recomended that you use the default inline string method of serialization.
11
+ class SharedStringsTable
12
+
13
+ # The total number of strings in the workbook including duplicates
14
+ # Empty cells are treated as blank strings
15
+ # @return [Integer]
16
+ attr_reader :count
17
+
18
+ # The total number of unique strings in the workbook.
19
+ # @return [Integer]
20
+ def unique_count
21
+ @unique_cells.size
22
+ end
23
+
24
+ # An array of unique cells. Multiple attributes of the cell are used in comparison
25
+ # each of these unique cells is parsed into the shared string table.
26
+ # @see Cell#sharable
27
+ attr_reader :unique_cells
28
+
29
+ # The xml:space attribute
30
+ # @see Workbook#xml_space
31
+ attr_reader :xml_space
32
+
33
+ # Creates a new Shared Strings Table agains an array of cells
34
+ # @param [Array] cells This is an array of all of the cells in the workbook
35
+ # @param [Symbol] xml_space The xml:space behavior for the shared string table.
36
+ def initialize(cells, xml_space=:preserve)
37
+ @index = 0
38
+ @xml_space = xml_space
39
+ @unique_cells = {}
40
+ @shared_xml_string = ""
41
+ shareable_cells = cells.flatten.select{ |cell| cell.plain_string? || cell.contains_rich_text? }
42
+ @count = shareable_cells.size
43
+ resolve(shareable_cells)
44
+ end
45
+
46
+ # Serializes the object
47
+ # @param [String] str
48
+ # @return [String]
49
+ def to_xml_string(str='')
50
+ Axlsx::sanitize(@shared_xml_string)
51
+ str << ('<?xml version="1.0" encoding="UTF-8"?><sst xmlns="' << XML_NS << '"')
52
+ str << (' count="' << @count.to_s << '" uniqueCount="' << unique_count.to_s << '"')
53
+ str << (' xml:space="' << xml_space.to_s << '">' << @shared_xml_string << '</sst>')
54
+ end
55
+
56
+ private
57
+
58
+ # Interate over all of the cells in the array.
59
+ # if our unique cells array does not contain a sharable cell,
60
+ # add the cell to our unique cells array and set the ssti attribute on the index of this cell in the shared strings table
61
+ # if a sharable cell already exists in our unique_cells array, set the ssti attribute of the cell and move on.
62
+ # @return [Array] unique cells
63
+ def resolve(cells)
64
+ cells.each do |cell|
65
+ cell_hash = cell.value
66
+ if index = @unique_cells[cell_hash]
67
+ cell.send :ssti=, index
68
+ else
69
+ cell.send :ssti=, @index
70
+ @shared_xml_string << '<si>' << CellSerializer.run_xml_string(cell) << '</si>'
71
+ @unique_cells[cell_hash] = @index
72
+ @index += 1
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end