caxlsx 3.4.1 → 4.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (153) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +24 -1
  3. data/README.md +9 -11
  4. data/Rakefile +7 -5
  5. data/examples/generate.rb +3 -1
  6. data/lib/axlsx/content_type/abstract_content_type.rb +12 -4
  7. data/lib/axlsx/content_type/content_type.rb +8 -6
  8. data/lib/axlsx/content_type/default.rb +7 -2
  9. data/lib/axlsx/content_type/override.rb +7 -2
  10. data/lib/axlsx/doc_props/app.rb +95 -26
  11. data/lib/axlsx/doc_props/core.rb +8 -6
  12. data/lib/axlsx/drawing/area_chart.rb +10 -8
  13. data/lib/axlsx/drawing/area_series.rb +20 -12
  14. data/lib/axlsx/drawing/ax_data_source.rb +2 -0
  15. data/lib/axlsx/drawing/axes.rb +6 -4
  16. data/lib/axlsx/drawing/axis.rb +42 -22
  17. data/lib/axlsx/drawing/bar_3D_chart.rb +14 -12
  18. data/lib/axlsx/drawing/bar_chart.rb +13 -11
  19. data/lib/axlsx/drawing/bar_series.rb +20 -9
  20. data/lib/axlsx/drawing/bubble_chart.rb +6 -4
  21. data/lib/axlsx/drawing/bubble_series.rb +8 -6
  22. data/lib/axlsx/drawing/cat_axis.rb +29 -12
  23. data/lib/axlsx/drawing/chart.rb +46 -20
  24. data/lib/axlsx/drawing/d_lbls.rb +10 -8
  25. data/lib/axlsx/drawing/drawing.rb +59 -56
  26. data/lib/axlsx/drawing/graphic_frame.rb +6 -4
  27. data/lib/axlsx/drawing/hyperlink.rb +19 -8
  28. data/lib/axlsx/drawing/line_3D_chart.rb +7 -5
  29. data/lib/axlsx/drawing/line_chart.rb +10 -8
  30. data/lib/axlsx/drawing/line_series.rb +20 -12
  31. data/lib/axlsx/drawing/marker.rb +24 -7
  32. data/lib/axlsx/drawing/num_data.rb +9 -7
  33. data/lib/axlsx/drawing/num_data_source.rb +9 -7
  34. data/lib/axlsx/drawing/num_val.rb +7 -5
  35. data/lib/axlsx/drawing/one_cell_anchor.rb +13 -5
  36. data/lib/axlsx/drawing/pic.rb +26 -15
  37. data/lib/axlsx/drawing/picture_locking.rb +3 -1
  38. data/lib/axlsx/drawing/pie_3D_chart.rb +6 -4
  39. data/lib/axlsx/drawing/pie_chart.rb +36 -0
  40. data/lib/axlsx/drawing/pie_series.rb +23 -9
  41. data/lib/axlsx/drawing/scaling.rb +25 -9
  42. data/lib/axlsx/drawing/scatter_chart.rb +7 -5
  43. data/lib/axlsx/drawing/scatter_series.rb +14 -12
  44. data/lib/axlsx/drawing/ser_axis.rb +13 -5
  45. data/lib/axlsx/drawing/series.rb +13 -5
  46. data/lib/axlsx/drawing/series_title.rb +6 -4
  47. data/lib/axlsx/drawing/str_data.rb +7 -5
  48. data/lib/axlsx/drawing/str_val.rb +6 -4
  49. data/lib/axlsx/drawing/title.rb +13 -14
  50. data/lib/axlsx/drawing/two_cell_anchor.rb +4 -2
  51. data/lib/axlsx/drawing/val_axis.rb +4 -2
  52. data/lib/axlsx/drawing/view_3D.rb +16 -8
  53. data/lib/axlsx/drawing/vml_drawing.rb +18 -16
  54. data/lib/axlsx/drawing/vml_shape.rb +24 -22
  55. data/lib/axlsx/package.rb +73 -67
  56. data/lib/axlsx/rels/relationship.rb +21 -6
  57. data/lib/axlsx/rels/relationships.rb +6 -4
  58. data/lib/axlsx/stylesheet/border.rb +15 -4
  59. data/lib/axlsx/stylesheet/border_pr.rb +19 -6
  60. data/lib/axlsx/stylesheet/cell_alignment.rb +41 -10
  61. data/lib/axlsx/stylesheet/cell_protection.rb +12 -3
  62. data/lib/axlsx/stylesheet/cell_style.rb +33 -8
  63. data/lib/axlsx/stylesheet/color.rb +15 -7
  64. data/lib/axlsx/stylesheet/dxf.rb +34 -9
  65. data/lib/axlsx/stylesheet/fill.rb +7 -2
  66. data/lib/axlsx/stylesheet/font.rb +65 -17
  67. data/lib/axlsx/stylesheet/gradient_fill.rb +12 -4
  68. data/lib/axlsx/stylesheet/gradient_stop.rb +14 -5
  69. data/lib/axlsx/stylesheet/num_fmt.rb +14 -10
  70. data/lib/axlsx/stylesheet/pattern_fill.rb +18 -5
  71. data/lib/axlsx/stylesheet/styles.rb +124 -82
  72. data/lib/axlsx/stylesheet/table_style.rb +19 -6
  73. data/lib/axlsx/stylesheet/table_style_element.rb +15 -4
  74. data/lib/axlsx/stylesheet/table_styles.rb +14 -5
  75. data/lib/axlsx/stylesheet/xf.rb +73 -18
  76. data/lib/axlsx/util/accessors.rb +10 -6
  77. data/lib/axlsx/util/buffered_zip_output_stream.rb +60 -0
  78. data/lib/axlsx/util/constants.rb +117 -104
  79. data/lib/axlsx/util/mime_type_utils.rb +3 -5
  80. data/lib/axlsx/util/options_parser.rb +3 -1
  81. data/lib/axlsx/util/serialized_attributes.rb +42 -17
  82. data/lib/axlsx/util/simple_typed_list.rb +47 -47
  83. data/lib/axlsx/util/storage.rb +11 -10
  84. data/lib/axlsx/util/validators.rb +101 -41
  85. data/lib/axlsx/util/zip_command.rb +10 -10
  86. data/lib/axlsx/version.rb +3 -1
  87. data/lib/axlsx/workbook/defined_name.rb +6 -4
  88. data/lib/axlsx/workbook/defined_names.rb +4 -2
  89. data/lib/axlsx/workbook/shared_strings_table.rb +8 -6
  90. data/lib/axlsx/workbook/workbook.rb +94 -79
  91. data/lib/axlsx/workbook/workbook_view.rb +3 -1
  92. data/lib/axlsx/workbook/workbook_views.rb +4 -2
  93. data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +65 -8
  94. data/lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb +11 -5
  95. data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +11 -7
  96. data/lib/axlsx/workbook/worksheet/auto_filter/sort_condition.rb +51 -0
  97. data/lib/axlsx/workbook/worksheet/auto_filter/sort_state.rb +56 -0
  98. data/lib/axlsx/workbook/worksheet/border_creator.rb +5 -3
  99. data/lib/axlsx/workbook/worksheet/break.rb +3 -1
  100. data/lib/axlsx/workbook/worksheet/cell.rb +83 -64
  101. data/lib/axlsx/workbook/worksheet/cell_serializer.rb +31 -27
  102. data/lib/axlsx/workbook/worksheet/cfvo.rb +11 -3
  103. data/lib/axlsx/workbook/worksheet/cfvos.rb +3 -1
  104. data/lib/axlsx/workbook/worksheet/col.rb +5 -3
  105. data/lib/axlsx/workbook/worksheet/col_breaks.rb +6 -4
  106. data/lib/axlsx/workbook/worksheet/color_scale.rb +12 -10
  107. data/lib/axlsx/workbook/worksheet/cols.rb +4 -2
  108. data/lib/axlsx/workbook/worksheet/comment.rb +8 -6
  109. data/lib/axlsx/workbook/worksheet/comments.rb +6 -4
  110. data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +16 -5
  111. data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +73 -16
  112. data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +4 -2
  113. data/lib/axlsx/workbook/worksheet/data_bar.rb +14 -13
  114. data/lib/axlsx/workbook/worksheet/data_validation.rb +69 -28
  115. data/lib/axlsx/workbook/worksheet/data_validations.rb +4 -2
  116. data/lib/axlsx/workbook/worksheet/date_time_converter.rb +7 -5
  117. data/lib/axlsx/workbook/worksheet/dimension.rb +4 -2
  118. data/lib/axlsx/workbook/worksheet/header_footer.rb +4 -2
  119. data/lib/axlsx/workbook/worksheet/icon_set.rb +38 -9
  120. data/lib/axlsx/workbook/worksheet/merged_cells.rb +6 -6
  121. data/lib/axlsx/workbook/worksheet/outline_pr.rb +6 -2
  122. data/lib/axlsx/workbook/worksheet/page_margins.rb +39 -11
  123. data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +7 -4
  124. data/lib/axlsx/workbook/worksheet/page_setup.rb +34 -9
  125. data/lib/axlsx/workbook/worksheet/pane.rb +17 -9
  126. data/lib/axlsx/workbook/worksheet/pivot_table.rb +20 -19
  127. data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +8 -6
  128. data/lib/axlsx/workbook/worksheet/pivot_tables.rb +3 -1
  129. data/lib/axlsx/workbook/worksheet/print_options.rb +3 -1
  130. data/lib/axlsx/workbook/worksheet/protected_range.rb +3 -1
  131. data/lib/axlsx/workbook/worksheet/protected_ranges.rb +6 -4
  132. data/lib/axlsx/workbook/worksheet/rich_text.rb +3 -1
  133. data/lib/axlsx/workbook/worksheet/rich_text_run.rb +46 -24
  134. data/lib/axlsx/workbook/worksheet/row.rb +11 -9
  135. data/lib/axlsx/workbook/worksheet/row_breaks.rb +7 -5
  136. data/lib/axlsx/workbook/worksheet/selection.rb +15 -7
  137. data/lib/axlsx/workbook/worksheet/sheet_calc_pr.rb +6 -2
  138. data/lib/axlsx/workbook/worksheet/sheet_data.rb +3 -1
  139. data/lib/axlsx/workbook/worksheet/sheet_format_pr.rb +6 -2
  140. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +8 -4
  141. data/lib/axlsx/workbook/worksheet/sheet_protection.rb +11 -9
  142. data/lib/axlsx/workbook/worksheet/sheet_view.rb +38 -15
  143. data/lib/axlsx/workbook/worksheet/table.rb +9 -7
  144. data/lib/axlsx/workbook/worksheet/table_style_info.rb +4 -2
  145. data/lib/axlsx/workbook/worksheet/tables.rb +4 -2
  146. data/lib/axlsx/workbook/worksheet/worksheet.rb +56 -39
  147. data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +4 -2
  148. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +8 -2
  149. data/lib/axlsx/workbook/worksheet/worksheet_hyperlink.rb +7 -5
  150. data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +5 -3
  151. data/lib/axlsx.rb +56 -42
  152. data/lib/caxlsx.rb +3 -1
  153. metadata +39 -71
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'open3'
2
4
  require 'shellwords'
