Class Spreadsheet::Excel::Writer::Format
In: lib/spreadsheet/excel/writer/format.rb
Parent: DelegateClassSpreadsheet::Format
Column Format Row Font Enumerable Worksheet\n[lib/spreadsheet/excel.rb\nlib/spreadsheet/worksheet.rb] Link Workbook Workbook\n[lib/spreadsheet/excel.rb\nlib/spreadsheet/excel/workbook.rb] SstEntry String Row Array Worksheet ExcelCompatibleWorkbook Format Worksheet Workbook DelegateClassSpreadsheet::Format Writer Compatibility Formula Reader\n[lib/parseexcel/parseexcel.rb\nlib/spreadsheet/excel/reader.rb\nlib/spreadsheet/excel/reader/biff5.rb\nlib/spreadsheet/excel/reader/biff8.rb] Error lib/spreadsheet/excel.rb lib/spreadsheet/link.rb lib/spreadsheet/formula.rb lib/spreadsheet/workbook.rb lib/spreadsheet/font.rb lib/spreadsheet/column.rb lib/spreadsheet/format.rb lib/spreadsheet/writer.rb lib/spreadsheet/row.rb Encodings lib/spreadsheet/excel.rb lib/spreadsheet/excel/row.rb lib/spreadsheet/excel/reader/biff5.rb lib/spreadsheet/excel/worksheet.rb lib/spreadsheet/excel/sst_entry.rb lib/spreadsheet/excel/error.rb lib/spreadsheet/excel/workbook.rb lib/spreadsheet/excel/writer/format.rb lib/spreadsheet/excel/writer/workbook.rb lib/spreadsheet/excel/writer/worksheet.rb Biff8 Writer Biff5 Biff8 Internals Offset Excel Datatypes ParseExcel Compatibility Spreadsheet dot/m_34_0.png

This class encapsulates everything that is needed to write an XF record.

Methods

Included Modules

Spreadsheet::Excel::Internals

Attributes

format  [R] 
xf_index  [RW] 

Public Class methods

[Source]

    # File lib/spreadsheet/excel/writer/format.rb, line 12
12:   def Format.boolean *args
13:     args.each do |key|
14:       define_method key do
15:         @format.send("#{key}?") ? 1 : 0
16:       end
17:     end
18:   end

[Source]

    # File lib/spreadsheet/excel/writer/format.rb, line 19
19:   def Format.color key, default
20:     define_method key do
21:       color_code(@format.send(key) || default)
22:     end
23:   end

[Source]

    # File lib/spreadsheet/excel/writer/format.rb, line 35
35:   def initialize writer, workbook, format=workbook.default_format, opts={}
36:     @opts = { :type => :format }.merge opts
37:     @format = format
38:     @writer = writer
39:     @workbook = workbook
40:     super format
41:   end

Public Instance methods

[Source]

    # File lib/spreadsheet/excel/writer/format.rb, line 42
42:   def color_code color
43:     SEDOC_ROLOC[color]
44:   end

[Source]

    # File lib/spreadsheet/excel/writer/format.rb, line 45
45:   def font_index
46:     @writer.font_index @workbook, font.key
47:   end

[Source]

    # File lib/spreadsheet/excel/writer/format.rb, line 48
48:   def horizontal_align
49:     XF_H_ALIGN.fetch @format.horizontal_align, 0
50:   end

[Source]

    # File lib/spreadsheet/excel/writer/format.rb, line 51
51:   def num_format
52:     @writer.number_format_index @workbook, @format.number_format
53:   end

[Source]

    # File lib/spreadsheet/excel/writer/format.rb, line 54
54:   def text_direction
55:     XF_TEXT_DIRECTION.fetch @format.text_direction, 0
56:   end

[Source]

    # File lib/spreadsheet/excel/writer/format.rb, line 57
57:   def vertical_align
58:     XF_V_ALIGN.fetch @format.vertical_align, 2
59:   end

[Source]

    # File lib/spreadsheet/excel/writer/format.rb, line 60
60:   def write_op writer, op, *args
61:     data = args.join
62:     writer.write [op,data.size].pack("v2")
63:     writer.write data
64:   end

