diff options
| author | Randy Morgan <[email protected]> | 2012-12-14 13:15:16 +0900 |
|---|---|---|
| committer | Randy Morgan <[email protected]> | 2012-12-14 13:16:04 +0900 |
| commit | b1600deadaafdb396c5cc7ca9d448e8adab8ac11 (patch) | |
| tree | ba560b3826c22c51d37c515d6b0232bf2a4de94e | |
| parent | 890b404c8f748a332c8c0cbcfec6aa44b7384fa4 (diff) | |
| download | caxlsx-b1600deadaafdb396c5cc7ca9d448e8adab8ac11.tar.gz caxlsx-b1600deadaafdb396c5cc7ca9d448e8adab8ac11.zip | |
Added formula_values options and specs for sheet format pr.
This lets cache formula values and specify the default row height so
that iOS and Max OSX previews render properly
| -rwxr-xr-x | examples/example.rb | 13 | ||||
| -rw-r--r-- | examples/ios_preview.rb | 2 | ||||
| -rw-r--r-- | lib/axlsx/workbook/worksheet/cell.rb | 10 | ||||
| -rw-r--r-- | lib/axlsx/workbook/worksheet/row.rb | 11 | ||||
| -rw-r--r-- | lib/axlsx/workbook/worksheet/worksheet.rb | 1 | ||||
| -rw-r--r-- | test/workbook/worksheet/tc_sheet_format_pr.rb | 9 |
6 files changed, 39 insertions, 7 deletions
diff --git a/examples/example.rb b/examples/example.rb index 47b0a67f..94b81444 100755 --- a/examples/example.rb +++ b/examples/example.rb @@ -44,7 +44,7 @@ examples << :conditional_formatting examples << :streaming examples << :shared_strings examples << :no_autowidth - +examples << :cached_formula p = Axlsx::Package.new wb = p.workbook #``` @@ -724,11 +724,20 @@ if examples.include? :no_autowidth wb.add_worksheet(:name => "Manual Widths") do | sheet | sheet.add_row ['oh look! no autowidth'] end - p.validate.each { |e| puts e.message } p.serialize("no-use_autowidth.xlsx") end #``` +if examples.include? :cached_formula + p = Axlsx::Package.new + p.use_shared_strings = true + wb = p.workbook + wb.add_worksheet(:name => "cached formula") do | sheet | + puts sheet.sheet_format_pr + sheet.add_row [1, 2, '=A1+B1'], :formula_values => [nil, nil, 3] + end + p.serialize 'cached_formula.xlsx' +end diff --git a/examples/ios_preview.rb b/examples/ios_preview.rb index 15367a81..60b3010f 100644 --- a/examples/ios_preview.rb +++ b/examples/ios_preview.rb @@ -10,5 +10,5 @@ p.use_shared_strings = true s = p.workbook.add_worksheet(:name => "Formula test") s.add_row [1, 2, 3] s.add_row %w(a b c) -s.add_row ["=SUM(A1:C1)"] +s.add_row ["=SUM(A1:C1)"], :formula_values => [6] p.serialize "ios_preview.xlsx" diff --git a/lib/axlsx/workbook/worksheet/cell.rb b/lib/axlsx/workbook/worksheet/cell.rb index cfcb6118..67b11633 100644 --- a/lib/axlsx/workbook/worksheet/cell.rb +++ b/lib/axlsx/workbook/worksheet/cell.rb @@ -28,11 +28,12 @@ module Axlsx # @option options [Symbol] vertAlign must be one of :baseline, :subscript, :superscript # @option options [Integer] sz # @option options [String] color an 8 letter rgb specification + # @option options [Number] formula_value The value to cache for a formula cell. # @option options [Symbol] scheme must be one of :none, major, :minor def initialize(row, value="", options={}) self.row=row @value = @font_name = @charset = @family = @b = @i = @strike = @outline = @shadow = nil - @condense = @u = @vertAlign = @sz = @color = @scheme = @extend = @ssti = nil + @formula_value = @condense = @u = @vertAlign = @sz = @color = @scheme = @extend = @ssti = nil @styles = row.worksheet.workbook.styles @row.cells << self parse_options options @@ -41,6 +42,10 @@ module Axlsx @value = cast_value(value) end + # this is the cached value for formula cells. If you want the values to render in iOS/Mac OSX preview + # you need to set this. + attr_accessor :formula_value + # An array of available inline styes. # TODO change this to a hash where each key defines attr name and validator (and any info the validator requires) # then move it out to a module so we can re-use in in other classes. @@ -326,8 +331,9 @@ module Axlsx when :string #parse formula - if @value.start_with?('=') + if is_formula? str << 't="str"><f>' << @value.to_s.sub('=', '') << '</f>' + str << '<v>' << @formula_value.to_s << '</v>' if @formula_value else #parse shared if @ssti diff --git a/lib/axlsx/workbook/worksheet/row.rb b/lib/axlsx/workbook/worksheet/row.rb index 1b64b412..43c85b59 100644 --- a/lib/axlsx/workbook/worksheet/row.rb +++ b/lib/axlsx/workbook/worksheet/row.rb @@ -147,15 +147,24 @@ module Axlsx def array_to_cells(values, options={}) values = values DataTypeValidator.validate 'Row.array_to_cells', Array, values - types, style = options.delete(:types), options.delete(:style) + types, style, formula_values = options.delete(:types), options.delete(:style), options.delete(:formula_values) values.each_with_index do |value, index| + + #WTF IS THIS PAP? cell_style = style.is_a?(Array) ? style[index] : style options[:style] = cell_style if cell_style + cell_type = types.is_a?(Array)? types[index] : types options[:type] = cell_type if cell_type + + formula_value = formula_values[index] if formula_values.is_a?(Array) + options[:formula_value] = formula_value if formula_value + Cell.new(self, value, options) + options.delete(:style) options.delete(:type) + options.delete(:formula_value) end end end diff --git a/lib/axlsx/workbook/worksheet/worksheet.rb b/lib/axlsx/workbook/worksheet/worksheet.rb index af2b2dfd..62d4e557 100644 --- a/lib/axlsx/workbook/worksheet/worksheet.rb +++ b/lib/axlsx/workbook/worksheet/worksheet.rb @@ -620,7 +620,6 @@ module Axlsx raise ArgumentError, (ERR_DUPLICATE_SHEET_NAME % name) if sheet_names.include?(name) end - def serializable_parts [sheet_pr, dimension, sheet_view, sheet_format_pr, column_info, sheet_data, sheet_calc_pr, @sheet_protection, protected_ranges, diff --git a/test/workbook/worksheet/tc_sheet_format_pr.rb b/test/workbook/worksheet/tc_sheet_format_pr.rb index 0f3a7703..6b19860f 100644 --- a/test/workbook/worksheet/tc_sheet_format_pr.rb +++ b/test/workbook/worksheet/tc_sheet_format_pr.rb @@ -71,9 +71,18 @@ class TestSheetFormatPr < Test::Unit::TestCase assert_raise(ArgumentError) { @sheet_format_pr.thick_bottom= :foo } assert_nothing_raised { @sheet_format_pr.thick_bottom = true } end + def test_to_xml_string doc = Nokogiri::XML(@sheet_format_pr.to_xml_string) assert doc.xpath("sheetFormatPr[@thickBottom='true']") + assert doc.xpath("sheetFormatPr[@baseColWidth=5]") + assert doc.xpath("sheetFormatPr[@default_col_width=7.2]") + assert doc.xpath("sheetFormatPr[@default_row_height=5.2]") + assert doc.xpath("sheetFormatPr[@custom_height='true']") + assert doc.xpath("sheetFormatPr[@zero_height='false']") + assert doc.xpath("sheetFormatPr[@thick_top='true']") + assert doc.xpath("sheetFormatPr[@outline_level_row=0]") + assert doc.xpath("sheetFormatPr[@outline_level_col=0]") end end |
