summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorRandy Morgan <[email protected]>2012-12-14 13:15:16 +0900
committerRandy Morgan <[email protected]>2012-12-14 13:16:04 +0900
commitb1600deadaafdb396c5cc7ca9d448e8adab8ac11 (patch)
treeba560b3826c22c51d37c515d6b0232bf2a4de94e
parent890b404c8f748a332c8c0cbcfec6aa44b7384fa4 (diff)
downloadcaxlsx-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-xexamples/example.rb13
-rw-r--r--examples/ios_preview.rb2
-rw-r--r--lib/axlsx/workbook/worksheet/cell.rb10
-rw-r--r--lib/axlsx/workbook/worksheet/row.rb11
-rw-r--r--lib/axlsx/workbook/worksheet/worksheet.rb1
-rw-r--r--test/workbook/worksheet/tc_sheet_format_pr.rb9
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