3
5
 
@@ -23,10 +25,10 @@ module Axlsx
23
25
  # Create a temporary directory for writing files to.
24
26
  #
25
27
  # The directory and its contents are removed at the end of the block.
26
- def open(output, &block)
28
+ def open(output)
27
29
  Dir.mktmpdir do |dir|
28
30
  @dir = dir
29
- block.call(self)
31
+ yield(self)
30
32
  write_file
31
33
  zip_parts(output)
32
34
  end
@@ -38,23 +40,21 @@ module Axlsx
38
40
  @current_file = "#{@dir}/#{entry.name}"
39
41
  @files << entry.name
40
42
  FileUtils.mkdir_p(File.dirname(@current_file))
43
+ @io = File.open(@current_file, "wb")
41
44
  end
42
45
 
43
46
  # Write to a buffer that will be written to the current entry
44
47
  def write(content)
45
- @buffer << content
48
+ @io << content
46
49
  end
47
50
  alias << write
48
51
 
49
52
  private
50
53
 
51
54
  def write_file
52
- if @current_file
53
- @buffer.rewind
54
- File.open(@current_file, "wb") { |f| f.write @buffer.read }
55
- end
55
+ @io.close if @current_file
56
56
  @current_file = nil
57
- @buffer = StringIO.new
57
+ @io = nil
58
58
  end