[Source]

     # File lib/spreadsheet/excel/writer/format.rb, line 65
 65:   def write_xf writer, type=@opts[:type]
 66:     xf_type = xf_type_prot type
 67:     data = [
 68:       font_index,   # Index to FONT record (➜ 6.43)
 69:       num_format,   # Index to FORMAT record (➜ 6.45)
 70:       xf_type,      #  Bit  Mask    Contents
 71:                     #  2-0  0x0007  XF_TYPE_PROT – XF type, cell protection
 72:                     #               Bit  Mask  Contents
 73:                     #                 0  0x01  1 = Cell is locked
 74:                     #                 1  0x02  1 = Formula is hidden
 75:                     #                 2  0x04  0 = Cell XF; 1 = Style XF
 76:                     # 15-4  0xfff0  Index to parent style XF
 77:                     #               (always 0xfff in style XFs)
 78:       xf_align,     #  Bit  Mask    Contents
 79:                     #  2-0  0x07    XF_HOR_ALIGN – Horizontal alignment
 80:                     #               Value  Horizontal alignment
 81:                     #               0x00   General
 82:                     #               0x01   Left
 83:                     #               0x02   Centred
 84:                     #               0x03   Right
 85:                     #               0x04   Filled
 86:                     #               0x05   Justified (BIFF4-BIFF8X)
 87:                     #               0x06   Centred across selection
 88:                     #                      (BIFF4-BIFF8X)
 89:                     #               0x07   Distributed (BIFF8X)
 90:                     #    3  0x08    1 = Text is wrapped at right border
 91:                     #  6-4  0x70    XF_VERT_ALIGN – Vertical alignment
 92:                     #               Value  Vertical alignment
 93:                     #               0x00   Top
 94:                     #               0x01   Centred
 95:                     #               0x02   Bottom
 96:                     #               0x03   Justified (BIFF5-BIFF8X)
 97:                     #               0x04   Distributed (BIFF8X)
 98:       xf_rotation,  # XF_ROTATION:  Text rotation angle
 99:                     #  Value  Text rotation
100:                     #      0  Not rotated
101:                     #   1-90  1 to 90 degrees counterclockwise
102:                     # 91-180  1 to 90 degrees clockwise
103:                     #    255  Letters are stacked top-to-bottom,
104:                     #         but not rotated
105:       xf_indent,    #  Bit  Mask  Contents
106:                     #  3-0  0x0f  Indent level
107:                     #    4  0x10  1 = Shrink content to fit into cell
108:                     #    5  0x40  1 = Merge Range (djberger)
109:                     #  7-6  0xc0  Text direction (BIFF8X only)
110:                     #             0 = According to context
111:                     #             1 = Left-to-right
112:                     #             2 = Right-to-left
113:       xf_used_attr, #  Bit  Mask  Contents
114:                     #  7-2  0xfc  XF_USED_ATTRIB – Used attributes
115:                     #             Each bit describes the validity of a
116:                     #             specific group of attributes. In cell XFs
117:                     #             a cleared bit means the attributes of the
118:                     #             parent style XF are used (but only if the
119:                     #             attributes are valid there), a set bit
120:                     #             means the attributes of this XF are used.
121:                     #             In style XFs a cleared bit means the
122:                     #             attribute setting is valid, a set bit
123:                     #             means the attribute should be ignored.
124:                     #             Bit  Mask  Contents
125:                     #               0  0x01  Flag for number format
126:                     #               1  0x02  Flag for font
127:                     #               2  0x04  Flag for horizontal and
128:                     #                        vertical alignment, text wrap,
129:                     #                        indentation, orientation,
130:                     #                        rotation, and text direction
131:                     #               3  0x08  Flag for border lines
132:                     #               4  0x10  Flag for background area style
133:                     #               5  0x20  Flag for cell protection (cell
134:                     #                        locked and formula hidden)
135:       xf_borders,   # Cell border lines and background area:
136:                     #   Bit  Mask        Contents
137:                     #  3- 0  0x0000000f  Left line style (➜ 3.10)
138:                     #  7- 4  0x000000f0  Right line style (➜ 3.10)
139:                     # 11- 8  0x00000f00  Top line style (➜ 3.10)
140:                     # 15-12  0x0000f000  Bottom line style (➜ 3.10)
141:                     # 22-16  0x007f0000  Colour index (➜ 6.70)
142:                     #                    for left line colour
143:                     # 29-23  0x3f800000  Colour index (➜ 6.70)
144:                     #                    for right line colour
145:                     #    30  0x40000000  1 = Diagonal line
146:                     #                    from top left to right bottom
147:                     #    31  0x80000000  1 = Diagonal line
148:                     #                    from bottom left to right top
149:       xf_brdcolors, #   Bit  Mask        Contents
150:                     #  6- 0  0x0000007f  Colour index (➜ 6.70)
151:                     #                    for top line colour
152:                     # 13- 7  0x00003f80  Colour index (➜ 6.70)
153:                     #                    for bottom line colour
154:                     # 20-14  0x001fc000  Colour index (➜ 6.70)
155:                     #                    for diagonal line colour
156:                     # 24-21  0x01e00000  Diagonal line style (➜ 3.10)
157:                     # 31-26  0xfc000000  Fill pattern (➜ 3.11)
158:       xf_pattern    #   Bit  Mask        Contents
159:                     #   6-0  0x007f      Colour index (➜ 6.70)
160:                     #                    for pattern colour
161:                     #  13-7  0x3f80      Colour index (➜ 6.70)
162:                     #                    for pattern background
163:     ]
164:     write_op writer, 0x00e0, data.pack(binfmt(:xf))
165:   end

