summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorRandy Morgan <[email protected]>2012-02-25 17:11:56 +0900
committerSean Duckett <[email protected]>2012-03-07 14:45:01 -0600
commit5d0c81118bac73ab0b18804ca1a3039db9cb69dd (patch)
tree564982a2f8dced7a5361ed4b1a2f2873161da9bf
parent1488c198ecef2654424a925c536e20b9ff79e9b0 (diff)
downloadcaxlsx-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.rb1
-rw-r--r--lib/axlsx/workbook/worksheet/page_margins.rb35
-rw-r--r--lib/axlsx/workbook/worksheet/worksheet.rb30
-rw-r--r--test/workbook/worksheet/tc_page_margins.rb13
-rw-r--r--test/workbook/worksheet/tc_worksheet.rb23
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