59
59
 
60
60
  def zip_parts(output)
@@ -63,8 +63,8 @@ module Axlsx
63
63
  escaped_dir = Shellwords.shellescape(@dir)
64
64
  command = "cd #{escaped_dir} && #{@zip_command} #{output} #{inputs}"
65
65
  stdout_and_stderr, status = Open3.capture2e(command)
66
- if !status.success?
67
- raise(ZipError.new(stdout_and_stderr))
66
+ unless status.success?
67
+ raise ZipError, stdout_and_stderr
68
68
  end
69
69
  end
70
70
  end
data/lib/axlsx/version.rb CHANGED
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Axlsx
2
4
  # The current version
3
- VERSION = "3.4.1"
5
+ VERSION = "4.1.0"
4
6
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # <definedNames>
2
4
  # <definedName name="_xlnm.Print_Titles" localSheetId="0">Sheet1!$1:$1</definedName>
3
5
  # </definedNames>
@@ -107,7 +109,7 @@ module Axlsx
107
109
  # The local sheet index (0-based)
108
110
  # @param [Integer] value the unsigned integer index of the sheet this defined_name applies to.
109
111
  def local_sheet_id=(value)
110
- Axlsx::validate_unsigned_int(value)
112
+ Axlsx.validate_unsigned_int(value)
111
113
  @local_sheet_id = value
112
114
  end
113
115
 
@@ -118,12 +120,12 @@ module Axlsx
118
120
  serializable_attributes :short_cut_key, :status_bar, :help, :description, :custom_menu, :comment,
119
121
  :workbook_parameter, :publish_to_server, :xlm, :vb_proceedure, :function, :hidden, :local_sheet_id
120
122
 
121
- def to_xml_string(str = '')
123
+ def to_xml_string(str = +'')
122
124
  raise ArgumentError, 'you must specify the name for this defined name. Please read the documentation for Axlsx::DefinedName for more details' unless name
123
125
 
124
- str << ('<definedName ' << 'name="' << name << '" ')
126
+ str << '<definedName ' << 'name="' << name << '" '
125
127
  serialized_attributes str
126
- str << ('>' << @formula << '</definedName>')
128
+ str << '>' << @formula << '</definedName>'
127
129
  end
128
130
  end
129
131
  end
@@ -1,15 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Axlsx
2
4
  # a simple types list of DefinedName objects
3
5
  class DefinedNames < SimpleTypedList
4
6
  # creates the DefinedNames object
5
7
  def initialize
6
- super DefinedName
8
+ super(DefinedName)
7
9
  end
8
10
 
9
11
  # Serialize to xml
10
12
  # @param [String] str
11
13
  # @return [String]
12
- def to_xml_string(str = '')
14
+ def to_xml_string(str = +'')
13
15
  return if empty?
14
16
 
15
17
  str << '<definedNames>'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Axlsx
2
4
  # The Shared String Table class is responsible for managing and serializing common strings in a workbook.
