caxlsx 3.2.0 → 3.4.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 (301) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +9 -9
  3. data/.yardopts_guide +18 -18
  4. data/CHANGELOG.md +394 -354
  5. data/LICENSE +21 -21
  6. data/README.md +184 -168
  7. data/Rakefile +28 -29
  8. data/examples/generate.rb +15 -15
  9. data/lib/axlsx/content_type/abstract_content_type.rb +29 -32
  10. data/lib/axlsx/content_type/content_type.rb +22 -26
  11. data/lib/axlsx/content_type/default.rb +21 -25
  12. data/lib/axlsx/content_type/override.rb +21 -25
  13. data/lib/axlsx/doc_props/app.rb +230 -235
  14. data/lib/axlsx/doc_props/core.rb +34 -39
  15. data/lib/axlsx/drawing/area_chart.rb +96 -99
  16. data/lib/axlsx/drawing/area_series.rb +107 -110
  17. data/lib/axlsx/drawing/ax_data_source.rb +21 -26
  18. data/lib/axlsx/drawing/axes.rb +60 -61
  19. data/lib/axlsx/drawing/axis.rb +185 -190
  20. data/lib/axlsx/drawing/bar_3D_chart.rb +145 -148
  21. data/lib/axlsx/drawing/bar_chart.rb +135 -138
  22. data/lib/axlsx/drawing/bar_series.rb +91 -97
  23. data/lib/axlsx/drawing/bubble_chart.rb +56 -59
  24. data/lib/axlsx/drawing/bubble_series.rb +60 -63
  25. data/lib/axlsx/drawing/cat_axis.rb +80 -85
  26. data/lib/axlsx/drawing/chart.rb +294 -276
  27. data/lib/axlsx/drawing/d_lbls.rb +92 -90
  28. data/lib/axlsx/drawing/drawing.rb +163 -167
  29. data/lib/axlsx/drawing/graphic_frame.rb +51 -54
  30. data/lib/axlsx/drawing/hyperlink.rb +97 -100
  31. data/lib/axlsx/drawing/line_3D_chart.rb +64 -68
  32. data/lib/axlsx/drawing/line_chart.rb +96 -99
  33. data/lib/axlsx/drawing/line_series.rb +107 -110
  34. data/lib/axlsx/drawing/marker.rb +80 -84
  35. data/lib/axlsx/drawing/num_data.rb +47 -52
  36. data/lib/axlsx/drawing/num_data_source.rb +58 -62
  37. data/lib/axlsx/drawing/num_val.rb +31 -34
  38. data/lib/axlsx/drawing/one_cell_anchor.rb +97 -99
  39. data/lib/axlsx/drawing/pic.rb +244 -211
  40. data/lib/axlsx/drawing/picture_locking.rb +39 -42
  41. data/lib/axlsx/drawing/pie_3D_chart.rb +42 -47
  42. data/lib/axlsx/drawing/pie_series.rb +69 -74
  43. data/lib/axlsx/drawing/scaling.rb +57 -60
  44. data/lib/axlsx/drawing/scatter_chart.rb +71 -74
  45. data/lib/axlsx/drawing/scatter_series.rb +126 -129
  46. data/lib/axlsx/drawing/ser_axis.rb +41 -45
  47. data/lib/axlsx/drawing/series.rb +67 -69
  48. data/lib/axlsx/drawing/series_title.rb +23 -25
  49. data/lib/axlsx/drawing/str_data.rb +37 -42
  50. data/lib/axlsx/drawing/str_val.rb +31 -34
  51. data/lib/axlsx/drawing/title.rb +104 -97
  52. data/lib/axlsx/drawing/two_cell_anchor.rb +95 -97
  53. data/lib/axlsx/drawing/val_axis.rb +34 -37
  54. data/lib/axlsx/drawing/view_3D.rb +115 -115
  55. data/lib/axlsx/drawing/vml_drawing.rb +39 -42
  56. data/lib/axlsx/drawing/vml_shape.rb +63 -66
  57. data/lib/axlsx/package.rb +397 -388
  58. data/lib/axlsx/rels/relationship.rb +127 -130
  59. data/lib/axlsx/rels/relationships.rb +29 -32
  60. data/lib/axlsx/stylesheet/border.rb +70 -73
  61. data/lib/axlsx/stylesheet/border_pr.rb +69 -71
  62. data/lib/axlsx/stylesheet/cell_alignment.rb +124 -132
  63. data/lib/axlsx/stylesheet/cell_protection.rb +38 -41
  64. data/lib/axlsx/stylesheet/cell_style.rb +68 -72
  65. data/lib/axlsx/stylesheet/color.rb +77 -76
  66. data/lib/axlsx/stylesheet/dxf.rb +75 -79
  67. data/lib/axlsx/stylesheet/fill.rb +31 -35
  68. data/lib/axlsx/stylesheet/font.rb +157 -156
  69. data/lib/axlsx/stylesheet/gradient_fill.rb +101 -103
  70. data/lib/axlsx/stylesheet/gradient_stop.rb +36 -37
  71. data/lib/axlsx/stylesheet/num_fmt.rb +83 -86
  72. data/lib/axlsx/stylesheet/pattern_fill.rb +71 -73
  73. data/lib/axlsx/stylesheet/styles.rb +543 -494
  74. data/lib/axlsx/stylesheet/table_style.rb +51 -54
  75. data/lib/axlsx/stylesheet/table_style_element.rb +74 -77
  76. data/lib/axlsx/stylesheet/table_styles.rb +42 -46
  77. data/lib/axlsx/stylesheet/xf.rb +144 -147
  78. data/lib/axlsx/util/accessors.rb +62 -64
  79. data/lib/axlsx/util/constants.rb +414 -410
  80. data/lib/axlsx/util/mime_type_utils.rb +24 -11
  81. data/lib/axlsx/util/options_parser.rb +15 -16
  82. data/lib/axlsx/util/serialized_attributes.rb +88 -89
  83. data/lib/axlsx/util/simple_typed_list.rb +180 -179
  84. data/lib/axlsx/util/storage.rb +142 -146
  85. data/lib/axlsx/util/validators.rb +315 -312
  86. data/lib/axlsx/util/zip_command.rb +71 -73
  87. data/lib/axlsx/version.rb +4 -5
  88. data/lib/axlsx/workbook/defined_name.rb +129 -128
  89. data/lib/axlsx/workbook/defined_names.rb +20 -21
  90. data/lib/axlsx/workbook/shared_strings_table.rb +74 -77
  91. data/lib/axlsx/workbook/workbook.rb +430 -395
  92. data/lib/axlsx/workbook/workbook_view.rb +75 -80
  93. data/lib/axlsx/workbook/workbook_views.rb +20 -22
  94. data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +78 -77
  95. data/lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb +94 -94
  96. data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +243 -244
  97. data/lib/axlsx/workbook/worksheet/border_creator.rb +79 -0
  98. data/lib/axlsx/workbook/worksheet/break.rb +32 -35
  99. data/lib/axlsx/workbook/worksheet/cell.rb +552 -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 +16 -18
  103. data/lib/axlsx/workbook/worksheet/col.rb +142 -145
  104. data/lib/axlsx/workbook/worksheet/col_breaks.rb +34 -35
  105. data/lib/axlsx/workbook/worksheet/color_scale.rb +108 -110
  106. data/lib/axlsx/workbook/worksheet/cols.rb +23 -23
  107. data/lib/axlsx/workbook/worksheet/comment.rb +90 -91
  108. data/lib/axlsx/workbook/worksheet/comments.rb +78 -82
  109. data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +81 -82
  110. data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +216 -220
  111. data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +23 -25
  112. data/lib/axlsx/workbook/worksheet/data_bar.rb +127 -129
  113. data/lib/axlsx/workbook/worksheet/data_validation.rb +266 -246
  114. data/lib/axlsx/workbook/worksheet/data_validations.rb +25 -28
  115. data/lib/axlsx/workbook/worksheet/date_time_converter.rb +28 -30
  116. data/lib/axlsx/workbook/worksheet/dimension.rb +65 -64
  117. data/lib/axlsx/workbook/worksheet/header_footer.rb +51 -52
  118. data/lib/axlsx/workbook/worksheet/icon_set.rb +80 -81
  119. data/lib/axlsx/workbook/worksheet/merged_cells.rb +37 -37
  120. data/lib/axlsx/workbook/worksheet/outline_pr.rb +32 -33
  121. data/lib/axlsx/workbook/worksheet/page_margins.rb +97 -97
  122. data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +42 -44
  123. data/lib/axlsx/workbook/worksheet/page_setup.rb +237 -240
  124. data/lib/axlsx/workbook/worksheet/pane.rb +138 -139
  125. data/lib/axlsx/workbook/worksheet/pivot_table.rb +332 -296
  126. data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +63 -66
  127. data/lib/axlsx/workbook/worksheet/pivot_tables.rb +23 -24
  128. data/lib/axlsx/workbook/worksheet/print_options.rb +38 -39
  129. data/lib/axlsx/workbook/worksheet/protected_range.rb +46 -47
  130. data/lib/axlsx/workbook/worksheet/protected_ranges.rb +37 -37
  131. data/lib/axlsx/workbook/worksheet/rich_text.rb +53 -55
  132. data/lib/axlsx/workbook/worksheet/rich_text_run.rb +266 -250
  133. data/lib/axlsx/workbook/worksheet/row.rb +173 -164
  134. data/lib/axlsx/workbook/worksheet/row_breaks.rb +32 -33
  135. data/lib/axlsx/workbook/worksheet/selection.rb +99 -101
  136. data/lib/axlsx/workbook/worksheet/sheet_calc_pr.rb +28 -29
  137. data/lib/axlsx/workbook/worksheet/sheet_data.rb +25 -27
  138. data/lib/axlsx/workbook/worksheet/sheet_format_pr.rb +18 -18
  139. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +87 -87
  140. data/lib/axlsx/workbook/worksheet/sheet_protection.rb +117 -118
  141. data/lib/axlsx/workbook/worksheet/sheet_view.rb +206 -213
  142. data/lib/axlsx/workbook/worksheet/table.rb +100 -102
  143. data/lib/axlsx/workbook/worksheet/table_style_info.rb +48 -49
  144. data/lib/axlsx/workbook/worksheet/tables.rb +34 -34
  145. data/lib/axlsx/workbook/worksheet/worksheet.rb +857 -786
  146. data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +58 -58
  147. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +59 -58
  148. data/lib/axlsx/workbook/worksheet/worksheet_hyperlink.rb +73 -74
  149. data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +38 -38
  150. data/lib/axlsx.rb +218 -185
  151. data/lib/caxlsx.rb +1 -2
  152. data/lib/schema/dc.xsd +118 -118
  153. data/lib/schema/dcmitype.xsd +51 -51
  154. data/lib/schema/dcterms.xsd +331 -331
  155. data/lib/schema/dml-chartDrawing.xsd +146 -146
  156. data/lib/schema/dml-compatibility.xsd +14 -14
  157. data/lib/schema/dml-lockedCanvas.xsd +11 -11
  158. data/lib/schema/dml-main.xsd +3048 -3048
  159. data/lib/schema/dml-picture.xsd +23 -23
  160. data/lib/schema/dml-spreadsheetDrawing.xsd +185 -185
  161. data/lib/schema/dml-wordprocessingDrawing.xsd +185 -185
  162. data/lib/schema/shared-additionalCharacteristics.xsd +28 -28
  163. data/lib/schema/shared-bibliography.xsd +144 -144
  164. data/lib/schema/shared-commonSimpleTypes.xsd +166 -166
  165. data/lib/schema/shared-customXmlDataProperties.xsd +25 -25
  166. data/lib/schema/shared-customXmlSchemaProperties.xsd +18 -18
  167. data/lib/schema/shared-documentPropertiesCustom.xsd +59 -59
  168. data/lib/schema/shared-documentPropertiesExtended.xsd +56 -56
  169. data/lib/schema/shared-documentPropertiesVariantTypes.xsd +195 -195
  170. data/lib/schema/shared-relationshipReference.xsd +25 -25
  171. data/lib/schema/vml-main.xsd +569 -569
  172. data/lib/schema/vml-officeDrawing.xsd +509 -509
  173. data/lib/schema/vml-presentationDrawing.xsd +12 -12
  174. data/lib/schema/vml-spreadsheetDrawing.xsd +108 -108
  175. data/lib/schema/vml-wordprocessingDrawing.xsd +96 -96
  176. data/lib/schema/xml.xsd +116 -116
  177. metadata +5 -252
  178. data/test/benchmark.rb +0 -72
  179. data/test/content_type/tc_content_type.rb +0 -76
  180. data/test/content_type/tc_default.rb +0 -16
  181. data/test/content_type/tc_override.rb +0 -14
  182. data/test/doc_props/tc_app.rb +0 -43
  183. data/test/doc_props/tc_core.rb +0 -42
  184. data/test/drawing/tc_area_chart.rb +0 -39
  185. data/test/drawing/tc_area_series.rb +0 -71
  186. data/test/drawing/tc_axes.rb +0 -8
  187. data/test/drawing/tc_axis.rb +0 -112
  188. data/test/drawing/tc_bar_3D_chart.rb +0 -86
  189. data/test/drawing/tc_bar_chart.rb +0 -86
  190. data/test/drawing/tc_bar_series.rb +0 -46
  191. data/test/drawing/tc_bubble_chart.rb +0 -44
  192. data/test/drawing/tc_bubble_series.rb +0 -21
  193. data/test/drawing/tc_cat_axis.rb +0 -31
  194. data/test/drawing/tc_cat_axis_data.rb +0 -27
  195. data/test/drawing/tc_chart.rb +0 -123
  196. data/test/drawing/tc_d_lbls.rb +0 -57
  197. data/test/drawing/tc_data_source.rb +0 -23
  198. data/test/drawing/tc_drawing.rb +0 -80
  199. data/test/drawing/tc_graphic_frame.rb +0 -27
  200. data/test/drawing/tc_hyperlink.rb +0 -64
  201. data/test/drawing/tc_line_3d_chart.rb +0 -47
  202. data/test/drawing/tc_line_chart.rb +0 -39
  203. data/test/drawing/tc_line_series.rb +0 -71
  204. data/test/drawing/tc_marker.rb +0 -44
  205. data/test/drawing/tc_named_axis_data.rb +0 -27
  206. data/test/drawing/tc_num_data.rb +0 -31
  207. data/test/drawing/tc_num_val.rb +0 -29
  208. data/test/drawing/tc_one_cell_anchor.rb +0 -66
  209. data/test/drawing/tc_pic.rb +0 -103
  210. data/test/drawing/tc_picture_locking.rb +0 -72
  211. data/test/drawing/tc_pie_3D_chart.rb +0 -28
  212. data/test/drawing/tc_pie_series.rb +0 -33
  213. data/test/drawing/tc_scaling.rb +0 -36
  214. data/test/drawing/tc_scatter_chart.rb +0 -48
  215. data/test/drawing/tc_scatter_series.rb +0 -74
  216. data/test/drawing/tc_ser_axis.rb +0 -31
  217. data/test/drawing/tc_series.rb +0 -23
  218. data/test/drawing/tc_series_title.rb +0 -54
  219. data/test/drawing/tc_str_data.rb +0 -18
  220. data/test/drawing/tc_str_val.rb +0 -30
  221. data/test/drawing/tc_title.rb +0 -70
  222. data/test/drawing/tc_two_cell_anchor.rb +0 -36
  223. data/test/drawing/tc_val_axis.rb +0 -24
  224. data/test/drawing/tc_view_3D.rb +0 -54
  225. data/test/drawing/tc_vml_drawing.rb +0 -25
  226. data/test/drawing/tc_vml_shape.rb +0 -106
  227. data/test/fixtures/image1.gif +0 -0
  228. data/test/fixtures/image1.jpeg +0 -0
  229. data/test/fixtures/image1.jpg +0 -0
  230. data/test/fixtures/image1.png +0 -0
  231. data/test/fixtures/image1_fake.jpg +0 -0
  232. data/test/profile.rb +0 -24
  233. data/test/rels/tc_relationship.rb +0 -52
  234. data/test/rels/tc_relationships.rb +0 -37
  235. data/test/stylesheet/tc_border.rb +0 -37
  236. data/test/stylesheet/tc_border_pr.rb +0 -32
  237. data/test/stylesheet/tc_cell_alignment.rb +0 -81
  238. data/test/stylesheet/tc_cell_protection.rb +0 -29
  239. data/test/stylesheet/tc_cell_style.rb +0 -57
  240. data/test/stylesheet/tc_color.rb +0 -43
  241. data/test/stylesheet/tc_dxf.rb +0 -81
  242. data/test/stylesheet/tc_fill.rb +0 -18
  243. data/test/stylesheet/tc_font.rb +0 -133
  244. data/test/stylesheet/tc_gradient_fill.rb +0 -72
  245. data/test/stylesheet/tc_gradient_stop.rb +0 -31
  246. data/test/stylesheet/tc_num_fmt.rb +0 -30
  247. data/test/stylesheet/tc_pattern_fill.rb +0 -43
  248. data/test/stylesheet/tc_styles.rb +0 -309
  249. data/test/stylesheet/tc_table_style.rb +0 -44
  250. data/test/stylesheet/tc_table_style_element.rb +0 -45
  251. data/test/stylesheet/tc_table_styles.rb +0 -29
  252. data/test/stylesheet/tc_xf.rb +0 -120
  253. data/test/tc_axlsx.rb +0 -109
  254. data/test/tc_helper.rb +0 -10
  255. data/test/tc_package.rb +0 -317
  256. data/test/util/tc_mime_type_utils.rb +0 -13
  257. data/test/util/tc_serialized_attributes.rb +0 -19
  258. data/test/util/tc_simple_typed_list.rb +0 -77
  259. data/test/util/tc_validators.rb +0 -210
  260. data/test/workbook/tc_defined_name.rb +0 -49
  261. data/test/workbook/tc_shared_strings_table.rb +0 -59
  262. data/test/workbook/tc_workbook.rb +0 -165
  263. data/test/workbook/tc_workbook_view.rb +0 -50
  264. data/test/workbook/worksheet/auto_filter/tc_auto_filter.rb +0 -38
  265. data/test/workbook/worksheet/auto_filter/tc_filter_column.rb +0 -76
  266. data/test/workbook/worksheet/auto_filter/tc_filters.rb +0 -50
  267. data/test/workbook/worksheet/tc_break.rb +0 -49
  268. data/test/workbook/worksheet/tc_cell.rb +0 -465
  269. data/test/workbook/worksheet/tc_cfvo.rb +0 -31
  270. data/test/workbook/worksheet/tc_col.rb +0 -93
  271. data/test/workbook/worksheet/tc_color_scale.rb +0 -58
  272. data/test/workbook/worksheet/tc_comment.rb +0 -72
  273. data/test/workbook/worksheet/tc_comments.rb +0 -57
  274. data/test/workbook/worksheet/tc_conditional_formatting.rb +0 -224
  275. data/test/workbook/worksheet/tc_data_bar.rb +0 -46
  276. data/test/workbook/worksheet/tc_data_validation.rb +0 -265
  277. data/test/workbook/worksheet/tc_date_time_converter.rb +0 -124
  278. data/test/workbook/worksheet/tc_header_footer.rb +0 -151
  279. data/test/workbook/worksheet/tc_icon_set.rb +0 -45
  280. data/test/workbook/worksheet/tc_outline_pr.rb +0 -19
  281. data/test/workbook/worksheet/tc_page_margins.rb +0 -97
  282. data/test/workbook/worksheet/tc_page_set_up_pr.rb +0 -15
  283. data/test/workbook/worksheet/tc_page_setup.rb +0 -143
  284. data/test/workbook/worksheet/tc_pane.rb +0 -54
  285. data/test/workbook/worksheet/tc_pivot_table.rb +0 -180
  286. data/test/workbook/worksheet/tc_pivot_table_cache_definition.rb +0 -62
  287. data/test/workbook/worksheet/tc_print_options.rb +0 -72
  288. data/test/workbook/worksheet/tc_protected_range.rb +0 -17
  289. data/test/workbook/worksheet/tc_rich_text.rb +0 -44
  290. data/test/workbook/worksheet/tc_rich_text_run.rb +0 -173
  291. data/test/workbook/worksheet/tc_row.rb +0 -160
  292. data/test/workbook/worksheet/tc_selection.rb +0 -55
  293. data/test/workbook/worksheet/tc_sheet_calc_pr.rb +0 -18
  294. data/test/workbook/worksheet/tc_sheet_format_pr.rb +0 -88
  295. data/test/workbook/worksheet/tc_sheet_pr.rb +0 -49
  296. data/test/workbook/worksheet/tc_sheet_protection.rb +0 -117
  297. data/test/workbook/worksheet/tc_sheet_view.rb +0 -214
  298. data/test/workbook/worksheet/tc_table.rb +0 -77
  299. data/test/workbook/worksheet/tc_table_style_info.rb +0 -53
  300. data/test/workbook/worksheet/tc_worksheet.rb +0 -632
  301. data/test/workbook/worksheet/tc_worksheet_hyperlink.rb +0 -55
