caxlsx 3.4.1 → 4.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 (151) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +16 -1
  3. data/README.md +9 -11
  4. data/Rakefile +7 -5
  5. data/lib/axlsx/content_type/abstract_content_type.rb +9 -4
  6. data/lib/axlsx/content_type/content_type.rb +7 -5
  7. data/lib/axlsx/content_type/default.rb +4 -2
  8. data/lib/axlsx/content_type/override.rb +4 -2
  9. data/lib/axlsx/doc_props/app.rb +26 -24
  10. data/lib/axlsx/doc_props/core.rb +8 -6
  11. data/lib/axlsx/drawing/area_chart.rb +10 -8
  12. data/lib/axlsx/drawing/area_series.rb +12 -10
  13. data/lib/axlsx/drawing/ax_data_source.rb +2 -0
  14. data/lib/axlsx/drawing/axes.rb +6 -4
  15. data/lib/axlsx/drawing/axis.rb +21 -19
  16. data/lib/axlsx/drawing/bar_3D_chart.rb +14 -12
  17. data/lib/axlsx/drawing/bar_chart.rb +13 -11
  18. data/lib/axlsx/drawing/bar_series.rb +8 -6
  19. data/lib/axlsx/drawing/bubble_chart.rb +6 -4
  20. data/lib/axlsx/drawing/bubble_series.rb +8 -6
  21. data/lib/axlsx/drawing/cat_axis.rb +12 -10
  22. data/lib/axlsx/drawing/chart.rb +20 -18
  23. data/lib/axlsx/drawing/d_lbls.rb +7 -5
  24. data/lib/axlsx/drawing/drawing.rb +58 -56
  25. data/lib/axlsx/drawing/graphic_frame.rb +6 -4
  26. data/lib/axlsx/drawing/hyperlink.rb +10 -8
  27. data/lib/axlsx/drawing/line_3D_chart.rb +7 -5
  28. data/lib/axlsx/drawing/line_chart.rb +10 -8
  29. data/lib/axlsx/drawing/line_series.rb +12 -10
  30. data/lib/axlsx/drawing/marker.rb +9 -7
  31. data/lib/axlsx/drawing/num_data.rb +9 -7
  32. data/lib/axlsx/drawing/num_data_source.rb +9 -7
  33. data/lib/axlsx/drawing/num_val.rb +7 -5
  34. data/lib/axlsx/drawing/one_cell_anchor.rb +7 -5
  35. data/lib/axlsx/drawing/pic.rb +16 -14
  36. data/lib/axlsx/drawing/picture_locking.rb +3 -1
  37. data/lib/axlsx/drawing/pie_3D_chart.rb +5 -3
  38. data/lib/axlsx/drawing/pie_series.rb +8 -6
  39. data/lib/axlsx/drawing/scaling.rb +8 -6
  40. data/lib/axlsx/drawing/scatter_chart.rb +7 -5
  41. data/lib/axlsx/drawing/scatter_series.rb +14 -12
  42. data/lib/axlsx/drawing/ser_axis.rb +7 -5
  43. data/lib/axlsx/drawing/series.rb +6 -4
  44. data/lib/axlsx/drawing/series_title.rb +6 -4
  45. data/lib/axlsx/drawing/str_data.rb +7 -5
  46. data/lib/axlsx/drawing/str_val.rb +6 -4
  47. data/lib/axlsx/drawing/title.rb +13 -14
  48. data/lib/axlsx/drawing/two_cell_anchor.rb +4 -2
  49. data/lib/axlsx/drawing/val_axis.rb +4 -2
  50. data/lib/axlsx/drawing/view_3D.rb +9 -7
  51. data/lib/axlsx/drawing/vml_drawing.rb +18 -16
  52. data/lib/axlsx/drawing/vml_shape.rb +24 -22
  53. data/lib/axlsx/package.rb +69 -66
  54. data/lib/axlsx/rels/relationship.rb +10 -5
  55. data/lib/axlsx/rels/relationships.rb +5 -3
  56. data/lib/axlsx/stylesheet/border.rb +6 -4
  57. data/lib/axlsx/stylesheet/border_pr.rb +5 -3
  58. data/lib/axlsx/stylesheet/cell_alignment.rb +12 -10
  59. data/lib/axlsx/stylesheet/cell_protection.rb +5 -3
  60. data/lib/axlsx/stylesheet/cell_style.rb +10 -8
  61. data/lib/axlsx/stylesheet/color.rb +9 -7
  62. data/lib/axlsx/stylesheet/dxf.rb +5 -3
  63. data/lib/axlsx/stylesheet/fill.rb +3 -1
  64. data/lib/axlsx/stylesheet/font.rb +18 -16
  65. data/lib/axlsx/stylesheet/gradient_fill.rb +6 -4
  66. data/lib/axlsx/stylesheet/gradient_stop.rb +6 -4
  67. data/lib/axlsx/stylesheet/num_fmt.rb +8 -10
  68. data/lib/axlsx/stylesheet/pattern_fill.rb +5 -3
  69. data/lib/axlsx/stylesheet/styles.rb +69 -71
  70. data/lib/axlsx/stylesheet/table_style.rb +7 -5
  71. data/lib/axlsx/stylesheet/table_style_element.rb +6 -4
  72. data/lib/axlsx/stylesheet/table_styles.rb +6 -4
  73. data/lib/axlsx/stylesheet/xf.rb +18 -16
  74. data/lib/axlsx/util/accessors.rb +4 -2
  75. data/lib/axlsx/util/buffered_zip_output_stream.rb +60 -0
  76. data/lib/axlsx/util/constants.rb +117 -104
  77. data/lib/axlsx/util/mime_type_utils.rb +3 -5
  78. data/lib/axlsx/util/options_parser.rb +3 -1
  79. data/lib/axlsx/util/serialized_attributes.rb +42 -17
  80. data/lib/axlsx/util/simple_typed_list.rb +47 -47
  81. data/lib/axlsx/util/storage.rb +11 -10
  82. data/lib/axlsx/util/validators.rb +101 -41
  83. data/lib/axlsx/util/zip_command.rb +10 -10
  84. data/lib/axlsx/version.rb +3 -1
  85. data/lib/axlsx/workbook/defined_name.rb +6 -4
  86. data/lib/axlsx/workbook/defined_names.rb +3 -1
  87. data/lib/axlsx/workbook/shared_strings_table.rb +8 -6
  88. data/lib/axlsx/workbook/workbook.rb +78 -76
  89. data/lib/axlsx/workbook/workbook_view.rb +3 -1
  90. data/lib/axlsx/workbook/workbook_views.rb +3 -1
  91. data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +65 -8
  92. data/lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb +7 -3
  93. data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +11 -7
  94. data/lib/axlsx/workbook/worksheet/auto_filter/sort_condition.rb +51 -0
  95. data/lib/axlsx/workbook/worksheet/auto_filter/sort_state.rb +56 -0
  96. data/lib/axlsx/workbook/worksheet/border_creator.rb +5 -3
  97. data/lib/axlsx/workbook/worksheet/break.rb +3 -1
  98. data/lib/axlsx/workbook/worksheet/cell.rb +53 -54
  99. data/lib/axlsx/workbook/worksheet/cell_serializer.rb +31 -27
  100. data/lib/axlsx/workbook/worksheet/cfvo.rb +5 -3
  101. data/lib/axlsx/workbook/worksheet/cfvos.rb +3 -1
  102. data/lib/axlsx/workbook/worksheet/col.rb +5 -3
  103. data/lib/axlsx/workbook/worksheet/col_breaks.rb +5 -3
  104. data/lib/axlsx/workbook/worksheet/color_scale.rb +12 -10
  105. data/lib/axlsx/workbook/worksheet/cols.rb +3 -1
  106. data/lib/axlsx/workbook/worksheet/comment.rb +8 -6
  107. data/lib/axlsx/workbook/worksheet/comments.rb +6 -4
  108. data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +9 -4
  109. data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +18 -16
  110. data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +3 -1
  111. data/lib/axlsx/workbook/worksheet/data_bar.rb +14 -13
  112. data/lib/axlsx/workbook/worksheet/data_validation.rb +30 -28
  113. data/lib/axlsx/workbook/worksheet/data_validations.rb +3 -1
  114. data/lib/axlsx/workbook/worksheet/date_time_converter.rb +7 -5
  115. data/lib/axlsx/workbook/worksheet/dimension.rb +4 -2
  116. data/lib/axlsx/workbook/worksheet/header_footer.rb +4 -2
  117. data/lib/axlsx/workbook/worksheet/icon_set.rb +23 -6
  118. data/lib/axlsx/workbook/worksheet/merged_cells.rb +5 -5
  119. data/lib/axlsx/workbook/worksheet/outline_pr.rb +6 -2
  120. data/lib/axlsx/workbook/worksheet/page_margins.rb +15 -10
  121. data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +6 -2
  122. data/lib/axlsx/workbook/worksheet/page_setup.rb +11 -9
  123. data/lib/axlsx/workbook/worksheet/pane.rb +11 -9
  124. data/lib/axlsx/workbook/worksheet/pivot_table.rb +20 -19
  125. data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +8 -6
  126. data/lib/axlsx/workbook/worksheet/pivot_tables.rb +2 -0
  127. data/lib/axlsx/workbook/worksheet/print_options.rb +3 -1
  128. data/lib/axlsx/workbook/worksheet/protected_range.rb +3 -1
  129. data/lib/axlsx/workbook/worksheet/protected_ranges.rb +5 -3
  130. data/lib/axlsx/workbook/worksheet/rich_text.rb +3 -1
  131. data/lib/axlsx/workbook/worksheet/rich_text_run.rb +16 -14
  132. data/lib/axlsx/workbook/worksheet/row.rb +6 -7
  133. data/lib/axlsx/workbook/worksheet/row_breaks.rb +6 -4
  134. data/lib/axlsx/workbook/worksheet/selection.rb +9 -7
  135. data/lib/axlsx/workbook/worksheet/sheet_calc_pr.rb +6 -2
  136. data/lib/axlsx/workbook/worksheet/sheet_data.rb +3 -1
  137. data/lib/axlsx/workbook/worksheet/sheet_format_pr.rb +6 -2
  138. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +8 -4
  139. data/lib/axlsx/workbook/worksheet/sheet_protection.rb +10 -8
  140. data/lib/axlsx/workbook/worksheet/sheet_view.rb +15 -13
  141. data/lib/axlsx/workbook/worksheet/table.rb +9 -7
  142. data/lib/axlsx/workbook/worksheet/table_style_info.rb +4 -2
  143. data/lib/axlsx/workbook/worksheet/tables.rb +3 -1
  144. data/lib/axlsx/workbook/worksheet/worksheet.rb +38 -37
  145. data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +4 -2
  146. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +8 -2
  147. data/lib/axlsx/workbook/worksheet/worksheet_hyperlink.rb +6 -4
  148. data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +4 -2
  149. data/lib/axlsx.rb +56 -42
  150. data/lib/caxlsx.rb +3 -1
  151. metadata +49 -43
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Axlsx
4
+ # The BufferedZipOutputStream buffers the output in order to avoid appending many small strings directly to the
5
+ # the `Zip::OutputStream`.
6
+ #
7
+ # The methods provided here mimic `Zip::OutputStream` so that this class can be used a drop-in replacement.
8
+ class BufferedZipOutputStream
9
+ # The 4_096 was chosen somewhat arbitrary, however, it was difficult to see any obvious improvement with larger
10
+ # buffer sizes.
11
+ BUFFER_SIZE = 4_096
12
+
13
+ def initialize(zos)
14
+ @zos = zos
15
+ @buffer = String.new(capacity: BUFFER_SIZE * 2)
16
+ end
17
+
18
+ # Create a temporary directory for writing files to.
19
+ #
20
+ # The directory and its contents are removed at the end of the block.
21
+ def self.open(file_name, encrypter = nil)
22
+ Zip::OutputStream.open(file_name, encrypter) do |zos|
23
+ bzos = new(zos)
24
+ yield(bzos)
25
+ ensure
26
+ bzos.flush if bzos
27
+ end
28
+ end
29
+
30
+ def self.write_buffer(io = ::StringIO.new, encrypter = nil)
31
+ Zip::OutputStream.write_buffer(io, encrypter) do |zos|
32
+ bzos = new(zos)
33
+ yield(bzos)
34
+ ensure
35
+ bzos.flush if bzos
36
+ end
37
+ end
38
+
39
+ # Closes the current entry and opens a new for writing.
40
+ def put_next_entry(entry)
41
+ flush
42
+ @zos.put_next_entry(entry)
43
+ end
44
+
45
+ # Write to a buffer that will be written to the current entry
46
+ def write(content)
47
+ @buffer << content.to_s
48
+ flush if @buffer.size > BUFFER_SIZE
49
+ self
50
+ end
51
+ alias << write
52
+
53
+ def flush
54
+ return if @buffer.empty?
55
+
56
+ @zos << @buffer
57
+ @buffer.clear
58
+ end
59
+ end
60
+ end
@@ -1,261 +1,263 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Axlsx
2
4
  # XML Encoding