3
5
  # While the ECMA-376 spec allows for both inline and shared strings it seems that at least some applications like iWorks Numbers
@@ -34,7 +36,7 @@ module Axlsx
34
36
  @index = 0
35
37
  @xml_space = xml_space
36
38
  @unique_cells = {}
37
- @shared_xml_string = ""
39
+ @shared_xml_string = +''
38
40
  shareable_cells = cells.flatten.select { |cell| cell.plain_string? || cell.contains_rich_text? }
39
41
  @count = shareable_cells.size
40
42
  resolve(shareable_cells)
@@ -43,11 +45,11 @@ module Axlsx
43
45
  # Serializes the object
44
46
  # @param [String] str
45
47
  # @return [String]
46
- def to_xml_string(str = '')
47
- Axlsx::sanitize(@shared_xml_string)
48
- str << ('<?xml version="1.0" encoding="UTF-8"?><sst xmlns="' << XML_NS << '"')
49
- str << (' count="' << @count.to_s << '" uniqueCount="' << unique_count.to_s << '"')
50
- str << (' xml:space="' << xml_space.to_s << '">' << @shared_xml_string << '</sst>')
48
+ def to_xml_string(str = +'')
49
+ Axlsx.sanitize(@shared_xml_string)
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>'
51
53
  end
52
54
 
53
55
  private
@@ -1,39 +1,41 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Axlsx
2
- require 'axlsx/workbook/worksheet/sheet_calc_pr.rb'
3
- require 'axlsx/workbook/worksheet/auto_filter/auto_filter.rb'
4
- require 'axlsx/workbook/worksheet/date_time_converter.rb'
5
- require 'axlsx/workbook/worksheet/protected_range.rb'
6
- require 'axlsx/workbook/worksheet/protected_ranges.rb'
4
+ require 'axlsx/workbook/worksheet/sheet_calc_pr'
5
+ require 'axlsx/workbook/worksheet/auto_filter/auto_filter'
6
+ require 'axlsx/workbook/worksheet/date_time_converter'
7
+ require 'axlsx/workbook/worksheet/protected_range'
8
+ require 'axlsx/workbook/worksheet/protected_ranges'
7
9
  require 'axlsx/workbook/worksheet/rich_text_run'
8
10
  require 'axlsx/workbook/worksheet/rich_text'
9
- require 'axlsx/workbook/worksheet/cell_serializer.rb'
10
- require 'axlsx/workbook/worksheet/cell.rb'
11
- require 'axlsx/workbook/worksheet/page_margins.rb'
12
- require 'axlsx/workbook/worksheet/page_set_up_pr.rb'
13
- require 'axlsx/workbook/worksheet/outline_pr.rb'
14
- require 'axlsx/workbook/worksheet/page_setup.rb'
15
- require 'axlsx/workbook/worksheet/header_footer.rb'
16
- require 'axlsx/workbook/worksheet/print_options.rb'
17
- require 'axlsx/workbook/worksheet/cfvo.rb'
18
- require 'axlsx/workbook/worksheet/cfvos.rb'
19
- require 'axlsx/workbook/worksheet/color_scale.rb'
20
- require 'axlsx/workbook/worksheet/data_bar.rb'
21
- require 'axlsx/workbook/worksheet/icon_set.rb'
22
- require 'axlsx/workbook/worksheet/conditional_formatting.rb'
23
- require 'axlsx/workbook/worksheet/conditional_formatting_rule.rb'
24
- require 'axlsx/workbook/worksheet/conditional_formattings.rb'
25
- require 'axlsx/workbook/worksheet/row.rb'
26
- require 'axlsx/workbook/worksheet/col.rb'
27
- require 'axlsx/workbook/worksheet/cols.rb'
28
- require 'axlsx/workbook/worksheet/comments.rb'
29
- require 'axlsx/workbook/worksheet/comment.rb'
30
- require 'axlsx/workbook/worksheet/merged_cells.rb'
31
- require 'axlsx/workbook/worksheet/sheet_protection.rb'
32
- require 'axlsx/workbook/worksheet/sheet_pr.rb'
33
- require 'axlsx/workbook/worksheet/dimension.rb'
34
- require 'axlsx/workbook/worksheet/sheet_data.rb'
35
- require 'axlsx/workbook/worksheet/worksheet_drawing.rb'
36
- require 'axlsx/workbook/worksheet/worksheet_comments.rb'
11
+ require 'axlsx/workbook/worksheet/cell_serializer'
12
+ require 'axlsx/workbook/worksheet/cell'
13
+ require 'axlsx/workbook/worksheet/page_margins'
14
+ require 'axlsx/workbook/worksheet/page_set_up_pr'
15
+ require 'axlsx/workbook/worksheet/outline_pr'
16
+ require 'axlsx/workbook/worksheet/page_setup'
17
+ require 'axlsx/workbook/worksheet/header_footer'
18
+ require 'axlsx/workbook/worksheet/print_options'
19
+ require 'axlsx/workbook/worksheet/cfvo'
20
+ require 'axlsx/workbook/worksheet/cfvos'
21
+ require 'axlsx/workbook/worksheet/color_scale'
22
+ require 'axlsx/workbook/worksheet/data_bar'
23
+ require 'axlsx/workbook/worksheet/icon_set'
24
+ require 'axlsx/workbook/worksheet/conditional_formatting'
25
+ require 'axlsx/workbook/worksheet/conditional_formatting_rule'
26
+ require 'axlsx/workbook/worksheet/conditional_formattings'
27
+ require 'axlsx/workbook/worksheet/row'
28
+ require 'axlsx/workbook/worksheet/col'
29
+ require 'axlsx/workbook/worksheet/cols'
30
+ require 'axlsx/workbook/worksheet/comments'
31
+ require 'axlsx/workbook/worksheet/comment'
32
+ require 'axlsx/workbook/worksheet/merged_cells'
33
+ require 'axlsx/workbook/worksheet/sheet_protection'
34
+ require 'axlsx/workbook/worksheet/sheet_pr'
35
+ require 'axlsx/workbook/worksheet/dimension'
36
+ require 'axlsx/workbook/worksheet/sheet_data'
37
+ require 'axlsx/workbook/worksheet/worksheet_drawing'
38
+ require 'axlsx/workbook/worksheet/worksheet_comments'
37
39
  require 'axlsx/workbook/worksheet/worksheet_hyperlink'
