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.
-
- (String) name
The name of the 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.
-
- (Object) add_image(options = {}) {|image| ... }
Adds a media item to the 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.
-
- (Object) col_style(index, style, options = {})
Set the style for cells in a specific column.
-
- (Object) cols
returns the sheet data as columnw.
-
- (Drawing) drawing
The drawing associated with this worksheet.
-
- (Integer) index
The index of this worksheet in the owning Workbook’s worksheets list.
-
- (Worksheet) initialize(wb, options = {})
constructor
Creates a new worksheet.
-
- (String) pn
The part name of this worksheet.
-
- (Relationships) relationships
The worksheet relationships.
-
- (String) rels_pn
The relationship part name of this worksheet.
-
- (String) rId
The relationship Id of thiw worksheet.
-
- (Object) row_style(index, style, options = {})
Set the style for cells in a specific row.
-
- (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.
34 35 36 37 38 39 40 41 42 43 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 34 def initialize(wb, ={}) @drawing = nil @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 @cols = SimpleTypedList.new Cell 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.
25 26 27 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 25 def auto_fit_data @auto_fit_data end |
- (String) name
The name of the worksheet
9 10 11 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 9 def name @name end |
- (SimpleTypedList) rows (readonly)
The recommended way to manage rows is Worksheet#add_row
The rows in this worksheet
20 21 22 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 20 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.
148 149 150 151 152 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 148 def add_chart(chart_type, ={}) chart = drawing.add_chart(chart_type, ) yield chart if block_given? chart end |
- (Object) add_image(options = {}) {|image| ... }
Adds a media item to the worksheets drawing
157 158 159 160 161 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 157 def add_image(={}) image = drawing.add_image() yield image if block_given? image end |
- (Row) add_row(values = [], options = {}) {|@rows.last| ... }
Adds a row to the worksheet and updates auto fit data
86 87 88 89 90 91 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 86 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.
232 233 234 235 236 237 238 239 240 241 242 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 232 def auto_width(col) mdw = 6.0 # maximum digit with is always 6.0 with RMagick's default font 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 |
- (Object) col_style(index, style, options = {})
You can also specify the style for specific columns in the call to add_row by using an array for the :styles option
Set the style for cells in a specific column
123 124 125 126 127 128 129 130 131 132 133 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 123 def col_style(index, style, ={}) offset = .delete(:row_offset) || 0 @rows[(offset..-1)].each do |r| cells = r.cells[index] if cells.is_a?(Array) cells.each { |c| c.style = style } else cells.style = style end end end |
- (Object) cols
returns the sheet data as columnw
111 112 113 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 111 def cols @rows.transpose end |
- (Drawing) drawing
the recommended way to work with drawings and charts is Worksheet#add_chart
The drawing associated with this worksheet.
77 78 79 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 77 def drawing @drawing || @drawing = Axlsx::Drawing.new(self) end |
- (Integer) index
The index of this worksheet in the owning Workbook’s worksheets list.
69 70 71 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 69 def index @workbook.worksheets.index(self) end |
- (String) pn
The part name of this worksheet
51 52 53 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 51 def pn "#{WORKSHEET_PN % (index+1)}" end |
- (Relationships) relationships
The worksheet relationships. This is managed automatically by the worksheet
189 190 191 192 193 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 189 def relationships r = Relationships.new r << Relationship.new(DRAWING_R, "../#{@drawing.pn}") if @drawing r end |
- (String) rels_pn
The relationship part name of this worksheet
57 58 59 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 57 def rels_pn "#{WORKSHEET_RELS_PN % (index+1)}" end |
- (String) rId
The relationship Id of thiw worksheet
63 64 65 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 63 def rId "rId#{index+1}" end |
- (Object) row_style(index, style, options = {})
You can also specify the style in the add_row call
Set the style for cells in a specific row
100 101 102 103 104 105 106 107 108 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 100 def row_style(index, style, ={}) offset = .delete(:col_offset) || 0 rs = @rows[index] if rs.is_a?(Array) rs.each { |r| r.cells[(offset..-1)].each { |c| c.style = style } } else rs.cells[(offset..-1)].each { |c| c.style = style } end end |
- (String) to_xml
Serializes the worksheet document
165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 165 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 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.
204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 |
# File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 204 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 |