write_xlsx 1.07.0 → 1.09.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|