38
40
  require 'axlsx/workbook/worksheet/worksheet_hyperlinks'
39
41
  require 'axlsx/workbook/worksheet/break'
@@ -41,22 +43,22 @@ module Axlsx
41
43
  require 'axlsx/workbook/worksheet/col_breaks'
42
44
  require 'axlsx/workbook/workbook_view'
43
45
  require 'axlsx/workbook/workbook_views'
44
- require 'axlsx/workbook/worksheet/worksheet.rb'
45
- require 'axlsx/workbook/shared_strings_table.rb'
46
- require 'axlsx/workbook/defined_name.rb'
47
- require 'axlsx/workbook/defined_names.rb'
48
- require 'axlsx/workbook/worksheet/table_style_info.rb'
49
- require 'axlsx/workbook/worksheet/table.rb'
50
- require 'axlsx/workbook/worksheet/tables.rb'
51
- require 'axlsx/workbook/worksheet/pivot_table_cache_definition.rb'
52
- require 'axlsx/workbook/worksheet/pivot_table.rb'
53
- require 'axlsx/workbook/worksheet/pivot_tables.rb'
54
- require 'axlsx/workbook/worksheet/data_validation.rb'
55
- require 'axlsx/workbook/worksheet/data_validations.rb'
56
- require 'axlsx/workbook/worksheet/sheet_view.rb'
57
- require 'axlsx/workbook/worksheet/sheet_format_pr.rb'
58
- require 'axlsx/workbook/worksheet/pane.rb'
59
- require 'axlsx/workbook/worksheet/selection.rb'
46
+ require 'axlsx/workbook/worksheet/worksheet'
47
+ require 'axlsx/workbook/shared_strings_table'
48
+ require 'axlsx/workbook/defined_name'
49
+ require 'axlsx/workbook/defined_names'
50
+ require 'axlsx/workbook/worksheet/table_style_info'
51
+ require 'axlsx/workbook/worksheet/table'
52
+ require 'axlsx/workbook/worksheet/tables'
53
+ require 'axlsx/workbook/worksheet/pivot_table_cache_definition'
54
+ require 'axlsx/workbook/worksheet/pivot_table'
55
+ require 'axlsx/workbook/worksheet/pivot_tables'
56
+ require 'axlsx/workbook/worksheet/data_validation'
57
+ require 'axlsx/workbook/worksheet/data_validations'
58
+ require 'axlsx/workbook/worksheet/sheet_view'
59
+ require 'axlsx/workbook/worksheet/sheet_format_pr'
60
+ require 'axlsx/workbook/worksheet/pane'
61
+ require 'axlsx/workbook/worksheet/selection'
60
62
 
61
63
  # The Workbook class is an xlsx workbook that manages worksheets, charts, drawings and styles.
62
64
  # The following parts of the Office Open XML spreadsheet specification are not implimented in this version.
@@ -93,7 +95,7 @@ module Axlsx
93
95
 
94
96
  # @see use_shared_strings
95
97
  def use_shared_strings=(v)
96
- Axlsx::validate_boolean(v)
98
+ Axlsx.validate_boolean(v)
97
99
  @use_shared_strings = v
98
100
  end
99
101
 
@@ -102,7 +104,7 @@ module Axlsx
102
104
  attr_reader :is_reversed
103
105
 
104
106
  def is_reversed=(v)
105
- Axlsx::validate_boolean(v)
107
+ Axlsx.validate_boolean(v)
106
108
  @is_reversed = v
107
109
  end
108
110
 
@@ -169,7 +171,7 @@ module Axlsx
169
171
  # @see Comment
170
172
  # @return [Comments]
171
173
  def comments
172
- worksheets.map { |sheet| sheet.comments }.compact
174
+ worksheets.map(&:comments).compact
173
175
  end
174
176
 
175
177
  # The styles associated with this workbook
@@ -195,16 +197,16 @@ module Axlsx
195
197
  # A helper to apply styles that were added using `worksheet.add_style`
196
198
  # @return [Boolean]
197
199
  def apply_styles
198
- return false if !styled_cells
200
+ return false unless styled_cells
199
201
 
