axlsx-alt 3.0.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 (330) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +9 -0
  3. data/.yardopts_guide +19 -0
  4. data/CHANGELOG.md +244 -0
  5. data/LICENSE +22 -0
  6. data/README.md +180 -0
  7. data/Rakefile +29 -0
  8. data/examples/2010_comments.rb +17 -0
  9. data/examples/anchor_swapping.rb +28 -0
  10. data/examples/auto_filter.rb +25 -0
  11. data/examples/basic_charts.rb +58 -0
  12. data/examples/chart_colors.rb +88 -0
  13. data/examples/colored_links.rb +59 -0
  14. data/examples/conditional_formatting/example_conditional_formatting.rb +89 -0
  15. data/examples/conditional_formatting/getting_barred.rb +37 -0
  16. data/examples/conditional_formatting/hitting_the_high_notes.rb +37 -0
  17. data/examples/conditional_formatting/scaled_colors.rb +39 -0
  18. data/examples/conditional_formatting/stop_and_go.rb +37 -0
  19. data/examples/data_validation.rb +67 -0
  20. data/examples/example.rb +885 -0
  21. data/examples/extractive.rb +45 -0
  22. data/examples/image1.jpeg +0 -0
  23. data/examples/ios_preview.rb +14 -0
  24. data/examples/merge_cells.rb +17 -0
  25. data/examples/no_grid_with_borders.rb +18 -0
  26. data/examples/page_setup.rb +11 -0
  27. data/examples/pivot_table.rb +39 -0
  28. data/examples/pivot_test.rb +63 -0
  29. data/examples/sheet_protection.rb +10 -0
  30. data/examples/skydrive/real_example.rb +63 -0
  31. data/examples/split.rb +16 -0
  32. data/examples/styles.rb +66 -0
  33. data/examples/underline.rb +13 -0
  34. data/examples/wrap_text.rb +21 -0
  35. data/lib/axlsx.rb +171 -0
  36. data/lib/axlsx/content_type/abstract_content_type.rb +32 -0
  37. data/lib/axlsx/content_type/content_type.rb +26 -0
  38. data/lib/axlsx/content_type/default.rb +25 -0
  39. data/lib/axlsx/content_type/override.rb +25 -0
  40. data/lib/axlsx/doc_props/app.rb +235 -0
  41. data/lib/axlsx/doc_props/core.rb +39 -0
  42. data/lib/axlsx/drawing/area_chart.rb +99 -0
  43. data/lib/axlsx/drawing/area_series.rb +110 -0
  44. data/lib/axlsx/drawing/ax_data_source.rb +26 -0
  45. data/lib/axlsx/drawing/axes.rb +61 -0
  46. data/lib/axlsx/drawing/axis.rb +190 -0
  47. data/lib/axlsx/drawing/bar_3D_chart.rb +151 -0
  48. data/lib/axlsx/drawing/bar_chart.rb +143 -0
  49. data/lib/axlsx/drawing/bar_series.rb +82 -0
  50. data/lib/axlsx/drawing/bubble_chart.rb +59 -0
  51. data/lib/axlsx/drawing/bubble_series.rb +63 -0
  52. data/lib/axlsx/drawing/cat_axis.rb +85 -0
  53. data/lib/axlsx/drawing/chart.rb +276 -0
  54. data/lib/axlsx/drawing/d_lbls.rb +90 -0
  55. data/lib/axlsx/drawing/drawing.rb +167 -0
  56. data/lib/axlsx/drawing/graphic_frame.rb +54 -0
  57. data/lib/axlsx/drawing/hyperlink.rb +100 -0
  58. data/lib/axlsx/drawing/line_3D_chart.rb +68 -0
  59. data/lib/axlsx/drawing/line_chart.rb +99 -0
  60. data/lib/axlsx/drawing/line_series.rb +110 -0
  61. data/lib/axlsx/drawing/marker.rb +84 -0
  62. data/lib/axlsx/drawing/num_data.rb +52 -0
  63. data/lib/axlsx/drawing/num_data_source.rb +62 -0
  64. data/lib/axlsx/drawing/num_val.rb +34 -0
  65. data/lib/axlsx/drawing/one_cell_anchor.rb +99 -0
  66. data/lib/axlsx/drawing/pic.rb +211 -0
  67. data/lib/axlsx/drawing/picture_locking.rb +42 -0
  68. data/lib/axlsx/drawing/pie_3D_chart.rb +47 -0
  69. data/lib/axlsx/drawing/pie_series.rb +74 -0
  70. data/lib/axlsx/drawing/scaling.rb +60 -0
  71. data/lib/axlsx/drawing/scatter_chart.rb +74 -0
  72. data/lib/axlsx/drawing/scatter_series.rb +98 -0
  73. data/lib/axlsx/drawing/ser_axis.rb +45 -0
  74. data/lib/axlsx/drawing/series.rb +69 -0
  75. data/lib/axlsx/drawing/series_title.rb +23 -0
  76. data/lib/axlsx/drawing/str_data.rb +42 -0
  77. data/lib/axlsx/drawing/str_val.rb +34 -0
  78. data/lib/axlsx/drawing/title.rb +96 -0
  79. data/lib/axlsx/drawing/two_cell_anchor.rb +97 -0
  80. data/lib/axlsx/drawing/val_axis.rb +37 -0
  81. data/lib/axlsx/drawing/view_3D.rb +115 -0
  82. data/lib/axlsx/drawing/vml_drawing.rb +42 -0
  83. data/lib/axlsx/drawing/vml_shape.rb +66 -0
  84. data/lib/axlsx/package.rb +358 -0
  85. data/lib/axlsx/rels/relationship.rb +137 -0
  86. data/lib/axlsx/rels/relationships.rb +32 -0
  87. data/lib/axlsx/stylesheet/border.rb +71 -0
  88. data/lib/axlsx/stylesheet/border_pr.rb +71 -0
  89. data/lib/axlsx/stylesheet/cell_alignment.rb +132 -0
  90. data/lib/axlsx/stylesheet/cell_protection.rb +41 -0
  91. data/lib/axlsx/stylesheet/cell_style.rb +72 -0
  92. data/lib/axlsx/stylesheet/color.rb +76 -0
  93. data/lib/axlsx/stylesheet/dxf.rb +79 -0
  94. data/lib/axlsx/stylesheet/fill.rb +35 -0
  95. data/lib/axlsx/stylesheet/font.rb +148 -0
  96. data/lib/axlsx/stylesheet/gradient_fill.rb +103 -0
  97. data/lib/axlsx/stylesheet/gradient_stop.rb +37 -0
  98. data/lib/axlsx/stylesheet/num_fmt.rb +86 -0
  99. data/lib/axlsx/stylesheet/pattern_fill.rb +73 -0
  100. data/lib/axlsx/stylesheet/styles.rb +420 -0
  101. data/lib/axlsx/stylesheet/table_style.rb +54 -0
  102. data/lib/axlsx/stylesheet/table_style_element.rb +77 -0
  103. data/lib/axlsx/stylesheet/table_styles.rb +46 -0
  104. data/lib/axlsx/stylesheet/xf.rb +147 -0
  105. data/lib/axlsx/util/accessors.rb +64 -0
  106. data/lib/axlsx/util/constants.rb +400 -0
  107. data/lib/axlsx/util/mime_type_utils.rb +11 -0
  108. data/lib/axlsx/util/options_parser.rb +16 -0
  109. data/lib/axlsx/util/parser.rb +44 -0
  110. data/lib/axlsx/util/serialized_attributes.rb +89 -0
  111. data/lib/axlsx/util/simple_typed_list.rb +179 -0
  112. data/lib/axlsx/util/storage.rb +146 -0
  113. data/lib/axlsx/util/validators.rb +312 -0
  114. data/lib/axlsx/version.rb +3 -0
  115. data/lib/axlsx/workbook/defined_name.rb +128 -0
  116. data/lib/axlsx/workbook/defined_names.rb +21 -0
  117. data/lib/axlsx/workbook/shared_strings_table.rb +77 -0
  118. data/lib/axlsx/workbook/workbook.rb +379 -0
  119. data/lib/axlsx/workbook/workbook_view.rb +80 -0
  120. data/lib/axlsx/workbook/workbook_views.rb +22 -0
  121. data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +77 -0
  122. data/lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb +94 -0
  123. data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +244 -0
  124. data/lib/axlsx/workbook/worksheet/break.rb +35 -0
  125. data/lib/axlsx/workbook/worksheet/cell.rb +478 -0
  126. data/lib/axlsx/workbook/worksheet/cell_serializer.rb +164 -0
  127. data/lib/axlsx/workbook/worksheet/cfvo.rb +60 -0
  128. data/lib/axlsx/workbook/worksheet/cfvos.rb +18 -0
  129. data/lib/axlsx/workbook/worksheet/col.rb +141 -0
  130. data/lib/axlsx/workbook/worksheet/col_breaks.rb +35 -0
  131. data/lib/axlsx/workbook/worksheet/color_scale.rb +110 -0
  132. data/lib/axlsx/workbook/worksheet/cols.rb +23 -0
  133. data/lib/axlsx/workbook/worksheet/comment.rb +90 -0
  134. data/lib/axlsx/workbook/worksheet/comments.rb +97 -0
  135. data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +82 -0
  136. data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +220 -0
  137. data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +25 -0
  138. data/lib/axlsx/workbook/worksheet/data_bar.rb +129 -0
  139. data/lib/axlsx/workbook/worksheet/data_validation.rb +246 -0
  140. data/lib/axlsx/workbook/worksheet/data_validations.rb +28 -0
  141. data/lib/axlsx/workbook/worksheet/date_time_converter.rb +30 -0
  142. data/lib/axlsx/workbook/worksheet/dimension.rb +64 -0
  143. data/lib/axlsx/workbook/worksheet/header_footer.rb +52 -0
  144. data/lib/axlsx/workbook/worksheet/icon_set.rb +81 -0
  145. data/lib/axlsx/workbook/worksheet/merged_cells.rb +37 -0
  146. data/lib/axlsx/workbook/worksheet/outline_pr.rb +33 -0
  147. data/lib/axlsx/workbook/worksheet/page_margins.rb +97 -0
  148. data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +44 -0
  149. data/lib/axlsx/workbook/worksheet/page_setup.rb +240 -0
  150. data/lib/axlsx/workbook/worksheet/pane.rb +139 -0
  151. data/lib/axlsx/workbook/worksheet/pivot_table.rb +289 -0
  152. data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +66 -0
  153. data/lib/axlsx/workbook/worksheet/pivot_tables.rb +24 -0
  154. data/lib/axlsx/workbook/worksheet/print_options.rb +39 -0
  155. data/lib/axlsx/workbook/worksheet/protected_range.rb +47 -0
  156. data/lib/axlsx/workbook/worksheet/protected_ranges.rb +37 -0
  157. data/lib/axlsx/workbook/worksheet/rich_text.rb +55 -0
  158. data/lib/axlsx/workbook/worksheet/rich_text_run.rb +250 -0
  159. data/lib/axlsx/workbook/worksheet/row.rb +161 -0
  160. data/lib/axlsx/workbook/worksheet/row_breaks.rb +33 -0
  161. data/lib/axlsx/workbook/worksheet/selection.rb +101 -0
  162. data/lib/axlsx/workbook/worksheet/sheet_calc_pr.rb +29 -0
  163. data/lib/axlsx/workbook/worksheet/sheet_data.rb +27 -0
  164. data/lib/axlsx/workbook/worksheet/sheet_format_pr.rb +60 -0
  165. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +87 -0
  166. data/lib/axlsx/workbook/worksheet/sheet_protection.rb +118 -0
  167. data/lib/axlsx/workbook/worksheet/sheet_view.rb +213 -0
  168. data/lib/axlsx/workbook/worksheet/table.rb +102 -0
  169. data/lib/axlsx/workbook/worksheet/table_style_info.rb +49 -0
  170. data/lib/axlsx/workbook/worksheet/tables.rb +34 -0
  171. data/lib/axlsx/workbook/worksheet/worksheet.rb +756 -0
  172. data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +58 -0
  173. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +58 -0
  174. data/lib/axlsx/workbook/worksheet/worksheet_hyperlink.rb +74 -0
  175. data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +38 -0
  176. data/lib/schema/dc.xsd +118 -0
  177. data/lib/schema/dcmitype.xsd +52 -0
  178. data/lib/schema/dcterms.xsd +331 -0
  179. data/lib/schema/dml-chart.xsd +1499 -0
  180. data/lib/schema/dml-chartDrawing.xsd +146 -0
  181. data/lib/schema/dml-compatibility.xsd +14 -0
  182. data/lib/schema/dml-diagram.xsd +1091 -0
  183. data/lib/schema/dml-lockedCanvas.xsd +11 -0
  184. data/lib/schema/dml-main.xsd +3048 -0
  185. data/lib/schema/dml-picture.xsd +23 -0
  186. data/lib/schema/dml-spreadsheetDrawing.xsd +185 -0
  187. data/lib/schema/dml-wordprocessingDrawing.xsd +185 -0
  188. data/lib/schema/opc-contentTypes.xsd +42 -0
  189. data/lib/schema/opc-coreProperties.xsd +54 -0
  190. data/lib/schema/opc-digSig.xsd +49 -0
  191. data/lib/schema/opc-relationships.xsd +33 -0
  192. data/lib/schema/pml.xsd +1676 -0
  193. data/lib/schema/shared-additionalCharacteristics.xsd +28 -0
  194. data/lib/schema/shared-bibliography.xsd +144 -0
  195. data/lib/schema/shared-commonSimpleTypes.xsd +166 -0
  196. data/lib/schema/shared-customXmlDataProperties.xsd +25 -0
  197. data/lib/schema/shared-customXmlSchemaProperties.xsd +18 -0
  198. data/lib/schema/shared-documentPropertiesCustom.xsd +59 -0
  199. data/lib/schema/shared-documentPropertiesExtended.xsd +56 -0
  200. data/lib/schema/shared-documentPropertiesVariantTypes.xsd +195 -0
  201. data/lib/schema/shared-math.xsd +582 -0
  202. data/lib/schema/shared-relationshipReference.xsd +25 -0
  203. data/lib/schema/sml.xsd +4434 -0
  204. data/lib/schema/vml-main.xsd +569 -0
  205. data/lib/schema/vml-officeDrawing.xsd +509 -0
  206. data/lib/schema/vml-presentationDrawing.xsd +12 -0
  207. data/lib/schema/vml-spreadsheetDrawing.xsd +108 -0
  208. data/lib/schema/vml-wordprocessingDrawing.xsd +96 -0
  209. data/lib/schema/wml.xsd +3644 -0
  210. data/lib/schema/xml.xsd +116 -0
  211. data/test/benchmark.rb +72 -0
  212. data/test/content_type/tc_content_type.rb +76 -0
  213. data/test/content_type/tc_default.rb +16 -0
  214. data/test/content_type/tc_override.rb +14 -0
  215. data/test/doc_props/tc_app.rb +43 -0
  216. data/test/doc_props/tc_core.rb +42 -0
  217. data/test/drawing/tc_area_chart.rb +39 -0
  218. data/test/drawing/tc_area_series.rb +71 -0
  219. data/test/drawing/tc_axes.rb +8 -0
  220. data/test/drawing/tc_axis.rb +112 -0
  221. data/test/drawing/tc_bar_3D_chart.rb +71 -0
  222. data/test/drawing/tc_bar_chart.rb +71 -0
  223. data/test/drawing/tc_bar_series.rb +37 -0
  224. data/test/drawing/tc_bubble_chart.rb +44 -0
  225. data/test/drawing/tc_bubble_series.rb +21 -0
  226. data/test/drawing/tc_cat_axis.rb +31 -0
  227. data/test/drawing/tc_cat_axis_data.rb +27 -0
  228. data/test/drawing/tc_chart.rb +123 -0
  229. data/test/drawing/tc_d_lbls.rb +57 -0
  230. data/test/drawing/tc_data_source.rb +23 -0
  231. data/test/drawing/tc_drawing.rb +80 -0
  232. data/test/drawing/tc_graphic_frame.rb +27 -0
  233. data/test/drawing/tc_hyperlink.rb +64 -0
  234. data/test/drawing/tc_line_3d_chart.rb +47 -0
  235. data/test/drawing/tc_line_chart.rb +39 -0
  236. data/test/drawing/tc_line_series.rb +71 -0
  237. data/test/drawing/tc_marker.rb +44 -0
  238. data/test/drawing/tc_named_axis_data.rb +27 -0
  239. data/test/drawing/tc_num_data.rb +31 -0
  240. data/test/drawing/tc_num_val.rb +29 -0
  241. data/test/drawing/tc_one_cell_anchor.rb +66 -0
  242. data/test/drawing/tc_pic.rb +103 -0
  243. data/test/drawing/tc_picture_locking.rb +72 -0
  244. data/test/drawing/tc_pie_3D_chart.rb +28 -0
  245. data/test/drawing/tc_pie_series.rb +32 -0
  246. data/test/drawing/tc_scaling.rb +36 -0
  247. data/test/drawing/tc_scatter_chart.rb +48 -0
  248. data/test/drawing/tc_scatter_series.rb +56 -0
  249. data/test/drawing/tc_ser_axis.rb +31 -0
  250. data/test/drawing/tc_series.rb +23 -0
  251. data/test/drawing/tc_series_title.rb +33 -0
  252. data/test/drawing/tc_str_data.rb +18 -0
  253. data/test/drawing/tc_str_val.rb +30 -0
  254. data/test/drawing/tc_title.rb +54 -0
  255. data/test/drawing/tc_two_cell_anchor.rb +36 -0
  256. data/test/drawing/tc_val_axis.rb +24 -0
  257. data/test/drawing/tc_view_3D.rb +54 -0
  258. data/test/drawing/tc_vml_drawing.rb +25 -0
  259. data/test/drawing/tc_vml_shape.rb +106 -0
  260. data/test/profile.rb +24 -0
  261. data/test/rels/tc_relationship.rb +44 -0
  262. data/test/rels/tc_relationships.rb +37 -0
  263. data/test/stylesheet/tc_border.rb +37 -0
  264. data/test/stylesheet/tc_border_pr.rb +32 -0
  265. data/test/stylesheet/tc_cell_alignment.rb +81 -0
  266. data/test/stylesheet/tc_cell_protection.rb +29 -0
  267. data/test/stylesheet/tc_cell_style.rb +57 -0
  268. data/test/stylesheet/tc_color.rb +43 -0
  269. data/test/stylesheet/tc_dxf.rb +81 -0
  270. data/test/stylesheet/tc_fill.rb +18 -0
  271. data/test/stylesheet/tc_font.rb +121 -0
  272. data/test/stylesheet/tc_gradient_fill.rb +72 -0
  273. data/test/stylesheet/tc_gradient_stop.rb +31 -0
  274. data/test/stylesheet/tc_num_fmt.rb +30 -0
  275. data/test/stylesheet/tc_pattern_fill.rb +43 -0
  276. data/test/stylesheet/tc_styles.rb +235 -0
  277. data/test/stylesheet/tc_table_style.rb +44 -0
  278. data/test/stylesheet/tc_table_style_element.rb +45 -0
  279. data/test/stylesheet/tc_table_styles.rb +29 -0
  280. data/test/stylesheet/tc_xf.rb +120 -0
  281. data/test/tc_axlsx.rb +103 -0
  282. data/test/tc_helper.rb +12 -0
  283. data/test/tc_package.rb +245 -0
  284. data/test/util/tc_mime_type_utils.rb +13 -0
  285. data/test/util/tc_serialized_attributes.rb +19 -0
  286. data/test/util/tc_simple_typed_list.rb +77 -0
  287. data/test/util/tc_validators.rb +210 -0
  288. data/test/workbook/tc_defined_name.rb +49 -0
  289. data/test/workbook/tc_shared_strings_table.rb +59 -0
  290. data/test/workbook/tc_workbook.rb +160 -0
  291. data/test/workbook/tc_workbook_view.rb +50 -0
  292. data/test/workbook/worksheet/auto_filter/tc_auto_filter.rb +38 -0
  293. data/test/workbook/worksheet/auto_filter/tc_filter_column.rb +76 -0
  294. data/test/workbook/worksheet/auto_filter/tc_filters.rb +50 -0
  295. data/test/workbook/worksheet/tc_break.rb +49 -0
  296. data/test/workbook/worksheet/tc_cell.rb +387 -0
  297. data/test/workbook/worksheet/tc_cfvo.rb +31 -0
  298. data/test/workbook/worksheet/tc_col.rb +78 -0
  299. data/test/workbook/worksheet/tc_color_scale.rb +58 -0
  300. data/test/workbook/worksheet/tc_comment.rb +72 -0
  301. data/test/workbook/worksheet/tc_comments.rb +57 -0
  302. data/test/workbook/worksheet/tc_conditional_formatting.rb +224 -0
  303. data/test/workbook/worksheet/tc_data_bar.rb +46 -0
  304. data/test/workbook/worksheet/tc_data_validation.rb +265 -0
  305. data/test/workbook/worksheet/tc_date_time_converter.rb +124 -0
  306. data/test/workbook/worksheet/tc_header_footer.rb +151 -0
  307. data/test/workbook/worksheet/tc_icon_set.rb +45 -0
  308. data/test/workbook/worksheet/tc_outline_pr.rb +19 -0
  309. data/test/workbook/worksheet/tc_page_margins.rb +97 -0
  310. data/test/workbook/worksheet/tc_page_set_up_pr.rb +15 -0
  311. data/test/workbook/worksheet/tc_page_setup.rb +143 -0
  312. data/test/workbook/worksheet/tc_pane.rb +54 -0
  313. data/test/workbook/worksheet/tc_pivot_table.rb +135 -0
  314. data/test/workbook/worksheet/tc_pivot_table_cache_definition.rb +54 -0
  315. data/test/workbook/worksheet/tc_print_options.rb +72 -0
  316. data/test/workbook/worksheet/tc_protected_range.rb +17 -0
  317. data/test/workbook/worksheet/tc_rich_text.rb +44 -0
  318. data/test/workbook/worksheet/tc_rich_text_run.rb +172 -0
  319. data/test/workbook/worksheet/tc_row.rb +122 -0
  320. data/test/workbook/worksheet/tc_selection.rb +55 -0
  321. data/test/workbook/worksheet/tc_sheet_calc_pr.rb +18 -0
  322. data/test/workbook/worksheet/tc_sheet_format_pr.rb +88 -0
  323. data/test/workbook/worksheet/tc_sheet_pr.rb +49 -0
  324. data/test/workbook/worksheet/tc_sheet_protection.rb +117 -0
  325. data/test/workbook/worksheet/tc_sheet_view.rb +214 -0
  326. data/test/workbook/worksheet/tc_table.rb +67 -0
  327. data/test/workbook/worksheet/tc_table_style_info.rb +53 -0
  328. data/test/workbook/worksheet/tc_worksheet.rb +597 -0
  329. data/test/workbook/worksheet/tc_worksheet_hyperlink.rb +55 -0
  330. metadata +601 -0