[Source]

     # File lib/spreadsheet/excel/writer/format.rb, line 166
166:   def xf_align
167:     align = horizontal_align
168:     align |= text_wrap      << 3
169:     align |= vertical_align << 4
170:     align |= text_justlast  << 7
171:     align
172:   end

[Source]

     # File lib/spreadsheet/excel/writer/format.rb, line 173
173:   def xf_borders
174:     border  = left
175:     border |= right       <<  4
176:     border |= top         <<  8
177:     border |= bottom      << 12
178:     border |= left_color  << 16
179:     border |= right_color << 23
180:     border |= cross_down  << 30
181:     border |= cross_up    << 31
182:     border
183:   end

[Source]

     # File lib/spreadsheet/excel/writer/format.rb, line 184
184:   def xf_brdcolors
185:     border  = top_color
186:     border |= bottom_color   << 7
187:     border |= diagonal_color << 14
188:     border |= pattern        << 26
189:     border
190:   end

[Source]

     # File lib/spreadsheet/excel/writer/format.rb, line 191
191:   def xf_indent
192:     indent  = indent_level & 0x0f
193:     indent |= shrink         << 4
194:     indent |= merge_range    << 5
195:     indent |= text_direction << 6
196:     indent
197:   end

[Source]

     # File lib/spreadsheet/excel/writer/format.rb, line 198
198:   def xf_pattern
199:     ptrn  = pattern_fg_color
200:     ptrn |= pattern_bg_color << 7
201:     ptrn
202:   end

[Source]

     # File lib/spreadsheet/excel/writer/format.rb, line 203
203:   def xf_rotation
204:     rot = @format.rotation
205:     if @format.rotation_stacked?
206:       rot = 255
207:     elsif rot >= -90 or rotation <= 90
208:       rot = -rot + 90 if rot < 0
209:     else
210:       warn "rotation outside -90..90; rotation set to 0"
211:       rot = 0
212:     end
213:     rot
214:   end

[Source]

     # File lib/spreadsheet/excel/writer/format.rb, line 215
215:   def xf_type_prot type
216:     type = type.to_s.downcase == 'style' ? 0xfff5 : 0x0000
217:     type |= locked
218:     type |= hidden << 1
219:     type
220:   end

[Source]

     # File lib/spreadsheet/excel/writer/format.rb, line 221
221:   def xf_used_attr
222:     atr_num = num_format & 1
223:     atr_fnt = font_index & 1
224:     atr_fnt = 1 unless @format.font.color == :text
225:     atr_alc = 0
226:     if horizontal_align != 0 \
227:       || vertical_align != 2 \
228:       || indent_level > 0 \
229:       || shrink? || merge_range? || text_wrap?
230:     then
231:       atr_alc = 1
232:     end
233:     atr_bdr = [top, bottom, left, right, cross_up, cross_down].max
234:     atr_pat = 0
235:     if  @format.pattern_fg_color != :border \
236:       || @format.pattern_bg_color != :pattern_bg \
237:       || pattern != 0x00
238:     then
239:       atr_pat = 1
240:     end
241:     atr_prot = hidden? || locked? ? 1 : 0
242:     attrs  = atr_num
243:     attrs |= atr_fnt << 1
244:     attrs |= atr_alc << 2
245:     attrs |= atr_bdr << 3
246:     attrs |= atr_pat << 4
247:     attrs |= atr_prot << 5
248:     attrs << 2
249:   end

[Validate]