200
202
  styled_cells.each do |cell|
201
203
  current_style = styles.style_index[cell.style]
202
204
 
203
- if current_style
204
- new_style = Axlsx.hash_deep_merge(current_style, cell.raw_style)
205
- else
206
- new_style = cell.raw_style
207
- end
205
+ new_style = if current_style
206
+ Axlsx.hash_deep_merge(current_style, cell.raw_style)
207
+ else
208
+ cell.raw_style
209
+ end
208
210
 
209
211
  cell.style = styles.add_style(new_style)
210
212
  end
@@ -219,8 +221,8 @@ module Axlsx
219
221
  # @param [String] name The name of the sheet you are looking for
220
222
  # @return [Worksheet] The sheet found, or nil
221
223
  def sheet_by_name(name)
222
- index = @worksheets.index { |sheet| sheet.name == name }
223
- @worksheets[index] if index
224
+ encoded_name = Axlsx.coder.encode(name)
225
+ @worksheets.find { |sheet| sheet.name == encoded_name }
224
226
  end
225
227
 
226
228
  # Creates a new Workbook.
@@ -247,18 +249,28 @@ module Axlsx
247
249
 
248
250
  # Instance level access to the class variable 1904
249
251
  # @return [Boolean]
250
- def date1904() @@date1904; end
252
+ def date1904
253
+ @@date1904
254
+ end
251
255
 
252
256
  # see @date1904
253
- def date1904=(v) Axlsx::validate_boolean v; @@date1904 = v; end
257
+ def date1904=(v)
258
+ Axlsx.validate_boolean v
259
+ @@date1904 = v
260
+ end
254
261
 
255
262
  # Sets the date1904 attribute to the provided boolean
256
263
  # @return [Boolean]
257
- def self.date1904=(v) Axlsx::validate_boolean v; @@date1904 = v; end
264
+ def self.date1904=(v)
265
+ Axlsx.validate_boolean v
266
+ @@date1904 = v
267
+ end
258
268
 
259
269
  # retrieves the date1904 attribute
260
270
  # @return [Boolean]
261
- def self.date1904() @@date1904; end
271
+ def self.date1904
272
+ @@date1904
273
+ end
262
274
 
263
275
  # Whether to treat values starting with an equals sign as formulas or as literal strings.
264
276
  # Allowing user-generated data to be interpreted as formulas is a security risk.
@@ -278,10 +290,13 @@ module Axlsx
278
290
  # calculation. Thus the performance benefits of turning this off are
279
291
  # marginal unless you are creating a very large sheet.
280
292
  # @return [Boolean]
281
- def use_autowidth() @use_autowidth; end
293
+ attr_reader :use_autowidth
282
294
 
283
295
  # see @use_autowidth
284
- def use_autowidth=(v = true) Axlsx::validate_boolean v; @use_autowidth = v; end
296
+ def use_autowidth=(v = true)
297
+ Axlsx.validate_boolean v
298
+ @use_autowidth = v
299
+ end
285
300
 
286
301
  # Font size of bold fonts is multiplied with this
287
302
  # Used for automatic calculation of cell widths with bold text
@@ -289,7 +304,7 @@ module Axlsx
289
304
  attr_reader :bold_font_multiplier
290
305
 
291
306
  def bold_font_multiplier=(v)
292
- Axlsx::validate_float v
307
+ Axlsx.validate_float v
293
308
  @bold_font_multiplier = v
294
309
  end
295
310
 
@@ -299,7 +314,7 @@ module Axlsx
299
314
  attr_reader :font_scale_divisor
300
315
 
301
316
  def font_scale_divisor=(v)
302
- Axlsx::validate_float v
317
+ Axlsx.validate_float v
303
318
  @font_scale_divisor = v
304
319
  end
305
320
 
@@ -352,10 +367,10 @@ module Axlsx
352
367
  def relationships
353
368
  r = Relationships.new
354
369
  @worksheets.each do |sheet|
355
- r << Relationship.new(sheet, WORKSHEET_R, WORKSHEET_PN % (r.size + 1))
370
+ r << Relationship.new(sheet, WORKSHEET_R, format(WORKSHEET_PN, r.size + 1))
356
371
  end
357
372
  pivot_tables.each_with_index do |pivot_table, index|
358
- r << Relationship.new(pivot_table.cache_definition, PIVOT_TABLE_CACHE_DEFINITION_R, PIVOT_TABLE_CACHE_DEFINITION_PN % (index + 1))
373
+ r << Relationship.new(pivot_table.cache_definition, PIVOT_TABLE_CACHE_DEFINITION_R, format(PIVOT_TABLE_CACHE_DEFINITION_PN, index + 1))
359
374
  end
360
375
  r << Relationship.new(self, STYLES_R, STYLES_PN)
361
376
  if use_shared_strings
@@ -367,7 +382,7 @@ module Axlsx
367
382
  # generates a shared string object against all cells in all worksheets.
368
383
  # @return [SharedStringTable]
369
384
  def shared_strings
370
- SharedStringsTable.new(worksheets.collect { |ws| ws.cells }, xml_space)
385
+ SharedStringsTable.new(worksheets.collect(&:cells), xml_space)
371
386
  end
372
387
 
