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
data/lib/axlsx.rb CHANGED
@@ -1,185 +1,218 @@
1
- # encoding: UTF-8
2
- require 'htmlentities'
3
- require 'axlsx/version.rb'
4
- require 'marcel'
5
-
6
- require 'axlsx/util/simple_typed_list.rb'
7
- require 'axlsx/util/constants.rb'
8
- require 'axlsx/util/validators.rb'
9
- require 'axlsx/util/accessors.rb'
10
- require 'axlsx/util/serialized_attributes'
11
- require 'axlsx/util/options_parser'
12
- require 'axlsx/util/mime_type_utils'
13
- require 'axlsx/util/zip_command'
14
-
15
- require 'axlsx/stylesheet/styles.rb'
16
-
17
- require 'axlsx/doc_props/app.rb'
18
- require 'axlsx/doc_props/core.rb'
19
- require 'axlsx/content_type/content_type.rb'
20
- require 'axlsx/rels/relationships.rb'
21
-
22
- require 'axlsx/drawing/drawing.rb'
23
- require 'axlsx/workbook/workbook.rb'
24
- require 'axlsx/package.rb'
25
- #required gems
26
- require 'nokogiri'
27
- require 'zip'
28
-
29
- #core dependencies
30
- require 'bigdecimal'
31
- require 'time'
32
-
33
- #if object does not have this already, I am borrowing it from active_support.
34
- # I am a very big fan of activesupports instance_values method, but do not want to require nor include the entire
35
- # library just for this one method.
36
- if !Object.respond_to?(:instance_values)
37
- Object.send :public # patch for 1.8.7 as it uses private scope
38
- Object.send :define_method, :instance_values do
39
- Hash[instance_variables.map { |name| [name.to_s[1..-1], instance_variable_get(name)] }]
40
- end
41
- end
42
-
43
- # xlsx generation with charts, images, automated column width, customizable styles
44
- # and full schema validation. Axlsx excels at helping you generate beautiful
45
- # Office Open XML Spreadsheet documents without having to understand the entire
46
- # ECMA specification. Check out the README for some examples of how easy it is.
47
- # Best of all, you can validate your xlsx file before serialization so you know
48
- # for sure that anything generated is going to load on your client's machine.
49
- module Axlsx
50
-
51
- # determines the cell range for the items provided
52
- def self.cell_range(cells, absolute=true)
53
- return "" unless cells.first.is_a? Cell
54
-
55
- first_cell, last_cell = cells.minmax_by(&:pos)
56
- reference = "#{first_cell.reference(absolute)}:#{last_cell.reference(absolute)}"
57
- if absolute
58
- escaped_name = first_cell.row.worksheet.name.gsub ''', "''"
59
- "'#{escaped_name}'!#{reference}"
60
- else
61
- reference
62
- end
63
- end
64
-
65
- # sorts the array of cells provided to start from the minimum x,y to
66
- # the maximum x.y#
67
- # @param [Array] cells
68
- # @return [Array]
69
- def self.sort_cells(cells)
70
- cells.sort_by(&:pos)
71
- end
72
-
73
- #global reference html entity encoding
74
- # @return [HtmlEntities]
75
- def self.coder
76
- @@coder ||= ::HTMLEntities.new
77
- end
78
-
79
- # returns the x, y position of a cell
80
- def self.name_to_indices(name)
81
- raise ArgumentError, 'invalid cell name' unless name.size > 1
82
-
83
- letters_str = name[/[A-Z]+/]
84
-
85
- # capitalization?!?
86
- v = letters_str.reverse.chars.reduce({:base=>1, :i=>0}) do |val, c|
87
- val[:i] += ((c.bytes.first - 64) * val[:base])
88
-
89
- val[:base] *= 26
90
-
91
- next val
92
- end
93
-
94
- col_index = (v[:i] - 1)
95
-
96
- numbers_str = name[/[1-9][0-9]*/]
97
-
98
- row_index = (numbers_str.to_i - 1)
99
-
100
- return [col_index, row_index]
101
- end
102
-
103
- # converts the column index into alphabetical values.
104
- # @note This follows the standard spreadsheet convention of naming columns A to Z, followed by AA to AZ etc.
105
- # @return [String]
106
- def self.col_ref(index)
107
- chars = ''
108
- while index >= 26 do
109
- index, char = index.divmod(26)
110
- chars.prepend((char + 65).chr)
111
- index -= 1
112
- end
113
- chars.prepend((index + 65).chr)
114
- chars
115
- end
116
-
117
- # @return [String] The alpha(column)numeric(row) reference for this sell.
118
- # @example Relative Cell Reference
119
- # ws.rows.first.cells.first.r #=> "A1"
120
- def self.cell_r(c_index, r_index)
121
- col_ref(c_index) << (r_index+1).to_s
122
- end
123
-
124
- # Creates an array of individual cell references based on an excel reference range.
125
- # @param [String] range A cell range, for example A1:D5
126
- # @return [Array]
127
- def self.range_to_a(range)
128
- range.match(/^(\w+?\d+)\:(\w+?\d+)$/)
129
- start_col, start_row = name_to_indices($1)
130
- end_col, end_row = name_to_indices($2)
131
- (start_row..end_row).to_a.map do |row_num|
132
- (start_col..end_col).to_a.map do |col_num|
133
- cell_r(col_num, row_num)
134
- end
135
- end
136
- end
137
-
138
- # performs the increadible feat of changing snake_case to CamelCase
139
- # @param [String] s The snake case string to camelize
140
- # @return [String]
141
- def self.camel(s="", all_caps = true)
142
- s = s.to_s
143
- s = s.capitalize if all_caps
144
- s.gsub(/_(.)/){ $1.upcase }
145
- end
146
-
147
- # returns the provided string with all invalid control charaters
148
- # removed.
149
- # @param [String] str The string to process
150
- # @return [String]
151
- def self.sanitize(str)
152
- if str.frozen?
153
- str.delete(CONTROL_CHARS)
154
- else
155
- str.delete!(CONTROL_CHARS)
156
- str
157
- end
158
- end
159
-
160
- # If value is boolean return 1 or 0
161
- # else return the value
162
- # @param [Object] value The value to process
163
- # @return [Object]
164
- def self.booleanize(value)
165
- if value == true || value == false
166
- value ? 1 : 0
167
- else
168
- value
169
- end
170
- end
171
-
172
- # Instructs the serializer to not try to escape cell value input.
173
- # This will give you a huge speed bonus, but if you content has <, > or other xml character data
174
- # the workbook will be invalid and excel will complain.
175
- def self.trust_input
176
- @trust_input ||= false
177
- end
178
-
179
- # @param[Boolean] trust_me A boolean value indicating if the cell value content is to be trusted
180
- # @return [Boolean]
181
- # @see Axlsx::trust_input
182
- def self.trust_input=(trust_me)
183
- @trust_input = trust_me
184
- end
185
- end
1
+ require 'htmlentities'
2
+ require 'axlsx/version.rb'
3
+ require 'marcel'
4
+
5
+ require 'axlsx/util/simple_typed_list.rb'
6
+ require 'axlsx/util/constants.rb'
7
+ require 'axlsx/util/validators.rb'
8
+ require 'axlsx/util/accessors.rb'
9
+ require 'axlsx/util/serialized_attributes'
10
+ require 'axlsx/util/options_parser'
11
+ require 'axlsx/util/mime_type_utils'
12
+ require 'axlsx/util/zip_command'
13
+
14
+ require 'axlsx/stylesheet/styles.rb'
15
+
16
+ require 'axlsx/doc_props/app.rb'
17
+ require 'axlsx/doc_props/core.rb'
18
+ require 'axlsx/content_type/content_type.rb'
19
+ require 'axlsx/rels/relationships.rb'
20
+
21
+ require 'axlsx/drawing/drawing.rb'
22
+ require 'axlsx/workbook/workbook.rb'
23
+ require 'axlsx/package.rb'
24
+ # required gems
25
+ require 'nokogiri'
26
+ require 'zip'
27
+
28
+ # core dependencies
29
+ require 'bigdecimal'
30
+ require 'set'
31
+ require 'time'
32
+
33
+ begin
34
+ if Gem.loaded_specs.has_key?("axlsx_styler")
35
+ raise StandardError.new("Please remove `axlsx_styler` from your Gemfile, the associated functionality is now built-in to `caxlsx` directly.")
36
+ end
37
+ rescue
38
+ # Do nothing
39
+ end
40
+
41
+ # xlsx generation with charts, images, automated column width, customizable styles
42
+ # and full schema validation. Axlsx excels at helping you generate beautiful
43
+ # Office Open XML Spreadsheet documents without having to understand the entire
44
+ # ECMA specification. Check out the README for some examples of how easy it is.
45
+ # Best of all, you can validate your xlsx file before serialization so you know
46
+ # for sure that anything generated is going to load on your client's machine.
47
+ module Axlsx
48
+ # I am a very big fan of activesupports instance_values method, but do not want to require nor include the entire
49
+ # library just for this one method.
50
+ #
51
+ # Defining as a class method on Axlsx to refrain from monkeypatching Object for all users of this gem.
52
+ def self.instance_values_for(object)
53
+ Hash[object.instance_variables.map { |name| [name.to_s[1..-1], object.instance_variable_get(name)] }]
54
+ end
55
+
56
+ # determines the cell range for the items provided
57
+ def self.cell_range(cells, absolute = true)
58
+ return "" unless cells.first.is_a? Cell
59
+
60
+ first_cell, last_cell = cells.minmax_by(&:pos)
61
+ reference = "#{first_cell.reference(absolute)}:#{last_cell.reference(absolute)}"
62
+ if absolute
63
+ escaped_name = first_cell.row.worksheet.name.gsub '&apos;', "''"
64
+ "'#{escaped_name}'!#{reference}"
65
+ else
66
+ reference
67
+ end
68
+ end
69
+
70
+ # sorts the array of cells provided to start from the minimum x,y to
71
+ # the maximum x.y#
72
+ # @param [Array] cells
73
+ # @return [Array]
74
+ def self.sort_cells(cells)
75
+ cells.sort_by(&:pos)
76
+ end
77
+
78
+ # global reference html entity encoding
79
+ # @return [HtmlEntities]
80
+ def self.coder
81
+ @@coder ||= ::HTMLEntities.new
82
+ end
83
+
84
+ # returns the x, y position of a cell
85
+ def self.name_to_indices(name)
86
+ raise ArgumentError, 'invalid cell name' unless name.size > 1
87
+
88
+ letters_str = name[/[A-Z]+/]
89
+
90
+ # capitalization?!?
91
+ v = letters_str.reverse.chars.reduce({ :base => 1, :i => 0 }) do |val, c|
92
+ val[:i] += ((c.bytes.first - 64) * val[:base])
93
+
94
+ val[:base] *= 26
95
+
96
+ next val
97
+ end
98
+
99
+ col_index = (v[:i] - 1)
100
+
101
+ numbers_str = name[/[1-9][0-9]*/]
102
+
103
+ row_index = (numbers_str.to_i - 1)
104
+
105
+ return [col_index, row_index]
106
+ end
107
+
108
+ # converts the column index into alphabetical values.
109
+ # @note This follows the standard spreadsheet convention of naming columns A to Z, followed by AA to AZ etc.
110
+ # @return [String]
111
+ def self.col_ref(index)
112
+ chars = ''
113
+ while index >= 26 do
114
+ index, char = index.divmod(26)
115
+ chars.prepend((char + 65).chr)
116
+ index -= 1
117
+ end
118
+ chars.prepend((index + 65).chr)
119
+ chars
120
+ end
121
+
122
+ # @return [String] The alpha(column)numeric(row) reference for this sell.
123
+ # @example Relative Cell Reference
124
+ # ws.rows.first.cells.first.r #=> "A1"
125
+ def self.cell_r(c_index, r_index)
126
+ col_ref(c_index) << (r_index + 1).to_s
127
+ end
128
+
129
+ # Creates an array of individual cell references based on an excel reference range.
130
+ # @param [String] range A cell range, for example A1:D5
131
+ # @return [Array]
132
+ def self.range_to_a(range)
133
+ range.match(/^(\w+?\d+)\:(\w+?\d+)$/)
134
+ start_col, start_row = name_to_indices($1)
135
+ end_col, end_row = name_to_indices($2)
136
+ (start_row..end_row).to_a.map do |row_num|
137
+ (start_col..end_col).to_a.map do |col_num|
138
+ cell_r(col_num, row_num)
139
+ end
140
+ end
141
+ end
142
+
143
+ # performs the increadible feat of changing snake_case to CamelCase
144
+ # @param [String] s The snake case string to camelize
145
+ # @return [String]
146
+ def self.camel(s = "", all_caps = true)
147
+ s = s.to_s
148
+ s = s.capitalize if all_caps
149
+ s.gsub(/_(.)/) { $1.upcase }
150
+ end
151
+
152
+ # returns the provided string with all invalid control charaters
153
+ # removed.
154
+ # @param [String] str The string to process
155
+ # @return [String]
156
+ def self.sanitize(str)
157
+ if str.frozen?
158
+ str.delete(CONTROL_CHARS)
159
+ else
160
+ str.delete!(CONTROL_CHARS)
161
+ str
162
+ end
163
+ end
164
+
165
+ # If value is boolean return 1 or 0
166
+ # else return the value
167
+ # @param [Object] value The value to process
168
+ # @return [Object]
169
+ def self.booleanize(value)
170
+ if value == true || value == false
171
+ value ? 1 : 0
172
+ else
173
+ value
174
+ end
175
+ end
176
+
177
+ # utility method for performing a deep merge on a Hash
178
+ # @param [Hash] Hash to merge into
179
+ # @param [Hash] Hash to be added
180
+ def self.hash_deep_merge(first_hash, second_hash)
181
+ first_hash.merge(second_hash) do |key, this_val, other_val|
182
+ if this_val.is_a?(Hash) && other_val.is_a?(Hash)
183
+ Axlsx.hash_deep_merge(this_val, other_val)
184
+ else
185
+ other_val
186
+ end
187
+ end
188
+ end
189
+
190
+ # Instructs the serializer to not try to escape cell value input.
191
+ # This will give you a huge speed bonus, but if you content has <, > or other xml character data
192
+ # the workbook will be invalid and excel will complain.
193
+ def self.trust_input
194
+ @trust_input ||= false
195
+ end
196
+
197
+ # @param[Boolean] trust_me A boolean value indicating if the cell value content is to be trusted
198
+ # @return [Boolean]
199
+ # @see Axlsx::trust_input
200
+ def self.trust_input=(trust_me)
201
+ @trust_input = trust_me
202
+ end
203
+
204
+ # Whether to treat values starting with an equals sign as formulas or as literal strings.
205
+ # Allowing user-generated data to be interpreted as formulas is a security risk.
206
+ # See https://www.owasp.org/index.php/CSV_Injection for details.
207
+ # @return [Boolean]
208
+ def self.escape_formulas
209
+ !defined?(@escape_formulas) || @escape_formulas.nil? ? false : @escape_formulas
210
+ end
211
+
212
+ # Sets whether to treat values starting with an equals sign as formulas or as literal strings.
213
+ # @param [Boolean] value The value to set.
214
+ def self.escape_formulas=(value)
215
+ Axlsx.validate_boolean(value)
216
+ @escape_formulas = value
217
+ end
218
+ end
data/lib/caxlsx.rb CHANGED
@@ -1,2 +1 @@
1
- # encoding: UTF-8
2
- require 'axlsx.rb'
1
+ require 'axlsx.rb'
data/lib/schema/dc.xsd CHANGED
@@ -1,118 +1,118 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
3
- xmlns="http://purl.org/dc/elements/1.1/"
4
- targetNamespace="http://purl.org/dc/elements/1.1/"
5
- elementFormDefault="qualified"
6
- attributeFormDefault="unqualified">
7
-
8
- <xs:annotation>
9
- <xs:documentation xml:lang="en">
10
- DCMES 1.1 XML Schema
11
- XML Schema for http://purl.org/dc/elements/1.1/ namespace
12
-
13
- Created 2003-04-02
14
-
15
- Created by
16
-
17
- Tim Cole (t-cole3@uiuc.edu)
18
- Tom Habing (thabing@uiuc.edu)
19
- Jane Hunter (jane@dstc.edu.au)
20
- Pete Johnston (p.johnston@ukoln.ac.uk),
21
- Carl Lagoze (lagoze@cs.cornell.edu)
22
-
23
- This schema declares XML elements for the 15 DC elements from the
24
- http://purl.org/dc/elements/1.1/ namespace.
25
-
26
- It defines a complexType SimpleLiteral which permits mixed content
27
- and makes the xml:lang attribute available. It disallows child elements by
28
- use of minOcccurs/maxOccurs.
29
-
30
- However, this complexType does permit the derivation of other complexTypes
31
- which would permit child elements.
32
-
33
- All elements are declared as substitutable for the abstract element any,
34
- which means that the default type for all elements is dc:SimpleLiteral.
35
-
36
- </xs:documentation>
37
-
38
- </xs:annotation>
39
-
40
-
41
- <xs:import namespace="http://www.w3.org/XML/1998/namespace"
42
- schemaLocation="xml.xsd">
43
- </xs:import>
44
-
45
- <xs:complexType name="SimpleLiteral">
46
- <xs:annotation>
47
- <xs:documentation xml:lang="en">
48
- This is the default type for all of the DC elements.
49
- It permits text content only with optional
50
- xml:lang attribute.
51
- Text is allowed because mixed="true", but sub-elements
52
- are disallowed because minOccurs="0" and maxOccurs="0"
53
- are on the xs:any tag.
54
-
55
- This complexType allows for restriction or extension permitting
56
- child elements.
57
- </xs:documentation>
58
- </xs:annotation>
59
-
60
- <xs:complexContent mixed="true">
61
- <xs:restriction base="xs:anyType">
62
- <xs:sequence>
63
- <xs:any processContents="lax" minOccurs="0" maxOccurs="0"/>
64
- </xs:sequence>
65
- <xs:attribute ref="xml:lang" use="optional"/>
66
- </xs:restriction>
67
- </xs:complexContent>
68
- </xs:complexType>
69
-
70
- <xs:element name="any" type="SimpleLiteral" abstract="true"/>
71
-
72
- <xs:element name="title" substitutionGroup="any"/>
73
- <xs:element name="creator" substitutionGroup="any"/>
74
- <xs:element name="subject" substitutionGroup="any"/>
75
- <xs:element name="description" substitutionGroup="any"/>
76
- <xs:element name="publisher" substitutionGroup="any"/>
77
- <xs:element name="contributor" substitutionGroup="any"/>
78
- <xs:element name="date" substitutionGroup="any"/>
79
- <xs:element name="type" substitutionGroup="any"/>
80
- <xs:element name="format" substitutionGroup="any"/>
81
- <xs:element name="identifier" substitutionGroup="any"/>
82
- <xs:element name="source" substitutionGroup="any"/>
83
- <xs:element name="language" substitutionGroup="any"/>
84
- <xs:element name="relation" substitutionGroup="any"/>
85
- <xs:element name="coverage" substitutionGroup="any"/>
86
- <xs:element name="rights" substitutionGroup="any"/>
87
-
88
- <xs:group name="elementsGroup">
89
- <xs:annotation>
90
- <xs:documentation xml:lang="en">
91
- This group is included as a convenience for schema authors
92
- who need to refer to all the elements in the
93
- http://purl.org/dc/elements/1.1/ namespace.
94
- </xs:documentation>
95
- </xs:annotation>
96
-
97
- <xs:sequence>
98
- <xs:choice minOccurs="0" maxOccurs="unbounded">
99
- <xs:element ref="any"/>
100
- </xs:choice>
101
- </xs:sequence>
102
- </xs:group>
103
-
104
- <xs:complexType name="elementContainer">
105
- <xs:annotation>
106
- <xs:documentation xml:lang="en">
107
- This complexType is included as a convenience for schema authors who need to define a root
108
- or container element for all of the DC elements.
109
- </xs:documentation>
110
- </xs:annotation>
111
-
112
- <xs:choice>
113
- <xs:group ref="elementsGroup"/>
114
- </xs:choice>
115
- </xs:complexType>
116
-
117
-
118
- </xs:schema>
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
3
+ xmlns="http://purl.org/dc/elements/1.1/"
4
+ targetNamespace="http://purl.org/dc/elements/1.1/"
5
+ elementFormDefault="qualified"
6
+ attributeFormDefault="unqualified">
7
+
8
+ <xs:annotation>
9
+ <xs:documentation xml:lang="en">
10
+ DCMES 1.1 XML Schema
11
+ XML Schema for http://purl.org/dc/elements/1.1/ namespace
12
+
13
+ Created 2003-04-02
14
+
15
+ Created by
16
+
17
+ Tim Cole (t-cole3@uiuc.edu)
18
+ Tom Habing (thabing@uiuc.edu)
19
+ Jane Hunter (jane@dstc.edu.au)
20
+ Pete Johnston (p.johnston@ukoln.ac.uk),
21
+ Carl Lagoze (lagoze@cs.cornell.edu)
22
+
23
+ This schema declares XML elements for the 15 DC elements from the
24
+ http://purl.org/dc/elements/1.1/ namespace.
25
+
26
+ It defines a complexType SimpleLiteral which permits mixed content
27
+ and makes the xml:lang attribute available. It disallows child elements by
28
+ use of minOcccurs/maxOccurs.
29
+
30
+ However, this complexType does permit the derivation of other complexTypes
31
+ which would permit child elements.
32
+
33
+ All elements are declared as substitutable for the abstract element any,
34
+ which means that the default type for all elements is dc:SimpleLiteral.
35
+
36
+ </xs:documentation>
37
+
38
+ </xs:annotation>
39
+
40
+
41
+ <xs:import namespace="http://www.w3.org/XML/1998/namespace"
42
+ schemaLocation="xml.xsd">
43
+ </xs:import>
44
+
45
+ <xs:complexType name="SimpleLiteral">
46
+ <xs:annotation>
47
+ <xs:documentation xml:lang="en">
48
+ This is the default type for all of the DC elements.
49
+ It permits text content only with optional
50
+ xml:lang attribute.
51
+ Text is allowed because mixed="true", but sub-elements
52
+ are disallowed because minOccurs="0" and maxOccurs="0"
53
+ are on the xs:any tag.
54
+
55
+ This complexType allows for restriction or extension permitting
56
+ child elements.
57
+ </xs:documentation>
58
+ </xs:annotation>
59
+
60
+ <xs:complexContent mixed="true">
61
+ <xs:restriction base="xs:anyType">
62
+ <xs:sequence>
63
+ <xs:any processContents="lax" minOccurs="0" maxOccurs="0"/>
64
+ </xs:sequence>
65
+ <xs:attribute ref="xml:lang" use="optional"/>
66
+ </xs:restriction>
67
+ </xs:complexContent>
68
+ </xs:complexType>
69
+
70
+ <xs:element name="any" type="SimpleLiteral" abstract="true"/>
71
+
72
+ <xs:element name="title" substitutionGroup="any"/>
73
+ <xs:element name="creator" substitutionGroup="any"/>
74
+ <xs:element name="subject" substitutionGroup="any"/>
75
+ <xs:element name="description" substitutionGroup="any"/>
76
+ <xs:element name="publisher" substitutionGroup="any"/>
77
+ <xs:element name="contributor" substitutionGroup="any"/>
78
+ <xs:element name="date" substitutionGroup="any"/>
79
+ <xs:element name="type" substitutionGroup="any"/>
80
+ <xs:element name="format" substitutionGroup="any"/>
81
+ <xs:element name="identifier" substitutionGroup="any"/>
82
+ <xs:element name="source" substitutionGroup="any"/>
83
+ <xs:element name="language" substitutionGroup="any"/>
84
+ <xs:element name="relation" substitutionGroup="any"/>
85
+ <xs:element name="coverage" substitutionGroup="any"/>
86
+ <xs:element name="rights" substitutionGroup="any"/>
87
+
88
+ <xs:group name="elementsGroup">
89
+ <xs:annotation>
90
+ <xs:documentation xml:lang="en">
91
+ This group is included as a convenience for schema authors
92
+ who need to refer to all the elements in the
93
+ http://purl.org/dc/elements/1.1/ namespace.
94
+ </xs:documentation>
95
+ </xs:annotation>
96
+
97
+ <xs:sequence>
98
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
99
+ <xs:element ref="any"/>
100
+ </xs:choice>
101
+ </xs:sequence>
102
+ </xs:group>
103
+
104
+ <xs:complexType name="elementContainer">
105
+ <xs:annotation>
106
+ <xs:documentation xml:lang="en">
107
+ This complexType is included as a convenience for schema authors who need to define a root
108
+ or container element for all of the DC elements.
109
+ </xs:documentation>
110
+ </xs:annotation>
111
+
112
+ <xs:choice>
113
+ <xs:group ref="elementsGroup"/>
114
+ </xs:choice>
115
+ </xs:complexType>
116
+
117
+
118
+ </xs:schema>