thunderboltlabs-rubyXL 1.2.10.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/Gemfile +16 -0
- data/Gemfile.lock +34 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +197 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/lib/.DS_Store +0 -0
- data/lib/rubyXL/Hash.rb +60 -0
- data/lib/rubyXL/cell.rb +461 -0
- data/lib/rubyXL/color.rb +14 -0
- data/lib/rubyXL/parser.rb +471 -0
- data/lib/rubyXL/private_class.rb +265 -0
- data/lib/rubyXL/workbook.rb +450 -0
- data/lib/rubyXL/worksheet.rb +1493 -0
- data/lib/rubyXL/writer/app_writer.rb +62 -0
- data/lib/rubyXL/writer/calc_chain_writer.rb +33 -0
- data/lib/rubyXL/writer/content_types_writer.rb +77 -0
- data/lib/rubyXL/writer/core_writer.rb +51 -0
- data/lib/rubyXL/writer/root_rels_writer.rb +25 -0
- data/lib/rubyXL/writer/shared_strings_writer.rb +30 -0
- data/lib/rubyXL/writer/styles_writer.rb +407 -0
- data/lib/rubyXL/writer/theme_writer.rb +343 -0
- data/lib/rubyXL/writer/workbook_rels_writer.rb +59 -0
- data/lib/rubyXL/writer/workbook_writer.rb +77 -0
- data/lib/rubyXL/writer/worksheet_writer.rb +230 -0
- data/lib/rubyXL/zip.rb +20 -0
- data/lib/rubyXL.rb +10 -0
- data/rubyXL.gemspec +92 -0
- data/spec/lib/cell_spec.rb +385 -0
- data/spec/lib/color_spec.rb +14 -0
- data/spec/lib/hash_spec.rb +28 -0
- data/spec/lib/parser_spec.rb +66 -0
- data/spec/lib/workbook_spec.rb +51 -0
- data/spec/lib/worksheet_spec.rb +1782 -0
- metadata +179 -0
@@ -0,0 +1,265 @@
|
|
1
|
+
module RubyXL
|
2
|
+
class PrivateClass
|
3
|
+
private
|
4
|
+
|
5
|
+
#validate and modify methods
|
6
|
+
def validate_horizontal_alignment(alignment)
|
7
|
+
if alignment.to_s == '' || alignment == 'center' || alignment == 'distributed' || alignment == 'justify' || alignment == 'left' || alignment == 'right'
|
8
|
+
return true
|
9
|
+
end
|
10
|
+
raise 'Only center, distributed, justify, left, and right are valid horizontal alignments'
|
11
|
+
end
|
12
|
+
|
13
|
+
def validate_vertical_alignment(alignment)
|
14
|
+
if alignment.to_s == '' || alignment == 'center' || alignment == 'distributed' || alignment == 'justify' || alignment == 'top' || alignment == 'bottom'
|
15
|
+
return true
|
16
|
+
end
|
17
|
+
raise 'Only center, distributed, justify, top, and bottom are valid vertical alignments'
|
18
|
+
end
|
19
|
+
|
20
|
+
def validate_border(weight)
|
21
|
+
if weight.to_s == '' || weight == 'thin' || weight == 'thick' || weight == 'hairline' || weight == 'medium'
|
22
|
+
return true
|
23
|
+
end
|
24
|
+
raise 'Border weights must only be "hairline", "thin", "medium", or "thick"'
|
25
|
+
end
|
26
|
+
|
27
|
+
def validate_nonnegative(row_or_col)
|
28
|
+
if row_or_col < 0
|
29
|
+
raise 'Row and Column arguments must be nonnegative'
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# This method checks to see if there is an equivalent font that exists
|
34
|
+
def find_font(workbook, font)
|
35
|
+
workbook.fonts.each {|font_id, f|
|
36
|
+
if f[:font][:i] == font[:i] &&
|
37
|
+
f[:font][:b] == font[:b] &&
|
38
|
+
f[:font][:u] == font[:u] &&
|
39
|
+
f[:font][:strike] == font[:strike] &&
|
40
|
+
f[:font][:name][:attributes][:val] == font[:name][:attributes][:val] &&
|
41
|
+
f[:font][:sz][:attributes][:val] == font[:sz][:attributes][:val] &&
|
42
|
+
(f[:font][:color] && f[:font][:color][:attributes][:rgb]) == (font[:color] && font[:color][:attributes][:rgb])
|
43
|
+
return font_id
|
44
|
+
end
|
45
|
+
}
|
46
|
+
return nil
|
47
|
+
end
|
48
|
+
|
49
|
+
# Helper method to modify the font color
|
50
|
+
def modify_font_color(font, font_color)
|
51
|
+
if font[:color].nil?
|
52
|
+
font[:color] = {:attributes => {:rgb => ''}}
|
53
|
+
end
|
54
|
+
font[:color][:attributes][:rgb] = font_color.to_s
|
55
|
+
return font
|
56
|
+
end
|
57
|
+
|
58
|
+
# Helper method to modify the font's italics settings
|
59
|
+
def modify_font_italics(font, italicized)
|
60
|
+
if italicized
|
61
|
+
font[:i] = {}
|
62
|
+
else
|
63
|
+
font[:i] = nil
|
64
|
+
end
|
65
|
+
return font
|
66
|
+
end
|
67
|
+
|
68
|
+
# Helper method to modify the font's bold settings
|
69
|
+
def modify_font_bold(font, bolded)
|
70
|
+
if bolded
|
71
|
+
font[:b] = {}
|
72
|
+
else
|
73
|
+
font[:b] = nil
|
74
|
+
end
|
75
|
+
return font
|
76
|
+
end
|
77
|
+
|
78
|
+
# Helper method to modify the font's underline settings
|
79
|
+
def modify_font_underline(font, underlined)
|
80
|
+
if underlined
|
81
|
+
font[:u] = {}
|
82
|
+
else
|
83
|
+
font[:u] = nil
|
84
|
+
end
|
85
|
+
return font
|
86
|
+
end
|
87
|
+
|
88
|
+
# Helper method to modify the font's strikethrough settings
|
89
|
+
def modify_font_strikethrough(font, struckthrough)
|
90
|
+
if struckthrough
|
91
|
+
font[:strike] = {}
|
92
|
+
else
|
93
|
+
font[:strike] = nil
|
94
|
+
end
|
95
|
+
return font
|
96
|
+
end
|
97
|
+
|
98
|
+
# Determines if font exists
|
99
|
+
# If yes, return id of existing font
|
100
|
+
# If no, appends font to font array
|
101
|
+
def modify_font(workbook, font, old_font_id)
|
102
|
+
font_id = old_font_id
|
103
|
+
existing_font_id = find_font(workbook, font)
|
104
|
+
if !existing_font_id.nil?
|
105
|
+
font_id = existing_font_id
|
106
|
+
workbook.fonts[font_id][:count] += 1
|
107
|
+
workbook.fonts[old_font_id][:count] -= 1
|
108
|
+
elsif workbook.fonts[old_font_id.to_s][:count] > 1 || old_font_id == '0'
|
109
|
+
font_id = workbook.fonts.size.to_s
|
110
|
+
workbook.fonts[font_id] = {}
|
111
|
+
workbook.fonts[font_id][:font] = font
|
112
|
+
workbook.fonts[font_id][:count] = 1
|
113
|
+
workbook.fonts[old_font_id][:count] -= 1
|
114
|
+
else
|
115
|
+
workbook.fonts[font_id][:font] = font
|
116
|
+
end
|
117
|
+
return font_id
|
118
|
+
end
|
119
|
+
|
120
|
+
# This method checks to see if there is an equivalent xf that exists
|
121
|
+
def find_xf(workbook, xf)
|
122
|
+
workbook.cell_xfs[:xf].each_with_index {|xfs, index|
|
123
|
+
if xfs[:attributes][:borderId] == xf[:borderId] &&
|
124
|
+
xfs[:attributes][:xfId] == xf[:xfId] &&
|
125
|
+
xfs[:attributes][:fillId] == xf[:fillId] &&
|
126
|
+
xfs[:attributes][:numFmtId] == xf[:numFmtId] &&
|
127
|
+
xfs[:attributes][:fontId] == xf[:fontId]
|
128
|
+
return index
|
129
|
+
end
|
130
|
+
}
|
131
|
+
return nil
|
132
|
+
end
|
133
|
+
|
134
|
+
# Determines if xf exists
|
135
|
+
# If yes, return id of existing xf
|
136
|
+
# If no, appends xf to xf array
|
137
|
+
def modify_xf(workbook, xf)
|
138
|
+
existing_xf_id = find_xf(workbook, xf)
|
139
|
+
if !existing_xf_id.nil?
|
140
|
+
xf_id = existing_xf_id
|
141
|
+
else
|
142
|
+
if workbook.cell_xfs[:xf].is_a?Array
|
143
|
+
workbook.cell_xfs[:xf] << {:attributes=>xf}
|
144
|
+
else
|
145
|
+
workbook.cell_xfs[:xf] = [workbook.cell_xfs[:xf], {:attributes=>xf}]
|
146
|
+
end
|
147
|
+
xf[:applyFont] = '1'
|
148
|
+
workbook.cell_xfs[:attributes][:count] += 1
|
149
|
+
xf_id = workbook.cell_xfs[:xf].size - 1
|
150
|
+
end
|
151
|
+
return xf_id
|
152
|
+
end
|
153
|
+
|
154
|
+
#modifies fill array (copies, appends, adds color and solid attribute)
|
155
|
+
#then styles array (copies, appends)
|
156
|
+
def modify_fill(workbook, style_index, rgb)
|
157
|
+
xf_obj = workbook.get_style(style_index)
|
158
|
+
xf = workbook.get_style_attributes(xf_obj)
|
159
|
+
#modify fill array
|
160
|
+
fill_id = xf[:fillId]
|
161
|
+
|
162
|
+
fill = workbook.fills[fill_id.to_s][:fill]
|
163
|
+
if workbook.fills[fill_id.to_s][:count] > 1 || fill_id == 0 || fill_id == 1
|
164
|
+
old_size = workbook.fills.size.to_s
|
165
|
+
workbook.fills[old_size] = {}
|
166
|
+
workbook.fills[old_size][:fill] = deep_copy(fill)
|
167
|
+
workbook.fills[old_size][:count] = 1
|
168
|
+
workbook.fills[fill_id.to_s][:count] -= 1
|
169
|
+
|
170
|
+
change_wb_fill(workbook, old_size,rgb)
|
171
|
+
|
172
|
+
#modify styles array
|
173
|
+
fill_id = old_size
|
174
|
+
if workbook.cell_xfs[:xf].is_a?Array
|
175
|
+
workbook.cell_xfs[:xf] << deep_copy({:attributes=>xf})
|
176
|
+
else
|
177
|
+
workbook.cell_xfs[:xf] = [workbook.cell_xfs[:xf], deep_copy({:attributes=>xf})]
|
178
|
+
end
|
179
|
+
xf = workbook.get_style_attributes(workbook.cell_xfs[:xf].last)
|
180
|
+
xf[:fillId] = fill_id
|
181
|
+
xf[:applyFill] = '1'
|
182
|
+
workbook.cell_xfs[:attributes][:count] += 1
|
183
|
+
return workbook.cell_xfs[:xf].size-1
|
184
|
+
else
|
185
|
+
change_wb_fill(workbook, fill_id.to_s,rgb)
|
186
|
+
return style_index
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
def modify_border(workbook, style_index)
|
191
|
+
xf_obj = workbook.get_style(style_index)
|
192
|
+
xf = workbook.get_style_attributes(xf_obj)
|
193
|
+
|
194
|
+
border_id = Integer(xf[:borderId])
|
195
|
+
border = workbook.borders[border_id.to_s][:border]
|
196
|
+
if workbook.borders[border_id.to_s][:count] > 1 || border_id == 0 || border_id == 1
|
197
|
+
old_size = workbook.borders.size.to_s
|
198
|
+
workbook.borders[old_size] = {}
|
199
|
+
workbook.borders[old_size][:border] = deep_copy(border)
|
200
|
+
workbook.borders[old_size][:count] = 1
|
201
|
+
|
202
|
+
border_id = old_size
|
203
|
+
|
204
|
+
if workbook.cell_xfs[:xf].is_a?Array
|
205
|
+
workbook.cell_xfs[:xf] << deep_copy(xf_obj)
|
206
|
+
else
|
207
|
+
workbook.cell_xfs[:xf] = [workbook.cell_xfs[:xf], deep_copy(xf_obj)]
|
208
|
+
end
|
209
|
+
|
210
|
+
xf = workbook.get_style_attributes(workbook.cell_xfs[:xf].last)
|
211
|
+
xf[:borderId] = border_id
|
212
|
+
xf[:applyBorder] = '1'
|
213
|
+
workbook.cell_xfs[:attributes][:count] += 1
|
214
|
+
return workbook.cell_xfs[:xf].size-1
|
215
|
+
else
|
216
|
+
return style_index
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
#is_horizontal is true when doing horizontal alignment,
|
221
|
+
#false when doing vertical alignment
|
222
|
+
def modify_alignment(workbook, style_index, is_horizontal, alignment)
|
223
|
+
old_xf_obj = workbook.get_style(style_index)
|
224
|
+
|
225
|
+
xf_obj = deep_copy(old_xf_obj)
|
226
|
+
|
227
|
+
if xf_obj[:alignment].nil? || xf_obj[:alignment][:attributes].nil?
|
228
|
+
xf_obj[:alignment] = {:attributes=>{:horizontal=>nil, :vertical=>nil}}
|
229
|
+
end
|
230
|
+
|
231
|
+
if is_horizontal
|
232
|
+
xf_obj[:alignment][:attributes][:horizontal] = alignment.to_s
|
233
|
+
else
|
234
|
+
xf_obj[:alignment][:attributes][:vertical] = alignment.to_s
|
235
|
+
end
|
236
|
+
|
237
|
+
if workbook.cell_xfs[:xf].is_a?Array
|
238
|
+
workbook.cell_xfs[:xf] << deep_copy(xf_obj)
|
239
|
+
else
|
240
|
+
workbook.cell_xfs[:xf] = [workbook.cell_xfs[:xf], deep_copy(xf_obj)]
|
241
|
+
end
|
242
|
+
|
243
|
+
xf = workbook.get_style_attributes(workbook.cell_xfs[:xf].last)
|
244
|
+
xf[:applyAlignment] = '1'
|
245
|
+
workbook.cell_xfs[:attributes][:count] += 1
|
246
|
+
workbook.cell_xfs[:xf].size-1
|
247
|
+
end
|
248
|
+
|
249
|
+
#returns non-shallow copy of hash
|
250
|
+
def deep_copy(hash)
|
251
|
+
Marshal.load(Marshal.dump(hash))
|
252
|
+
end
|
253
|
+
|
254
|
+
def change_wb_fill(workbook, fill_index, rgb)
|
255
|
+
if workbook.fills[fill_index][:fill][:patternFill][:fgColor].nil?
|
256
|
+
workbook.fills[fill_index][:fill][:patternFill][:fgColor] = {:attributes => {:rgb => ''}}
|
257
|
+
end
|
258
|
+
workbook.fills[fill_index][:fill][:patternFill][:fgColor][:attributes][:rgb] = rgb
|
259
|
+
|
260
|
+
#previously none, doesn't show fill
|
261
|
+
workbook.fills[fill_index][:fill][:patternFill][:attributes][:patternType] = 'solid'
|
262
|
+
end
|
263
|
+
|
264
|
+
end
|
265
|
+
end
|