373
388
  # The xml:space attribute for the worksheet.
@@ -389,12 +404,12 @@ module Axlsx
389
404
  end
390
405
 
391
406
  # returns a range of cells in a worksheet
392
- # @param [String] cell_def The excel style reference defining the worksheet and cells. The range must specify the sheet to
407
+ # @param [String] cell_def The Excel style reference defining the worksheet and cells. The range must specify the sheet to
393
408
  # retrieve the cells from. e.g. range('Sheet1!A1:B2') will return an array of four cells [A1, A2, B1, B2] while range('Sheet1!A1') will return a single Cell.
394
409
  # @return [Cell, Array]
395
410
  def [](cell_def)
396
- sheet_name = cell_def.split('!')[0] if cell_def.match('!')
397
- worksheet = self.worksheets.select { |s| s.name == sheet_name }.first
411
+ sheet_name = cell_def.split('!')[0] if cell_def.include?('!')
412
+ worksheet = worksheets.find { |s| s.name == sheet_name }
398
413
  raise ArgumentError, 'Unknown Sheet' unless sheet_name && worksheet.is_a?(Worksheet)
399
414
 
400
415
  worksheet[cell_def.gsub(/.+!/, "")]
@@ -403,11 +418,11 @@ module Axlsx
403
418
  # Serialize the workbook
404
419
  # @param [String] str
405
420
  # @return [String]
406
- def to_xml_string(str = '')
407
- add_worksheet(name: 'Sheet1') unless worksheets.size > 0
421
+ def to_xml_string(str = +'')
422
+ add_worksheet(name: 'Sheet1') if worksheets.empty?
408
423
  str << '<?xml version="1.0" encoding="UTF-8"?>'
409
- str << ('<workbook xmlns="' << XML_NS << '" xmlns:r="' << XML_NS_R << '">')
410
- str << ('<workbookPr date1904="' << @@date1904.to_s << '"/>')
424
+ str << '<workbook xmlns="' << XML_NS << '" xmlns:r="' << XML_NS_R << '">'
425
+ str << '<workbookPr date1904="' << @@date1904.to_s << '"/>'
411
426
  views.to_xml_string(str)
412
427
  str << '<sheets>'
413
428
  if is_reversed
@@ -420,7 +435,7 @@ module Axlsx
420
435
  unless pivot_tables.empty?
421
436
  str << '<pivotCaches>'
422
437
  pivot_tables.each do |pivot_table|
423
- str << ('<pivotCache cacheId="' << pivot_table.cache_definition.cache_id.to_s << '" r:id="' << pivot_table.cache_definition.rId << '"/>')
438
+ str << '<pivotCache cacheId="' << pivot_table.cache_definition.cache_id.to_s << '" r:id="' << pivot_table.cache_definition.rId << '"/>'
424
439
  end
425
440
  str << '</pivotCaches>'
426
441
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # <xsd:complexType name="CT_BookView">
2
4
  # <xsd:sequence>
3
5
  # <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/>
@@ -66,7 +68,7 @@ module Axlsx
66
68
  # Serialize the WorkbookView
67
69
  # @param [String] str
68
70
  # @return [String]
69
- def to_xml_string(str = '')
71
+ def to_xml_string(str = +'')
70
72
  str << '<workbookView '
71
73
  serialized_attributes str
72
74
  str << '></workbookView>'
@@ -1,15 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Axlsx
2
4
  # a simple types list of BookView objects
3
5
  class WorkbookViews < SimpleTypedList
4
6
  # creates the book views object
5
7
  def initialize
6
- super WorkbookView
8
+ super(WorkbookView)
7
9
  end
8
10
 
9
11
  # Serialize to xml
10
12
  # @param [String] str
11
13
  # @return [String]
12
- def to_xml_string(str = '')
14
+ def to_xml_string(str = +'')
13
15
  return if empty?
14
16
 
15
17
  str << "<bookViews>"
@@ -1,5 +1,8 @@
1
- require 'axlsx/workbook/worksheet/auto_filter/filter_column.rb'
2
- require 'axlsx/workbook/worksheet/auto_filter/filters.rb'
1
+ # frozen_string_literal: true
2
+
3
+ require 'axlsx/workbook/worksheet/auto_filter/filter_column'
4
+ require 'axlsx/workbook/worksheet/auto_filter/filters'
5
+ require 'axlsx/workbook/worksheet/auto_filter/sort_state'
3
6
 
4
7
  module Axlsx
5
8
  # This class represents an auto filter range in a worksheet
@@ -10,9 +13,10 @@ module Axlsx
10
13
  raise ArgumentError, 'you must provide a worksheet' unless worksheet.is_a?(Worksheet)
11
14
 
12
15
  @worksheet = worksheet
16
+ @sort_on_generate = true
13
17
  end
14
18
 
15
- attr_reader :worksheet
19
+ attr_reader :worksheet, :sort_on_generate
16
20
 
17
21
  # The range the autofilter should be applied to.
18
22
  # This should be a string like 'A1:B8'
@@ -46,15 +50,50 @@ module Axlsx
46
50
  columns.last
47
51
  end
48
52
 