3
- ENCODING = "UTF-8".freeze
5
+ ENCODING = "UTF-8"
4
6
 
5
7
  # spreadsheetML namespace
6
- XML_NS = "http://schemas.openxmlformats.org/spreadsheetml/2006/main".freeze
8
+ XML_NS = "http://schemas.openxmlformats.org/spreadsheetml/2006/main"
7
9
 
8
10
  # content-types namespace
9
- XML_NS_T = "http://schemas.openxmlformats.org/package/2006/content-types".freeze
11
+ XML_NS_T = "http://schemas.openxmlformats.org/package/2006/content-types"
10
12
 
11
13
  # extended-properties namespace
12
- APP_NS = "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties".freeze
14
+ APP_NS = "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties"
13
15
 
14
16
  # doc props namespace
15
- APP_NS_VT = "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes".freeze
17
+ APP_NS_VT = "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"
16
18
 
17
19
  # core properties namespace
18
- CORE_NS = "http://schemas.openxmlformats.org/package/2006/metadata/core-properties".freeze
20
+ CORE_NS = "http://schemas.openxmlformats.org/package/2006/metadata/core-properties"
19
21
 
20
22
  # dc elements (core) namespace
21
- CORE_NS_DC = "http://purl.org/dc/elements/1.1/".freeze
23
+ CORE_NS_DC = "http://purl.org/dc/elements/1.1/"
22
24
 
