diff options
| author | Randy Morgan <[email protected]> | 2012-02-25 17:11:56 +0900 |
|---|---|---|
| committer | Sean Duckett <[email protected]> | 2012-03-07 14:45:01 -0600 |
| commit | 5d0c81118bac73ab0b18804ca1a3039db9cb69dd (patch) | |
| tree | 564982a2f8dced7a5361ed4b1a2f2873161da9bf | |
| parent | 1488c198ecef2654424a925c536e20b9ff79e9b0 (diff) | |
| download | caxlsx-5d0c81118bac73ab0b18804ca1a3039db9cb69dd.tar.gz caxlsx-5d0c81118bac73ab0b18804ca1a3039db9cb69dd.zip | |
add support for page margin initialization options as well as adding an option to worksheet initialization so we can do stuff like this:
workbook.add_worksheet(:page_margins => {:top=> 1.9})
and yielding the page_margins object off the worksheet for stuff like:
worksheet.page_margins do |pm|
pm.left = 0.7
end
| -rw-r--r-- | lib/axlsx/workbook/workbook.rb | 1 | ||||
| -rw-r--r-- | lib/axlsx/workbook/worksheet/page_margins.rb | 35 | ||||
| -rw-r--r-- | lib/axlsx/workbook/worksheet/worksheet.rb | 30 | ||||
| -rw-r--r-- | test/workbook/worksheet/tc_page_margins.rb | 13 | ||||
| -rw-r--r-- | test/workbook/worksheet/tc_worksheet.rb | 23 |
5 files changed, 86 insertions, 16 deletions
diff --git a/lib/axlsx/workbook/workbook.rb b/lib/axlsx/workbook/workbook.rb index 47af692b..b3b10fac 100644 --- a/lib/axlsx/workbook/workbook.rb +++ b/lib/axlsx/workbook/workbook.rb @@ -136,6 +136,7 @@ require 'axlsx/workbook/shared_strings_table.rb' # Adds a worksheet to this workbook # @return [Worksheet] # @option options [String] name The name of the worksheet. + # @option options [Hash] page_margins The page margins for the worksheet. # @see Worksheet#initialize def add_worksheet(options={}) worksheet = Worksheet.new(self, options) diff --git a/lib/axlsx/workbook/worksheet/page_margins.rb b/lib/axlsx/workbook/worksheet/page_margins.rb index cef6dcbf..ab67337b 100644 --- a/lib/axlsx/workbook/worksheet/page_margins.rb +++ b/lib/axlsx/workbook/worksheet/page_margins.rb @@ -5,7 +5,9 @@ module Axlsx # has been specified. Otherwise, it serializes to a PageMargin element specifying all 6 margin values # (using default values for margins that have not been specified explicitly). # + # @note The recommended way to manage page margins is via Worksheet#page_margins # @see Worksheet#page_margins + # @see Worksheet#initialize class PageMargins # Default left and right margin (in inches) @@ -41,18 +43,29 @@ module Axlsx # @return [Float] attr_reader :footer - def initialize + # Creates a new PageMargins object + # @option options [Numeric] left The left margin in inches + # @option options [Numeric] right The right margin in inches + # @option options [Numeric] bottom The bottom margin in inches + # @option options [Numeric] top The top margin in inches + # @option options [Numeric] header The header margin in inches + # @option options [Numeric] footer The footer margin in inches + def initialize(options={}) # Default values taken from MS Excel for Mac 2011 @left = @right = DEFAULT_LEFT_RIGHT @top = @bottom = DEFAULT_TOP_BOTTOM @header = @footer = DEFAULT_HEADER_FOOTER - - @custom_margins_specified = false + + options.each do |o| + self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}=" + end end # True if custom page margins have been specified. def custom_margins_specified? - @custom_margins_specified + !(@left == @right && @right == DEFAULT_LEFT_RIGHT && + @top == @bottom && @bottom == DEFAULT_TOP_BOTTOM && + @header == @footer && @footer == DEFAULT_HEADER_FOOTER) end # Set some or all margins at once. @@ -65,17 +78,17 @@ module Axlsx end # @see left - def left=(v); Axlsx::validate_unsigned_numeric(v); @custom_margins_specified = true; @left = v end + def left=(v); Axlsx::validate_unsigned_numeric(v); @left = v end # @see right - def right=(v); Axlsx::validate_unsigned_numeric(v); @custom_margins_specified = true; @right = v end + def right=(v); Axlsx::validate_unsigned_numeric(v); @right = v end # @see top - def top=(v); Axlsx::validate_unsigned_numeric(v); @custom_margins_specified = true; @top = v end + def top=(v); Axlsx::validate_unsigned_numeric(v); @top = v end # @see bottom - def bottom=(v); Axlsx::validate_unsigned_numeric(v); @custom_margins_specified = true; @bottom = v end + def bottom=(v); Axlsx::validate_unsigned_numeric(v); @bottom = v end # @see header - def header=(v); Axlsx::validate_unsigned_numeric(v); @custom_margins_specified = true; @header = v end + def header=(v); Axlsx::validate_unsigned_numeric(v); @header = v end # @see footer - def footer=(v); Axlsx::validate_unsigned_numeric(v); @custom_margins_specified = true; @footer = v end + def footer=(v); Axlsx::validate_unsigned_numeric(v); @footer = v end # Serializes the page margins element # @note For compatibility, this is a noop unless custom margins have been specified. @@ -86,4 +99,4 @@ module Axlsx xml.pageMargins :left => left, :right => right, :top => top, :bottom => bottom, :header => header, :footer => footer end end -end
\ No newline at end of file +end diff --git a/lib/axlsx/workbook/worksheet/worksheet.rb b/lib/axlsx/workbook/worksheet/worksheet.rb index ca2c51d6..3882b1db 100644 --- a/lib/axlsx/workbook/worksheet/worksheet.rb +++ b/lib/axlsx/workbook/worksheet/worksheet.rb @@ -36,13 +36,33 @@ module Axlsx attr_reader :auto_filter # Page margins for printing the worksheet. + # @example + # wb = Axlsx::Package.new.workbook + # # using options when creating the worksheet. + # ws = wb.add_worksheet :page_margins => {:left => 1.9, :header => 0.1} + # + # # use the set method of the page_margins object + # ws.page_margins.set(:bottom => 3, :footer => 0.7) + # + # # set page margins in a block + # ws.page_margins do |margins| + # margins.right = 6 + # margins.top = 0.2 + # end + # @see PageMargins#initialize # @return [PageMargins] - attr_reader :page_margins + # @yeilds self + def page_margins + @page_margins ||= PageMargins.new + yield @page_margins if block_given? + @page_margins + end # Creates a new worksheet. # @note the recommended way to manage worksheets is Workbook#add_worksheet # @see Workbook#add_worksheet - # @option options [String] name The name of this sheet. + # @option options [String] name The name of this worksheet. + # @option options [Hash] page_margins A hash containing page margins for this worksheet. @see PageMargins def initialize(wb, options={}) @drawing = nil @auto_filter = nil @@ -51,10 +71,12 @@ module Axlsx @workbook.worksheets << self @auto_fit_data = [] self.name = options[:name] || "Sheet" + (index+1).to_s + @magick_draw = Magick::Draw.new @cols = SimpleTypedList.new Cell @merged_cells = [] - @page_margins = PageMargins.new + + @page_margins = PageMargins.new options[:page_margins] if options[:page_margins] end # convinience method to access all cells in this worksheet @@ -326,7 +348,7 @@ module Axlsx } xml.autoFilter :ref=>@auto_filter if @auto_filter xml.mergeCells(:count=>@merged_cells.size) { @merged_cells.each { | mc | xml.mergeCell(:ref=>mc) } } unless @merged_cells.empty? - @page_margins.to_xml(xml) + page_margins.to_xml(xml) xml.drawing :"r:id"=>"rId1" if @drawing } end diff --git a/test/workbook/worksheet/tc_page_margins.rb b/test/workbook/worksheet/tc_page_margins.rb index 6f2e6fdb..ed3d90d8 100644 --- a/test/workbook/worksheet/tc_page_margins.rb +++ b/test/workbook/worksheet/tc_page_margins.rb @@ -18,7 +18,18 @@ class TestPageMargins < Test::Unit::TestCase assert_equal(Axlsx::PageMargins::DEFAULT_HEADER_FOOTER, @pm.header) assert_equal(Axlsx::PageMargins::DEFAULT_HEADER_FOOTER, @pm.footer) end - + + def test_initialize_with_options + optioned = Axlsx::PageMargins.new(:left => 2, :right => 3, :top => 2, :bottom => 1, :header => 0.1, :footer => 0.1) + assert_equal(true, optioned.custom_margins_specified?) + assert_equal(2, optioned.left) + assert_equal(3, optioned.right) + assert_equal(2, optioned.top) + assert_equal(1, optioned.bottom) + assert_equal(0.1, optioned.header) + assert_equal(0.1, optioned.footer) + end + def test_custom_margins_specified @pm.left = 0.5 assert(@pm.custom_margins_specified?) diff --git a/test/workbook/worksheet/tc_worksheet.rb b/test/workbook/worksheet/tc_worksheet.rb index c2444820..d7e52f73 100644 --- a/test/workbook/worksheet/tc_worksheet.rb +++ b/test/workbook/worksheet/tc_worksheet.rb @@ -13,6 +13,29 @@ class TestWorksheet < Test::Unit::TestCase assert_equal(ws.pn, "worksheets/sheet2.xml") end + def test_page_margins + assert(@ws.page_margins.is_a? Axlsx::PageMargins) + end + + def test_page_margins_yeild + @ws.page_margins do |pm| + assert(pm.is_a? Axlsx::PageMargins) + assert(@ws.page_margins == pm) + end + end + + def test_initialization_options + page_margins = {:left => 2, :right => 2, :bottom => 2, :top => 2, :header => 2, :footer => 2} + optioned = @ws.workbook.add_worksheet(:name => 'bob', :page_margins => page_margins) + 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.name, 'bob') + end + def test_rels_pn assert_equal(@ws.rels_pn, "worksheets/_rels/sheet1.xml.rels") ws = @ws.workbook.add_worksheet |
