From c87151a4bd740391b13d3fcf564e9fa7b0f21b29 Mon Sep 17 00:00:00 2001 From: Stefan Daschek Date: Thu, 3 May 2012 17:44:29 +0200 Subject: Add support for printOptions --- examples/example.rb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) mode change 100644 => 100755 examples/example.rb (limited to 'examples/example.rb') diff --git a/examples/example.rb b/examples/example.rb old mode 100644 new mode 100755 index e1fc945e..c74f7455 --- a/examples/example.rb +++ b/examples/example.rb @@ -333,12 +333,13 @@ end #``` -##Specify Page Margins for printing +##Specify page margins and other options for printing #```ruby margins = {:left => 3, :right => 3, :top => 1.2, :bottom => 1.2, :header => 0.7, :footer => 0.7} -wb.add_worksheet(:name => "print margins", :page_margins => margins) do |sheet| - sheet.add_row ["this sheet uses customized page margins for printing"] +options = {:grid_lines => true, :headings => true, :horizontal_centered => true} +wb.add_worksheet(:name => "print margins", :page_margins => margins, :print_options => options) do |sheet| + sheet.add_row ["this sheet uses customized print settings"] end #``` -- cgit v1.2.3 From 58effe424218aa8ba6aa8157b49233df05646308 Mon Sep 17 00:00:00 2001 From: Stefan Daschek Date: Thu, 3 May 2012 19:46:50 +0200 Subject: Add support for pageSetup. --- examples/example.rb | 3 +- lib/axlsx/util/validators.rb | 16 +++++ lib/axlsx/workbook/workbook.rb | 1 + lib/axlsx/workbook/worksheet/page_setup.rb | 90 +++++++++++++++++++++++++ lib/axlsx/workbook/worksheet/worksheet.rb | 25 +++++++ test/util/tc_validators.rb | 29 ++++++++ test/workbook/worksheet/tc_page_setup.rb | 103 +++++++++++++++++++++++++++++ test/workbook/worksheet/tc_worksheet.rb | 43 +++++++++--- 8 files changed, 298 insertions(+), 12 deletions(-) create mode 100644 lib/axlsx/workbook/worksheet/page_setup.rb create mode 100644 test/workbook/worksheet/tc_page_setup.rb (limited to 'examples/example.rb') diff --git a/examples/example.rb b/examples/example.rb index c74f7455..0027c797 100755 --- a/examples/example.rb +++ b/examples/example.rb @@ -337,8 +337,9 @@ end #```ruby margins = {:left => 3, :right => 3, :top => 1.2, :bottom => 1.2, :header => 0.7, :footer => 0.7} +setup = {:fit_to_width => 1, :orientation => :landscape, :paper_width => "297mm", :paper_height => "210mm"} options = {:grid_lines => true, :headings => true, :horizontal_centered => true} -wb.add_worksheet(:name => "print margins", :page_margins => margins, :print_options => options) do |sheet| +wb.add_worksheet(:name => "print margins", :page_margins => margins, :page_setup => setup, :print_options => options) do |sheet| sheet.add_row ["this sheet uses customized print settings"] end #``` diff --git a/lib/axlsx/util/validators.rb b/lib/axlsx/util/validators.rb index 48f99877..dd86ff56 100644 --- a/lib/axlsx/util/validators.rb +++ b/lib/axlsx/util/validators.rb @@ -90,6 +90,22 @@ module Axlsx DataTypeValidator.validate :float, Float, v end + # Requires that the value is a string containing a positive decimal number followed by one of the following units: + # "mm", "cm", "in", "pt", "pc", "pi" + def self.validate_number_with_unit(v) + RegexValidator.validate "number_with_unit", /\A[0-9]+(\.[0-9]+)?(mm|cm|in|pt|pc|pi)\Z/, v + end + + # Requires that the value is an integer ranging from 10 to 400. + def self.validate_page_scale(v) + DataTypeValidator.validate "page_scale", [Fixnum, Integer], v, lambda { |arg| arg >= 10 && arg <= 400 } + end + + # Requires that the value is one of :default, :landscape, or :portrait. + def self.validate_page_orientation(v) + RestrictionValidator.validate "page_orientation", [:default, :landscape, :portrait], v + end + # Requires that the value is valid pattern type. # valid pattern types must be one of :none, :solid, :mediumGray, :darkGray, :lightGray, :darkHorizontal, :darkVertical, :darkDown, # :darkUp, :darkGrid, :darkTrellis, :lightHorizontal, :lightVertical, :lightDown, :lightUp, :lightGrid, :lightTrellis, :gray125, or :gray0625. diff --git a/lib/axlsx/workbook/workbook.rb b/lib/axlsx/workbook/workbook.rb index b9667648..aeedec61 100644 --- a/lib/axlsx/workbook/workbook.rb +++ b/lib/axlsx/workbook/workbook.rb @@ -4,6 +4,7 @@ module Axlsx require 'axlsx/workbook/worksheet/date_time_converter.rb' require 'axlsx/workbook/worksheet/cell.rb' require 'axlsx/workbook/worksheet/page_margins.rb' +require 'axlsx/workbook/worksheet/page_setup.rb' require 'axlsx/workbook/worksheet/print_options.rb' require 'axlsx/workbook/worksheet/cfvo.rb' require 'axlsx/workbook/worksheet/color_scale.rb' diff --git a/lib/axlsx/workbook/worksheet/page_setup.rb b/lib/axlsx/workbook/worksheet/page_setup.rb new file mode 100644 index 00000000..93ba0dd4 --- /dev/null +++ b/lib/axlsx/workbook/worksheet/page_setup.rb @@ -0,0 +1,90 @@ +module Axlsx + # Page setup settings for printing a worksheet. All settings are optional. + # + # @note The recommended way to manage print options is via Worksheet#page_setup + # @see Worksheet#print_options + # @see Worksheet#initialize + class PageSetup + + # TODO: Attributes defined by Open XML spec that are not implemented yet: + # + # * blackAndWhite + # * cellComments + # * copies + # * draft + # * errors + # * firstPageNumber + # * horizontalDpi + # * pageOrder + # * paperSize + # * useFirstPageNumber + # * usePrinterDefaults + # * verticalDpi + + # Number of vertical pages to fit on. + # @return [Integer] + attr_reader :fit_to_height + + # Number of horizontal pages to fit on. + # @return [Integer] + attr_reader :fit_to_width + + # Orientation of the page (:default, :landscape, :portrait) + # @return [Symbol] + attr_reader :orientation + + # Height of paper (string containing a number followed by a unit identifier: "297mm", "11in") + # @return [String] + attr_reader :paper_height + + # Width of paper (string containing a number followed by a unit identifier: "210mm", "8.5in") + # @return [String] + attr_reader :paper_width + + # Print scaling (percent value, given as integer ranging from 10 to 400) + # @return [Integer] + attr_reader :scale + + + # Creates a new PageSetup object + # @option options [Integer] fit_to_height Number of vertical pages to fit on + # @option options [Integer] fit_to_width Number of horizontal pages to fit on + # @option options [Symbol] orientation Orientation of the page (:default, :landscape, :portrait) + # @option options [String] paper_height Height of paper (number followed by unit identifier: "297mm", "11in") + # @option options [String] paper_width Width of paper (number followed by unit identifier: "210mm", "8.5in") + # @option options [Integer] scale Print scaling (percent value, integer ranging from 10 to 400) + def initialize(options = {}) + set(options) + end + + # Set some or all page settings at once. + # @param [Hash] options The page settings to set (possible keys are :fit_to_height, :fit_to_width, :orientation, :paper_height, :paper_width, and :scale). + def set(options) + options.each do |k, v| + send("#{k}=", v) if respond_to? "#{k}=" + end + end + + # @see fit_to_height + def fit_to_height=(v); Axlsx::validate_unsigned_int(v); @fit_to_height = v; end + # @see fit_to_width + def fit_to_width=(v); Axlsx::validate_unsigned_int(v); @fit_to_width = v; end + # @see orientation + def orientation=(v); Axlsx::validate_page_orientation(v); @orientation = v; end + # @see paper_height + def paper_height=(v); Axlsx::validate_number_with_unit(v); @paper_height = v; end + # @see paper_width + def paper_width=(v); Axlsx::validate_number_with_unit(v); @paper_width = v; end + # @see scale + def scale=(v); Axlsx::validate_page_scale(v); @scale = v; end + + # Serializes the page settings element. + # @param [String] str + # @return [String] + def to_xml_string(str = '') + str << '' + end + end +end diff --git a/lib/axlsx/workbook/worksheet/worksheet.rb b/lib/axlsx/workbook/worksheet/worksheet.rb index de5183aa..8f91d629 100644 --- a/lib/axlsx/workbook/worksheet/worksheet.rb +++ b/lib/axlsx/workbook/worksheet/worksheet.rb @@ -81,6 +81,29 @@ module Axlsx end + # Page setup settings for printing the worksheet. + # @example + # wb = Axlsx::Package.new.workbook + # + # # using options when creating the worksheet. + # ws = wb.add_worksheet :page_setup => {:fit_to_width => 1, :orientation => :landscape} + # + # # use the set method of the page_setup object + # ws.page_setup.set(:paper_width => "297mm", :paper_height => "210mm") + # + # # setup page in a block + # ws.page_setup do |page| + # page.scale = 80 + # page.orientation = :portrait + # end + # @see PageSetup#initialize + # @return [PageSetup] + def page_setup + @page_setup ||= PageSetup.new + yield @page_setup if block_given? + @page_setup + end + # Options for printing the worksheet. # @example # wb = Axlsx::Package.new.workbook @@ -130,6 +153,7 @@ module Axlsx @show_gridlines = true self.name = "Sheet" + (index+1).to_s @page_margins = PageMargins.new options[:page_margins] if options[:page_margins] + @page_setup = PageSetup.new options[:page_setup] if options[:page_setup] @print_options = PrintOptions.new options[:print_options] if options[:print_options] @rows = SimpleTypedList.new Row @@ -449,6 +473,7 @@ module Axlsx str.concat "%s" % [@merged_cells.size, @merged_cells.reduce('') { |memo, obj| memo += "" % obj } ] unless @merged_cells.empty? print_options.to_xml_string(str) if @print_options page_margins.to_xml_string(str) if @page_margins + page_setup.to_xml_string(str) if @page_setup str.concat "" if @drawing unless @tables.empty? str.concat "%s" % [@tables.size, @tables.reduce('') { |memo, obj| memo += "" % obj.rId }] diff --git a/test/util/tc_validators.rb b/test/util/tc_validators.rb index d4f98d05..2a0a0229 100644 --- a/test/util/tc_validators.rb +++ b/test/util/tc_validators.rb @@ -70,6 +70,35 @@ class TestValidators < Test::Unit::TestCase assert_raise(ArgumentError) { Axlsx.validate_relationship_type "http://some.url" } assert_raise(ArgumentError) { Axlsx.validate_relationship_type false } + #number_with_unit + assert_nothing_raised { Axlsx.validate_number_with_unit "210mm" } + assert_nothing_raised { Axlsx.validate_number_with_unit "8.5in" } + assert_nothing_raised { Axlsx.validate_number_with_unit "29.7cm" } + assert_nothing_raised { Axlsx.validate_number_with_unit "120pt" } + assert_nothing_raised { Axlsx.validate_number_with_unit "0pc" } + assert_nothing_raised { Axlsx.validate_number_with_unit "12.34pi" } + assert_raise(ArgumentError) { Axlsx.validate_number_with_unit nil } + assert_raise(ArgumentError) { Axlsx.validate_number_with_unit "210" } + assert_raise(ArgumentError) { Axlsx.validate_number_with_unit 210 } + assert_raise(ArgumentError) { Axlsx.validate_number_with_unit "mm" } + assert_raise(ArgumentError) { Axlsx.validate_number_with_unit "-29cm" } + + #page_scale + assert_nothing_raised { Axlsx.validate_page_scale 10 } + assert_nothing_raised { Axlsx.validate_page_scale 100 } + assert_nothing_raised { Axlsx.validate_page_scale 400 } + assert_raise(ArgumentError) { Axlsx.validate_page_scale 9 } + assert_raise(ArgumentError) { Axlsx.validate_page_scale 10.0 } + assert_raise(ArgumentError) { Axlsx.validate_page_scale 400.1 } + assert_raise(ArgumentError) { Axlsx.validate_page_scale "99" } + + #page_orientation + assert_nothing_raised { Axlsx.validate_page_orientation :default } + assert_nothing_raised { Axlsx.validate_page_orientation :landscape } + assert_nothing_raised { Axlsx.validate_page_orientation :portrait } + assert_raise(ArgumentError) { Axlsx.validate_page_orientation nil } + assert_raise(ArgumentError) { Axlsx.validate_page_orientation 1 } + assert_raise(ArgumentError) { Axlsx.validate_page_orientation "landscape" } end end diff --git a/test/workbook/worksheet/tc_page_setup.rb b/test/workbook/worksheet/tc_page_setup.rb new file mode 100644 index 00000000..ff323c75 --- /dev/null +++ b/test/workbook/worksheet/tc_page_setup.rb @@ -0,0 +1,103 @@ +require 'tc_helper.rb' + +class TestPageSetup < Test::Unit::TestCase + + def setup + p = Axlsx::Package.new + ws = p.workbook.add_worksheet :name => "hmmm" + @ps = ws.page_setup + end + + def test_initialize + assert_equal(nil, @ps.fit_to_height) + assert_equal(nil, @ps.fit_to_width) + assert_equal(nil, @ps.orientation) + assert_equal(nil, @ps.paper_height) + assert_equal(nil, @ps.paper_width) + assert_equal(nil, @ps.scale) + end + + def test_initialize_with_options + optioned = Axlsx::PageSetup.new(:fit_to_height => 1, :fit_to_width => 2, :orientation => :landscape, :paper_height => "297mm", :paper_width => "210mm", :scale => 50) + assert_equal(1, optioned.fit_to_height) + assert_equal(2, optioned.fit_to_width) + assert_equal(:landscape, optioned.orientation) + assert_equal("297mm", optioned.paper_height) + assert_equal("210mm", optioned.paper_width) + assert_equal(50, optioned.scale) + end + + def test_set_all_values + @ps.set(:fit_to_height => 1, :fit_to_width => 2, :orientation => :landscape, :paper_height => "297mm", :paper_width => "210mm", :scale => 50) + assert_equal(1, @ps.fit_to_height) + assert_equal(2, @ps.fit_to_width) + assert_equal(:landscape, @ps.orientation) + assert_equal("297mm", @ps.paper_height) + assert_equal("210mm", @ps.paper_width) + assert_equal(50, @ps.scale) + end + + def test_set_some_values + @ps.set(:fit_to_width => 2, :orientation => :portrait) + assert_equal(2, @ps.fit_to_width) + assert_equal(:portrait, @ps.orientation) + assert_equal(nil, @ps.fit_to_height) + assert_equal(nil, @ps.paper_height) + assert_equal(nil, @ps.paper_width) + assert_equal(nil, @ps.scale) + end + + def test_to_xml_all_values + @ps.set(:fit_to_height => 1, :fit_to_width => 2, :orientation => :landscape, :paper_height => "297mm", :paper_width => "210mm", :scale => 50) + doc = Nokogiri::XML.parse(@ps.to_xml_string) + assert_equal(1, doc.xpath(".//pageSetup[@fitToHeight='1'][@fitToWidth='2'][@orientation='landscape'][@paperHeight='297mm'][@paperWidth='210mm'][@scale='50']").size) + end + + def test_to_xml_some_values + @ps.set(:orientation => :portrait) + doc = Nokogiri::XML.parse(@ps.to_xml_string) + assert_equal(1, doc.xpath(".//pageSetup[@orientation='portrait']").size) + assert_equal(0, doc.xpath(".//pageSetup[@fitToHeight]").size) + assert_equal(0, doc.xpath(".//pageSetup[@fitToWidth]").size) + assert_equal(0, doc.xpath(".//pageSetup[@paperHeight]").size) + assert_equal(0, doc.xpath(".//pageSetup[@paperWidth]").size) + assert_equal(0, doc.xpath(".//pageSetup[@scale]").size) + end + + def test_fit_to_height + assert_raise(ArgumentError) { @ps.fit_to_height = 1.5 } + assert_nothing_raised { @ps.fit_to_height = 2 } + assert_equal(2, @ps.fit_to_height) + end + + def test_fit_to_width + assert_raise(ArgumentError) { @ps.fit_to_width = false } + assert_nothing_raised { @ps.fit_to_width = 1 } + assert_equal(1, @ps.fit_to_width) + end + + def test_orientation + assert_raise(ArgumentError) { @ps.orientation = "" } + assert_nothing_raised { @ps.orientation = :default } + assert_equal(:default, @ps.orientation) + end + + def test_paper_height + assert_raise(ArgumentError) { @ps.paper_height = 99 } + assert_nothing_raised { @ps.paper_height = "11in" } + assert_equal("11in", @ps.paper_height) + end + + def test_paper_width + assert_raise(ArgumentError) { @ps.paper_width = "22" } + assert_nothing_raised { @ps.paper_width = "29.7cm" } + assert_equal("29.7cm", @ps.paper_width) + end + + def test_scale + assert_raise(ArgumentError) { @ps.scale = 50.5 } + assert_nothing_raised { @ps.scale = 99 } + assert_equal(99, @ps.scale) + end + +end diff --git a/test/workbook/worksheet/tc_worksheet.rb b/test/workbook/worksheet/tc_worksheet.rb index a4a62d09..a16713b5 100644 --- a/test/workbook/worksheet/tc_worksheet.rb +++ b/test/workbook/worksheet/tc_worksheet.rb @@ -25,6 +25,17 @@ class TestWorksheet < Test::Unit::TestCase end end + def test_page_setup + assert(@ws.page_setup.is_a? Axlsx::PageSetup) + end + + def test_page_setup_yield + @ws.page_setup do |ps| + assert(ps.is_a? Axlsx::PageSetup) + assert(@ws.page_setup == ps) + end + end + def test_print_options assert(@ws.print_options.is_a? Axlsx::PrintOptions) end @@ -44,18 +55,18 @@ class TestWorksheet < Test::Unit::TestCase def test_initialization_options page_margins = {:left => 2, :right => 2, :bottom => 2, :top => 2, :header => 2, :footer => 2} + page_setup = {:fit_to_height => 1, :fit_to_width => 1, :orientation => :landscape, :paper_width => "210mm", :paper_height => "297mm", :scale => 80} print_options = {:grid_lines => true, :headings => true, :horizontal_centered => true, :vertical_centered => true} - optioned = @ws.workbook.add_worksheet(:name => 'bob', :page_margins => page_margins, :print_options => print_options, :selected => true, :show_gridlines => false) - assert_equal(optioned.page_margins.left, page_margins[:left]) - assert_equal(optioned.page_margins.right, page_margins[:right]) - assert_equal(optioned.page_margins.top, page_margins[:top]) - assert_equal(optioned.page_margins.bottom, page_margins[:bottom]) - assert_equal(optioned.page_margins.header, page_margins[:header]) - assert_equal(optioned.page_margins.footer, page_margins[:footer]) - assert_equal(optioned.print_options.grid_lines, print_options[:grid_lines]) - assert_equal(optioned.print_options.headings, print_options[:headings]) - assert_equal(optioned.print_options.horizontal_centered, print_options[:horizontal_centered]) - assert_equal(optioned.print_options.vertical_centered, print_options[:vertical_centered]) + optioned = @ws.workbook.add_worksheet(:name => 'bob', :page_margins => page_margins, :page_setup => page_setup, :print_options => print_options, :selected => true, :show_gridlines => false) + page_margins.keys.each do |key| + assert_equal(page_margins[key], optioned.page_margins.send(key)) + end + page_setup.keys.each do |key| + assert_equal(page_setup[key], optioned.page_setup.send(key)) + end + print_options.keys.each do |key| + assert_equal(print_options[key], optioned.print_options.send(key)) + end assert_equal(optioned.name, 'bob') assert_equal(optioned.selected, true) assert_equal(optioned.show_gridlines, false) @@ -238,6 +249,15 @@ class TestWorksheet < Test::Unit::TestCase assert_equal(doc.xpath('//xmlns:worksheet/xmlns:pageMargins[@left="9"][@right="7"]').size, 1) end + def test_to_xml_string_page_setup + @ws.page_setup do |ps| + ps.paper_width = "210mm" + ps.scale = 80 + end + doc = Nokogiri::XML(@ws.to_xml_string) + assert_equal(doc.xpath('//xmlns:worksheet/xmlns:pageSetup[@paperWidth="210mm"][@scale="80"]').size, 1) + end + def test_to_xml_string_print_options @ws.print_options do |po| po.grid_lines = true @@ -283,6 +303,7 @@ class TestWorksheet < Test::Unit::TestCase # is generated in correct order. def test_valid_with_optional_elements @ws.page_margins.set :left => 9 + @ws.page_setup.set :fit_to_width => 1 @ws.print_options.set :headings => true @ws.auto_filter = "A1:C3" @ws.merge_cells "A4:A5" -- cgit v1.2.3