23
25
  # dcmit (core) namespcace
24
- CORE_NS_DCMIT = "http://purl.org/dc/dcmitype/".freeze
26
+ CORE_NS_DCMIT = "http://purl.org/dc/dcmitype/"
25
27
 
26
28
  # dc terms namespace
27
- CORE_NS_DCT = "http://purl.org/dc/terms/".freeze
29
+ CORE_NS_DCT = "http://purl.org/dc/terms/"
28
30
 
29
31
  # xml schema namespace
30
- CORE_NS_XSI = "http://www.w3.org/2001/XMLSchema-instance".freeze
32
+ CORE_NS_XSI = "http://www.w3.org/2001/XMLSchema-instance"
31
33
 
32
34
  # Digital signature namespace
33
- DIGITAL_SIGNATURE_NS = "http://schemas.openxmlformats.org/package/2006/digital-signature".freeze
35
+ DIGITAL_SIGNATURE_NS = "http://schemas.openxmlformats.org/package/2006/digital-signature"
34
36
 
35
37
  # spreadsheet drawing namespace
36
- XML_NS_XDR = "http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing".freeze
38
+ XML_NS_XDR = "http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing"
37
39
 
38
40
  # drawing namespace
39
- XML_NS_A = "http://schemas.openxmlformats.org/drawingml/2006/main".freeze
41
+ XML_NS_A = "http://schemas.openxmlformats.org/drawingml/2006/main"
40
42
 
41
43
  # chart namespace