@@ -1,395 +1,430 @@
1
- # -*- coding: utf-8 -*-
2
- module Axlsx
3
- require 'axlsx/workbook/worksheet/sheet_calc_pr.rb'
4
- require 'axlsx/workbook/worksheet/auto_filter/auto_filter.rb'
5
- require 'axlsx/workbook/worksheet/date_time_converter.rb'
6
- require 'axlsx/workbook/worksheet/protected_range.rb'
7
- require 'axlsx/workbook/worksheet/protected_ranges.rb'
8
- require 'axlsx/workbook/worksheet/rich_text_run'
9
- require 'axlsx/workbook/worksheet/rich_text'
10
- require 'axlsx/workbook/worksheet/cell_serializer.rb'
11
- require 'axlsx/workbook/worksheet/cell.rb'
12
- require 'axlsx/workbook/worksheet/page_margins.rb'
13
- require 'axlsx/workbook/worksheet/page_set_up_pr.rb'
14
- require 'axlsx/workbook/worksheet/outline_pr.rb'
15
- require 'axlsx/workbook/worksheet/page_setup.rb'
16
- require 'axlsx/workbook/worksheet/header_footer.rb'
17
- require 'axlsx/workbook/worksheet/print_options.rb'
18
- require 'axlsx/workbook/worksheet/cfvo.rb'
19
- require 'axlsx/workbook/worksheet/cfvos.rb'
20
- require 'axlsx/workbook/worksheet/color_scale.rb'
21
- require 'axlsx/workbook/worksheet/data_bar.rb'
22
- require 'axlsx/workbook/worksheet/icon_set.rb'
23
- require 'axlsx/workbook/worksheet/conditional_formatting.rb'
24
- require 'axlsx/workbook/worksheet/conditional_formatting_rule.rb'
25
- require 'axlsx/workbook/worksheet/conditional_formattings.rb'
26
- require 'axlsx/workbook/worksheet/row.rb'
27
- require 'axlsx/workbook/worksheet/col.rb'
28
- require 'axlsx/workbook/worksheet/cols.rb'
29
- require 'axlsx/workbook/worksheet/comments.rb'
30
- require 'axlsx/workbook/worksheet/comment.rb'
31
- require 'axlsx/workbook/worksheet/merged_cells.rb'
32
- require 'axlsx/workbook/worksheet/sheet_protection.rb'
33
- require 'axlsx/workbook/worksheet/sheet_pr.rb'
34
- require 'axlsx/workbook/worksheet/dimension.rb'
35
- require 'axlsx/workbook/worksheet/sheet_data.rb'
36
- require 'axlsx/workbook/worksheet/worksheet_drawing.rb'
37
- require 'axlsx/workbook/worksheet/worksheet_comments.rb'
38
- require 'axlsx/workbook/worksheet/worksheet_hyperlink'
39
- require 'axlsx/workbook/worksheet/worksheet_hyperlinks'
40
- require 'axlsx/workbook/worksheet/break'
41
- require 'axlsx/workbook/worksheet/row_breaks'
42
- require 'axlsx/workbook/worksheet/col_breaks'
43
- require 'axlsx/workbook/workbook_view'
44
- require 'axlsx/workbook/workbook_views'
45
-
46
-
47
- require 'axlsx/workbook/worksheet/worksheet.rb'
48
- require 'axlsx/workbook/shared_strings_table.rb'
49
- require 'axlsx/workbook/defined_name.rb'
50
- require 'axlsx/workbook/defined_names.rb'
51
- require 'axlsx/workbook/worksheet/table_style_info.rb'
52
- require 'axlsx/workbook/worksheet/table.rb'
53
- require 'axlsx/workbook/worksheet/tables.rb'
54
- require 'axlsx/workbook/worksheet/pivot_table_cache_definition.rb'
55
- require 'axlsx/workbook/worksheet/pivot_table.rb'
56
- require 'axlsx/workbook/worksheet/pivot_tables.rb'
57
- require 'axlsx/workbook/worksheet/data_validation.rb'
58
- require 'axlsx/workbook/worksheet/data_validations.rb'
59
- require 'axlsx/workbook/worksheet/sheet_view.rb'
60
- require 'axlsx/workbook/worksheet/sheet_format_pr.rb'
61
- require 'axlsx/workbook/worksheet/pane.rb'
62
- require 'axlsx/workbook/worksheet/selection.rb'
63
- # The Workbook class is an xlsx workbook that manages worksheets, charts, drawings and styles.
64
- # The following parts of the Office Open XML spreadsheet specification are not implimented in this version.
65
- #
66
- # bookViews
67
- # calcPr
68
- # customWorkbookViews
69
- # definedNames
70
- # externalReferences
71
- # extLst
72
- # fileRecoveryPr
73
- # fileSharing
74
- # fileVersion
75
- # functionGroups
76
- # oleSize
77
- # pivotCaches
78
- # smartTagPr
79
- # smartTagTypes
80
- # webPublishing
81
- # webPublishObjects
82
- # workbookProtection
83
- # workbookPr*
84
- #
85
- # *workbookPr is only supported to the extend of date1904
86
- class Workbook
87
-
88
- BOLD_FONT_MULTIPLIER = 1.5
89
- FONT_SCALE_DIVISOR = 10.0
90
-
91
- # When true, the Package will be generated with a shared string table. This may be required by some OOXML processors that do not
92
- # adhere to the ECMA specification that dictates string may be inline in the sheet.
93
- # Using this option will increase the time required to serialize the document as every string in every cell must be analzed and referenced.
94
- # @return [Boolean]
95
- attr_reader :use_shared_strings
96
-
97
- # @see use_shared_strings
98
- def use_shared_strings=(v)
99
- Axlsx::validate_boolean(v)
100
- @use_shared_strings = v
101
- end
102
-
103
- # If true reverse the order in which the workbook is serialized
104
- # @return [Boolean]
105
- attr_reader :is_reversed
106
-
107
- def is_reversed=(v)
108
- Axlsx::validate_boolean(v)
109
- @is_reversed = v
110
- end
111
-
112
-
113
- # A collection of worksheets associated with this workbook.
114
- # @note The recommended way to manage worksheets is add_worksheet
115
- # @see Workbook#add_worksheet
116
- # @see Worksheet
117
- # @return [SimpleTypedList]
118
- attr_reader :worksheets
119
-
120
- # A colllection of charts associated with this workbook
121
- # @note The recommended way to manage charts is Worksheet#add_chart
122
- # @see Worksheet#add_chart
123
- # @see Chart
124
- # @return [SimpleTypedList]
125
- attr_reader :charts
126
-
127
- # A colllection of images associated with this workbook
128
- # @note The recommended way to manage images is Worksheet#add_image
129
- # @see Worksheet#add_image
130
- # @see Pic
131
- # @return [SimpleTypedList]
132
- attr_reader :images
133
-
134
- # A colllection of drawings associated with this workbook
135
- # @note The recommended way to manage drawings is Worksheet#add_chart
136
- # @see Worksheet#add_chart
137
- # @see Drawing
138
- # @return [SimpleTypedList]
139
- attr_reader :drawings
140
-
141
- # pretty sure this two are always empty and can be removed.
142
-
143
-
144
- # A colllection of tables associated with this workbook
145
- # @note The recommended way to manage drawings is Worksheet#add_table
146
- # @see Worksheet#add_table
147
- # @see Table
148
- # @return [SimpleTypedList]
149
- attr_reader :tables
150
-
151
- # A colllection of pivot tables associated with this workbook
152
- # @note The recommended way to manage drawings is Worksheet#add_table
153
- # @see Worksheet#add_table
154
- # @see Table
155
- # @return [SimpleTypedList]
156
- attr_reader :pivot_tables
157
-
158
- # A collection of views for this workbook
159
- def views
160
- @views ||= WorkbookViews.new
161
- end
162
-
163
- # A collection of defined names for this workbook
164
- # @note The recommended way to manage defined names is Workbook#add_defined_name
165
- # @see DefinedName
166
- # @return [DefinedNames]
167
- def defined_names
168
- @defined_names ||= DefinedNames.new
169
- end
170
-
171
- # A collection of comments associated with this workbook
172
- # @note The recommended way to manage comments is WOrksheet#add_comment
173
- # @see Worksheet#add_comment
174
- # @see Comment
175
- # @return [Comments]
176
- def comments
177
- worksheets.map { |sheet| sheet.comments }.compact
178
- end
179
-
180
- # The styles associated with this workbook
181
- # @note The recommended way to manage styles is Styles#add_style
182
- # @see Style#add_style
183
- # @see Style
184
- # @return [Styles]
185
- def styles
186
- yield @styles if block_given?
187
- @styles
188
- end
189
-
190
-
191
- # Indicates if the epoc date for serialization should be 1904. If false, 1900 is used.
192
- @@date1904 = false
193
-
194
-
195
- # A quick helper to retrive a worksheet by name
196
- # @param [String] name The name of the sheet you are looking for
197
- # @return [Worksheet] The sheet found, or nil
198
- def sheet_by_name(name)
199
- index = @worksheets.index { |sheet| sheet.name == name }
200
- @worksheets[index] if index
201
- end
202
-
203
- # Creates a new Workbook
204
- # The recomended way to work with workbooks is via Package#workbook
205
- # @option options [Boolean] date1904. If this is not specified, date1904 is set to false. Office 2011 for Mac defaults to false.
206
- def initialize(options={})
207
- @styles = Styles.new
208
- @worksheets = SimpleTypedList.new Worksheet
209
- @drawings = SimpleTypedList.new Drawing
210
- @charts = SimpleTypedList.new Chart
211
- @images = SimpleTypedList.new Pic
212
- # Are these even used????? Check package serialization parts
213
- @tables = SimpleTypedList.new Table
214
- @pivot_tables = SimpleTypedList.new PivotTable
215
- @comments = SimpleTypedList.new Comments
216
-
217
-
218
- @use_autowidth = true
219
- @bold_font_multiplier = BOLD_FONT_MULTIPLIER
220
- @font_scale_divisor = FONT_SCALE_DIVISOR
221
-
222
- self.date1904= !options[:date1904].nil? && options[:date1904]
223
- yield self if block_given?
224
- end
225
-
226
- # Instance level access to the class variable 1904
227
- # @return [Boolean]
228
- def date1904() @@date1904; end
229
-
230
- # see @date1904
231
- def date1904=(v) Axlsx::validate_boolean v; @@date1904 = v; end
232
-
233
- # Sets the date1904 attribute to the provided boolean
234
- # @return [Boolean]
235
- def self.date1904=(v) Axlsx::validate_boolean v; @@date1904 = v; end
236
-
237
- # retrieves the date1904 attribute
238
- # @return [Boolean]
239
- def self.date1904() @@date1904; end
240
-
241
- # Indicates if the workbook should use autowidths or not.
242
- # @note This gem no longer depends on RMagick for autowidth
243
- # calculation. Thus the performance benefits of turning this off are
244
- # marginal unless you are creating a very large sheet.
245
- # @return [Boolean]
246
- def use_autowidth() @use_autowidth; end
247
-
248
- # see @use_autowidth
249
- def use_autowidth=(v=true) Axlsx::validate_boolean v; @use_autowidth = v; end
250
-
251
- # Font size of bold fonts is multiplied with this
252
- # Used for automatic calculation of cell widths with bold text
253
- # @return [Float]
254
- attr_reader :bold_font_multiplier
255
-
256
- def bold_font_multiplier=(v)
257
- Axlsx::validate_float v
258
- @bold_font_multiplier = v
259
- end
260
-
261
- # Font scale is calculated with this value (font_size / font_scale_divisor)
262
- # Used for automatic calculation of cell widths
263
- # @return [Float]
264
- attr_reader :font_scale_divisor
265
-
266
- def font_scale_divisor=(v)
267
- Axlsx::validate_float v
268
- @font_scale_divisor = v
269
- end
270
-
271
- # inserts a worksheet into this workbook at the position specified.
272
- # It the index specified is out of range, the worksheet will be added to the end of the
273
- # worksheets collection
274
- # @return [Worksheet]
275
- # @param index The zero based position to insert the newly created worksheet
276
- # @param [Hash] options Options to pass into the worksheed during initialization.
277
- # @option options [String] name The name of the worksheet
278
- # @option options [Hash] page_margins The page margins for the worksheet
279
- def insert_worksheet(index=0, options={})
280
- worksheet = Worksheet.new(self, options)
281
- @worksheets.delete_at(@worksheets.size - 1)
282
- @worksheets.insert(index, worksheet)
283
- yield worksheet if block_given?
284
- worksheet
285
- end
286
-
287
- #
288
- # Adds a worksheet to this workbook
289
- # @return [Worksheet]
290
- # @option options [String] name The name of the worksheet.
291
- # @option options [Hash] page_margins The page margins for the worksheet.
292
- # @see Worksheet#initialize
293
- def add_worksheet(options={})
294
- worksheet = Worksheet.new(self, options)
295
- yield worksheet if block_given?
296
- worksheet
297
- end
298
-
299
- # Adds a new WorkbookView
300
- # @return WorkbookViews
301
- # @option options [Hash] options passed into the added WorkbookView
302
- # @see WorkbookView#initialize
303
- def add_view(options={})
304
- views << WorkbookView.new(options)
305
- end
306
-
307
- # Adds a defined name to this workbook
308
- # @return [DefinedName]
309
- # @param [String] formula @see DefinedName
310
- # @param [Hash] options @see DefinedName
311
- def add_defined_name(formula, options)
312
- defined_names << DefinedName.new(formula, options)
313
- end
314
-
315
- # The workbook relationships. This is managed automatically by the workbook
316
- # @return [Relationships]
317
- def relationships
318
- r = Relationships.new
319
- @worksheets.each do |sheet|
320
- r << Relationship.new(sheet, WORKSHEET_R, WORKSHEET_PN % (r.size+1))
321
- end
322
- pivot_tables.each_with_index do |pivot_table, index|
323
- r << Relationship.new(pivot_table.cache_definition, PIVOT_TABLE_CACHE_DEFINITION_R, PIVOT_TABLE_CACHE_DEFINITION_PN % (index+1))
324
- end
325
- r << Relationship.new(self, STYLES_R, STYLES_PN)
326
- if use_shared_strings
327
- r << Relationship.new(self, SHARED_STRINGS_R, SHARED_STRINGS_PN)
328
- end
329
- r
330
- end
331
-
332
- # generates a shared string object against all cells in all worksheets.
333
- # @return [SharedStringTable]
334
- def shared_strings
335
- SharedStringsTable.new(worksheets.collect { |ws| ws.cells }, xml_space)
336
- end
337
-
338
- # The xml:space attribute for the worksheet.
339
- # This determines how whitespace is handled withing the document.
340
- # The most relevant part being whitespace in the cell text.
341
- # allowed values are :preserve and :default. Axlsx uses :preserve unless
342
- # you explicily set this to :default.
343
- # @return Symbol
344
- def xml_space
345
- @xml_space ||= :preserve
346
- end
347
-
348
- # Sets the xml:space attribute for the worksheet
349
- # @see Worksheet#xml_space
350
- # @param [Symbol] space must be one of :preserve or :default
351
- def xml_space=(space)
352
- Axlsx::RestrictionValidator.validate(:xml_space, [:preserve, :default], space)
353
- @xml_space = space;
354
- end
355
-
356
- # returns a range of cells in a worksheet
357
- # @param [String] cell_def The excel style reference defining the worksheet and cells. The range must specify the sheet to
358
- # retrieve the cells from. e.g. range('Sheet1!A1:B2') will return an array of four cells [A1, A2, B1, B2] while range('Sheet1!A1') will return a single Cell.
359
- # @return [Cell, Array]
360
- def [](cell_def)
361
- sheet_name = cell_def.split('!')[0] if cell_def.match('!')
362
- worksheet = self.worksheets.select { |s| s.name == sheet_name }.first
363
- raise ArgumentError, 'Unknown Sheet' unless sheet_name && worksheet.is_a?(Worksheet)
364
- worksheet[cell_def.gsub(/.+!/,"")]
365
- end
366
-
367
- # Serialize the workbook
368
- # @param [String] str
369
- # @return [String]
370
- def to_xml_string(str='')
371
- add_worksheet(name: 'Sheet1') unless worksheets.size > 0
372
- str << '<?xml version="1.0" encoding="UTF-8"?>'
373
- str << ('<workbook xmlns="' << XML_NS << '" xmlns:r="' << XML_NS_R << '">')
374
- str << ('<workbookPr date1904="' << @@date1904.to_s << '"/>')
375
- views.to_xml_string(str)
376
- str << '<sheets>'
377
- if is_reversed
378
- worksheets.reverse_each { |sheet| sheet.to_sheet_node_xml_string(str) }
379
- else
380
- worksheets.each { |sheet| sheet.to_sheet_node_xml_string(str) }
381
- end
382
- str << '</sheets>'
383
- defined_names.to_xml_string(str)
384
- unless pivot_tables.empty?
385
- str << '<pivotCaches>'
386
- pivot_tables.each do |pivot_table|
387
- str << ('<pivotCache cacheId="' << pivot_table.cache_definition.cache_id.to_s << '" r:id="' << pivot_table.cache_definition.rId << '"/>')
388
- end
389
- str << '</pivotCaches>'
390
- end
391
- str << '</workbook>'
392
- end
393
-
394
- end
395
- end
1
+ module Axlsx
2
+ require 'axlsx/workbook/worksheet/sheet_calc_pr.rb'
3
+ require 'axlsx/workbook/worksheet/auto_filter/auto_filter.rb'
4
+ require 'axlsx/workbook/worksheet/date_time_converter.rb'
5
+ require 'axlsx/workbook/worksheet/protected_range.rb'
6
+ require 'axlsx/workbook/worksheet/protected_ranges.rb'
7
+ require 'axlsx/workbook/worksheet/rich_text_run'
8
+ require 'axlsx/workbook/worksheet/rich_text'
9
+ require 'axlsx/workbook/worksheet/cell_serializer.rb'
10
+ require 'axlsx/workbook/worksheet/cell.rb'
11
+ require 'axlsx/workbook/worksheet/page_margins.rb'
12
+ require 'axlsx/workbook/worksheet/page_set_up_pr.rb'
13
+ require 'axlsx/workbook/worksheet/outline_pr.rb'
14
+ require 'axlsx/workbook/worksheet/page_setup.rb'
15
+ require 'axlsx/workbook/worksheet/header_footer.rb'
16
+ require 'axlsx/workbook/worksheet/print_options.rb'
17
+ require 'axlsx/workbook/worksheet/cfvo.rb'
18
+ require 'axlsx/workbook/worksheet/cfvos.rb'
19
+ require 'axlsx/workbook/worksheet/color_scale.rb'
20
+ require 'axlsx/workbook/worksheet/data_bar.rb'
21
+ require 'axlsx/workbook/worksheet/icon_set.rb'
22
+ require 'axlsx/workbook/worksheet/conditional_formatting.rb'
23
+ require 'axlsx/workbook/worksheet/conditional_formatting_rule.rb'
24
+ require 'axlsx/workbook/worksheet/conditional_formattings.rb'
25
+ require 'axlsx/workbook/worksheet/row.rb'
26
+ require 'axlsx/workbook/worksheet/col.rb'
27
+ require 'axlsx/workbook/worksheet/cols.rb'
28
+ require 'axlsx/workbook/worksheet/comments.rb'
29
+ require 'axlsx/workbook/worksheet/comment.rb'
30
+ require 'axlsx/workbook/worksheet/merged_cells.rb'
31
+ require 'axlsx/workbook/worksheet/sheet_protection.rb'
32
+ require 'axlsx/workbook/worksheet/sheet_pr.rb'
33
+ require 'axlsx/workbook/worksheet/dimension.rb'
34
+ require 'axlsx/workbook/worksheet/sheet_data.rb'
35
+ require 'axlsx/workbook/worksheet/worksheet_drawing.rb'
36
+ require 'axlsx/workbook/worksheet/worksheet_comments.rb'
37
+ require 'axlsx/workbook/worksheet/worksheet_hyperlink'
38
+ require 'axlsx/workbook/worksheet/worksheet_hyperlinks'
39
+ require 'axlsx/workbook/worksheet/break'
40
+ require 'axlsx/workbook/worksheet/row_breaks'
41
+ require 'axlsx/workbook/worksheet/col_breaks'
42
+ require 'axlsx/workbook/workbook_view'
43
+ require 'axlsx/workbook/workbook_views'
44
+ require 'axlsx/workbook/worksheet/worksheet.rb'
45
+ require 'axlsx/workbook/shared_strings_table.rb'
46
+ require 'axlsx/workbook/defined_name.rb'
47
+ require 'axlsx/workbook/defined_names.rb'
48
+ require 'axlsx/workbook/worksheet/table_style_info.rb'
49
+ require 'axlsx/workbook/worksheet/table.rb'
50
+ require 'axlsx/workbook/worksheet/tables.rb'
51
+ require 'axlsx/workbook/worksheet/pivot_table_cache_definition.rb'
52
+ require 'axlsx/workbook/worksheet/pivot_table.rb'
53
+ require 'axlsx/workbook/worksheet/pivot_tables.rb'
54
+ require 'axlsx/workbook/worksheet/data_validation.rb'
55
+ require 'axlsx/workbook/worksheet/data_validations.rb'
56
+ require 'axlsx/workbook/worksheet/sheet_view.rb'
57
+ require 'axlsx/workbook/worksheet/sheet_format_pr.rb'
58
+ require 'axlsx/workbook/worksheet/pane.rb'
59
+ require 'axlsx/workbook/worksheet/selection.rb'
60
+
61
+ # The Workbook class is an xlsx workbook that manages worksheets, charts, drawings and styles.
62
+ # The following parts of the Office Open XML spreadsheet specification are not implimented in this version.
63
+ #
64
+ # bookViews
65
+ # calcPr
66
+ # customWorkbookViews
67
+ # definedNames
68
+ # externalReferences
69
+ # extLst
70
+ # fileRecoveryPr
71
+ # fileSharing
72
+ # fileVersion
73
+ # functionGroups
74
+ # oleSize
75
+ # pivotCaches
76
+ # smartTagPr
77
+ # smartTagTypes
78
+ # webPublishing
79
+ # webPublishObjects
80
+ # workbookProtection
81
+ # workbookPr*
82
+ #
83
+ # *workbookPr is only supported to the extend of date1904
84
+ class Workbook
85
+ BOLD_FONT_MULTIPLIER = 1.5
86
+ FONT_SCALE_DIVISOR = 10.0
87
+
88
+ # When true, the Package will be generated with a shared string table. This may be required by some OOXML processors that do not
89
+ # adhere to the ECMA specification that dictates string may be inline in the sheet.
90
+ # Using this option will increase the time required to serialize the document as every string in every cell must be analzed and referenced.
91
+ # @return [Boolean]
92
+ attr_reader :use_shared_strings
93
+
94
+ # @see use_shared_strings
95
+ def use_shared_strings=(v)
96
+ Axlsx::validate_boolean(v)
97
+ @use_shared_strings = v
98
+ end
99
+
100
+ # If true reverse the order in which the workbook is serialized
101
+ # @return [Boolean]
102
+ attr_reader :is_reversed
103
+
104
+ def is_reversed=(v)
105
+ Axlsx::validate_boolean(v)
106
+ @is_reversed = v
107
+ end
108
+
109
+ # A collection of worksheets associated with this workbook.
110
+ # @note The recommended way to manage worksheets is add_worksheet
111
+ # @see Workbook#add_worksheet
112
+ # @see Worksheet
113
+ # @return [SimpleTypedList]
114
+ attr_reader :worksheets
115
+
116
+ # A collection of charts associated with this workbook
117
+ # @note The recommended way to manage charts is Worksheet#add_chart
118
+ # @see Worksheet#add_chart
119
+ # @see Chart
120
+ # @return [SimpleTypedList]
121
+ attr_reader :charts
122
+
123
+ # A collection of images associated with this workbook
124
+ # @note The recommended way to manage images is Worksheet#add_image
125
+ # @see Worksheet#add_image
126
+ # @see Pic
127
+ # @return [SimpleTypedList]
128
+ attr_reader :images
129
+
130
+ # A collection of drawings associated with this workbook
131
+ # @note The recommended way to manage drawings is Worksheet#add_chart
132
+ # @see Worksheet#add_chart
133
+ # @see Drawing
134
+ # @return [SimpleTypedList]
135
+ attr_reader :drawings
136
+
137
+ # pretty sure this two are always empty and can be removed.
138
+
139
+ # A collection of tables associated with this workbook
140
+ # @note The recommended way to manage drawings is Worksheet#add_table
141
+ # @see Worksheet#add_table
142
+ # @see Table
143
+ # @return [SimpleTypedList]
144
+ attr_reader :tables
145
+
146
+ # A collection of pivot tables associated with this workbook
147
+ # @note The recommended way to manage drawings is Worksheet#add_table
148
+ # @see Worksheet#add_table
149
+ # @see Table
150
+ # @return [SimpleTypedList]
151
+ attr_reader :pivot_tables
152
+
153
+ # A collection of views for this workbook
154
+ def views
155
+ @views ||= WorkbookViews.new
156
+ end
157
+
158
+ # A collection of defined names for this workbook
159
+ # @note The recommended way to manage defined names is Workbook#add_defined_name
160
+ # @see DefinedName
161
+ # @return [DefinedNames]
162
+ def defined_names
163
+ @defined_names ||= DefinedNames.new
164
+ end
165
+
166
+ # A collection of comments associated with this workbook
167
+ # @note The recommended way to manage comments is WOrksheet#add_comment
168
+ # @see Worksheet#add_comment
169
+ # @see Comment
170
+ # @return [Comments]
171
+ def comments
172
+ worksheets.map { |sheet| sheet.comments }.compact
173
+ end
174
+
175
+ # The styles associated with this workbook
176
+ # @note The recommended way to manage styles is Styles#add_style
177
+ # @see Style#add_style
178
+ # @see Style
179
+ # @return [Styles]
180
+ def styles
181
+ yield @styles if block_given?
182
+ @styles
183
+ end
184
+
185
+ # An array that holds all cells with styles
186
+ # @return Set
187
+ def styled_cells
188
+ @styled_cells ||= Set.new
189
+ end
190
+
191
+ # Are the styles added with workbook.add_styles applied yet
192
+ # @return Boolean
193
+ attr_accessor :styles_applied
194
+
195
+ # A helper to apply styles that were added using `worksheet.add_style`
196
+ # @return [Boolean]
197
+ def apply_styles
198
+ return false if !styled_cells
199
+
200
+ styled_cells.each do |cell|
201
+ current_style = styles.style_index[cell.style]
202
+
203
+ if current_style
204
+ new_style = Axlsx.hash_deep_merge(current_style, cell.raw_style)
205
+ else
206
+ new_style = cell.raw_style
207
+ end
208
+
209
+ cell.style = styles.add_style(new_style)
210
+ end
211
+
212
+ self.styles_applied = true
213
+ end
214
+
215
+ # Indicates if the epoc date for serialization should be 1904. If false, 1900 is used.
216
+ @@date1904 = false
217
+
218
+ # A quick helper to retrive a worksheet by name
219
+ # @param [String] name The name of the sheet you are looking for
220
+ # @return [Worksheet] The sheet found, or nil
221
+ def sheet_by_name(name)
222
+ index = @worksheets.index { |sheet| sheet.name == name }
223
+ @worksheets[index] if index
224
+ end
225
+
226
+ # Creates a new Workbook.
227
+ # The recommended way to work with workbooks is via Package#workbook.
228
+ # @option options [Boolean] date1904 If this is not specified, date1904 is set to false. Office 2011 for Mac defaults to false.
229
+ def initialize(options = {})
230
+ @styles = Styles.new
231
+ @worksheets = SimpleTypedList.new Worksheet
232
+ @drawings = SimpleTypedList.new Drawing
233
+ @charts = SimpleTypedList.new Chart
234
+ @images = SimpleTypedList.new Pic
235
+ # Are these even used????? Check package serialization parts
236
+ @tables = SimpleTypedList.new Table
237
+ @pivot_tables = SimpleTypedList.new PivotTable
238
+ @comments = SimpleTypedList.new Comments
239
+ @use_autowidth = true
240
+ @bold_font_multiplier = BOLD_FONT_MULTIPLIER
241
+ @font_scale_divisor = FONT_SCALE_DIVISOR
242
+
243
+ self.escape_formulas = options[:escape_formulas].nil? ? Axlsx.escape_formulas : options[:escape_formulas]
244
+ self.date1904 = !options[:date1904].nil? && options[:date1904]
245
+ yield self if block_given?
246
+ end
247
+
248
+ # Instance level access to the class variable 1904
249
+ # @return [Boolean]
250
+ def date1904() @@date1904; end
251
+
252
+ # see @date1904
253
+ def date1904=(v) Axlsx::validate_boolean v; @@date1904 = v; end
254
+
255
+ # Sets the date1904 attribute to the provided boolean
256
+ # @return [Boolean]
257
+ def self.date1904=(v) Axlsx::validate_boolean v; @@date1904 = v; end
258
+
259
+ # retrieves the date1904 attribute
260
+ # @return [Boolean]
261
+ def self.date1904() @@date1904; end
262
+
263
+ # Whether to treat values starting with an equals sign as formulas or as literal strings.
264
+ # Allowing user-generated data to be interpreted as formulas is a security risk.
265
+ # See https://www.owasp.org/index.php/CSV_Injection for details.
266
+ # @return [Boolean]
267
+ attr_reader :escape_formulas
268
+
269
+ # Sets whether to treat values starting with an equals sign as formulas or as literal strings.
270
+ # @param [Boolean] value The value to set.
271
+ def escape_formulas=(value)
272
+ Axlsx.validate_boolean(value)
273
+ @escape_formulas = value
274
+ end
275
+
276
+ # Indicates if the workbook should use autowidths or not.
277
+ # @note This gem no longer depends on RMagick for autowidth
278
+ # calculation. Thus the performance benefits of turning this off are
279
+ # marginal unless you are creating a very large sheet.
280
+ # @return [Boolean]
281
+ def use_autowidth() @use_autowidth; end
282
+
283
+ # see @use_autowidth
284
+ def use_autowidth=(v = true) Axlsx::validate_boolean v; @use_autowidth = v; end
285
+
286
+ # Font size of bold fonts is multiplied with this
287
+ # Used for automatic calculation of cell widths with bold text
288
+ # @return [Float]
289
+ attr_reader :bold_font_multiplier
290
+
291
+ def bold_font_multiplier=(v)
292
+ Axlsx::validate_float v
293
+ @bold_font_multiplier = v
294
+ end
295
+
296
+ # Font scale is calculated with this value (font_size / font_scale_divisor)
297
+ # Used for automatic calculation of cell widths
298
+ # @return [Float]
299
+ attr_reader :font_scale_divisor
300
+
301
+ def font_scale_divisor=(v)
302
+ Axlsx::validate_float v
303
+ @font_scale_divisor = v
304
+ end
305
+
306
+ # inserts a worksheet into this workbook at the position specified.
307
+ # It the index specified is out of range, the worksheet will be added to the end of the
308
+ # worksheets collection
309
+ # @return [Worksheet]
310
+ # @param index The zero based position to insert the newly created worksheet
311
+ # @param [Hash] options Options to pass into the worksheed during initialization.
312
+ # @option options [String] name The name of the worksheet
313
+ # @option options [Hash] page_margins The page margins for the worksheet
314
+ def insert_worksheet(index = 0, options = {})
315
+ worksheet = Worksheet.new(self, options)
316
+ @worksheets.delete_at(@worksheets.size - 1)
317
+ @worksheets.insert(index, worksheet)
318
+ yield worksheet if block_given?
319
+ worksheet
320
+ end
321
+
322
+ #
323
+ # Adds a worksheet to this workbook
324
+ # @return [Worksheet]
325
+ # @option options [String] name The name of the worksheet.
326
+ # @option options [Hash] page_margins The page margins for the worksheet.
327
+ # @see Worksheet#initialize
328
+ def add_worksheet(options = {})
329
+ worksheet = Worksheet.new(self, options)
330
+ yield worksheet if block_given?
331
+ worksheet
332
+ end
333
+
334
+ # Adds a new WorkbookView
335
+ # @return WorkbookViews
336
+ # @option options [Hash] options passed into the added WorkbookView
337
+ # @see WorkbookView#initialize
338
+ def add_view(options = {})
339
+ views << WorkbookView.new(options)
340
+ end
341
+
342
+ # Adds a defined name to this workbook
343
+ # @return [DefinedName]
344
+ # @param [String] formula @see DefinedName
345
+ # @param [Hash] options @see DefinedName
346
+ def add_defined_name(formula, options)
347
+ defined_names << DefinedName.new(formula, options)
348
+ end
349
+
350
+ # The workbook relationships. This is managed automatically by the workbook
351
+ # @return [Relationships]
352
+ def relationships
353
+ r = Relationships.new
354
+ @worksheets.each do |sheet|
355
+ r << Relationship.new(sheet, WORKSHEET_R, WORKSHEET_PN % (r.size + 1))
356
+ end
357
+ pivot_tables.each_with_index do |pivot_table, index|
358
+ r << Relationship.new(pivot_table.cache_definition, PIVOT_TABLE_CACHE_DEFINITION_R, PIVOT_TABLE_CACHE_DEFINITION_PN % (index + 1))
359
+ end
360
+ r << Relationship.new(self, STYLES_R, STYLES_PN)
361
+ if use_shared_strings
362
+ r << Relationship.new(self, SHARED_STRINGS_R, SHARED_STRINGS_PN)
363
+ end
364
+ r
365
+ end
366
+
367
+ # generates a shared string object against all cells in all worksheets.
368
+ # @return [SharedStringTable]
369
+ def shared_strings
370
+ SharedStringsTable.new(worksheets.collect { |ws| ws.cells }, xml_space)
371
+ end
372
+
373
+ # The xml:space attribute for the worksheet.
374
+ # This determines how whitespace is handled withing the document.
375
+ # The most relevant part being whitespace in the cell text.
376
+ # allowed values are :preserve and :default. Axlsx uses :preserve unless
377
+ # you explicily set this to :default.
378
+ # @return Symbol
379
+ def xml_space
380
+ @xml_space ||= :preserve
381
+ end
382
+
383
+ # Sets the xml:space attribute for the worksheet
384
+ # @see Worksheet#xml_space
385
+ # @param [Symbol] space must be one of :preserve or :default
386
+ def xml_space=(space)
387
+ Axlsx::RestrictionValidator.validate(:xml_space, [:preserve, :default], space)
388
+ @xml_space = space
389
+ end
390
+
391
+ # returns a range of cells in a worksheet
392
+ # @param [String] cell_def The excel style reference defining the worksheet and cells. The range must specify the sheet to
393
+ # retrieve the cells from. e.g. range('Sheet1!A1:B2') will return an array of four cells [A1, A2, B1, B2] while range('Sheet1!A1') will return a single Cell.
394
+ # @return [Cell, Array]
395
+ def [](cell_def)
396
+ sheet_name = cell_def.split('!')[0] if cell_def.match('!')
397
+ worksheet = self.worksheets.select { |s| s.name == sheet_name }.first
398
+ raise ArgumentError, 'Unknown Sheet' unless sheet_name && worksheet.is_a?(Worksheet)
399
+
400
+ worksheet[cell_def.gsub(/.+!/, "")]
401
+ end
402
+
403
+ # Serialize the workbook
404
+ # @param [String] str
405
+ # @return [String]
406
+ def to_xml_string(str = '')
407
+ add_worksheet(name: 'Sheet1') unless worksheets.size > 0
408
+ str << '<?xml version="1.0" encoding="UTF-8"?>'
409
+ str << ('<workbook xmlns="' << XML_NS << '" xmlns:r="' << XML_NS_R << '">')
410
+ str << ('<workbookPr date1904="' << @@date1904.to_s << '"/>')
411
+ views.to_xml_string(str)
412
+ str << '<sheets>'
413
+ if is_reversed
414
+ worksheets.reverse_each { |sheet| sheet.to_sheet_node_xml_string(str) }
415
+ else
416
+ worksheets.each { |sheet| sheet.to_sheet_node_xml_string(str) }
417
+ end
418
+ str << '</sheets>'
419
+ defined_names.to_xml_string(str)
420
+ unless pivot_tables.empty?
421
+ str << '<pivotCaches>'
422
+ pivot_tables.each do |pivot_table|
423
+ str << ('<pivotCache cacheId="' << pivot_table.cache_definition.cache_id.to_s << '" r:id="' << pivot_table.cache_definition.rId << '"/>')
424
+ end
425
+ str << '</pivotCaches>'
426
+ end
427
+ str << '</workbook>'
428
+ end
429
+ end
430
+ end