@@ -0,0 +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
@@ -0,0 +1,379 @@
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
+ # 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
+
110
+ # A collection of worksheets associated with this workbook.
111
+ # @note The recommended way to manage worksheets is add_worksheet
112
+ # @see Workbook#add_worksheet
113
+ # @see Worksheet
114
+ # @return [SimpleTypedList]
115
+ attr_reader :worksheets
116
+
117
+ # A colllection of charts associated with this workbook
118
+ # @note The recommended way to manage charts is Worksheet#add_chart
119
+ # @see Worksheet#add_chart
120
+ # @see Chart
121
+ # @return [SimpleTypedList]
122
+ attr_reader :charts
123
+
124
+ # A colllection of images associated with this workbook
125
+ # @note The recommended way to manage images is Worksheet#add_image
126
+ # @see Worksheet#add_image
127
+ # @see Pic
128
+ # @return [SimpleTypedList]
129
+ attr_reader :images
130
+
131
+ # A colllection of drawings associated with this workbook
132
+ # @note The recommended way to manage drawings is Worksheet#add_chart
133
+ # @see Worksheet#add_chart
134
+ # @see Drawing
135
+ # @return [SimpleTypedList]
136
+ attr_reader :drawings
137
+
138
+ # pretty sure this two are always empty and can be removed.
139
+
140
+
141
+ # A colllection of tables associated with this workbook
142
+ # @note The recommended way to manage drawings is Worksheet#add_table
143
+ # @see Worksheet#add_table
144
+ # @see Table
145
+ # @return [SimpleTypedList]
146
+ attr_reader :tables
147
+
148
+ # A colllection of pivot tables associated with this workbook
149
+ # @note The recommended way to manage drawings is Worksheet#add_table
150
+ # @see Worksheet#add_table
151
+ # @see Table
152
+ # @return [SimpleTypedList]
153
+ attr_reader :pivot_tables
154
+
155
+ # A collection of views for this workbook
156
+ def views
157
+ @views ||= WorkbookViews.new
158
+ end
159
+
160
+ # A collection of defined names for this workbook
161
+ # @note The recommended way to manage defined names is Workbook#add_defined_name
162
+ # @see DefinedName
163
+ # @return [DefinedNames]
164
+ def defined_names
165
+ @defined_names ||= DefinedNames.new
166
+ end
167
+
168
+ # A collection of comments associated with this workbook
169
+ # @note The recommended way to manage comments is WOrksheet#add_comment
170
+ # @see Worksheet#add_comment
171
+ # @see Comment
172
+ # @return [Comments]
173
+ def comments
174
+ worksheets.map { |sheet| sheet.comments }.compact
175
+ end
176
+
177
+ # The styles associated with this workbook
178
+ # @note The recommended way to manage styles is Styles#add_style
179
+ # @see Style#add_style
180
+ # @see Style
181
+ # @return [Styles]
182
+ def styles
183
+ yield @styles if block_given?
184
+ @styles
185
+ end
186
+
187
+
188
+ # Indicates if the epoc date for serialization should be 1904. If false, 1900 is used.
189
+ @@date1904 = false
190
+
191
+
192
+ # A quick helper to retrive a worksheet by name
193
+ # @param [String] name The name of the sheet you are looking for
194
+ # @return [Worksheet] The sheet found, or nil
195
+ def sheet_by_name(name)
196
+ index = @worksheets.index { |sheet| sheet.name == name }
197
+ @worksheets[index] if index
198
+ end
199
+
200
+ # lets come back to this later when we are ready for parsing.
201
+ #def self.parse entry
202
+ # io = entry.get_input_stream
203
+ # w = self.new
204
+ # w.parser_xml = Nokogiri::XML(io.read)
205
+ # w.parse_string :date1904, "//xmlns:workbookPr/@date1904"
206
+ # w
207
+ #end
208
+
209
+ # Creates a new Workbook
210
+ # The recomended way to work with workbooks is via Package#workbook
211
+ # @option options [Boolean] date1904. If this is not specified, date1904 is set to false. Office 2011 for Mac defaults to false.
212
+ def initialize(options={})
213
+ @styles = Styles.new
214
+ @worksheets = SimpleTypedList.new Worksheet
215
+ @drawings = SimpleTypedList.new Drawing
216
+ @charts = SimpleTypedList.new Chart
217
+ @images = SimpleTypedList.new Pic
218
+ # Are these even used????? Check package serialization parts
219
+ @tables = SimpleTypedList.new Table
220
+ @pivot_tables = SimpleTypedList.new PivotTable
221
+ @comments = SimpleTypedList.new Comments
222
+
223
+
224
+ @use_autowidth = true
225
+
226
+ self.date1904= !options[:date1904].nil? && options[:date1904]
227
+ yield self if block_given?
228
+ end
229
+
230
+ # Instance level access to the class variable 1904
231
+ # @return [Boolean]
232
+ def date1904() @@date1904; end
233
+
234
+ # see @date1904
235
+ def date1904=(v) Axlsx::validate_boolean v; @@date1904 = v; end
236
+
237
+ # Sets the date1904 attribute to the provided boolean
238
+ # @return [Boolean]
239
+ def self.date1904=(v) Axlsx::validate_boolean v; @@date1904 = v; end
240
+
241
+ # retrieves the date1904 attribute
242
+ # @return [Boolean]
243
+ def self.date1904() @@date1904; end
244
+
245
+ # Indicates if the workbook should use autowidths or not.
246
+ # @note This gem no longer depends on RMagick for autowidth
247
+ # calculation. Thus the performance benefits of turning this off are
248
+ # marginal unless you are creating a very large sheet.
249
+ # @return [Boolean]
250
+ def use_autowidth() @use_autowidth; end
251
+
252
+ # see @use_autowidth
253
+ def use_autowidth=(v=true) Axlsx::validate_boolean v; @use_autowidth = v; end
254
+
255
+ # inserts a worksheet into this workbook at the position specified.
256
+ # It the index specified is out of range, the worksheet will be added to the end of the
257
+ # worksheets collection
258
+ # @return [Worksheet]
259
+ # @param index The zero based position to insert the newly created worksheet
260
+ # @param [Hash] options Options to pass into the worksheed during initialization.
261
+ # @option options [String] name The name of the worksheet
262
+ # @option options [Hash] page_margins The page margins for the worksheet
263
+ def insert_worksheet(index=0, options={})
264
+ worksheet = Worksheet.new(self, options)
265
+ @worksheets.delete_at(@worksheets.size - 1)
266
+ @worksheets.insert(index, worksheet)
267
+ yield worksheet if block_given?
268
+ worksheet
269
+ end
270
+
271
+ #
272
+ # Adds a worksheet to this workbook
273
+ # @return [Worksheet]
274
+ # @option options [String] name The name of the worksheet.
275
+ # @option options [Hash] page_margins The page margins for the worksheet.
276
+ # @see Worksheet#initialize
277
+ def add_worksheet(options={})
278
+ worksheet = Worksheet.new(self, options)
279
+ yield worksheet if block_given?
280
+ worksheet
281
+ end
282
+
283
+ # Adds a new WorkbookView
284
+ # @return WorkbookViews
285
+ # @option options [Hash] options passed into the added WorkbookView
286
+ # @see WorkbookView#initialize
287
+ def add_view(options={})
288
+ views << WorkbookView.new(options)
289
+ end
290
+
291
+ # Adds a defined name to this workbook
292
+ # @return [DefinedName]
293
+ # @param [String] formula @see DefinedName
294
+ # @param [Hash] options @see DefinedName
295
+ def add_defined_name(formula, options)
296
+ defined_names << DefinedName.new(formula, options)
297
+ end
298
+
299
+ # The workbook relationships. This is managed automatically by the workbook
300
+ # @return [Relationships]
301
+ def relationships
302
+ r = Relationships.new
303
+ @worksheets.each do |sheet|
304
+ r << Relationship.new(sheet, WORKSHEET_R, WORKSHEET_PN % (r.size+1))
305
+ end
306
+ pivot_tables.each_with_index do |pivot_table, index|
307
+ r << Relationship.new(pivot_table.cache_definition, PIVOT_TABLE_CACHE_DEFINITION_R, PIVOT_TABLE_CACHE_DEFINITION_PN % (index+1))
308
+ end
309
+ r << Relationship.new(self, STYLES_R, STYLES_PN)
310
+ if use_shared_strings
311
+ r << Relationship.new(self, SHARED_STRINGS_R, SHARED_STRINGS_PN)
312
+ end
313
+ r
314
+ end
315
+
316
+ # generates a shared string object against all cells in all worksheets.
317
+ # @return [SharedStringTable]
318
+ def shared_strings
319
+ SharedStringsTable.new(worksheets.collect { |ws| ws.cells }, xml_space)
320
+ end
321
+
322
+ # The xml:space attribute for the worksheet.
323
+ # This determines how whitespace is handled withing the document.
324
+ # The most relevant part being whitespace in the cell text.
325
+ # allowed values are :preserve and :default. Axlsx uses :preserve unless
326
+ # you explicily set this to :default.
327
+ # @return Symbol
328
+ def xml_space
329
+ @xml_space ||= :preserve
330
+ end
331
+
332
+ # Sets the xml:space attribute for the worksheet
333
+ # @see Worksheet#xml_space
334
+ # @param [Symbol] space must be one of :preserve or :default
335
+ def xml_space=(space)
336
+ Axlsx::RestrictionValidator.validate(:xml_space, [:preserve, :default], space)
337
+ @xml_space = space;
338
+ end
339
+
340
+ # returns a range of cells in a worksheet
341
+ # @param [String] cell_def The excel style reference defining the worksheet and cells. The range must specify the sheet to
342
+ # 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.
343
+ # @return [Cell, Array]
344
+ def [](cell_def)
345
+ sheet_name = cell_def.split('!')[0] if cell_def.match('!')
346
+ worksheet = self.worksheets.select { |s| s.name == sheet_name }.first
347
+ raise ArgumentError, 'Unknown Sheet' unless sheet_name && worksheet.is_a?(Worksheet)
348
+ worksheet[cell_def.gsub(/.+!/,"")]
349
+ end
350
+
351
+ # Serialize the workbook
352
+ # @param [String] str
353
+ # @return [String]
354
+ def to_xml_string(str='')
355
+ add_worksheet(name: 'Sheet1') unless worksheets.size > 0
356
+ str << '<?xml version="1.0" encoding="UTF-8"?>'
357
+ str << ('<workbook xmlns="' << XML_NS << '" xmlns:r="' << XML_NS_R << '">')
358
+ str << ('<workbookPr date1904="' << @@date1904.to_s << '"/>')
359
+ views.to_xml_string(str)
360
+ str << '<sheets>'
361
+ if is_reversed
362
+ worksheets.reverse_each { |sheet| sheet.to_sheet_node_xml_string(str) }
363
+ else
364
+ worksheets.each { |sheet| sheet.to_sheet_node_xml_string(str) }
365
+ end
366
+ str << '</sheets>'
367
+ defined_names.to_xml_string(str)
368
+ unless pivot_tables.empty?
369
+ str << '<pivotCaches>'
370
+ pivot_tables.each do |pivot_table|
371
+ str << ('<pivotCache cacheId="' << pivot_table.cache_definition.cache_id.to_s << '" r:id="' << pivot_table.cache_definition.rId << '"/>')
372
+ end
373
+ str << '</pivotCaches>'
374
+ end
375
+ str << '</workbook>'
376
+ end
377
+
378
+ end
379
+ end