write_xlsx 1.07.0 → 1.09.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Changes +40 -0
- data/README.md +1 -1
- data/examples/background.rb +19 -0
- data/examples/ignore_errors.rb +39 -0
- data/ignore_errors.xlsx +0 -0
- data/lib/write_xlsx/chart/axis.rb +3 -3
- data/lib/write_xlsx/chart/scatter.rb +0 -15
- data/lib/write_xlsx/chart/series.rb +1 -1
- data/lib/write_xlsx/chart.rb +31 -33
- data/lib/write_xlsx/chartsheet.rb +3 -3
- data/lib/write_xlsx/drawing.rb +118 -55
- data/lib/write_xlsx/format.rb +11 -179
- data/lib/write_xlsx/package/app.rb +5 -5
- data/lib/write_xlsx/package/button.rb +8 -8
- data/lib/write_xlsx/package/comments.rb +8 -8
- data/lib/write_xlsx/package/conditional_format.rb +2 -8
- data/lib/write_xlsx/package/content_types.rb +18 -9
- data/lib/write_xlsx/package/core.rb +5 -5
- data/lib/write_xlsx/package/custom.rb +2 -2
- data/lib/write_xlsx/package/metadata.rb +159 -0
- data/lib/write_xlsx/package/packager.rb +22 -0
- data/lib/write_xlsx/package/shared_strings.rb +6 -6
- data/lib/write_xlsx/package/styles.rb +27 -14
- data/lib/write_xlsx/package/table.rb +31 -23
- data/lib/write_xlsx/package/theme.rb +1 -1
- data/lib/write_xlsx/package/vml.rb +43 -43
- data/lib/write_xlsx/shape.rb +17 -15
- data/lib/write_xlsx/sparkline.rb +340 -340
- data/lib/write_xlsx/utility.rb +9 -24
- data/lib/write_xlsx/version.rb +1 -1
- data/lib/write_xlsx/workbook.rb +193 -643
- data/lib/write_xlsx/worksheet/cell_data.rb +25 -3
- data/lib/write_xlsx/worksheet/data_validation.rb +21 -26
- data/lib/write_xlsx/worksheet/hyperlink.rb +4 -4
- data/lib/write_xlsx/worksheet/page_setup.rb +12 -12
- data/lib/write_xlsx/worksheet.rb +461 -4233
- data/test/drawing/{test_write_ext.rb → test_write_xdr_ext.rb} +2 -2
- data/test/perl_output/background.xlsx +0 -0
- data/test/perl_output/ignore_errors.xlsx +0 -0
- data/test/regression/images/logo.gif +0 -0
- data/test/regression/images/logo.jpg +0 -0
- data/test/regression/images/red.gif +0 -0
- data/test/regression/test_background01.rb +23 -0
- data/test/regression/test_background02.rb +23 -0
- data/test/regression/test_background03.rb +24 -0
- data/test/regression/test_background04.rb +25 -0
- data/test/regression/test_background05.rb +25 -0
- data/test/regression/test_background06.rb +31 -0
- data/test/regression/test_background07.rb +37 -0
- data/test/regression/test_chart_axis47.rb +52 -0
- data/test/regression/test_chart_axis48.rb +53 -0
- data/test/regression/test_chart_crossing01.rb +1 -1
- data/test/regression/test_chart_crossing05.rb +46 -0
- data/test/regression/test_chart_crossing06.rb +46 -0
- data/test/regression/test_chart_data_labels48.rb +55 -0
- data/test/regression/test_chart_data_labels49.rb +55 -0
- data/test/regression/test_chart_data_labels50.rb +57 -0
- data/test/regression/test_dynamic_array01.rb +25 -0
- data/test/regression/test_format16.rb +24 -0
- data/test/regression/test_format17.rb +24 -0
- data/test/regression/test_header04.rb +30 -0
- data/test/regression/test_hyperlink50.rb +27 -0
- data/test/regression/test_hyperlink51.rb +27 -0
- data/test/regression/test_ignore_error01.rb +23 -0
- data/test/regression/test_ignore_error02.rb +24 -0
- data/test/regression/test_ignore_error03.rb +26 -0
- data/test/regression/test_ignore_error04.rb +26 -0
- data/test/regression/test_ignore_error05.rb +32 -0
- data/test/regression/test_ignore_error06.rb +32 -0
- data/test/regression/test_image52.rb +26 -0
- data/test/regression/test_image53.rb +26 -0
- data/test/regression/test_image54.rb +26 -0
- data/test/regression/test_image55.rb +27 -0
- data/test/regression/test_image56.rb +23 -0
- data/test/regression/test_image57.rb +23 -0
- data/test/regression/test_protect04.rb +32 -0
- data/test/regression/test_protect05.rb +35 -0
- data/test/regression/test_protect06.rb +35 -0
- data/test/regression/test_protect07.rb +23 -0
- data/test/regression/test_set_column10.rb +55 -0
- data/test/regression/test_set_column11.rb +48 -0
- data/test/regression/test_set_row01.rb +35 -0
- data/test/regression/test_set_row02.rb +35 -0
- data/test/regression/test_set_row03.rb +35 -0
- data/test/regression/test_set_row04.rb +35 -0
- data/test/regression/test_table26.rb +38 -0
- data/test/regression/xlsx_files/background01.xlsx +0 -0
- data/test/regression/xlsx_files/background02.xlsx +0 -0
- data/test/regression/xlsx_files/background03.xlsx +0 -0
- data/test/regression/xlsx_files/background04.xlsx +0 -0
- data/test/regression/xlsx_files/background05.xlsx +0 -0
- data/test/regression/xlsx_files/background06.xlsx +0 -0
- data/test/regression/xlsx_files/background07.xlsx +0 -0
- data/test/regression/xlsx_files/chart_axis47.xlsx +0 -0
- data/test/regression/xlsx_files/chart_axis48.xlsx +0 -0
- data/test/regression/xlsx_files/chart_crossing05.xlsx +0 -0
- data/test/regression/xlsx_files/chart_crossing06.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels48.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels49.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels50.xlsx +0 -0
- data/test/regression/xlsx_files/dynamic_array01.xlsx +0 -0
- data/test/regression/xlsx_files/format16.xlsx +0 -0
- data/test/regression/xlsx_files/format17.xlsx +0 -0
- data/test/regression/xlsx_files/header04.xlsx +0 -0
- data/test/regression/xlsx_files/hyperlink50.xlsx +0 -0
- data/test/regression/xlsx_files/hyperlink51.xlsx +0 -0
- data/test/regression/xlsx_files/ignore_error01.xlsx +0 -0
- data/test/regression/xlsx_files/ignore_error02.xlsx +0 -0
- data/test/regression/xlsx_files/ignore_error03.xlsx +0 -0
- data/test/regression/xlsx_files/ignore_error04.xlsx +0 -0
- data/test/regression/xlsx_files/ignore_error05.xlsx +0 -0
- data/test/regression/xlsx_files/ignore_error06.xlsx +0 -0
- data/test/regression/xlsx_files/image52.xlsx +0 -0
- data/test/regression/xlsx_files/image53.xlsx +0 -0
- data/test/regression/xlsx_files/image54.xlsx +0 -0
- data/test/regression/xlsx_files/image55.xlsx +0 -0
- data/test/regression/xlsx_files/image56.xlsx +0 -0
- data/test/regression/xlsx_files/image57.xlsx +0 -0
- data/test/regression/xlsx_files/protect04.xlsx +0 -0
- data/test/regression/xlsx_files/protect05.xlsx +0 -0
- data/test/regression/xlsx_files/protect06.xlsx +0 -0
- data/test/regression/xlsx_files/protect07.xlsx +0 -0
- data/test/regression/xlsx_files/set_row01.xlsx +0 -0
- data/test/regression/xlsx_files/set_row03.xlsx +0 -0
- data/test/regression/xlsx_files/table26.xlsx +0 -0
- data/test/test_example_match.rb +43 -0
- data/test/utility/test_range.rb +20 -0
- data/test/worksheet/test_pixels_to_row_col.rb +46 -0
- metadata +190 -8
@@ -63,9 +63,9 @@ module Writexlsx
|
|
63
63
|
|
64
64
|
attributes =
|
65
65
|
[
|
66
|
-
|
67
|
-
|
68
|
-
|
66
|
+
['xmlns', schema + '/spreadsheetml/2006/main'],
|
67
|
+
['count', total_count],
|
68
|
+
['uniqueCount', unique_count]
|
69
69
|
]
|
70
70
|
|
71
71
|
@writer.tag_elements('sst', attributes) { yield }
|
@@ -94,9 +94,9 @@ module Writexlsx
|
|
94
94
|
|
95
95
|
# Convert control character to the _xHHHH_ escape.
|
96
96
|
string = string.gsub(
|
97
|
-
|
98
|
-
|
99
|
-
|
97
|
+
/([\x00-\x08\x0B-\x1F])/,
|
98
|
+
sprintf("_x%04X_", $1.ord)
|
99
|
+
) if string =~ /([\x00-\x08\x0B-\x1F])/
|
100
100
|
|
101
101
|
# Convert character to \xC2\xxx or \xC3\xxx
|
102
102
|
if string.bytesize == 1 && 0x80 <= string.ord && string.ord <= 0xFF
|
@@ -56,11 +56,11 @@ module Writexlsx
|
|
56
56
|
# based on the default or user defined values in the Workbook palette.
|
57
57
|
#
|
58
58
|
def palette_color(index)
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
59
|
+
if index.to_s =~ /^#([0-9A-F]{6})$/i
|
60
|
+
"FF#{$1.upcase}"
|
61
|
+
else
|
62
|
+
"FF#{super(index)}"
|
63
|
+
end
|
64
64
|
end
|
65
65
|
|
66
66
|
#
|
@@ -253,11 +253,22 @@ module Writexlsx
|
|
253
253
|
# Write the <fill> element.
|
254
254
|
#
|
255
255
|
def write_fill(format, dxf_format = nil)
|
256
|
-
|
257
|
-
|
256
|
+
# Special handling for pattern only case.
|
257
|
+
if pattern_only_case?(format, dxf_format)
|
258
|
+
write_default_fill(PATTERNS[format.pattern])
|
259
|
+
else
|
260
|
+
@writer.tag_elements('fill' ) do
|
261
|
+
write_fill_base(format, dxf_format)
|
262
|
+
end
|
258
263
|
end
|
259
264
|
end
|
260
265
|
|
266
|
+
def pattern_only_case?(format, dxf_format)
|
267
|
+
bg_color, fg_color = bg_and_fg_color(format, dxf_format)
|
268
|
+
|
269
|
+
!ptrue?(fg_color) && !ptrue?(bg_color) && ptrue?(format.pattern)
|
270
|
+
end
|
271
|
+
|
261
272
|
def write_fill_base(format, dxf_format)
|
262
273
|
# The "none" pattern is handled differently for dxf formats.
|
263
274
|
if dxf_format && format.pattern <= 1
|
@@ -281,7 +292,9 @@ module Writexlsx
|
|
281
292
|
if bg_color && bg_color != 0
|
282
293
|
@writer.empty_tag('bgColor', [ ['rgb', palette_color(bg_color)] ])
|
283
294
|
else
|
284
|
-
|
295
|
+
if !dxf_format && format.pattern <= 1
|
296
|
+
@writer.empty_tag('bgColor', [ ['indexed', 64] ])
|
297
|
+
end
|
285
298
|
end
|
286
299
|
end
|
287
300
|
|
@@ -513,9 +526,9 @@ module Writexlsx
|
|
513
526
|
#
|
514
527
|
def write_cell_style(name, xf_id, builtin_id)
|
515
528
|
attributes = [
|
516
|
-
|
517
|
-
|
518
|
-
|
529
|
+
['name', name],
|
530
|
+
['xfId', xf_id],
|
531
|
+
['builtinId', builtin_id]
|
519
532
|
]
|
520
533
|
|
521
534
|
@writer.empty_tag('cellStyle', attributes)
|
@@ -557,9 +570,9 @@ module Writexlsx
|
|
557
570
|
#
|
558
571
|
def write_table_styles
|
559
572
|
attributes = [
|
560
|
-
|
561
|
-
|
562
|
-
|
573
|
+
['count', 0],
|
574
|
+
['defaultTableStyle', 'TableStyleMedium9'],
|
575
|
+
['defaultPivotStyle', 'PivotStyleLight16']
|
563
576
|
]
|
564
577
|
|
565
578
|
@writer.empty_tag('tableStyles', attributes)
|
@@ -117,8 +117,8 @@ module Writexlsx
|
|
117
117
|
)
|
118
118
|
elsif user_data[:total_string]
|
119
119
|
total_label_only(
|
120
|
-
|
121
|
-
|
120
|
+
@row2, col_num, col_data, user_data[:total_string], user_data[:format]
|
121
|
+
)
|
122
122
|
end
|
123
123
|
|
124
124
|
# Get the dxf format index.
|
@@ -181,7 +181,7 @@ module Writexlsx
|
|
181
181
|
row1, row2 = row2, row1 if row1 > row2
|
182
182
|
col1, col2 = col2, col1 if col1 > col2
|
183
183
|
|
184
|
-
|
184
|
+
# The final hash contains the validation parameters.
|
185
185
|
param ||= {}
|
186
186
|
|
187
187
|
# Turn on Excel's defaults.
|
@@ -189,6 +189,14 @@ module Writexlsx
|
|
189
189
|
param[:header_row] ||= 1
|
190
190
|
param[:autofilter] ||= 1
|
191
191
|
|
192
|
+
# Check that there are enough rows.
|
193
|
+
num_rows = row2 - row1
|
194
|
+
num_rows -= 1 if ptrue?(param[:header_row])
|
195
|
+
|
196
|
+
if num_rows < 0
|
197
|
+
raise "Must have at least one data row in in add_table()"
|
198
|
+
end
|
199
|
+
|
192
200
|
# If the header row if off the default is to turn autofilter off.
|
193
201
|
param[:autofilter] = 0 if param[:header_row] == 0
|
194
202
|
|
@@ -200,17 +208,17 @@ module Writexlsx
|
|
200
208
|
# List of valid input parameters.
|
201
209
|
def valid_table_parameter
|
202
210
|
[
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
211
|
+
:autofilter,
|
212
|
+
:banded_columns,
|
213
|
+
:banded_rows,
|
214
|
+
:columns,
|
215
|
+
:data,
|
216
|
+
:first_column,
|
217
|
+
:header_row,
|
218
|
+
:last_column,
|
219
|
+
:name,
|
220
|
+
:style,
|
221
|
+
:total_row
|
214
222
|
]
|
215
223
|
end
|
216
224
|
|
@@ -323,12 +331,12 @@ module Writexlsx
|
|
323
331
|
xmlns = "#{schema}spreadsheetml/2006/main"
|
324
332
|
|
325
333
|
attributes = [
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
334
|
+
['xmlns', xmlns],
|
335
|
+
['id', id],
|
336
|
+
['name', @name],
|
337
|
+
['displayName', @name],
|
338
|
+
['ref', @range]
|
339
|
+
]
|
332
340
|
|
333
341
|
unless ptrue?(@header_row_count)
|
334
342
|
attributes << ['headerRowCount', 0]
|
@@ -370,9 +378,9 @@ module Writexlsx
|
|
370
378
|
#
|
371
379
|
def write_table_column(col_data)
|
372
380
|
attributes = [
|
373
|
-
|
374
|
-
|
375
|
-
|
381
|
+
['id', col_data.id],
|
382
|
+
['name', col_data.name]
|
383
|
+
]
|
376
384
|
|
377
385
|
if ptrue?(col_data.total_string)
|
378
386
|
attributes << [:totalsRowLabel, col_data.total_string]
|
@@ -36,7 +36,7 @@ module Writexlsx
|
|
36
36
|
#
|
37
37
|
def write_theme_file
|
38
38
|
theme =
|
39
|
-
%Q{<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
39
|
+
%Q{<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
40
40
|
<a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme"><a:themeElements><a:clrScheme name="Office"><a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1><a:lt1><a:sysClr val="window" lastClr="FFFFFF"/></a:lt1><a:dk2><a:srgbClr val="1F497D"/></a:dk2><a:lt2><a:srgbClr val="EEECE1"/></a:lt2><a:accent1><a:srgbClr val="4F81BD"/></a:accent1><a:accent2><a:srgbClr val="C0504D"/></a:accent2><a:accent3><a:srgbClr val="9BBB59"/></a:accent3><a:accent4><a:srgbClr val="8064A2"/></a:accent4><a:accent5><a:srgbClr val="4BACC6"/></a:accent5><a:accent6><a:srgbClr val="F79646"/></a:accent6><a:hlink><a:srgbClr val="0000FF"/></a:hlink><a:folHlink><a:srgbClr val="800080"/></a:folHlink></a:clrScheme><a:fontScheme name="Office"><a:majorFont><a:latin typeface="Cambria"/><a:ea typeface=""/><a:cs typeface=""/><a:font script="Jpan" typeface="MS Pゴシック"/><a:font script="Hang" typeface="맑은 고딕"/><a:font script="Hans" typeface="宋体"/><a:font script="Hant" typeface="新細明體"/><a:font script="Arab" typeface="Times New Roman"/><a:font script="Hebr" typeface="Times New Roman"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="MoolBoran"/><a:font script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Times New Roman"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:majorFont><a:minorFont><a:latin typeface="Calibri"/><a:ea typeface=""/><a:cs typeface=""/><a:font script="Jpan" typeface="MS Pゴシック"/><a:font script="Hang" typeface="맑은 고딕"/><a:font script="Hans" typeface="宋体"/><a:font script="Hant" typeface="新細明體"/><a:font script="Arab" typeface="Arial"/><a:font script="Hebr" typeface="Arial"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="DaunPenh"/><a:font script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Arial"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:minorFont></a:fontScheme><a:fmtScheme name="Office"><a:fillStyleLst><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="50000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="35000"><a:schemeClr val="phClr"><a:tint val="37000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="15000"/><a:satMod val="350000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="1"/></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:shade val="51000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs pos="80000"><a:schemeClr val="phClr"><a:shade val="93000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="94000"/><a:satMod val="135000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="0"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w="9525" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"><a:shade val="95000"/><a:satMod val="105000"/></a:schemeClr></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="25400" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="38100" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln></a:lnStyleLst><a:effectStyleLst><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="20000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="38000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst><a:scene3d><a:camera prst="orthographicFront"><a:rot lat="0" lon="0" rev="0"/></a:camera><a:lightRig rig="threePt" dir="t"><a:rot lat="0" lon="0" rev="1200000"/></a:lightRig></a:scene3d><a:sp3d><a:bevelT w="63500" h="25400"/></a:sp3d></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="40000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="40000"><a:schemeClr val="phClr"><a:tint val="45000"/><a:shade val="99000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="20000"/><a:satMod val="255000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="-80000" r="50000" b="180000"/></a:path></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="80000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="30000"/><a:satMod val="200000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="50000" r="50000" b="50000"/></a:path></a:gradFill></a:bgFillStyleLst></a:fmtScheme></a:themeElements><a:objectDefaults/><a:extraClrSchemeLst/></a:theme>}
|
41
41
|
@writer.write(theme)
|
42
42
|
end
|
@@ -37,8 +37,8 @@ module Writexlsx
|
|
37
37
|
end
|
38
38
|
unless comments_data.empty?
|
39
39
|
write_shape_type_and_shape(
|
40
|
-
|
41
|
-
|
40
|
+
comments_data,
|
41
|
+
vml_shape_id, z_index) do
|
42
42
|
write_comment_shapetype
|
43
43
|
end
|
44
44
|
end
|
@@ -84,9 +84,9 @@ module Writexlsx
|
|
84
84
|
def xml_attributes
|
85
85
|
schema = 'urn:schemas-microsoft-com:'
|
86
86
|
[
|
87
|
-
|
88
|
-
|
89
|
-
|
87
|
+
['xmlns:v', "#{schema}vml"],
|
88
|
+
['xmlns:o', "#{schema}office:office"],
|
89
|
+
['xmlns:x', "#{schema}office:excel"]
|
90
90
|
]
|
91
91
|
end
|
92
92
|
|
@@ -95,8 +95,8 @@ module Writexlsx
|
|
95
95
|
#
|
96
96
|
def write_shapelayout(data_id)
|
97
97
|
attributes = [
|
98
|
-
|
99
|
-
|
98
|
+
['v:ext', 'edit']
|
99
|
+
]
|
100
100
|
|
101
101
|
@writer.tag_elements('o:shapelayout', attributes) do
|
102
102
|
# Write the o:idmap element.
|
@@ -121,10 +121,10 @@ module Writexlsx
|
|
121
121
|
#
|
122
122
|
def write_comment_shapetype
|
123
123
|
attributes = [
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
124
|
+
['id', '_x0000_t202'],
|
125
|
+
['coordsize', '21600,21600'],
|
126
|
+
['o:spt', 202],
|
127
|
+
['path', 'm,l,21600r21600,l21600,xe']
|
128
128
|
]
|
129
129
|
|
130
130
|
@writer.tag_elements('v:shapetype', attributes) do
|
@@ -140,11 +140,11 @@ module Writexlsx
|
|
140
140
|
#
|
141
141
|
def write_button_shapetype
|
142
142
|
attributes = [
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
143
|
+
['id', '_x0000_t201'],
|
144
|
+
['coordsize', '21600,21600'],
|
145
|
+
['o:spt', 201],
|
146
|
+
['path', 'm,l,21600r21600,l21600,xe']
|
147
|
+
]
|
148
148
|
|
149
149
|
@writer.tag_elements('v:shapetype', attributes) do
|
150
150
|
# Write the v:stroke element.
|
@@ -169,14 +169,14 @@ module Writexlsx
|
|
169
169
|
stroked = 'f'
|
170
170
|
|
171
171
|
attributes = [
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
172
|
+
['id', id],
|
173
|
+
['coordsize', coordsize],
|
174
|
+
['o:spt', spt],
|
175
|
+
['o:preferrelative', o_preferrelative],
|
176
|
+
['path', path],
|
177
|
+
['filled', filled],
|
178
|
+
['stroked', stroked]
|
179
|
+
]
|
180
180
|
|
181
181
|
@writer.tag_elements('v:shapetype', attributes) do
|
182
182
|
# Write the v:stroke element.
|
@@ -198,12 +198,12 @@ module Writexlsx
|
|
198
198
|
#
|
199
199
|
def write_button_path
|
200
200
|
attributes = [
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
201
|
+
['shadowok', 'f'],
|
202
|
+
['o:extrusionok', 'f'],
|
203
|
+
['strokeok', 'f'],
|
204
|
+
['fillok', 'f'],
|
205
|
+
['o:connecttype', 'rect']
|
206
|
+
]
|
207
207
|
@writer.empty_tag('v:path', attributes)
|
208
208
|
end
|
209
209
|
|
@@ -216,10 +216,10 @@ module Writexlsx
|
|
216
216
|
connecttype = 'rect'
|
217
217
|
|
218
218
|
attributes = [
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
219
|
+
['o:extrusionok', extrusionok],
|
220
|
+
['gradientshapeok', gradientshapeok],
|
221
|
+
['o:connecttype', connecttype]
|
222
|
+
]
|
223
223
|
|
224
224
|
@writer.empty_tag('v:path', attributes)
|
225
225
|
end
|
@@ -229,9 +229,9 @@ module Writexlsx
|
|
229
229
|
#
|
230
230
|
def write_shapetype_lock
|
231
231
|
attributes = [
|
232
|
-
|
233
|
-
|
234
|
-
|
232
|
+
['v:ext', 'edit'],
|
233
|
+
['shapetype', 't']
|
234
|
+
]
|
235
235
|
@writer.empty_tag('o:lock', attributes)
|
236
236
|
end
|
237
237
|
|
@@ -240,9 +240,9 @@ module Writexlsx
|
|
240
240
|
#
|
241
241
|
def write_rotation_lock
|
242
242
|
attributes = [
|
243
|
-
|
244
|
-
|
245
|
-
|
243
|
+
['v:ext', 'edit'],
|
244
|
+
['rotation', 't']
|
245
|
+
]
|
246
246
|
@writer.empty_tag('o:lock', attributes)
|
247
247
|
end
|
248
248
|
|
@@ -254,9 +254,9 @@ module Writexlsx
|
|
254
254
|
aspectratio = 't'
|
255
255
|
|
256
256
|
attributes = [
|
257
|
-
|
258
|
-
|
259
|
-
|
257
|
+
['v:ext', ext],
|
258
|
+
['aspectratio', aspectratio]
|
259
|
+
]
|
260
260
|
|
261
261
|
@writer.empty_tag('o:lock', attributes)
|
262
262
|
end
|
data/lib/write_xlsx/shape.rb
CHANGED
@@ -154,15 +154,17 @@ module Writexlsx
|
|
154
154
|
# EMUs per point. Therefore, 12,700 * 3 /4 = 9,525 EMUs per pixel.
|
155
155
|
#
|
156
156
|
def calc_position_emus(worksheet)
|
157
|
-
c_start, r_start,
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
157
|
+
c_start, r_start,
|
158
|
+
xx1, yy1, c_end, r_end,
|
159
|
+
xx2, yy2, x_abslt, y_abslt =
|
160
|
+
worksheet.position_object_pixels(
|
161
|
+
@column_start,
|
162
|
+
@row_start,
|
163
|
+
@x_offset,
|
164
|
+
@y_offset,
|
165
|
+
@width * @scale_x,
|
166
|
+
@height * @scale_y
|
167
|
+
)
|
166
168
|
|
167
169
|
# Now that x2/y2 have been calculated with a potentially negative
|
168
170
|
# width/height we use the absolute value and convert to EMUs.
|
@@ -297,12 +299,12 @@ module Writexlsx
|
|
297
299
|
|
298
300
|
def dimensions
|
299
301
|
[
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
302
|
+
@column_start, @row_start,
|
303
|
+
@x1, @y1,
|
304
|
+
@column_end, @row_end,
|
305
|
+
@x2, @y2,
|
306
|
+
@x_abs, @y_abs,
|
307
|
+
@width_emu, @height_emu
|
306
308
|
]
|
307
309
|
end
|
308
310
|
end
|