42
- XML_NS_C = "http://schemas.openxmlformats.org/drawingml/2006/chart".freeze
44
+ XML_NS_C = "http://schemas.openxmlformats.org/drawingml/2006/chart"
43
45
 
44
46
  # relationships namespace
45
- XML_NS_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships".freeze
47
+ XML_NS_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships"
46
48
 
47
49
  # relationships name space
48
- RELS_R = "http://schemas.openxmlformats.org/package/2006/relationships".freeze
50
+ RELS_R = "http://schemas.openxmlformats.org/package/2006/relationships"
49
51
 
50
52
  # table rels namespace
51
- TABLE_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/table".freeze
53
+ TABLE_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/table"
52
54
 
53
55
  # pivot table rels namespace
54
- PIVOT_TABLE_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotTable".freeze
56
+ PIVOT_TABLE_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotTable"
55
57
 
56
58
  # pivot table cache definition namespace
57
- PIVOT_TABLE_CACHE_DEFINITION_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotCacheDefinition".freeze
59
+ PIVOT_TABLE_CACHE_DEFINITION_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotCacheDefinition"
58
60
 
59
61
  # workbook rels namespace
60
- WORKBOOK_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument".freeze
62
+ WORKBOOK_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"
61
63
 
62
64
  # worksheet rels namespace
63
- WORKSHEET_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet".freeze
65
+ WORKSHEET_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet"
64
66
 
65
67
  # app rels namespace
66
- APP_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties".freeze
68
+ APP_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties"
67
69
 
68
70
  # core rels namespace
69
- CORE_R = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties".freeze
71
+ CORE_R = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties"
70
72
 
71
73
  # digital signature rels namespace
72
- DIGITAL_SIGNATURE_R = "http://schemas.openxmlformats.org/package/2006/relationships/digital- signature/signature".freeze
74
+ DIGITAL_SIGNATURE_R = "http://schemas.openxmlformats.org/package/2006/relationships/digital- signature/signature"
73
75
 
74
76
  # styles rels namespace
75
- STYLES_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles".freeze
77
+ STYLES_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles"
76
78
 
77
79
  # shared strings namespace
78
- SHARED_STRINGS_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings".freeze
80
+ SHARED_STRINGS_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings"
79
81
 
80
82
  # drawing rels namespace
81
- DRAWING_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing".freeze
83
+ DRAWING_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing"
82
84
 
83
85
  # chart rels namespace
84
- CHART_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart".freeze
86
+ CHART_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart"
85
87
 
86
88
  # image rels namespace
87
- IMAGE_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image".freeze
89
+ IMAGE_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image"
88
90
 
89
91
  # hyperlink rels namespace
90
- HYPERLINK_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink".freeze
92
+ HYPERLINK_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink"
91
93
 
92
94
  # comment rels namespace
93
- COMMENT_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments".freeze
95
+ COMMENT_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments"
94
96
 
95
97
  # comment relation for nil target
96
- COMMENT_R_NULL = "http://purl.oclc.org/ooxml/officeDocument/relationships/comments".freeze
98
+ COMMENT_R_NULL = "http://purl.oclc.org/ooxml/officeDocument/relationships/comments"
97
99
 
98
100
  # vml drawing relation namespace
99
101
  VML_DRAWING_R = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing'
100
102
 
101
103
  # VML Drawing content type
102
- VML_DRAWING_CT = "application/vnd.openxmlformats-officedocument.vmlDrawing".freeze
104
+ VML_DRAWING_CT = "application/vnd.openxmlformats-officedocument.vmlDrawing"
103
105
 
104
106
  # table content type
105
- TABLE_CT = "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml".freeze
107
+ TABLE_CT = "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml"
106
108
 
107
109
  # pivot table content type
108
- PIVOT_TABLE_CT = "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml".freeze
110
+ PIVOT_TABLE_CT = "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml"
109
111
 
110
112
  # pivot table cache definition content type
111
- PIVOT_TABLE_CACHE_DEFINITION_CT = "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml".freeze
113
+ PIVOT_TABLE_CACHE_DEFINITION_CT = "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml"
112
114
 
113
115
  # workbook content type
114
- WORKBOOK_CT = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml".freeze
116
+ WORKBOOK_CT = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"
115
117
 
116
118
  # app content type
117
- APP_CT = "application/vnd.openxmlformats-officedocument.extended-properties+xml".freeze
119
+ APP_CT = "application/vnd.openxmlformats-officedocument.extended-properties+xml"
118
120
 
119
121
  # rels content type
120
- RELS_CT = "application/vnd.openxmlformats-package.relationships+xml".freeze
122
+ RELS_CT = "application/vnd.openxmlformats-package.relationships+xml"
121
123
 
122
124
  # styles content type
123
- STYLES_CT = "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml".freeze
125
+ STYLES_CT = "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml"
124
126
 
125
127
  # xml content type
126
- XML_CT = "application/xml".freeze
128
+ XML_CT = "application/xml"
127
129
 
128
130
  # worksheet content type
129
- WORKSHEET_CT = "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml".freeze
131
+ WORKSHEET_CT = "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"
130
132
 
131
133
  # shared strings content type
132
- SHARED_STRINGS_CT = "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml".freeze
134
+ SHARED_STRINGS_CT = "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml"
133
135
 
134
136
  # core content type
