caxlsx 2.0.2

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