49
- # actually performs the filtering of rows who's cells do not
50
- # match the filter.
53
+ # Performs the sorting of the rows based on the sort_state conditions. Then it actually performs
54
+ # the filtering of rows who's cells do not match the filter.
51
55
  def apply
52
56
  first_cell, last_cell = range.split(':')
53
- start_point = Axlsx::name_to_indices(first_cell)
54
- end_point = Axlsx::name_to_indices(last_cell)
57
+ start_point = Axlsx.name_to_indices(first_cell)
58
+ end_point = Axlsx.name_to_indices(last_cell)
55
59
  # The +1 is so we skip the header row with the filter drop downs
56
60
  rows = worksheet.rows[(start_point.last + 1)..end_point.last] || []
57
61
 
62
+ # the sorting of the rows if sort_conditions are available.
63
+ if !sort_state.sort_conditions.empty? && sort_on_generate
64
+ sort_conditions = sort_state.sort_conditions
65
+ sorted_rows = rows.sort do |row1, row2|
66
+ comparison = 0
67
+
68
+ sort_conditions.each do |condition|
69
+ cell_value_row1 = row1.cells[condition.column_index + start_point.first].value
70
+ cell_value_row2 = row2.cells[condition.column_index + start_point.first].value
71
+ custom_list = condition.custom_list
72
+ comparison = if cell_value_row1.nil? || cell_value_row2.nil?
73
+ cell_value_row1.nil? ? 1 : -1
74
+ elsif custom_list.empty?
75
+ condition.order == :asc ? cell_value_row1 <=> cell_value_row2 : cell_value_row2 <=> cell_value_row1
76
+ else
77
+ index1 = custom_list.index(cell_value_row1) || custom_list.size
78
+ index2 = custom_list.index(cell_value_row2) || custom_list.size
79
+
80
+ condition.order == :asc ? index1 <=> index2 : index2 <=> index1
81
+ end
82
+
83
+ break unless comparison.zero?
84
+ end
85
+
86
+ comparison
87
+ end
88
+ insert_index = start_point.last + 1
89
+
90
+ sorted_rows.each do |row|
91
+ # Insert the row at the specified index
92
+ worksheet.rows[insert_index] = row
93
+ insert_index += 1
94
+ end
95
+ end
96
+
58
97
  column_offset = start_point.first
59
98
  columns.each do |column|
60
99
  rows.each do |row|
@@ -65,13 +104,31 @@ module Axlsx
65
104
  end
66
105
  end
67
106
 
107
+ # the SortState object for this AutoFilter
108
+ # @return [SortState]
109
+ def sort_state
110
+ @sort_state ||= SortState.new self
111
+ end
112
+
113
+ # @param [Boolean] v Flag indicating whether the AutoFilter should sort the rows when generating the
114
+ # file. If false, the sorting rules will need to be applied manually after generating to alter
115
+ # the order of the rows.
116
+ # @return [Boolean]
117
+ def sort_on_generate=(v)
118
+ Axlsx.validate_boolean v
119
+ @sort_on_generate = v
120
+ end
121
+
68
122
  # serialize the object
69
123
  # @return [String]
70
- def to_xml_string(str = '')
124
+ def to_xml_string(str = +'')
71
125
  return unless range
72
126
 
73
127
  str << "<autoFilter ref='#{range}'>"
74
128
  columns.each { |filter_column| filter_column.to_xml_string(str) }
129
+ unless @sort_state.nil?
130
+ @sort_state.to_xml_string(str)
131
+ end
75
132
  str << "</autoFilter>"
76
133
  end
77
134
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Axlsx
2
4
  # The filterColumn collection identifies a particular column in the AutoFilter
3
5
  # range and specifies filter information that has been applied to this column.
@@ -26,7 +28,7 @@ module Axlsx
26
28
  serializable_attributes :col_id, :hidden_button, :show_button
27
29
 
28
30
  # Allowed filters
29
- FILTERS = [:filters] # , :top10, :custom_filters, :dynamic_filters, :color_filters, :icon_filters]
31
+ FILTERS = [:filters].freeze # , :top10, :custom_filters, :dynamic_filters, :color_filters, :icon_filters]
30
32
 
31
33
  # Zero-based index indicating the AutoFilter column to which this filter information applies.
32
34
  # @return [Integer]
@@ -41,7 +43,9 @@ module Axlsx
41
43
  # the filter button can be hidden, and not drawn.
42
44
  # @return [Boolean]
43
45
  def show_button
44
- @show_button ||= true
46
+ return @show_button if defined?(@show_button)
47
+
48
+ true
45
49
  end
46
50
 
47
51
  # Flag indicating whether the AutoFilter button for this column is hidden.
@@ -81,12 +85,14 @@ module Axlsx
81
85
  # @return [Boolean]
82
86
  def show_button=(show)
83
87
  Axlsx.validate_boolean show
84
- @show_botton = show
88
+ @show_button = show
85
89
  end
86
90
 
87
91
  # Serialize the object to xml
88
- def to_xml_string(str = '')
89
- str << "<filterColumn #{serialized_attributes}>"
92
+ def to_xml_string(str = +'')
93
+ str << '<filterColumn '
94
+ serialized_attributes(str)
95
+ str << '>'
90
96
  @filter.to_xml_string(str)
91
97
  str << "</filterColumn>"
92
98
  end