135
- CORE_CT = "application/vnd.openxmlformats-package.core-properties+xml".freeze
137
+ CORE_CT = "application/vnd.openxmlformats-package.core-properties+xml"
136
138
 
137
139
  # digital signature xml content type
138
- DIGITAL_SIGNATURE_XML_CT = "application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml".freeze
140
+ DIGITAL_SIGNATURE_XML_CT = "application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml"
139
141
 
140
142
  # digital signature origin content type
141
- DIGITAL_SIGNATURE_ORIGIN_CT = "application/vnd.openxmlformats-package.digital-signature-origin".freeze
143
+ DIGITAL_SIGNATURE_ORIGIN_CT = "application/vnd.openxmlformats-package.digital-signature-origin"
142
144
 
143
145
  # digital signature certificate content type
144
- DIGITAL_SIGNATURE_CERTIFICATE_CT = "application/vnd.openxmlformats-package.digital-signature-certificate".freeze
146
+ DIGITAL_SIGNATURE_CERTIFICATE_CT = "application/vnd.openxmlformats-package.digital-signature-certificate"
145
147
 
146
148
  # chart content type
147
- CHART_CT = "application/vnd.openxmlformats-officedocument.drawingml.chart+xml".freeze
149
+ CHART_CT = "application/vnd.openxmlformats-officedocument.drawingml.chart+xml"
148
150
 
149
151
  # comments content type
150
- COMMENT_CT = "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml".freeze
152
+ COMMENT_CT = "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml"
151
153
 
152
154
  # jpeg content type
153
- JPEG_CT = "image/jpeg".freeze
155
+ JPEG_CT = "image/jpeg"
154
156
 
155
157
  # gif content type
156
- GIF_CT = "image/gif".freeze
158
+ GIF_CT = "image/gif"
157
159
 
158
160
  # png content type
159
- PNG_CT = "image/png".freeze
161
+ PNG_CT = "image/png"
160
162
 
161
163
  # drawing content type
162
- DRAWING_CT = "application/vnd.openxmlformats-officedocument.drawing+xml".freeze
164
+ DRAWING_CT = "application/vnd.openxmlformats-officedocument.drawing+xml"
163
165
 
164
166
  # xml content type extensions
165
- XML_EX = "xml".freeze
167
+ XML_EX = "xml"
166
168
 
167
- # jpeg extension
168
- JPEG_EX = "jpeg".freeze
169
+ # jpeg extensions
170
+ JPEG_EXS = ["jpeg", "jpg"].freeze
169
171
 
170
172
  # gif extension
171
- GIF_EX = "gif".freeze
173
+ GIF_EX = "gif"
172
174
 
173
175
  # png extension
174
- PNG_EX = "png".freeze
176
+ PNG_EX = "png"
175
177
 
176
178
  # rels content type extension
177
- RELS_EX = "rels".freeze
179
+ RELS_EX = "rels"
178
180
 
179
181
  # workbook part
180
- WORKBOOK_PN = "xl/workbook.xml".freeze
182
+ WORKBOOK_PN = "xl/workbook.xml"
181
183
 
182
184
  # styles part
183
- STYLES_PN = "styles.xml".freeze
185
+ STYLES_PN = "styles.xml"
184
186
 
185
187
  # shared_strings part
186
- SHARED_STRINGS_PN = "sharedStrings.xml".freeze
188
+ SHARED_STRINGS_PN = "sharedStrings.xml"
187
189
 
188
190
  # app part
189
- APP_PN = "docProps/app.xml".freeze
191
+ APP_PN = "docProps/app.xml"
190
192
 
191
193
  # core part
192
- CORE_PN = "docProps/core.xml".freeze
194
+ CORE_PN = "docProps/core.xml"
193
195
 
194
196
  # content types part
195
- CONTENT_TYPES_PN = "[Content_Types].xml".freeze
197
+ CONTENT_TYPES_PN = "[Content_Types].xml"
196
198
 
197
199
  # rels part
198
- RELS_PN = "_rels/.rels".freeze
200
+ RELS_PN = "_rels/.rels"
199
201
 
200
202
  # workbook rels part
201
- WORKBOOK_RELS_PN = "xl/_rels/workbook.xml.rels".freeze
203
+ WORKBOOK_RELS_PN = "xl/_rels/workbook.xml.rels"
202
204
 
203
205
  # worksheet part
204
- WORKSHEET_PN = "worksheets/sheet%d.xml".freeze
206
+ WORKSHEET_PN = "worksheets/sheet%d.xml"
205
207
 
206
208
  # worksheet rels part
207
- WORKSHEET_RELS_PN = "worksheets/_rels/sheet%d.xml.rels".freeze
209
+ WORKSHEET_RELS_PN = "worksheets/_rels/sheet%d.xml.rels"
208
210
 
209
211
  # drawing part
210
- DRAWING_PN = "drawings/drawing%d.xml".freeze
212
+ DRAWING_PN = "drawings/drawing%d.xml"
211
213
 
212
214
  # drawing rels part
213
- DRAWING_RELS_PN = "drawings/_rels/drawing%d.xml.rels".freeze
215
+ DRAWING_RELS_PN = "drawings/_rels/drawing%d.xml.rels"
214
216
 
215
217
  # vml drawing part
216
- VML_DRAWING_PN = "drawings/vmlDrawing%d.vml".freeze
218
+ VML_DRAWING_PN = "drawings/vmlDrawing%d.vml"
217
219
 
