Class: Axlsx::Worksheet
- Inherits:
-
Object
- Object
- Axlsx::Worksheet
- Defined in:
- lib/axlsx/workbook/worksheet/worksheet.rb
Overview
The Worksheet class represents a worksheet in the workbook.
Instance Attribute Summary (collapse)
-
- (Array) auto_fit_data
readonly
An array of content based calculated column widths.
-
- (Drawing) drawing
readonly
The drawing associated with this worksheet.
-
- (Integer) index
readonly
The index of this worksheet in the owning Workbook’s worksheets list.
-
- (String) name
The name of the worksheet.
-
- (String) pn
readonly
The part name of this worksheet.
-
- (Object) relationships
readonly
The worksheet’s relationships.
-
- (String) rels_pn
readonly
The relationship part name of this worksheet.
-
- (String) rId
readonly
The relationship Id of thiw worksheet.
-
- (SimpleTypedList) rows
readonly
The rows in this worksheet.
-
- (Workbook) workbook
The workbook that owns this worksheet.
Instance Method Summary (collapse)
-
- (Object) add_chart(chart_type, options = {}) {|chart| ... }
Adds a chart to this worksheets drawing.
-
- (Row) add_row(values = [], options = {}) {|@rows.last| ... }
Adds a row to the worksheet and updates auto fit data.
-
- (Float) auto_width(col)
Determines the proper width for a column based on content.
-
- (Worksheet) initialize(wb, options = {})
constructor
Creates a new worksheet.
-
- (String) to_xml
Serializes the worksheet document.
-
- (Array) update_auto_fit_data(cells)
Updates auto fit data.
Constructor Details
- (Worksheet) initialize(wb, options = {})
the recommended way to manage worksheets is Workbook#add_worksheet
Creates a new worksheet.
59 60 61 62 63 64 65 66 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 59 def initialize(wb, ={}) @rows = SimpleTypedList.new Row self.workbook = wb @workbook.worksheets << self @auto_fit_data = [] self.name = [:name] || "Sheet" + (index+1).to_s @magick_draw = Magick::Draw.new end |
Instance Attribute Details
- (Array) auto_fit_data (readonly)
a single auto fit data item is a hash with :longest => [String] and :sz=> [Integer] members.
An array of content based calculated column widths.
34 35 36 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 34 def auto_fit_data @auto_fit_data end |
- (Drawing) drawing (readonly)
the recommended way to work with drawings and charts is Worksheet#add_chart
The drawing associated with this worksheet.
29 30 31 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 29 def drawing @drawing || @drawing = Axlsx::Drawing.new(self) end |
- (Integer) index (readonly)
The index of this worksheet in the owning Workbook’s worksheets list.
50 51 52 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 50 def index @workbook.worksheets.index(self) end |
- (String) name
The name of the worksheet
9 10 11 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 9 def name @name end |
- (String) pn (readonly)
The part name of this worksheet
38 39 40 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 38 def pn "#{WORKSHEET_PN % (index+1)}" end |
- (Object) relationships (readonly)
The worksheet’s relationships.
17 18 19 20 21 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 17 def relationships r = Relationships.new r << Relationship.new(DRAWING_R, "../#{@drawing.pn}") if @drawing r end |
- (String) rels_pn (readonly)
The relationship part name of this worksheet
42 43 44 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 42 def rels_pn "#{WORKSHEET_RELS_PN % (index+1)}" end |
- (String) rId (readonly)
The relationship Id of thiw worksheet
46 47 48 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 46 def rId "rId#{index+1}" end |
- (SimpleTypedList) rows (readonly)
The recommended way to manage rows is Worksheet#add_row
The rows in this worksheet
23 24 25 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 23 def rows @rows end |
- (Workbook) workbook
The workbook that owns this worksheet
13 14 15 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 13 def workbook @workbook end |
Instance Method Details
- (Object) add_chart(chart_type, options = {}) {|chart| ... }
each chart type also specifies additional options
Adds a chart to this worksheets drawing. This is the recommended way to create charts for your worksheet. This method wraps the complexity of dealing with ooxml drawing, anchors, markers graphic frames chart objects and all the other dirty details.
116 117 118 119 120 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 116 def add_chart(chart_type, ={}) chart = drawing.add_chart(chart_type, ) yield chart if block_given? chart end |
- (Row) add_row(values = [], options = {}) {|@rows.last| ... }
Adds a row to the worksheet and updates auto fit data
96 97 98 99 100 101 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 96 def add_row(values=[], ={}) Row.new(self, values, ) update_auto_fit_data @rows.last.cells yield @rows.last if block_given? @rows.last end |
- (Float) auto_width(col)
From ECMA docs
Column width measured as the number of characters of the maximum digit width of the numbers 0 .. 9 as rendered in the normal style's font. There are 4 pixels of margin padding (two on each side), plus 1 pixel padding for the gridlines. width = Truncate([{Number of Characters} * {Maximum Digit Width} + {5 pixel padding}]/{Maximum Digit Width}*256)/256
Determines the proper width for a column based on content.
190 191 192 193 194 195 196 197 198 199 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 190 def auto_width(col) mdw = 6.0 # maximum digit with is always 6.0 in testable fonts so instead of beating RMagick every time, I am hardcoding it here. mdw_count = 0 best_guess = 1.5 #direct testing shows the results of the documented formula to be a bit too small. This is a best guess scaling font_scale = col[:sz].to_f / (self.workbook.styles.fonts[0].sz.to_f || 11.0) col[:longest].scan(/./mu).each do |i| mdw_count +=1 if @magick_draw.get_type_metrics(i).width >= mdw end ((mdw_count * mdw + 5) / mdw * 256) / 256.0 * best_guess * font_scale end |
- (String) to_xml
Serializes the worksheet document
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 124 def to_xml builder = Nokogiri::XML::Builder.new(:encoding => ENCODING) do |xml| xml.worksheet(:xmlns => XML_NS, :'xmlns:r' => XML_NS_R) { if @auto_fit_data.size > 0 xml.cols { @auto_fit_data.each_with_index do |col, index| min_max = index+1 xml.col(:min=>min_max, :max=>min_max, :width => auto_width(col), :customWidth=>"true") end } end xml.sheetData { @rows.each do |row| row.to_xml(xml) end } xml.drawing :"r:id"=>"rId1" if @drawing } end builder.to_xml(:indent=>0, :save_with=>0) end |
- (Array) update_auto_fit_data(cells)
Updates auto fit data. Autofit data attempts to determine the cell in a column that has the greatest width by comparing the length of the text multiplied by the size of the font.
162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 162 def update_auto_fit_data(cells) styles = self.workbook.styles cellXfs, fonts = styles.cellXfs, styles.fonts sz = fonts[0].sz cells.each_with_index do |item, index| col = @auto_fit_data[index] || {:longest=>"", :sz=>sz} cell_xf = cellXfs[item.style] font = fonts[cell_xf.fontId || 0] sz = font.sz || sz if (col[:longest].scan(/./mu).size * col[:sz]) < (item.value.to_s.scan(/./mu).size * sz) col[:sz] = sz col[:longest] = item.value.to_s end @auto_fit_data[index] = col end cells end |