diff --git a/lib/axlsx/stylesheet/num_fmt.rb b/lib/axlsx/stylesheet/num_fmt.rb
index 8276ba18..1072d18a 100644
--- a/lib/axlsx/stylesheet/num_fmt.rb
+++ b/lib/axlsx/stylesheet/num_fmt.rb
@@ -73,5 +73,14 @@ def to_xml_string(str = '')
serialized_tag('numFmt', str)
end
+ # Override to avoid removing underscores
+ def serialized_attributes(str = '', additional_attributes = {})
+ attributes = declared_attributes.merge! additional_attributes
+ attributes.each do |key, value|
+ str << "#{Axlsx.camel(key, false)}=\"#{Axlsx.booleanize(value)}\" "
+ end
+ str
+ end
+
end
end
diff --git a/lib/axlsx/workbook/worksheet/pivot_table.rb b/lib/axlsx/workbook/worksheet/pivot_table.rb
index 0d5f34e8..fffced0b 100644
--- a/lib/axlsx/workbook/worksheet/pivot_table.rb
+++ b/lib/axlsx/workbook/worksheet/pivot_table.rb
@@ -25,10 +25,20 @@ def initialize(ref, range, sheet, options={})
@data = []
@pages = []
@subtotal = nil
+ @no_subtotals_on_headers = []
+ @style_info = {}
parse_options options
yield self if block_given?
end
+ # Defines the headers in which subtotals are not to be included
+ # @return[Array]
+ attr_accessor :no_subtotals_on_headers
+
+ # Style info for the pivot table
+ # @return[Hash]
+ attr_accessor :style_info
+
# The reference to the table data
# @return [String]
attr_reader :ref
@@ -163,7 +173,7 @@ def to_xml_string(str = '')
str << ( '')
str << ( '')
header_cell_values.each do |cell_value|
- str << pivot_field_for(cell_value)
+ str << pivot_field_for(cell_value,!no_subtotals_on_headers.include?(cell_value))
end
str << ''
if rows.empty?
@@ -200,12 +210,21 @@ def to_xml_string(str = '')
unless data.empty?
str << ""
data.each do |datum_value|
- str << ""
end
str << ''
end
+ # custom pivot table style
+ unless style_info.empty?
+ str << ''
+ end
str << ''
end
@@ -241,13 +260,17 @@ def header_index_of(value)
private
- def pivot_field_for(cell_ref)
+ def pivot_field_for(cell_ref, subtotal=true)
if rows.include? cell_ref
- '' + ' ' + ''
+ if subtotal
+ '' + ' ' + ''
+ else
+ '' + ''
+ end
elsif columns.include? cell_ref
'' + ' ' + ''
elsif pages.include? cell_ref
- '' + ' ' + ''
+ '' + ' ' + ''
elsif data_refs.include? cell_ref
'' + ''
else
diff --git a/test/workbook/worksheet/tc_pivot_table.rb b/test/workbook/worksheet/tc_pivot_table.rb
index 3c42d605..08ad49e6 100644
--- a/test/workbook/worksheet/tc_pivot_table.rb
+++ b/test/workbook/worksheet/tc_pivot_table.rb
@@ -67,7 +67,27 @@ def test_add_pivot_table_with_options_on_data_field
assert_equal([{:ref=>"Sales", :subtotal => 'average'}], pivot_table.data)
end
- def test_header_indices
+ def test_add_pivot_table_with_style_info
+ style_info_data = { :name=>"PivotStyleMedium9", :showRowHeaders=>"1", :showLastColumn=>"0"}
+ pivot_table = @ws.add_pivot_table('G5:G6', 'A1:E5', {:style_info=>style_info_data}) do |pt|
+ pt.rows = ['Year', 'Month']
+ pt.columns = ['Type']
+ pt.data = ['Sales']
+ pt.pages = ['Region']
+ end
+ assert_equal(style_info_data, pivot_table.style_info)
+ shared_test_pivot_table_xml_validity(pivot_table)
+ end
+
+ def test_add_pivot_table_with_row_without_subtotals
+ pivot_table = @ws.add_pivot_table('G5:G6', 'A1:D5', {:no_subtotals_on_headers=>['Year']}) do |pt|
+ pt.data = ['Sales']
+ pt.rows = ['Year','Month']
+ end
+ assert_equal(['Year'], pivot_table.no_subtotals_on_headers)
+ end
+
+ def test_header_indices
pivot_table = @ws.add_pivot_table('G5:G6', 'A1:E5')
assert_equal(0, pivot_table.header_index_of('Year' ))
assert_equal(1, pivot_table.header_index_of('Month' ))