218
220
  # drawing part
219
- TABLE_PN = "tables/table%d.xml".freeze
221
+ TABLE_PN = "tables/table%d.xml"
220
222
 
221
223
  # pivot table parts
222
- PIVOT_TABLE_PN = "pivotTables/pivotTable%d.xml".freeze
224
+ PIVOT_TABLE_PN = "pivotTables/pivotTable%d.xml"
223
225
 
224
226
  # pivot table cache definition part name
225
- PIVOT_TABLE_CACHE_DEFINITION_PN = "pivotCache/pivotCacheDefinition%d.xml".freeze
227
+ PIVOT_TABLE_CACHE_DEFINITION_PN = "pivotCache/pivotCacheDefinition%d.xml"
226
228
 
227
229
  # pivot table rels parts
228
- PIVOT_TABLE_RELS_PN = "pivotTables/_rels/pivotTable%d.xml.rels".freeze
230
+ PIVOT_TABLE_RELS_PN = "pivotTables/_rels/pivotTable%d.xml.rels"
229
231
 
230
232
  # chart part
231
- CHART_PN = "charts/chart%d.xml".freeze
233
+ CHART_PN = "charts/chart%d.xml"
232
234
 
233
235
  # chart part
234
- IMAGE_PN = "media/image%d.%s".freeze
236
+ IMAGE_PN = "media/image%d.%s"
235
237
 
236
238
  # comment part
237
- COMMENT_PN = "comments%d.xml".freeze
239
+ COMMENT_PN = "comments%d.xml"
238
240
 
239
241
  # location of schema files for validation
240
- SCHEMA_BASE = (File.dirname(__FILE__) + '/../../schema/').freeze
242
+ SCHEMA_BASE = "#{File.dirname(__FILE__)}/../../schema/"
241
243
 
242
244
  # App validation schema
243
- APP_XSD = (SCHEMA_BASE + "shared-documentPropertiesExtended.xsd").freeze
245
+ APP_XSD = "#{SCHEMA_BASE}shared-documentPropertiesExtended.xsd"
244
246
 
245
247
  # core validation schema
246
- CORE_XSD = (SCHEMA_BASE + "opc-coreProperties.xsd").freeze
248
+ CORE_XSD = "#{SCHEMA_BASE}opc-coreProperties.xsd"
247
249
 
248
250
  # content types validation schema
249
- CONTENT_TYPES_XSD = (SCHEMA_BASE + "opc-contentTypes.xsd").freeze
251
+ CONTENT_TYPES_XSD = "#{SCHEMA_BASE}opc-contentTypes.xsd"
250
252
 
251
253
  # rels validation schema
252
- RELS_XSD = (SCHEMA_BASE + "opc-relationships.xsd").freeze
254
+ RELS_XSD = "#{SCHEMA_BASE}opc-relationships.xsd"
253
255
 
254
256
  # spreadsheetML validation schema
255
- SML_XSD = (SCHEMA_BASE + "sml.xsd").freeze
257
+ SML_XSD = "#{SCHEMA_BASE}sml.xsd"
256
258
 
257
259
  # drawing validation schema
258
- DRAWING_XSD = (SCHEMA_BASE + "dml-spreadsheetDrawing.xsd").freeze
260
+ DRAWING_XSD = "#{SCHEMA_BASE}dml-spreadsheetDrawing.xsd"
259
261
 
260
262
  # number format id for pecentage formatting using the default formatting id.
261
263
  NUM_FMT_PERCENT = 9
@@ -279,46 +281,46 @@ module Axlsx
279
281
  WORKSHEET_NAME_FORBIDDEN_CHARS = '[]*/\?:'.chars.freeze
280
282
 
281
283
  # error messages RestrictionValidor
282
- ERR_RESTRICTION = "Invalid Data: %s. %s must be one of %s.".freeze
284
+ ERR_RESTRICTION = "Invalid Data: %s. %s must be one of %s."
283
285
 
284
286
  # error message DataTypeValidator
285
- ERR_TYPE = "Invalid Data %s for %s. must be %s.".freeze
287
+ ERR_TYPE = "Invalid Data %s for %s. must be %s."
286
288
 
287
289
  # error message for RegexValidator
288
- ERR_REGEX = "Invalid Data. %s does not match %s.".freeze
290
+ ERR_REGEX = "Invalid Data. %s does not match %s."
289
291
 
290
292
  # error message for RangeValidator
291
- ERR_RANGE = "Invalid Data. %s must be between %s and %s, (inclusive:%s) you gave: %s".freeze
293
+ ERR_RANGE = "Invalid Data. %s must be between %s and %s, (inclusive:%s) you gave: %s"
292
294
 
293
295
  # error message for sheets that use explicit empty string name
294
- ERR_SHEET_NAME_EMPTY = "Your worksheet name is empty. Worksheet name can't be empty. Please assign name of your sheet or don't use name option at all.".freeze
296
+ ERR_SHEET_NAME_EMPTY = "Your worksheet name is empty. Worksheet name can't be empty. Please assign name of your sheet or don't use name option at all."
295
297
 
296
298
  # error message for sheets that use a name which is longer than 31 bytes
297
- ERR_SHEET_NAME_TOO_LONG = "Your worksheet name '%s' is too long. Worksheet names must be #{WORKSHEET_MAX_NAME_LENGTH} characters (bytes) or less".freeze
299
+ ERR_SHEET_NAME_TOO_LONG = "Your worksheet name '%s' is too long. Worksheet names must be #{WORKSHEET_MAX_NAME_LENGTH} characters (bytes) or less"
298
300
 
