diff options
| author | Randy Morgan <[email protected]> | 2012-05-04 16:57:00 +0900 |
|---|---|---|
| committer | Randy Morgan <[email protected]> | 2012-05-04 16:57:00 +0900 |
| commit | 754e2226d618260c4895cf15e54f5c8190345f8e (patch) | |
| tree | e1c433db807764c1816e1d823437009f3b3e35e3 /lib | |
| parent | 5d221c2e01336b8771d15cf89a87fcb0f6e424b5 (diff) | |
| parent | 58effe424218aa8ba6aa8157b49233df05646308 (diff) | |
| download | caxlsx-754e2226d618260c4895cf15e54f5c8190345f8e.tar.gz caxlsx-754e2226d618260c4895cf15e54f5c8190345f8e.zip | |
Merge branch 'master' of github.com:randym/axlsx
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/axlsx/util/validators.rb | 16 | ||||
| -rw-r--r-- | lib/axlsx/workbook/workbook.rb | 2 | ||||
| -rw-r--r-- | lib/axlsx/workbook/worksheet/page_setup.rb | 90 | ||||
| -rw-r--r-- | lib/axlsx/workbook/worksheet/print_options.rb | 63 | ||||
| -rw-r--r-- | lib/axlsx/workbook/worksheet/worksheet.rb | 50 |
5 files changed, 221 insertions, 0 deletions
diff --git a/lib/axlsx/util/validators.rb b/lib/axlsx/util/validators.rb index 7b0a74a6..1ee0d75e 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 60bee011..38336af3 100644 --- a/lib/axlsx/workbook/workbook.rb +++ b/lib/axlsx/workbook/workbook.rb @@ -4,6 +4,8 @@ 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' require 'axlsx/workbook/worksheet/data_bar.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 << '<pageSetup ' + str << instance_values.map{ |k,v| k.gsub(/_(.)/){ $1.upcase } << %{="#{v}"} }.join(' ') + str << '/>' + end + end +end diff --git a/lib/axlsx/workbook/worksheet/print_options.rb b/lib/axlsx/workbook/worksheet/print_options.rb new file mode 100644 index 00000000..bc177980 --- /dev/null +++ b/lib/axlsx/workbook/worksheet/print_options.rb @@ -0,0 +1,63 @@ +module Axlsx + # Options for printing a worksheet. All options are boolean and false by default. + # + # @note The recommended way to manage print options is via Worksheet#print_options + # @see Worksheet#print_options + # @see Worksheet#initialize + class PrintOptions + + # Whether grid lines should be printed. + # @return [Boolean] + attr_reader :grid_lines + + # Whether row and column headings should be printed. + # @return [Boolean] + attr_reader :headings + + # Whether the content should be centered horizontally on the page. + # @return [Boolean] + attr_reader :horizontal_centered + + # Whether the content should be centered vertically on the page. + # @return [Boolean] + attr_reader :vertical_centered + + # Creates a new PrintOptions object + # @option options [Boolean] grid_lines Whether grid lines should be printed + # @option options [Boolean] headings Whether row and column headings should be printed + # @option options [Boolean] horizontal_centered Whether the content should be centered horizontally + # @option options [Boolean] vertical_centered Whether the content should be centered vertically + def initialize(options = {}) + @grid_lines = @headings = @horizontal_centered = @vertical_centered = false + set(options) + end + + # Set some or all options at once. + # @param [Hash] options The options to set (possible keys are :grid_lines, :headings, :horizontal_centered, and :vertical_centered). + def set(options) + options.each do |k, v| + send("#{k}=", v) if respond_to? "#{k}=" + end + end + + # @see grid_lines + def grid_lines=(v); Axlsx::validate_boolean(v); @grid_lines = v; end + # @see headings + def headings=(v); Axlsx::validate_boolean(v); @headings = v; end + # @see horizontal_centered + def horizontal_centered=(v); Axlsx::validate_boolean(v); @horizontal_centered = v; end + # @see vertical_centered + def vertical_centered=(v); Axlsx::validate_boolean(v); @vertical_centered = v; end + + # Serializes the page options element. + # @note As all attributes default to "false" according to the xml schema definition, the generated xml includes only those attributes that are set to true. + # @param [String] str + # @return [String] + def to_xml_string(str = '') + str << '<printOptions ' + # + str << instance_values.select{ |k,v| v == true }.map{ |k,v| k.gsub(/_(.)/){ $1.upcase } << %{="#{v}"} }.join(' ') + str << '/>' + end + end +end diff --git a/lib/axlsx/workbook/worksheet/worksheet.rb b/lib/axlsx/workbook/worksheet/worksheet.rb index b84d1c48..24120aa1 100644 --- a/lib/axlsx/workbook/worksheet/worksheet.rb +++ b/lib/axlsx/workbook/worksheet/worksheet.rb @@ -81,6 +81,51 @@ 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 + # # using options when creating the worksheet. + # ws = wb.add_worksheet :print_options => {:gridLines => true, :horizontalCentered => true} + # + # # use the set method of the page_margins object + # ws.print_options.set(:headings => true) + # + # # set page margins in a block + # ws.print_options do |options| + # options.horizontalCentered = true + # options.verticalCentered = true + # end + # @see PrintOptions#initialize + # @return [PrintOptions] + def print_options + @print_options ||= PrintOptions.new + yield @print_options if block_given? + @print_options + end + # definition of characters which are less than the maximum width of 0-9 in the default font for use in String#count. # This is used for autowidth calculations # @return [String] @@ -93,6 +138,7 @@ module Axlsx # @see Workbook#add_worksheet # @option options [String] name The name of this worksheet. # @option options [Hash] page_margins A hash containing page margins for this worksheet. @see PageMargins + # @option options [Hash] print_options A hash containing print options for this worksheet. @see PrintOptions # @option options [Boolean] show_gridlines indicates if gridlines should be shown for this sheet. def initialize(wb, options={}) self.workbook = wb @@ -107,6 +153,8 @@ 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 @column_info = SimpleTypedList.new Col @@ -429,7 +477,9 @@ module Axlsx str.concat '</sheetData>' str.concat "<autoFilter ref='%s'></autoFilter>" % @auto_filter if @auto_filter str.concat "<mergeCells count='%s'>%s</mergeCells>" % [@merged_cells.size, @merged_cells.reduce('') { |memo, obj| memo += "<mergeCell ref='%s'></mergeCell>" % 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 "<drawing r:id='rId1'></drawing>" if @drawing unless @tables.empty? str.concat "<tableParts count='%s'>%s</tableParts>" % [@tables.size, @tables.reduce('') { |memo, obj| memo += "<tablePart r:id='%s'/>" % obj.rId }] |
