write_xlsx 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +3 -0
- data/VERSION +1 -1
- data/lib/write_xlsx/chart.rb +421 -604
- data/lib/write_xlsx/chart/area.rb +6 -9
- data/lib/write_xlsx/chart/bar.rb +1 -44
- data/lib/write_xlsx/chart/column.rb +1 -46
- data/lib/write_xlsx/chart/line.rb +6 -9
- data/lib/write_xlsx/chart/pie.rb +42 -63
- data/lib/write_xlsx/chart/scatter.rb +42 -96
- data/lib/write_xlsx/chart/stock.rb +14 -21
- data/lib/write_xlsx/chartsheet.rb +4 -4
- data/lib/write_xlsx/drawing.rb +112 -163
- data/lib/write_xlsx/format.rb +62 -47
- data/lib/write_xlsx/package/app.rb +14 -19
- data/lib/write_xlsx/package/comments.rb +37 -48
- data/lib/write_xlsx/package/core.rb +12 -34
- data/lib/write_xlsx/package/packager.rb +10 -15
- data/lib/write_xlsx/package/relationships.rb +3 -5
- data/lib/write_xlsx/package/shared_strings.rb +7 -9
- data/lib/write_xlsx/package/styles.rb +148 -172
- data/lib/write_xlsx/package/vml.rb +43 -65
- data/lib/write_xlsx/package/xml_writer_simple.rb +7 -3
- data/lib/write_xlsx/workbook.rb +30 -67
- data/lib/write_xlsx/worksheet.rb +189 -239
- data/test/chart/test_write_format_code.rb +2 -1
- data/test/helper.rb +9 -0
- data/test/perl_output/chart_scatter06.xlsx +0 -0
- data/test/test_example_match.rb +37 -0
- data/test/test_xml_writer_simple.rb +9 -8
- data/test/worksheet/test_write_cell.rb +10 -10
- data/write_xlsx.gemspec +3 -2
- metadata +12 -11
@@ -85,12 +85,10 @@ def write_shapelayout(data_id)
|
|
85
85
|
|
86
86
|
attributes = ['v:ext', ext]
|
87
87
|
|
88
|
-
@writer.
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
@writer.end_tag('o:shapelayout')
|
88
|
+
@writer.tag_elements('o:shapelayout', attributes) do
|
89
|
+
# Write the o:idmap element.
|
90
|
+
write_idmap(data_id)
|
91
|
+
end
|
94
92
|
end
|
95
93
|
|
96
94
|
#
|
@@ -123,15 +121,12 @@ def write_shapetype
|
|
123
121
|
'path', path
|
124
122
|
]
|
125
123
|
|
126
|
-
@writer.
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
write_path('t', 'rect')
|
133
|
-
|
134
|
-
@writer.end_tag('v:shapetype')
|
124
|
+
@writer.tag_elements('v:shapetype', attributes) do
|
125
|
+
# Write the v:stroke element.
|
126
|
+
write_stroke
|
127
|
+
# Write the v:path element.
|
128
|
+
write_path('t', 'rect')
|
129
|
+
end
|
135
130
|
end
|
136
131
|
|
137
132
|
#
|
@@ -203,24 +198,18 @@ def write_shape(id, z_index, comment)
|
|
203
198
|
'o:insetmode', insetmode
|
204
199
|
]
|
205
200
|
|
206
|
-
@writer.
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
write_textbox
|
219
|
-
|
220
|
-
# Write the x:ClientData element.
|
221
|
-
write_client_data(comment)
|
222
|
-
|
223
|
-
@writer.end_tag('v:shape')
|
201
|
+
@writer.tag_elements('v:shape', attributes) do
|
202
|
+
# Write the v:fill element.
|
203
|
+
write_fill
|
204
|
+
# Write the v:shadow element.
|
205
|
+
write_shadow
|
206
|
+
# Write the v:path element.
|
207
|
+
write_path(nil, 'none')
|
208
|
+
# Write the v:textbox element.
|
209
|
+
write_textbox
|
210
|
+
# Write the x:ClientData element.
|
211
|
+
write_client_data(comment)
|
212
|
+
end
|
224
213
|
end
|
225
214
|
|
226
215
|
def float_to_str(float)
|
@@ -267,12 +256,10 @@ def write_textbox
|
|
267
256
|
|
268
257
|
attributes = ['style', style]
|
269
258
|
|
270
|
-
@writer.
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
@writer.end_tag('v:textbox')
|
259
|
+
@writer.tag_elements('v:textbox', attributes) do
|
260
|
+
# Write the div element.
|
261
|
+
write_div
|
262
|
+
end
|
276
263
|
end
|
277
264
|
|
278
265
|
#
|
@@ -282,8 +269,7 @@ def write_div
|
|
282
269
|
style = 'text-align:left'
|
283
270
|
attributes = ['style', style]
|
284
271
|
|
285
|
-
@writer.
|
286
|
-
@writer.end_tag('div')
|
272
|
+
@writer.tag_elements('div', attributes) { }
|
287
273
|
end
|
288
274
|
|
289
275
|
#
|
@@ -294,30 +280,22 @@ def write_client_data(comment)
|
|
294
280
|
|
295
281
|
attributes = ['ObjectType', object_type]
|
296
282
|
|
297
|
-
@writer.
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
# Write the x:Column element.
|
315
|
-
write_column(comment.col)
|
316
|
-
|
317
|
-
# Write the x:Visible element.
|
318
|
-
write_visible if comment.visible != 0 && !comment.visible.nil?
|
319
|
-
|
320
|
-
@writer.end_tag('x:ClientData')
|
283
|
+
@writer.tag_elements('x:ClientData', attributes) do
|
284
|
+
# Write the x:MoveWithCells element.
|
285
|
+
write_move_with_cells
|
286
|
+
# Write the x:SizeWithCells element.
|
287
|
+
write_size_with_cells
|
288
|
+
# Write the x:Anchor element.
|
289
|
+
write_anchor(comment.vertices)
|
290
|
+
# Write the x:AutoFill element.
|
291
|
+
write_auto_fill
|
292
|
+
# Write the x:Row element.
|
293
|
+
write_row(comment.row)
|
294
|
+
# Write the x:Column element.
|
295
|
+
write_column(comment.col)
|
296
|
+
# Write the x:Visible element.
|
297
|
+
write_visible if comment.visible != 0 && !comment.visible.nil?
|
298
|
+
end
|
321
299
|
end
|
322
300
|
|
323
301
|
#
|
@@ -22,6 +22,12 @@ def xml_decl(encoding = 'UTF-8', standalone = true)
|
|
22
22
|
io_write(str)
|
23
23
|
end
|
24
24
|
|
25
|
+
def tag_elements(tag, attributes = [])
|
26
|
+
start_tag(tag, attributes)
|
27
|
+
yield
|
28
|
+
end_tag(tag)
|
29
|
+
end
|
30
|
+
|
25
31
|
def start_tag(tag, attr = [])
|
26
32
|
str = "<#{tag}#{key_vals(attr)}>"
|
27
33
|
io_write(str)
|
@@ -38,9 +44,7 @@ def empty_tag(tag, attr = [])
|
|
38
44
|
end
|
39
45
|
|
40
46
|
def data_element(tag, data, attr = [])
|
41
|
-
|
42
|
-
str << io_write("#{characters(data)}")
|
43
|
-
str << end_tag(tag)
|
47
|
+
tag_elements(tag, attr) { io_write("#{characters(data)}") }
|
44
48
|
end
|
45
49
|
|
46
50
|
def characters(data)
|
data/lib/write_xlsx/workbook.rb
CHANGED
@@ -844,7 +844,7 @@ def write_workbook_pr #:nodoc:
|
|
844
844
|
end
|
845
845
|
|
846
846
|
def write_book_views #:nodoc:
|
847
|
-
@writer.
|
847
|
+
@writer.tag_elements('bookViews') { write_workbook_view }
|
848
848
|
end
|
849
849
|
|
850
850
|
def write_workbook_view #:nodoc:
|
@@ -864,13 +864,13 @@ def write_workbook_view #:nodoc:
|
|
864
864
|
end
|
865
865
|
|
866
866
|
def write_sheets #:nodoc:
|
867
|
-
|
868
|
-
|
869
|
-
|
870
|
-
|
871
|
-
|
867
|
+
@writer.tag_elements('sheets') do
|
868
|
+
id_num = 1
|
869
|
+
@worksheets.each do |sheet|
|
870
|
+
write_sheet(sheet.name, id_num, sheet.hidden?)
|
871
|
+
id_num += 1
|
872
|
+
end
|
872
873
|
end
|
873
|
-
str << @writer.end_tag('sheets')
|
874
874
|
end
|
875
875
|
|
876
876
|
def write_sheet(name, sheet_id, hidden = false) #:nodoc:
|
@@ -893,7 +893,7 @@ def write_calc_pr #:nodoc:
|
|
893
893
|
|
894
894
|
def write_ext_lst #:nodoc:
|
895
895
|
tag = 'extLst'
|
896
|
-
@writer.
|
896
|
+
@writer.tag_elements(tag) { write_ext }
|
897
897
|
end
|
898
898
|
|
899
899
|
def write_ext #:nodoc:
|
@@ -902,7 +902,7 @@ def write_ext #:nodoc:
|
|
902
902
|
'xmlns:mx', 'http://schemas.microsoft.com/office/mac/excel/2008/main',
|
903
903
|
'uri', 'http://schemas.microsoft.com/office/mac/excel/2008/main'
|
904
904
|
]
|
905
|
-
@writer.
|
905
|
+
@writer.tag_elements(tag, attributes) { write_mx_arch_id }
|
906
906
|
end
|
907
907
|
|
908
908
|
def write_mx_arch_id #:nodoc:
|
@@ -912,9 +912,9 @@ def write_mx_arch_id #:nodoc:
|
|
912
912
|
def write_defined_names #:nodoc:
|
913
913
|
return if @defined_names.nil? || @defined_names.empty?
|
914
914
|
tag = 'definedNames'
|
915
|
-
|
916
|
-
|
917
|
-
|
915
|
+
@writer.tag_elements(tag) do
|
916
|
+
@defined_names.each { |defined_name| write_defined_name(defined_name) }
|
917
|
+
end
|
918
918
|
end
|
919
919
|
|
920
920
|
def write_defined_name(data) #:nodoc:
|
@@ -949,8 +949,6 @@ def defined_names #:nodoc:
|
|
949
949
|
# Assemble worksheets into a workbook.
|
950
950
|
#
|
951
951
|
def store_workbook #:nodoc:
|
952
|
-
packager = Package::Packager.new
|
953
|
-
|
954
952
|
# Add a default worksheet if non have been added.
|
955
953
|
add_worksheet if @worksheets.empty?
|
956
954
|
|
@@ -960,19 +958,13 @@ def store_workbook #:nodoc:
|
|
960
958
|
# Set the active sheet.
|
961
959
|
@worksheets.each { |sheet| sheet.activate if sheet.index == @activesheet }
|
962
960
|
|
963
|
-
# Prepare the worksheet cell comments.
|
964
|
-
|
965
|
-
|
966
|
-
#
|
967
|
-
prepare_defined_names
|
968
|
-
|
969
|
-
# Prepare the drawings, charts and images.
|
970
|
-
prepare_drawings
|
971
|
-
|
972
|
-
# Add cached data to charts.
|
973
|
-
add_chart_data
|
961
|
+
prepare_comments # Prepare the worksheet cell comments.
|
962
|
+
prepare_defined_names # Set the defined names for the worksheets such as Print Titles.
|
963
|
+
prepare_drawings # Prepare the drawings, charts and images.
|
964
|
+
add_chart_data # Add cached data to charts.
|
974
965
|
|
975
966
|
# Package the workbook.
|
967
|
+
packager = Package::Packager.new
|
976
968
|
packager.add_workbook(self)
|
977
969
|
packager.set_package_dir(@tempdir)
|
978
970
|
packager.create_package
|
@@ -1020,45 +1012,27 @@ def prepare_formats #:nodoc:
|
|
1020
1012
|
end
|
1021
1013
|
end
|
1022
1014
|
|
1023
|
-
#
|
1024
|
-
# Set the default index for each format. This is mainly used for testing.
|
1025
|
-
#
|
1026
|
-
def set_default_xf_indices #:nodoc:
|
1027
|
-
@formats.each { |format| format.get_xf_index }
|
1028
|
-
end
|
1029
|
-
|
1030
1015
|
#
|
1031
1016
|
# Iterate through the XF Format objects and give them an index to non-default
|
1032
1017
|
# font elements.
|
1033
1018
|
#
|
1034
1019
|
def prepare_fonts #:nodoc:
|
1035
1020
|
fonts = {}
|
1036
|
-
index = 0
|
1037
|
-
|
1038
1021
|
@xf_formats.each do |format|
|
1039
1022
|
key = format.get_font_key
|
1040
|
-
|
1041
|
-
|
1042
|
-
|
1043
|
-
format.font_index = fonts[key]
|
1044
|
-
format.has_font = 0
|
1045
|
-
else
|
1046
|
-
# This is a new font.
|
1047
|
-
fonts[key] = index
|
1048
|
-
format.font_index = index
|
1049
|
-
format.has_font = 1
|
1050
|
-
index += 1
|
1051
|
-
end
|
1023
|
+
format.has_font(!fonts[key])
|
1024
|
+
format.font_index = fonts[key] || fonts.size
|
1025
|
+
fonts[key] ||= fonts.size
|
1052
1026
|
end
|
1053
1027
|
|
1054
|
-
@font_count =
|
1028
|
+
@font_count = fonts.size
|
1055
1029
|
|
1056
1030
|
# For the DXF formats we only need to check if the properties have changed.
|
1057
1031
|
@dxf_formats.each do |format|
|
1058
1032
|
# The only font properties that can change for a DXF format are: color,
|
1059
1033
|
# bold, italic, underline and strikethrough.
|
1060
1034
|
if format.color || format.bold? || format.italic? || format.underline? || format.strikeout?
|
1061
|
-
format.has_dxf_font
|
1035
|
+
format.has_dxf_font(true)
|
1062
1036
|
end
|
1063
1037
|
end
|
1064
1038
|
end
|
@@ -1110,30 +1084,19 @@ def prepare_num_formats #:nodoc:
|
|
1110
1084
|
#
|
1111
1085
|
def prepare_borders #:nodoc:
|
1112
1086
|
borders = {}
|
1113
|
-
index = 0
|
1114
|
-
|
1115
1087
|
@xf_formats.each do |format|
|
1116
1088
|
key = format.get_border_key
|
1117
|
-
|
1118
|
-
|
1119
|
-
|
1120
|
-
format.border_index = borders[key]
|
1121
|
-
format.has_border = 0
|
1122
|
-
else
|
1123
|
-
# This is a new border.
|
1124
|
-
borders[key] = index
|
1125
|
-
format.border_index = index
|
1126
|
-
format.has_border = 1
|
1127
|
-
index += 1
|
1128
|
-
end
|
1089
|
+
format.has_border(!borders[key])
|
1090
|
+
format.border_index = borders[key] || borders.size
|
1091
|
+
borders[key] ||= borders.size
|
1129
1092
|
end
|
1130
1093
|
|
1131
|
-
@border_count =
|
1094
|
+
@border_count = borders.size
|
1132
1095
|
|
1133
1096
|
# For the DXF formats we only need to check if the properties have changed.
|
1134
1097
|
@dxf_formats.each do |format|
|
1135
1098
|
key = format.get_border_key
|
1136
|
-
format.has_dxf_border
|
1099
|
+
format.has_dxf_border(true) if key =~ /[^0:]/
|
1137
1100
|
end
|
1138
1101
|
end
|
1139
1102
|
|
@@ -1177,12 +1140,12 @@ def prepare_fills #:nodoc:
|
|
1177
1140
|
if fills[key]
|
1178
1141
|
# Fill has already been used.
|
1179
1142
|
format.fill_index = fills[key]
|
1180
|
-
format.has_fill
|
1143
|
+
format.has_fill(false)
|
1181
1144
|
else
|
1182
1145
|
# This is a new fill.
|
1183
1146
|
fills[key] = index
|
1184
1147
|
format.fill_index = index
|
1185
|
-
format.has_fill
|
1148
|
+
format.has_fill(true)
|
1186
1149
|
index += 1
|
1187
1150
|
end
|
1188
1151
|
end
|
@@ -1191,7 +1154,7 @@ def prepare_fills #:nodoc:
|
|
1191
1154
|
|
1192
1155
|
# For the DXF formats we only need to check if the properties have changed.
|
1193
1156
|
@dxf_formats.each do |format|
|
1194
|
-
format.has_dxf_fill
|
1157
|
+
format.has_dxf_fill(true) if format.pattern || format.bg_color || format.fg_color
|
1195
1158
|
end
|
1196
1159
|
end
|
1197
1160
|
|
data/lib/write_xlsx/worksheet.rb
CHANGED
@@ -109,23 +109,21 @@ class CellData # :nodoc:
|
|
109
109
|
attr_reader :result, :range, :link_type, :url, :tip
|
110
110
|
|
111
111
|
#
|
112
|
-
#
|
112
|
+
# attributes for the <cell> element. This is the innermost loop so efficiency is
|
113
113
|
# important where possible.
|
114
114
|
#
|
115
|
-
def
|
116
|
-
xf_index = 0
|
117
|
-
xf_index = xf.get_xf_index if xf.respond_to?(:get_xf_index)
|
118
|
-
|
115
|
+
def cell_attributes #:nodoc:
|
116
|
+
xf_index = xf ? xf.get_xf_index : 0
|
119
117
|
attributes = ['r', xl_rowcol_to_cell(row, col)]
|
120
118
|
|
121
119
|
# Add the cell format index.
|
122
120
|
if xf_index != 0
|
123
121
|
attributes << 's' << xf_index
|
124
|
-
elsif worksheet.set_rows[row] && worksheet.set_rows[row][1]
|
125
|
-
row_xf = worksheet.set_rows[row][1]
|
122
|
+
elsif @worksheet.set_rows[row] && @worksheet.set_rows[row][1]
|
123
|
+
row_xf = @worksheet.set_rows[row][1]
|
126
124
|
attributes << 's' << row_xf.get_xf_index
|
127
|
-
elsif worksheet.col_formats[col]
|
128
|
-
col_xf = worksheet.col_formats[col]
|
125
|
+
elsif @worksheet.col_formats[col]
|
126
|
+
col_xf = @worksheet.col_formats[col]
|
129
127
|
attributes << 's' << col_xf.get_xf_index
|
130
128
|
end
|
131
129
|
attributes
|
@@ -133,7 +131,8 @@ def write_cell(worksheet) #:nodoc:
|
|
133
131
|
end
|
134
132
|
|
135
133
|
class NumberCellData < CellData # :nodoc:
|
136
|
-
def initialize(row, col, num, xf)
|
134
|
+
def initialize(worksheet, row, col, num, xf)
|
135
|
+
@worksheet = worksheet
|
137
136
|
@row, @col, @token, @xf = row, col, num, xf
|
138
137
|
end
|
139
138
|
|
@@ -141,16 +140,16 @@ def data
|
|
141
140
|
@token
|
142
141
|
end
|
143
142
|
|
144
|
-
def write_cell
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
worksheet.writer.end_tag('c')
|
143
|
+
def write_cell
|
144
|
+
@worksheet.writer.tag_elements('c', cell_attributes) do
|
145
|
+
@worksheet.write_cell_value(token)
|
146
|
+
end
|
149
147
|
end
|
150
148
|
end
|
151
149
|
|
152
150
|
class StringCellData < CellData # :nodoc:
|
153
|
-
def initialize(row, col, index, xf)
|
151
|
+
def initialize(worksheet, row, col, index, xf)
|
152
|
+
@worksheet = worksheet
|
154
153
|
@row, @col, @token, @xf = row, col, index, xf
|
155
154
|
end
|
156
155
|
|
@@ -158,17 +157,18 @@ def data
|
|
158
157
|
{ :sst_id => token }
|
159
158
|
end
|
160
159
|
|
161
|
-
def write_cell
|
162
|
-
attributes =
|
160
|
+
def write_cell
|
161
|
+
attributes = cell_attributes
|
163
162
|
attributes << 't' << 's'
|
164
|
-
worksheet.writer.
|
165
|
-
|
166
|
-
|
163
|
+
@worksheet.writer.tag_elements('c', attributes) do
|
164
|
+
@worksheet.write_cell_value(token)
|
165
|
+
end
|
167
166
|
end
|
168
167
|
end
|
169
168
|
|
170
169
|
class FormulaCellData < CellData # :nodoc:
|
171
|
-
def initialize(row, col, formula, xf, result)
|
170
|
+
def initialize(worksheet, row, col, formula, xf, result)
|
171
|
+
@worksheet = worksheet
|
172
172
|
@row, @col, @token, @xf, @result = row, col, formula, xf, result
|
173
173
|
end
|
174
174
|
|
@@ -176,17 +176,17 @@ def data
|
|
176
176
|
@result || 0
|
177
177
|
end
|
178
178
|
|
179
|
-
def write_cell
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
worksheet.writer.end_tag('c')
|
179
|
+
def write_cell
|
180
|
+
@worksheet.writer.tag_elements('c', cell_attributes) do
|
181
|
+
@worksheet.write_cell_formula(token)
|
182
|
+
@worksheet.write_cell_value(result || 0)
|
183
|
+
end
|
185
184
|
end
|
186
185
|
end
|
187
186
|
|
188
187
|
class FormulaArrayCellData < CellData # :nodoc:
|
189
|
-
def initialize(row, col, formula, xf, range, result)
|
188
|
+
def initialize(worksheet, row, col, formula, xf, range, result)
|
189
|
+
@worksheet = worksheet
|
190
190
|
@row, @col, @token, @xf, @range, @result = row, col, formula, xf, range, result
|
191
191
|
end
|
192
192
|
|
@@ -194,17 +194,17 @@ def data
|
|
194
194
|
@result || 0
|
195
195
|
end
|
196
196
|
|
197
|
-
def write_cell
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
worksheet.writer.end_tag('c')
|
197
|
+
def write_cell
|
198
|
+
@worksheet.writer.tag_elements('c', cell_attributes) do
|
199
|
+
@worksheet.write_cell_array_formula(token, range)
|
200
|
+
@worksheet.write_cell_value(result)
|
201
|
+
end
|
203
202
|
end
|
204
203
|
end
|
205
204
|
|
206
205
|
class HyperlinkCellData < CellData # :nodoc:
|
207
|
-
def initialize(row, col, index, xf, link_type, url, str, tip)
|
206
|
+
def initialize(worksheet, row, col, index, xf, link_type, url, str, tip)
|
207
|
+
@worksheet = worksheet
|
208
208
|
@row, @col, @token, @xf, @link_type, @url, @str, @tip =
|
209
209
|
row, col, index, xf, link_type, url, str, tip
|
210
210
|
end
|
@@ -213,32 +213,33 @@ def data
|
|
213
213
|
{ :sst_id => token }
|
214
214
|
end
|
215
215
|
|
216
|
-
def write_cell
|
217
|
-
attributes =
|
216
|
+
def write_cell
|
217
|
+
attributes = cell_attributes
|
218
218
|
attributes << 't' << 's'
|
219
|
-
worksheet.writer.
|
220
|
-
|
221
|
-
|
219
|
+
@worksheet.writer.tag_elements('c', attributes) do
|
220
|
+
@worksheet.write_cell_value(token)
|
221
|
+
end
|
222
222
|
|
223
223
|
if link_type == 1
|
224
224
|
# External link with rel file relationship.
|
225
|
-
worksheet.hlink_count += 1
|
226
|
-
worksheet.hlink_refs <<
|
225
|
+
@worksheet.hlink_count += 1
|
226
|
+
@worksheet.hlink_refs <<
|
227
227
|
[
|
228
228
|
link_type, row, col,
|
229
|
-
worksheet.hlink_count, @str, @tip
|
229
|
+
@worksheet.hlink_count, @str, @tip
|
230
230
|
]
|
231
231
|
|
232
|
-
worksheet.external_hyper_links << [ '/hyperlink', @url, 'External' ]
|
232
|
+
@worksheet.external_hyper_links << [ '/hyperlink', @url, 'External' ]
|
233
233
|
elsif link_type
|
234
234
|
# External link with rel file relationship.
|
235
|
-
worksheet.hlink_refs << [link_type, row, col, @url, @str, @tip ]
|
235
|
+
@worksheet.hlink_refs << [link_type, row, col, @url, @str, @tip ]
|
236
236
|
end
|
237
237
|
end
|
238
238
|
end
|
239
239
|
|
240
240
|
class BlankCellData < CellData # :nodoc:
|
241
|
-
def initialize(row, col, index, xf)
|
241
|
+
def initialize(worksheet, row, col, index, xf)
|
242
|
+
@worksheet = worksheet
|
242
243
|
@row, @col, @xf = row, col, xf
|
243
244
|
end
|
244
245
|
|
@@ -246,9 +247,8 @@ def data
|
|
246
247
|
''
|
247
248
|
end
|
248
249
|
|
249
|
-
def write_cell
|
250
|
-
|
251
|
-
worksheet.writer.empty_tag('c', attributes)
|
250
|
+
def write_cell
|
251
|
+
@worksheet.writer.empty_tag('c', cell_attributes)
|
252
252
|
end
|
253
253
|
end
|
254
254
|
|
@@ -724,14 +724,14 @@ def set_column(*args)
|
|
724
724
|
# the column dimensions in certain cases.
|
725
725
|
ignore_row = 1
|
726
726
|
ignore_col = 1
|
727
|
-
ignore_col = 0 if format.respond_to?(:
|
727
|
+
ignore_col = 0 if format.respond_to?(:xf_index) # Column has a format.
|
728
728
|
ignore_col = 0 if width && hidden && hidden != 0 # Column has a width but is hidden
|
729
729
|
|
730
730
|
check_dimensions_and_update_max_min_values(0, firstcol, ignore_row, ignore_col)
|
731
731
|
check_dimensions_and_update_max_min_values(0, lastcol, ignore_row, ignore_col)
|
732
732
|
|
733
733
|
# Set the limits for the outline levels (0 <= x <= 7).
|
734
|
-
level
|
734
|
+
level ||= 0
|
735
735
|
level = 0 if level < 0
|
736
736
|
level = 7 if level > 7
|
737
737
|
|
@@ -2072,13 +2072,11 @@ def write_number(*args)
|
|
2072
2072
|
row, col, num, xf = row_col_notation(args)
|
2073
2073
|
raise WriteXLSXInsufficientArgumentError if [row, col, num].include?(nil)
|
2074
2074
|
|
2075
|
-
type = 'n'
|
2076
|
-
|
2077
2075
|
# Check that row and col are valid and store max and min values
|
2078
2076
|
check_dimensions(row, col)
|
2079
2077
|
store_row_col_max_min_values(row, col)
|
2080
2078
|
|
2081
|
-
store_data_to_table(NumberCellData.new(row, col, num, xf))
|
2079
|
+
store_data_to_table(NumberCellData.new(self, row, col, num, xf))
|
2082
2080
|
end
|
2083
2081
|
|
2084
2082
|
#
|
@@ -2121,7 +2119,7 @@ def write_string(*args)
|
|
2121
2119
|
|
2122
2120
|
index = shared_string_index(str[0, STR_MAX])
|
2123
2121
|
|
2124
|
-
store_data_to_table(StringCellData.new(row, col, index, xf))
|
2122
|
+
store_data_to_table(StringCellData.new(self, row, col, index, xf))
|
2125
2123
|
end
|
2126
2124
|
|
2127
2125
|
#
|
@@ -2222,12 +2220,11 @@ def write_rich_string(*args)
|
|
2222
2220
|
raise WriteXLSXInsufficientArgumentError if [row, col, rich_strings[0]].include?(nil)
|
2223
2221
|
|
2224
2222
|
# If the last arg is a format we use it as the cell format.
|
2225
|
-
if rich_strings[-1].respond_to?(:
|
2223
|
+
if rich_strings[-1].respond_to?(:xf_index)
|
2226
2224
|
xf = rich_strings.pop
|
2227
2225
|
else
|
2228
|
-
xf
|
2226
|
+
xf = nil
|
2229
2227
|
end
|
2230
|
-
type = 's' # The data type.
|
2231
2228
|
|
2232
2229
|
# Check that row and col are valid and store max and min values
|
2233
2230
|
check_dimensions(row, col)
|
@@ -2240,11 +2237,11 @@ def write_rich_string(*args)
|
|
2240
2237
|
fragments, length = rich_strings_fragments(rich_strings)
|
2241
2238
|
|
2242
2239
|
# If the first token is a string start the <r> element.
|
2243
|
-
writer.start_tag('r') if !fragments[0].respond_to?(:
|
2240
|
+
writer.start_tag('r') if !fragments[0].respond_to?(:xf_index)
|
2244
2241
|
|
2245
2242
|
# Write the XML elements for the format string fragments.
|
2246
2243
|
fragments.each do |token|
|
2247
|
-
if token.respond_to?(:
|
2244
|
+
if token.respond_to?(:xf_index)
|
2248
2245
|
# Write the font run.
|
2249
2246
|
writer.start_tag('r')
|
2250
2247
|
write_font(writer, token)
|
@@ -2261,7 +2258,7 @@ def write_rich_string(*args)
|
|
2261
2258
|
# Add the XML string to the shared string table.
|
2262
2259
|
index = shared_string_index(writer.string)
|
2263
2260
|
|
2264
|
-
store_data_to_table(StringCellData.new(row, col, index, xf))
|
2261
|
+
store_data_to_table(StringCellData.new(self, row, col, index, xf))
|
2265
2262
|
end
|
2266
2263
|
|
2267
2264
|
#
|
@@ -2303,7 +2300,7 @@ def write_blank(*args)
|
|
2303
2300
|
check_dimensions(row, col)
|
2304
2301
|
store_row_col_max_min_values(row, col)
|
2305
2302
|
|
2306
|
-
store_data_to_table(BlankCellData.new(row, col, nil, xf))
|
2303
|
+
store_data_to_table(BlankCellData.new(self, row, col, nil, xf))
|
2307
2304
|
end
|
2308
2305
|
|
2309
2306
|
#
|
@@ -2343,16 +2340,14 @@ def write_formula(*args)
|
|
2343
2340
|
raise WriteXLSXInsufficientArgumentError if [row, col, formula].include?(nil)
|
2344
2341
|
|
2345
2342
|
if formula =~ /^\{=.*\}$/
|
2346
|
-
|
2347
|
-
|
2348
|
-
|
2349
|
-
|
2350
|
-
|
2351
|
-
store_row_col_max_min_values(row, col)
|
2352
|
-
|
2353
|
-
formula.sub!(/^=/, '')
|
2343
|
+
write_array_formula(row, col, row, col, formula, format, value)
|
2344
|
+
else
|
2345
|
+
check_dimensions(row, col)
|
2346
|
+
store_row_col_max_min_values(row, col)
|
2347
|
+
formula.sub!(/^=/, '')
|
2354
2348
|
|
2355
|
-
|
2349
|
+
store_data_to_table(FormulaCellData.new(self, row, col, formula, format, value))
|
2350
|
+
end
|
2356
2351
|
end
|
2357
2352
|
|
2358
2353
|
#
|
@@ -2425,7 +2420,7 @@ def write_array_formula(*args)
|
|
2425
2420
|
formula.sub!(/^\{(.*)\}$/, '\1')
|
2426
2421
|
formula.sub!(/^=/, '')
|
2427
2422
|
|
2428
|
-
store_data_to_table(FormulaArrayCellData.new(row1, col1, formula, xf, range, value))
|
2423
|
+
store_data_to_table(FormulaArrayCellData.new(self, row1, col1, formula, xf, range, value))
|
2429
2424
|
end
|
2430
2425
|
|
2431
2426
|
# The outline_settings() method is used to control the appearance of
|
@@ -2547,7 +2542,6 @@ def write_url(*args)
|
|
2547
2542
|
xf, str = str, xf if str.respond_to?(:xf_index)
|
2548
2543
|
raise WriteXLSXInsufficientArgumentError if [row, col, url].include?(nil)
|
2549
2544
|
|
2550
|
-
type = 'l' # XML data type
|
2551
2545
|
link_type = 1
|
2552
2546
|
|
2553
2547
|
# Remove the URI scheme from internal links.
|
@@ -2561,7 +2555,7 @@ def write_url(*args)
|
|
2561
2555
|
end
|
2562
2556
|
|
2563
2557
|
# The displayed string defaults to the url string.
|
2564
|
-
str
|
2558
|
+
str ||= url
|
2565
2559
|
|
2566
2560
|
# For external links change the directory separator from Unix to Dos.
|
2567
2561
|
if link_type == 3
|
@@ -2599,7 +2593,7 @@ def write_url(*args)
|
|
2599
2593
|
link_type = 1
|
2600
2594
|
end
|
2601
2595
|
|
2602
|
-
store_data_to_table(HyperlinkCellData.new(row, col, index, xf, link_type, url, str, tip))
|
2596
|
+
store_data_to_table(HyperlinkCellData.new(self, row, col, index, xf, link_type, url, str, tip))
|
2603
2597
|
end
|
2604
2598
|
|
2605
2599
|
#
|
@@ -2656,9 +2650,12 @@ def write_date_time(*args)
|
|
2656
2650
|
|
2657
2651
|
date_time = convert_date_time(str)
|
2658
2652
|
|
2659
|
-
|
2660
|
-
|
2661
|
-
|
2653
|
+
if date_time
|
2654
|
+
store_data_to_table(NumberCellData.new(self, row, col, date_time, xf))
|
2655
|
+
else
|
2656
|
+
# If the date isn't valid then write it as a string.
|
2657
|
+
write_string(args) unless date_time
|
2658
|
+
end
|
2662
2659
|
end
|
2663
2660
|
|
2664
2661
|
#
|
@@ -3048,7 +3045,7 @@ def merge_range(*args)
|
|
3048
3045
|
row_first, col_first, row_last, col_last, string, format, *extra_args = row_col_notation(args)
|
3049
3046
|
|
3050
3047
|
raise "Incorrect number of arguments" if [row_first, col_first, row_last, col_last, format].include?(nil)
|
3051
|
-
raise "Fifth parameter must be a format object" unless format.respond_to?(:
|
3048
|
+
raise "Fifth parameter must be a format object" unless format.respond_to?(:xf_index)
|
3052
3049
|
raise "Can't merge single cell" if row_first == row_last && col_first == col_last
|
3053
3050
|
|
3054
3051
|
# Swap last row/col with first row/col as necessary
|
@@ -3081,7 +3078,7 @@ def merge_range_type(type, *args)
|
|
3081
3078
|
row_first, col_first, row_last, col_last, token, format, *others = row_col_notation(args)
|
3082
3079
|
end
|
3083
3080
|
|
3084
|
-
raise "Format object missing or in an incorrect position" unless format.respond_to?(:
|
3081
|
+
raise "Format object missing or in an incorrect position" unless format.respond_to?(:xf_index)
|
3085
3082
|
raise "Can't merge single cell" if row_first == row_last && col_first == col_last
|
3086
3083
|
|
3087
3084
|
# Swap last row/col with first row/col as necessary
|
@@ -4344,16 +4341,6 @@ def set_some_defaults(param)
|
|
4344
4341
|
param[:show_error] ||= 1
|
4345
4342
|
end
|
4346
4343
|
|
4347
|
-
# Minor modification to allow comparison testing. Change RGB colors
|
4348
|
-
# from long format, ffcc00 to short format fc0 used by VML.
|
4349
|
-
def rgb_color(rgb)
|
4350
|
-
result = sprintf("%02x%02x%02x", *rgb)
|
4351
|
-
if result =~ /^([0-9a-f])\1([0-9a-f])\2([0-9a-f])\3$/
|
4352
|
-
result = "#{$1}#{$2}#{$3}"
|
4353
|
-
end
|
4354
|
-
result
|
4355
|
-
end
|
4356
|
-
|
4357
4344
|
# List of valid input parameters.
|
4358
4345
|
def valid_validation_parameter
|
4359
4346
|
[
|
@@ -4406,7 +4393,7 @@ def rich_strings_fragments(rich_strings) # :nodoc:
|
|
4406
4393
|
|
4407
4394
|
fragments = []
|
4408
4395
|
rich_strings.each do |token|
|
4409
|
-
if token.respond_to?(:
|
4396
|
+
if token.respond_to?(:xf_index)
|
4410
4397
|
raise AugumentError, "Can't allow 2 formats in a row" if last == 'format' && pos > 0
|
4411
4398
|
|
4412
4399
|
# Token is a format object. Add it to the fragment list.
|
@@ -4837,10 +4824,10 @@ def write_sheet_pr #:nodoc:
|
|
4837
4824
|
(attributes << 'filterMode' << 1) if filter_on?
|
4838
4825
|
|
4839
4826
|
if fit_page? || tab_color?
|
4840
|
-
@writer.
|
4841
|
-
|
4842
|
-
|
4843
|
-
|
4827
|
+
@writer.tag_elements('sheetPr', attributes) do
|
4828
|
+
write_tab_color
|
4829
|
+
write_page_set_up_pr
|
4830
|
+
end
|
4844
4831
|
else
|
4845
4832
|
@writer.empty_tag('sheetPr', attributes)
|
4846
4833
|
end
|
@@ -4892,9 +4879,7 @@ def write_dimension #:nodoc:
|
|
4892
4879
|
# Write the <sheetViews> element.
|
4893
4880
|
#
|
4894
4881
|
def write_sheet_views #:nodoc:
|
4895
|
-
@writer.
|
4896
|
-
write_sheet_view
|
4897
|
-
@writer.end_tag('sheetViews')
|
4882
|
+
@writer.tag_elements('sheetViews', []) { write_sheet_view }
|
4898
4883
|
end
|
4899
4884
|
|
4900
4885
|
def write_sheet_view #:nodoc:
|
@@ -4926,10 +4911,10 @@ def write_sheet_view #:nodoc:
|
|
4926
4911
|
if @panes.empty? && @selections.empty?
|
4927
4912
|
@writer.empty_tag('sheetView', attributes)
|
4928
4913
|
else
|
4929
|
-
@writer.
|
4930
|
-
|
4931
|
-
|
4932
|
-
|
4914
|
+
@writer.tag_elements('sheetView', attributes) do
|
4915
|
+
write_panes
|
4916
|
+
write_selections
|
4917
|
+
end
|
4933
4918
|
end
|
4934
4919
|
end
|
4935
4920
|
|
@@ -4972,10 +4957,9 @@ def write_cols #:nodoc:
|
|
4972
4957
|
# Exit unless some column have been formatted.
|
4973
4958
|
return if @colinfo.empty?
|
4974
4959
|
|
4975
|
-
@writer.
|
4976
|
-
|
4977
|
-
|
4978
|
-
@writer.end_tag('cols')
|
4960
|
+
@writer.tag_elements('cols') do
|
4961
|
+
@colinfo.each {|col_info| write_col_info(*col_info) }
|
4962
|
+
end
|
4979
4963
|
end
|
4980
4964
|
|
4981
4965
|
#
|
@@ -4989,23 +4973,15 @@ def write_col_info(*args) #:nodoc:
|
|
4989
4973
|
hidden = args[4] || 0 # Hidden flag.
|
4990
4974
|
level = args[5] || 0 # Outline level.
|
4991
4975
|
collapsed = args[6] || 0 # Outline level.
|
4976
|
+
xf_index = format ? format.get_xf_index : 0
|
4992
4977
|
|
4993
4978
|
custom_width = true
|
4994
|
-
|
4995
|
-
|
4979
|
+
custom_width = false if width.nil? && hidden == 0
|
4980
|
+
custom_width = false if width == 8.43
|
4996
4981
|
|
4997
|
-
# Set the Excel default col width.
|
4998
4982
|
if width.nil?
|
4999
|
-
|
5000
|
-
|
5001
|
-
custom_width = false
|
5002
|
-
else
|
5003
|
-
width = 0
|
5004
|
-
end
|
5005
|
-
else
|
5006
|
-
# Width is defined but same as default.
|
5007
|
-
custom_width = false if width == 8.43
|
5008
|
-
end
|
4983
|
+
width = hidden == 0 ? 8.43 : 0
|
4984
|
+
end
|
5009
4985
|
|
5010
4986
|
# Convert column width from user units to character width.
|
5011
4987
|
max_digit_width = 7.0 # For Calabri 11.
|
@@ -5036,9 +5012,7 @@ def write_sheet_data #:nodoc:
|
|
5036
5012
|
# If the dimensions aren't defined then there is no data to write.
|
5037
5013
|
@writer.empty_tag('sheetData')
|
5038
5014
|
else
|
5039
|
-
@writer.
|
5040
|
-
write_rows
|
5041
|
-
@writer.end_tag('sheetData')
|
5015
|
+
@writer.tag_elements('sheetData') { write_rows }
|
5042
5016
|
end
|
5043
5017
|
end
|
5044
5018
|
|
@@ -5112,7 +5086,7 @@ def not_contain_formatting_or_data?(row_num) # :nodoc:
|
|
5112
5086
|
|
5113
5087
|
def write_cell_column_dimension(row_num) # :nodoc:
|
5114
5088
|
(@dim_colmin .. @dim_colmax).each do |col_num|
|
5115
|
-
@cell_data_table[row_num][col_num].write_cell
|
5089
|
+
@cell_data_table[row_num][col_num].write_cell if @cell_data_table[row_num][col_num]
|
5116
5090
|
end
|
5117
5091
|
end
|
5118
5092
|
|
@@ -5125,12 +5099,10 @@ def write_row_element(r, spans = nil, height = 15, format = nil, hidden = false,
|
|
5125
5099
|
level ||= 0
|
5126
5100
|
collapsed ||= 0
|
5127
5101
|
empty_row ||= 0
|
5128
|
-
xf_index = 0
|
5102
|
+
xf_index = format ? format.get_xf_index : 0
|
5129
5103
|
|
5130
5104
|
attributes = ['r', r + 1]
|
5131
5105
|
|
5132
|
-
xf_index = format.get_xf_index if format
|
5133
|
-
|
5134
5106
|
(attributes << 'spans' << spans) if spans
|
5135
5107
|
(attributes << 's' << xf_index) if xf_index != 0
|
5136
5108
|
(attributes << 'customFormat' << 1 ) if format
|
@@ -5362,9 +5334,7 @@ def write_page_setup #:nodoc:
|
|
5362
5334
|
# Write the <extLst> element.
|
5363
5335
|
#
|
5364
5336
|
def write_ext_lst #:nodoc:
|
5365
|
-
@writer.
|
5366
|
-
write_ext
|
5367
|
-
@writer.end_tag('extLst')
|
5337
|
+
@writer.tag_elements('extLst') { write_ext }
|
5368
5338
|
end
|
5369
5339
|
|
5370
5340
|
#
|
@@ -5379,9 +5349,7 @@ def write_ext #:nodoc:
|
|
5379
5349
|
'uri', uri
|
5380
5350
|
]
|
5381
5351
|
|
5382
|
-
@writer.
|
5383
|
-
write_mx_plv
|
5384
|
-
@writer.end_tag('ext')
|
5352
|
+
@writer.tag_elements('ext', attributes) { write_mx_plv }
|
5385
5353
|
end
|
5386
5354
|
|
5387
5355
|
#
|
@@ -5409,12 +5377,10 @@ def write_merge_cells #:nodoc:
|
|
5409
5377
|
|
5410
5378
|
attributes = ['count', @merge.size]
|
5411
5379
|
|
5412
|
-
@writer.
|
5413
|
-
|
5414
|
-
|
5415
|
-
|
5416
|
-
|
5417
|
-
@writer.end_tag('mergeCells')
|
5380
|
+
@writer.tag_elements('mergeCells', attributes) do
|
5381
|
+
# Write the mergeCell element.
|
5382
|
+
@merge.each { |merged_range| write_merge_cell(merged_range) }
|
5383
|
+
end
|
5418
5384
|
end
|
5419
5385
|
|
5420
5386
|
|
@@ -5463,10 +5429,10 @@ def write_print_options #:nodoc:
|
|
5463
5429
|
def write_header_footer #:nodoc:
|
5464
5430
|
return unless header_footer_changed?
|
5465
5431
|
|
5466
|
-
@writer.
|
5467
|
-
|
5468
|
-
|
5469
|
-
|
5432
|
+
@writer.tag_elements('headerFooter') do
|
5433
|
+
write_odd_header if @header && @header != ''
|
5434
|
+
write_odd_footer if @footer && @footer != ''
|
5435
|
+
end
|
5470
5436
|
end
|
5471
5437
|
|
5472
5438
|
#
|
@@ -5476,7 +5442,6 @@ def write_odd_header #:nodoc:
|
|
5476
5442
|
@writer.data_element('oddHeader', @header)
|
5477
5443
|
end
|
5478
5444
|
|
5479
|
-
# _write_odd_footer()
|
5480
5445
|
#
|
5481
5446
|
# Write the <oddFooter> element.
|
5482
5447
|
#
|
@@ -5515,9 +5480,9 @@ def write_breaks(tag) # :nodoc:
|
|
5515
5480
|
|
5516
5481
|
attributes = ['count', count, 'manualBreakCount', count]
|
5517
5482
|
|
5518
|
-
@writer.
|
5519
|
-
|
5520
|
-
|
5483
|
+
@writer.tag_elements(tag, attributes) do
|
5484
|
+
page_breaks.each { |num| write_brk(num, max) }
|
5485
|
+
end
|
5521
5486
|
end
|
5522
5487
|
#
|
5523
5488
|
# Write the <brk> element.
|
@@ -5542,9 +5507,9 @@ def write_auto_filter #:nodoc:
|
|
5542
5507
|
|
5543
5508
|
if filter_on?
|
5544
5509
|
# Autofilter defined active filters.
|
5545
|
-
@writer.
|
5546
|
-
|
5547
|
-
|
5510
|
+
@writer.tag_elements('autoFilter', attributes) do
|
5511
|
+
write_autofilters
|
5512
|
+
end
|
5548
5513
|
else
|
5549
5514
|
# Autofilter defined without active filters.
|
5550
5515
|
@writer.empty_tag('autoFilter', attributes)
|
@@ -5576,16 +5541,15 @@ def write_autofilters #:nodoc:
|
|
5576
5541
|
def write_filter_column(col_id, type, *filters) #:nodoc:
|
5577
5542
|
attributes = ['colId', col_id]
|
5578
5543
|
|
5579
|
-
@writer.
|
5580
|
-
|
5581
|
-
|
5582
|
-
|
5583
|
-
|
5584
|
-
|
5585
|
-
|
5544
|
+
@writer.tag_elements('filterColumn', attributes) do
|
5545
|
+
if type == 1
|
5546
|
+
# Type == 1 is the new XLSX style filter.
|
5547
|
+
write_filters(*filters)
|
5548
|
+
else
|
5549
|
+
# Type == 0 is the classic "custom" filter.
|
5550
|
+
write_custom_filters(*filters)
|
5551
|
+
end
|
5586
5552
|
end
|
5587
|
-
|
5588
|
-
@writer.end_tag('filterColumn')
|
5589
5553
|
end
|
5590
5554
|
|
5591
5555
|
#
|
@@ -5597,9 +5561,9 @@ def write_filters(*filters) #:nodoc:
|
|
5597
5561
|
@writer.empty_tag('filters', ['blank', 1])
|
5598
5562
|
else
|
5599
5563
|
# General case.
|
5600
|
-
@writer.
|
5601
|
-
|
5602
|
-
|
5564
|
+
@writer.tag_elements('filters') do
|
5565
|
+
filters.each { |filter| write_filter(filter) }
|
5566
|
+
end
|
5603
5567
|
end
|
5604
5568
|
end
|
5605
5569
|
|
@@ -5617,9 +5581,7 @@ def write_filter(val) #:nodoc:
|
|
5617
5581
|
def write_custom_filters(*tokens) #:nodoc:
|
5618
5582
|
if tokens.size == 2
|
5619
5583
|
# One filter expression only.
|
5620
|
-
@writer.
|
5621
|
-
write_custom_filter(*tokens)
|
5622
|
-
@writer.end_tag('customFilters')
|
5584
|
+
@writer.tag_elements('customFilters') { write_custom_filter(*tokens) }
|
5623
5585
|
else
|
5624
5586
|
# Two filter expressions.
|
5625
5587
|
|
@@ -5631,10 +5593,10 @@ def write_custom_filters(*tokens) #:nodoc:
|
|
5631
5593
|
end
|
5632
5594
|
|
5633
5595
|
# Write the two custom filters.
|
5634
|
-
@writer.
|
5635
|
-
|
5636
|
-
|
5637
|
-
|
5596
|
+
@writer.tag_elements('customFilters', attributes) do
|
5597
|
+
write_custom_filter(tokens[0], tokens[1])
|
5598
|
+
write_custom_filter(tokens[3], tokens[4])
|
5599
|
+
end
|
5638
5600
|
end
|
5639
5601
|
end
|
5640
5602
|
|
@@ -5675,19 +5637,17 @@ def write_custom_filter(operator, val) #:nodoc:
|
|
5675
5637
|
def write_hyperlinks #:nodoc:
|
5676
5638
|
return if @hlink_refs.empty?
|
5677
5639
|
|
5678
|
-
@writer.
|
5640
|
+
@writer.tag_elements('hyperlinks') do
|
5641
|
+
@hlink_refs.each do |aref|
|
5642
|
+
type, *args = aref
|
5679
5643
|
|
5680
|
-
|
5681
|
-
|
5682
|
-
|
5683
|
-
|
5684
|
-
|
5685
|
-
elsif type == 2
|
5686
|
-
write_hyperlink_internal(*args)
|
5644
|
+
if type == 1
|
5645
|
+
write_hyperlink_external(*args)
|
5646
|
+
elsif type == 2
|
5647
|
+
write_hyperlink_internal(*args)
|
5648
|
+
end
|
5687
5649
|
end
|
5688
5650
|
end
|
5689
|
-
|
5690
|
-
@writer.end_tag('hyperlinks')
|
5691
5651
|
end
|
5692
5652
|
|
5693
5653
|
#
|
@@ -5798,42 +5758,39 @@ def write_legacy_drawing #:nodoc:
|
|
5798
5758
|
# Write the <font> element.
|
5799
5759
|
#
|
5800
5760
|
def write_font(writer, format) #:nodoc:
|
5801
|
-
writer.
|
5802
|
-
|
5803
|
-
|
5804
|
-
|
5805
|
-
|
5806
|
-
|
5807
|
-
|
5808
|
-
|
5809
|
-
|
5810
|
-
|
5811
|
-
|
5812
|
-
|
5813
|
-
|
5814
|
-
|
5815
|
-
|
5816
|
-
|
5817
|
-
|
5818
|
-
|
5819
|
-
|
5820
|
-
|
5821
|
-
|
5822
|
-
|
5823
|
-
|
5824
|
-
|
5825
|
-
|
5826
|
-
write_color(writer, 'theme', 1)
|
5827
|
-
end
|
5761
|
+
writer.tag_elements('rPr') do
|
5762
|
+
writer.empty_tag('b') if format.bold?
|
5763
|
+
writer.empty_tag('i') if format.italic?
|
5764
|
+
writer.empty_tag('strike') if format.strikeout?
|
5765
|
+
writer.empty_tag('outline') if format.outline?
|
5766
|
+
writer.empty_tag('shadow') if format.shadow?
|
5767
|
+
|
5768
|
+
# Handle the underline variants.
|
5769
|
+
write_underline(writer, format.underline) if format.underline?
|
5770
|
+
|
5771
|
+
write_vert_align(writer, 'superscript') if format.font_script == 1
|
5772
|
+
write_vert_align(writer, 'subscript') if format.font_script == 2
|
5773
|
+
|
5774
|
+
writer.empty_tag('sz', ['val', format.size])
|
5775
|
+
|
5776
|
+
theme = format.theme
|
5777
|
+
color = format.color
|
5778
|
+
if !theme.nil? && theme != 0
|
5779
|
+
write_color(writer, 'theme', theme)
|
5780
|
+
elsif !color.nil? && color != 0
|
5781
|
+
color = get_palette_color(color)
|
5782
|
+
write_color(writer, 'rgb', color)
|
5783
|
+
else
|
5784
|
+
write_color(writer, 'theme', 1)
|
5785
|
+
end
|
5828
5786
|
|
5829
|
-
|
5830
|
-
|
5787
|
+
writer.empty_tag('rFont', ['val', format.font])
|
5788
|
+
writer.empty_tag('family', ['val', format.font_family])
|
5831
5789
|
|
5832
|
-
|
5833
|
-
|
5790
|
+
if format.font == 'Calibri' && format.hyperlink == 0
|
5791
|
+
writer.empty_tag('scheme', ['val', format.font_scheme])
|
5792
|
+
end
|
5834
5793
|
end
|
5835
|
-
|
5836
|
-
writer.end_tag('rPr')
|
5837
5794
|
end
|
5838
5795
|
|
5839
5796
|
#
|
@@ -5870,9 +5827,9 @@ def write_data_validations #:nodoc:
|
|
5870
5827
|
|
5871
5828
|
attributes = ['count', @validations.size]
|
5872
5829
|
|
5873
|
-
@writer.
|
5874
|
-
|
5875
|
-
|
5830
|
+
@writer.tag_elements('dataValidations', attributes) do
|
5831
|
+
@validations.each { |validation| write_data_validation(validation) }
|
5832
|
+
end
|
5876
5833
|
end
|
5877
5834
|
|
5878
5835
|
#
|
@@ -5922,15 +5879,12 @@ def write_data_validation(param) #:nodoc:
|
|
5922
5879
|
attributes << 'prompt' << param[:input_message] if param[:input_message]
|
5923
5880
|
attributes << 'sqref' << sqref
|
5924
5881
|
|
5925
|
-
@writer.
|
5926
|
-
|
5927
|
-
|
5928
|
-
|
5929
|
-
|
5930
|
-
|
5931
|
-
write_formula_2(param[:maximum]) if param[:maximum]
|
5932
|
-
|
5933
|
-
@writer.end_tag('dataValidation')
|
5882
|
+
@writer.tag_elements('dataValidation', attributes) do
|
5883
|
+
# Write the formula1 element.
|
5884
|
+
write_formula_1(param[:value])
|
5885
|
+
# Write the formula2 element.
|
5886
|
+
write_formula_2(param[:maximum]) if param[:maximum]
|
5887
|
+
end
|
5934
5888
|
end
|
5935
5889
|
|
5936
5890
|
#
|
@@ -5977,11 +5931,9 @@ def write_conditional_formats #:nodoc:
|
|
5977
5931
|
def write_conditional_formatting(range, params) #:nodoc:
|
5978
5932
|
attributes = ['sqref', range]
|
5979
5933
|
|
5980
|
-
@writer.
|
5981
|
-
|
5982
|
-
|
5983
|
-
|
5984
|
-
@writer.end_tag('conditionalFormatting')
|
5934
|
+
@writer.tag_elements('conditionalFormatting', attributes) do
|
5935
|
+
params.each { |param| write_cf_rule(param) }
|
5936
|
+
end
|
5985
5937
|
end
|
5986
5938
|
|
5987
5939
|
#
|
@@ -5996,18 +5948,16 @@ def write_cf_rule(param) #:nodoc:
|
|
5996
5948
|
attributes << 'priority' << param[:priority]
|
5997
5949
|
attributes << 'operator' << param[:criteria]
|
5998
5950
|
|
5999
|
-
@writer.
|
6000
|
-
|
6001
|
-
|
6002
|
-
|
6003
|
-
|
6004
|
-
|
6005
|
-
|
6006
|
-
|
5951
|
+
@writer.tag_elements('cfRule', attributes) do
|
5952
|
+
if param[:type] == 'cellIs'
|
5953
|
+
if param[:minimum] && param[:maximum]
|
5954
|
+
write_formula_tag(param[:minimum])
|
5955
|
+
write_formula_tag(param[:maximum])
|
5956
|
+
else
|
5957
|
+
write_formula_tag(param[:value])
|
5958
|
+
end
|
6007
5959
|
end
|
6008
5960
|
end
|
6009
|
-
|
6010
|
-
@writer.end_tag('cfRule')
|
6011
5961
|
end
|
6012
5962
|
|
6013
5963
|
def store_data_to_table(cell_data) #:nodoc:
|