299
301
  # error message for sheets that use a name which include invalid characters
300
- ERR_SHEET_NAME_CHARACTER_FORBIDDEN = "Your worksheet name '%s' contains a character which is not allowed by MS Excel and will cause repair warnings. Please change the name of your sheet.".freeze
302
+ ERR_SHEET_NAME_CHARACTER_FORBIDDEN = "Your worksheet name '%s' contains a character which is not allowed by MS Excel and will cause repair warnings. Please change the name of your sheet."
301
303
 
302
304
  # error message for duplicate sheet names
303
- ERR_DUPLICATE_SHEET_NAME = "There is already a worksheet in this workbook named '%s'. Please use a unique name".freeze
305
+ ERR_DUPLICATE_SHEET_NAME = "There is already a worksheet in this workbook named '%s'. Please use a unique name"
304
306
 
305
307
  # error message when user does not provide color and or style options for border in Style#add_sytle
306
- ERR_INVALID_BORDER_OPTIONS = "border hash must include both style and color. e.g. :border => { :color => 'FF000000', :style => :thin }. You provided: %s".freeze
308
+ ERR_INVALID_BORDER_OPTIONS = "border hash must include both style and color. e.g. :border => { :color => 'FF000000', :style => :thin }. You provided: %s"
307
309
 
308
310
  # error message for invalid border id reference
309
- ERR_INVALID_BORDER_ID = "The border id you specified (%s) does not exist. Please add a border with Style#add_style before referencing its index.".freeze
311
+ ERR_INVALID_BORDER_ID = "The border id you specified (%s) does not exist. Please add a border with Style#add_style before referencing its index."
310
312
 
311
313
  # error message for invalid angles
312
- ERR_ANGLE = "Angles must be a value between -90 and 90. You provided: %s".freeze
314
+ ERR_ANGLE = "Angles must be a value between -90 and 90. You provided: %s"
313
315
 
314
316
  # error message for non 'integerish' value
315
- ERR_INTEGERISH = "You value must be, or be castable via to_i, an Integer. You provided %s".freeze
317
+ ERR_INTEGERISH = "You value must be, or be castable via to_i, an Integer. You provided %s"
316
318
 
317
319
  # error message for invalid cell reference
318
- ERR_CELL_REFERENCE_INVALID = "Invalid cell definition `%s`".freeze
320
+ ERR_CELL_REFERENCE_INVALID = "Invalid cell definition `%s`"
319
321
 
320
322
  # error message for cell reference with last cell missing
321
- ERR_CELL_REFERENCE_MISSING_CELL = "Missing cell `%s` for the specified range `%s`".freeze
323
+ ERR_CELL_REFERENCE_MISSING_CELL = "Missing cell `%s` for the specified range `%s`"
322
324
 
323
325
  # Regex to match forbidden control characters
324
326
  # The following will be automatically stripped from worksheets.
@@ -354,7 +356,7 @@ module Axlsx
354
356
  # x1F Information Separator One
355
357
  #
356
358
  # The following are not dealt with.
357
- # If you have this in your data, expect excel to blow up!
359
+ # If you have this in your data, expect Excel to blow up!
358
360
  #
359
361
  # x7F Delete
360
362
  # x80 Control 0080
@@ -395,9 +397,8 @@ module Axlsx
395
397
  # x0A Line Feed (Lf)
396
398
  # x0D Carriage Return (Cr)
397
399
  # x09 Character Tabulation
398
- # @see http://www.codetable.net/asciikeycodes
399
- pattern = "\x0-\x08\x0B\x0C\x0E-\x1F"
400
- pattern = pattern.respond_to?(:encode) ? pattern.encode('UTF-8') : pattern
400
+ # @see https://www.codetable.net/asciikeycodes
401
+ pattern = "\x0-\x08\x0B\x0C\x0E-\x1F".encode(Encoding::UTF_8)
401
402
 
402
403
  # The regular expression used to remove control characters from worksheets
403
404
  CONTROL_CHARS = pattern.freeze
@@ -411,4 +412,16 @@ module Axlsx
411
412
 
412
413
  # Numeric recognition
413
414
  NUMERIC_REGEX = /\A[+-]?\d+?\Z/.freeze
415
+
416
+ # Leading characters that indicate a formula.
417
+ # See: https://owasp.org/www-community/attacks/CSV_Injection
418
+ FORMULA_PREFIX = '='
419
+
420
+ # Leading characters that indicate an array formula.
421
+ ARRAY_FORMULA_PREFIX = '{='
422
+
423
+ # Trailing character that indicates an array formula.
424
+ ARRAY_FORMULA_SUFFIX = '}'
425
+
426
+ BOOLEAN_VALUES = [true, false].freeze
414
427
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'open-uri'
2
4
 
3
5
  module Axlsx
@@ -14,11 +16,7 @@ module Axlsx
14
16
  # @param [String] v URI
15
17
  # @return [String] File mime type
16
18
  def self.get_mime_type_from_uri(v)
17
- if URI.respond_to?(:open)
18
- Marcel::MimeType.for(URI.open(v))
19
- else
20
- Marcel::MimeType.for(URI.parse(v).open)
21
- end
19
+ Marcel::MimeType.for(URI.parse(v).open)
22
20
  end
23
21
  end
24
22
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Axlsx
2
4
  # This module defines a single method for parsing options in class
3
5
  # initializers.
@@ -8,7 +10,7 @@ module Axlsx
8
10
  def parse_options(options = {})
9
11
  options.each do |key, value|
10
12
  key = :"#{key}="
11
- self.send(key, value) if !value.nil? && self.respond_to?(key)
13
+ send(key, value) if !value.nil? && respond_to?(key)
12
14
  end
13
15
  end
14
16
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Axlsx
2
4
  # This module allows us to define a list of symbols defining which
3
5
  # attributes will be serialized for a class.
@@ -13,11 +15,21 @@ module Axlsx
13
15
  # which of the instance values are serializable
14
16
  def serializable_attributes(*symbols)
15
17
  @xml_attributes = symbols
18
+ @camel_xml_attributes = nil
19
+ @ivar_xml_attributes = nil
16
20
  end
17
21
 
18
22
  # a reader for those attributes
19
23
  attr_reader :xml_attributes
20
24
 
25
+ def camel_xml_attributes
26
+ @camel_xml_attributes ||= @xml_attributes.map { |attr| Axlsx.camel(attr, false) }
27
+ end
28
+
29
+ def ivar_xml_attributes
30
+ @ivar_xml_attributes ||= @xml_attributes.map { |attr| :"@#{attr}" }
31
+ end
32
+
21
33
  # This helper registers the attributes that will be formatted as elements.
22
34
  def serializable_element_attributes(*symbols)
23
35
  @xml_element_attributes = symbols
@@ -29,13 +41,13 @@ module Axlsx
29
41
 
30
42
  # creates a XML tag with serialized attributes
31
43
  # @see SerializedAttributes#serialized_attributes
32
- def serialized_tag(tagname, str, additional_attributes = {}, &block)
33
- str << "<#{tagname} "
44
+ def serialized_tag(tagname, str, additional_attributes = {})
45
+ str << '<' << tagname << ' '
34
46
  serialized_attributes(str, additional_attributes)
35
47
  if block_given?
36
48
  str << '>'
37
49
  yield
38
- str << "</#{tagname}>"
50
+ str << '</' << tagname << '>'
39
51
  else
40
52
  str << '/>'
41
53
  end
@@ -47,21 +59,34 @@ module Axlsx
47
59
  # serialization to.
48
60
  # @param [Hash] additional_attributes An option key value hash for
49
61
  # defining values that are not serializable attributes list.
50
- def serialized_attributes(str = '', additional_attributes = {})
51
- attributes = declared_attributes.merge! additional_attributes
52
- attributes.each do |key, value|
53
- str << "#{Axlsx.camel(key, false)}=\"#{Axlsx.camel(Axlsx.booleanize(value), false)}\" "
62
+ # @param [Boolean] camelize_value Should the attribute values be camelized
63
+ def serialized_attributes(str = +'', additional_attributes = {}, camelize_value = true)
64
+ camel_xml_attributes = self.class.camel_xml_attributes
65
+ ivar_xml_attributes = self.class.ivar_xml_attributes
66
+
67
+ self.class.xml_attributes.each_with_index do |attr, index|
68
+ next if additional_attributes.key?(attr)
69
+ next unless instance_variable_defined?(ivar_xml_attributes[index])
70
+
71
+ value = instance_variable_get(ivar_xml_attributes[index])
72
+ next if value.nil?
73
+
74
+ value = Axlsx.booleanize(value)
75
+ value = Axlsx.camel(value, false) if camelize_value
76
+
77
+ str << camel_xml_attributes[index] << '="' << value.to_s << '" '
54
78
  end
55
- str
56
- end
57
79
 
58
- # A hash of instance variables that have been declared with
59
- # seraialized_attributes and are not nil.
60
- # This requires ruby 1.9.3 or higher
61
- def declared_attributes
62
- Axlsx.instance_values_for(self).select do |key, value|
63
- value != nil && self.class.xml_attributes.include?(key.to_sym)
80
+ additional_attributes.each do |attr, value|
81
+ next if value.nil?
82
+
83
+ value = Axlsx.booleanize(value)
84
+ value = Axlsx.camel(value, false) if camelize_value
85
+
86
+ str << Axlsx.camel(attr, false) << '="' << value.to_s << '" '
64
87
  end
88
+
89
+ str
65
90
  end
66
91
 
67
92
  # serialized instance values at text nodes on a camelized element of the
@@ -71,7 +96,7 @@ module Axlsx
71
96
  # @param [String] str The string instance to which serialized data is appended
72
97
  # @param [Array] additional_attributes An array of additional attribute names.
73
98
  # @return [String] The serialized output.
74
- def serialized_element_attributes(str = '', additional_attributes = [], &block)
99
+ def serialized_element_attributes(str = +'', additional_attributes = [])
75
100
  attrs = self.class.xml_element_attributes + additional_attributes
76
101
  values = Axlsx.instance_values_for(self)
77
102
  attrs.each do |attribute_name|
@@ -80,7 +105,7 @@ module Axlsx
80
105
 
81
106
  value = yield value if block_given?
82
107
  element_name = Axlsx.camel(attribute_name, false)
83
- str << "<#{element_name}>#{value}</#{element_name}>"
108
+ str << '<' << element_name << '>' << value << '</' << element_name << '>'
84
109
  end
85
110
  str
86
111
  end