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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c6e34fc6f5c19637ceda0a196039c186fea4e0b6959c1d99d6d13260854cf0fd
|
4
|
+
data.tar.gz: c582b95f3b8e9851015bd8555a8d6b5a1e9d9d9f4cec1e66357ea328963b765e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 00a16bb85b40a0e8ca072e1afaac2723f9bd845d28c4ea495c8c9fab0e4bad40c2f2b6cbe2875cdec97fcb8a0ad0a1f53a357c479e838bb873debba49e8de8f5
|
7
|
+
data.tar.gz: ae74b4e1506d658d770c3667f45043e3f999d10bce0700e48a40c0cfcc1d07ce7d40e4a77e8b51ea7b65dbaecc2b131a9793b124e064c9e5448ee50e5c16808e
|
data/Changes
CHANGED
@@ -1,5 +1,45 @@
|
|
1
1
|
Change history of write_xlsx rubygem.
|
2
2
|
|
3
|
+
2021-11-26 v1.09.0
|
4
|
+
|
5
|
+
Added support for background images in worksheets. See set_background().
|
6
|
+
|
7
|
+
Added support for GIF image files (and in Excel 365, animated GIF files).
|
8
|
+
|
9
|
+
Added support for pixel sizing in set_row() and set_column() via new
|
10
|
+
functions called set_row_pixels() and set_column_pixels().
|
11
|
+
|
12
|
+
2021-11-19 v1.08.0
|
13
|
+
|
14
|
+
Added ability to add accessibility options "description" and
|
15
|
+
"decorative" to images via insert_image().
|
16
|
+
|
17
|
+
Added the workbook read_only_recommended() method to set the Excel
|
18
|
+
"Read-only Recommended" option that is available when saving a file.
|
19
|
+
|
20
|
+
Added option to set a chart crossing to 'min' as well as the existing
|
21
|
+
'max' option. The 'min' option isn't available in the Excel interface
|
22
|
+
but can be enabled via VBA.
|
23
|
+
|
24
|
+
Added option to unprotect ranges in protected worksheets.
|
25
|
+
|
26
|
+
Added check, and warning, for worksheet tables with no data row. Either
|
27
|
+
with or without a header row.
|
28
|
+
|
29
|
+
Added ignore_errors() worksheet method to ignore Excel worksheet
|
30
|
+
errors/warnings in user defined ranges.
|
31
|
+
|
32
|
+
Fixed issue where pattern formats without colours where given a default
|
33
|
+
black fill colour.
|
34
|
+
|
35
|
+
Fix issue where custom chart data labels didn't inherit the position for
|
36
|
+
the data labels in the series.
|
37
|
+
|
38
|
+
Fixed issue with relative url links in images.
|
39
|
+
|
40
|
+
Fixed issue where headers/footers were restricted to 254 characters
|
41
|
+
instead of 255.
|
42
|
+
|
3
43
|
2021-02-17 v1.07.0
|
4
44
|
|
5
45
|
Added support for Border, Fill, Pattern and Gradient formatting to chart
|
data/README.md
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
gem to create a new file in the Excel 2007+ XLSX format, and you can use the
|
7
7
|
same interface as writeexcel gem. write_xlsx is converted from Perl's module
|
8
|
-
[Excel::Writer::XLSX-1.
|
8
|
+
[Excel::Writer::XLSX-1.09](https://github.com/jmcnamara/excel-writer-xlsx/tree/CPAN_1.09)
|
9
9
|
|
10
10
|
## Description
|
11
11
|
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
|
4
|
+
#######################################################################
|
5
|
+
#
|
6
|
+
# An example of setting a worksheet background image with Excel::Writer::XLSX.
|
7
|
+
#
|
8
|
+
# Copyright 2000-2021, John McNamara, jmcnamara@cpan.org
|
9
|
+
# convert to ruby by Hideo NAKAMURA, nakamura.hideo@gmail.com
|
10
|
+
#
|
11
|
+
|
12
|
+
require 'write_xlsx'
|
13
|
+
|
14
|
+
workbook = WriteXLSX.new('background.xlsx')
|
15
|
+
worksheet = workbook.add_worksheet
|
16
|
+
|
17
|
+
worksheet.set_background('republic.png')
|
18
|
+
|
19
|
+
workbook.close
|
@@ -0,0 +1,39 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
|
4
|
+
##############################################################################
|
5
|
+
#
|
6
|
+
# An example of turning off worksheet cells errors/warnings using the
|
7
|
+
# Excel::Writer::XLSX module.
|
8
|
+
#
|
9
|
+
# Copyright 2000-2021, John McNamara, jmcnamara@cpan.org
|
10
|
+
# convert to ruby by Hideo NAKAMURA, nakamura.hideo@gmail.com
|
11
|
+
#
|
12
|
+
|
13
|
+
require 'write_xlsx'
|
14
|
+
|
15
|
+
workbook = WriteXLSX.new('ignore_errors.xlsx')
|
16
|
+
worksheet = workbook.add_worksheet
|
17
|
+
|
18
|
+
# Write strings that looks like numbers. This will cause an Excel warning.
|
19
|
+
worksheet.write_string('C2', '123')
|
20
|
+
worksheet.write_string('C3', '123')
|
21
|
+
|
22
|
+
# Write a divide by zero formula. This will also cause an Excel warning.
|
23
|
+
worksheet.write_formula('C5', '=1/0')
|
24
|
+
worksheet.write_formula('C6', '=1/0')
|
25
|
+
|
26
|
+
# Turn off some of the warnings:
|
27
|
+
worksheet.ignore_errors(
|
28
|
+
:number_stored_as_text => 'C3',
|
29
|
+
:eval_error => 'C6'
|
30
|
+
)
|
31
|
+
|
32
|
+
# Write some descriptions for the cells and make the column wider for clarity.
|
33
|
+
worksheet.set_column('B:B', 16)
|
34
|
+
worksheet.write('B2', 'Warning:')
|
35
|
+
worksheet.write('B3', 'Warning turned off:')
|
36
|
+
worksheet.write('B5', 'Warning:')
|
37
|
+
worksheet.write('B6', 'Warning turned off:')
|
38
|
+
|
39
|
+
workbook.close
|
data/ignore_errors.xlsx
ADDED
Binary file
|
@@ -87,8 +87,8 @@ module Writexlsx
|
|
87
87
|
|
88
88
|
def num_fmt_attributes
|
89
89
|
[
|
90
|
-
|
91
|
-
|
90
|
+
['formatCode', @num_format],
|
91
|
+
['sourceLinked', source_linked]
|
92
92
|
]
|
93
93
|
end
|
94
94
|
|
@@ -175,7 +175,7 @@ module Writexlsx
|
|
175
175
|
if @position_axis == 'on_tick'
|
176
176
|
@position_axis = 'midCat'
|
177
177
|
elsif @position_axis == 'between'
|
178
|
-
|
178
|
+
# Doesn't neet to be modified.
|
179
179
|
else
|
180
180
|
# Otherwise use the default value.
|
181
181
|
@position_axis = nil
|
@@ -17,21 +17,6 @@ require 'write_xlsx/utility'
|
|
17
17
|
|
18
18
|
module Writexlsx
|
19
19
|
class Chart
|
20
|
-
# The Scatter chart module also supports the following sub-types:
|
21
|
-
#
|
22
|
-
# markers_only (the default)
|
23
|
-
# straight_with_markers
|
24
|
-
# straight
|
25
|
-
# smooth_with_markers
|
26
|
-
# smooth
|
27
|
-
# These can be specified at creation time via the add_chart() Worksheet
|
28
|
-
# method:
|
29
|
-
#
|
30
|
-
# chart = workbook.add_chart(
|
31
|
-
# :type => 'scatter',
|
32
|
-
# :subtype => 'straight_with_markers'
|
33
|
-
# )
|
34
|
-
#
|
35
20
|
class Scatter < self
|
36
21
|
include Writexlsx::Utility
|
37
22
|
include Writexlsx::WriteDPtPoint
|
@@ -192,7 +192,7 @@ module Writexlsx
|
|
192
192
|
@values = aref_to_formula(params[:values])
|
193
193
|
@categories = aref_to_formula(params[:categories])
|
194
194
|
@name, @name_formula =
|
195
|
-
|
195
|
+
chart.process_names(params[:name], params[:name_formula])
|
196
196
|
|
197
197
|
set_data_ids(params)
|
198
198
|
|
data/lib/write_xlsx/chart.rb
CHANGED
@@ -165,16 +165,16 @@ module Writexlsx
|
|
165
165
|
include Writexlsx::Utility
|
166
166
|
include Writexlsx::Gradient
|
167
167
|
|
168
|
-
attr_accessor :id, :name
|
169
|
-
attr_writer :index, :palette, :protection
|
170
|
-
attr_reader :embedded, :formula_ids, :formula_data
|
171
|
-
attr_reader :x_scale, :y_scale, :x_offset, :y_offset
|
172
|
-
attr_reader :width, :height
|
168
|
+
attr_accessor :id, :name # :nodoc:
|
169
|
+
attr_writer :index, :palette, :protection # :nodoc:
|
170
|
+
attr_reader :embedded, :formula_ids, :formula_data # :nodoc:
|
171
|
+
attr_reader :x_scale, :y_scale, :x_offset, :y_offset # :nodoc:
|
172
|
+
attr_reader :width, :height # :nodoc:
|
173
173
|
attr_reader :label_positions, :label_position_default, :combined # :nodoc:
|
174
|
-
attr_writer :date_category, :already_inserted
|
175
|
-
attr_writer :series_index
|
176
|
-
attr_writer :writer
|
177
|
-
attr_reader :x2_axis, :y2_axis, :axis2_ids
|
174
|
+
attr_writer :date_category, :already_inserted # :nodoc:
|
175
|
+
attr_writer :series_index # :nodoc:
|
176
|
+
attr_writer :writer # :nodoc:
|
177
|
+
attr_reader :x2_axis, :y2_axis, :axis2_ids # :nodoc:
|
178
178
|
|
179
179
|
#
|
180
180
|
# Factory method for returning chart objects based on their class type.
|
@@ -1057,7 +1057,7 @@ module Writexlsx
|
|
1057
1057
|
end
|
1058
1058
|
|
1059
1059
|
def write_val_base(formula, data_id, tag) # :nodoc:
|
1060
|
-
data
|
1060
|
+
data = @formula_data[data_id]
|
1061
1061
|
|
1062
1062
|
@writer.tag_elements(tag) do
|
1063
1063
|
# Unlike Cat axes data should only be numeric.
|
@@ -1397,7 +1397,7 @@ module Writexlsx
|
|
1397
1397
|
|
1398
1398
|
def write_crossing(crossing)
|
1399
1399
|
# Note, the category crossing comes from the value axis.
|
1400
|
-
if
|
1400
|
+
if [nil, 'max', 'min'].include?(crossing)
|
1401
1401
|
# Write the c:crosses element.
|
1402
1402
|
write_crosses(crossing)
|
1403
1403
|
else
|
@@ -1408,11 +1408,11 @@ module Writexlsx
|
|
1408
1408
|
|
1409
1409
|
def write_scaling_with_param(param)
|
1410
1410
|
write_scaling(
|
1411
|
-
|
1412
|
-
|
1413
|
-
|
1414
|
-
|
1415
|
-
|
1411
|
+
param.reverse,
|
1412
|
+
param.min,
|
1413
|
+
param.max,
|
1414
|
+
param.log_base
|
1415
|
+
)
|
1416
1416
|
end
|
1417
1417
|
#
|
1418
1418
|
# Write the <c:scaling> element.
|
@@ -1443,7 +1443,7 @@ module Writexlsx
|
|
1443
1443
|
# Write the <c:orientation> element.
|
1444
1444
|
#
|
1445
1445
|
def write_orientation(reverse = nil) # :nodoc:
|
1446
|
-
val
|
1446
|
+
val = ptrue?(reverse) ? 'maxMin' : 'minMax'
|
1447
1447
|
|
1448
1448
|
@writer.empty_tag('c:orientation', [ ['val', val] ])
|
1449
1449
|
end
|
@@ -1499,9 +1499,9 @@ module Writexlsx
|
|
1499
1499
|
source_linked = 0
|
1500
1500
|
|
1501
1501
|
attributes = [
|
1502
|
-
|
1503
|
-
|
1504
|
-
|
1502
|
+
['formatCode', format_code],
|
1503
|
+
['sourceLinked', source_linked]
|
1504
|
+
]
|
1505
1505
|
|
1506
1506
|
@writer.empty_tag('c:numFmt', attributes)
|
1507
1507
|
end
|
@@ -1778,13 +1778,13 @@ module Writexlsx
|
|
1778
1778
|
footer = 0.3
|
1779
1779
|
|
1780
1780
|
attributes = [
|
1781
|
-
|
1782
|
-
|
1783
|
-
|
1784
|
-
|
1785
|
-
|
1786
|
-
|
1787
|
-
|
1781
|
+
['b', b],
|
1782
|
+
['l', l],
|
1783
|
+
['r', r],
|
1784
|
+
['t', t],
|
1785
|
+
['header', header],
|
1786
|
+
['footer', footer]
|
1787
|
+
]
|
1788
1788
|
|
1789
1789
|
@writer.empty_tag('c:pageMargins', attributes)
|
1790
1790
|
end
|
@@ -2272,7 +2272,7 @@ module Writexlsx
|
|
2272
2272
|
data.each_with_index do |token, i|
|
2273
2273
|
# Write non-numeric data as 0.
|
2274
2274
|
if token &&
|
2275
|
-
|
2275
|
+
!(token.to_s =~ /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/)
|
2276
2276
|
token = 0
|
2277
2277
|
end
|
2278
2278
|
|
@@ -2418,12 +2418,14 @@ module Writexlsx
|
|
2418
2418
|
elsif label[:formula]
|
2419
2419
|
write_custom_label_formula(label)
|
2420
2420
|
|
2421
|
+
write_d_lbl_pos(parent[:position]) if parent[:position]
|
2421
2422
|
write_show_val if parent[:value]
|
2422
2423
|
write_show_cat_name if parent[:category]
|
2423
2424
|
write_show_ser_name if parent[:series_name]
|
2424
2425
|
elsif label[:value]
|
2425
2426
|
write_custom_label_str(label)
|
2426
2427
|
|
2428
|
+
write_d_lbl_pos(parent[:position]) if parent[:position]
|
2427
2429
|
write_show_val if parent[:value]
|
2428
2430
|
write_show_cat_name if parent[:category]
|
2429
2431
|
write_show_ser_name if parent[:series_name]
|
@@ -2701,7 +2703,7 @@ module Writexlsx
|
|
2701
2703
|
end
|
2702
2704
|
|
2703
2705
|
def write_num_ref_or_lit(values, data)
|
2704
|
-
if values.to_s =~ /^=/
|
2706
|
+
if values.to_s =~ /^=/ # '=Sheet1!$A$1:$A$5'
|
2705
2707
|
write_num_ref(values, data, 'num')
|
2706
2708
|
else # [1, 2, 3]
|
2707
2709
|
write_num_lit(values)
|
@@ -2926,9 +2928,5 @@ module Writexlsx
|
|
2926
2928
|
@writer.empty_tag(tag)
|
2927
2929
|
end
|
2928
2930
|
end
|
2929
|
-
|
2930
|
-
def nil_or_max?(val) # :nodoc:
|
2931
|
-
val.nil? || val == 'max'
|
2932
|
-
end
|
2933
2931
|
end
|
2934
2932
|
end
|
@@ -204,9 +204,9 @@ module Writexlsx
|
|
204
204
|
mc_preserve_attributes = 'mv:*'
|
205
205
|
|
206
206
|
attributes = [
|
207
|
-
|
208
|
-
|
209
|
-
|
207
|
+
['xmlns', xmlns],
|
208
|
+
['xmlns:r', xmlns_r]
|
209
|
+
]
|
210
210
|
|
211
211
|
@writer.tag_elements('chartsheet', attributes) do
|
212
212
|
yield
|
data/lib/write_xlsx/drawing.rb
CHANGED
@@ -5,11 +5,11 @@ require 'write_xlsx/utility'
|
|
5
5
|
module Writexlsx
|
6
6
|
class Drawing
|
7
7
|
attr_accessor :type, :dimensions, :width, :height, :description, :shape, :anchor, :rel_index, :url_rel_index
|
8
|
-
attr_reader :tip
|
8
|
+
attr_reader :tip, :decorative
|
9
9
|
|
10
|
-
def initialize(type, dimensions, width, height, description, shape, anchor, rel_index = nil, url_rel_index = nil, tip = nil)
|
11
|
-
@type, @dimensions, @width, @height, @description, @shape, @anchor, @rel_index, @url_rel_index, @tip =
|
12
|
-
|
10
|
+
def initialize(type, dimensions, width, height, description, shape, anchor, rel_index = nil, url_rel_index = nil, tip = nil, decorative = nil)
|
11
|
+
@type, @dimensions, @width, @height, @description, @shape, @anchor, @rel_index, @url_rel_index, @tip, @decorative =
|
12
|
+
type, dimensions, width, height, description, shape, anchor, rel_index, url_rel_index, tip, decorative
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
@@ -70,8 +70,8 @@ module Writexlsx
|
|
70
70
|
def write_drawing_workspace
|
71
71
|
schema = 'http://schemas.openxmlformats.org/drawingml/'
|
72
72
|
attributes = [
|
73
|
-
|
74
|
-
|
73
|
+
['xmlns:xdr', "#{schema}2006/spreadsheetDrawing"],
|
74
|
+
['xmlns:a', "#{schema}2006/main"]
|
75
75
|
]
|
76
76
|
|
77
77
|
@writer.tag_elements('xdr:wsDr', attributes) { yield }
|
@@ -92,6 +92,7 @@ module Writexlsx
|
|
92
92
|
rel_index = drawing.rel_index
|
93
93
|
url_rel_index = drawing.url_rel_index
|
94
94
|
tip = drawing.tip
|
95
|
+
decorative = drawing.decorative
|
95
96
|
|
96
97
|
col_from, row_from, col_from_offset, row_from_offset,
|
97
98
|
col_to, row_to, col_to_offset, row_to_offset, col_absolute, row_absolute = drawing.dimensions
|
@@ -124,7 +125,7 @@ module Writexlsx
|
|
124
125
|
write_pic(
|
125
126
|
index, rel_index, col_absolute,
|
126
127
|
row_absolute, width, height,
|
127
|
-
description, url_rel_index , tip
|
128
|
+
description, url_rel_index , tip, decorative
|
128
129
|
)
|
129
130
|
else
|
130
131
|
# Write the xdr:sp element for shapes.
|
@@ -148,13 +149,13 @@ module Writexlsx
|
|
148
149
|
write_pos(0, 0)
|
149
150
|
|
150
151
|
# Write the xdr:ext element.
|
151
|
-
|
152
|
+
write_xdr_ext(9308969, 6078325)
|
152
153
|
else
|
153
154
|
# Write the xdr:pos element.
|
154
155
|
write_pos(0, -47625)
|
155
156
|
|
156
157
|
# Write the xdr:ext element.
|
157
|
-
|
158
|
+
write_xdr_ext(6162675, 6124575)
|
158
159
|
end
|
159
160
|
|
160
161
|
# Write the xdr:graphicFrame element.
|
@@ -165,7 +166,7 @@ module Writexlsx
|
|
165
166
|
end
|
166
167
|
end
|
167
168
|
|
168
|
-
|
169
|
+
#
|
169
170
|
# Write the <xdr:from> element.
|
170
171
|
#
|
171
172
|
def write_from(col, row, col_offset, row_offset)
|
@@ -242,7 +243,7 @@ module Writexlsx
|
|
242
243
|
#
|
243
244
|
# Write the <xdr:ext> element.
|
244
245
|
#
|
245
|
-
def
|
246
|
+
def write_xdr_ext(cx, cy)
|
246
247
|
attributes = [
|
247
248
|
['cx', cx],
|
248
249
|
['cy', cy]
|
@@ -286,19 +287,25 @@ module Writexlsx
|
|
286
287
|
#
|
287
288
|
# Write the <xdr:cNvPr> element.
|
288
289
|
#
|
289
|
-
def write_c_nv_pr(index, name, description = nil, url_rel_index = nil, tip = nil)
|
290
|
+
def write_c_nv_pr(index, name, description = nil, url_rel_index = nil, tip = nil, decorative = nil)
|
290
291
|
attributes = [
|
291
292
|
['id', index],
|
292
293
|
['name', name]
|
293
294
|
]
|
294
295
|
|
295
296
|
# Add description attribute for images.
|
296
|
-
attributes << ['descr', description] if description
|
297
|
+
attributes << ['descr', description] if ptrue?(description) && !ptrue?(decorative)
|
297
298
|
|
298
|
-
if ptrue?(url_rel_index)
|
299
|
+
if ptrue?(url_rel_index) || ptrue?(decorative)
|
299
300
|
@writer.tag_elements('xdr:cNvPr', attributes) do
|
300
|
-
|
301
|
-
|
301
|
+
if ptrue?(url_rel_index)
|
302
|
+
# Write the a:hlinkClick element.
|
303
|
+
write_a_hlink_click(url_rel_index, tip)
|
304
|
+
end
|
305
|
+
if ptrue?(decorative)
|
306
|
+
# Write the adec:decorative element.
|
307
|
+
write_decorative
|
308
|
+
end
|
302
309
|
end
|
303
310
|
else
|
304
311
|
@writer.empty_tag('xdr:cNvPr', attributes)
|
@@ -323,6 +330,62 @@ module Writexlsx
|
|
323
330
|
@writer.empty_tag('a:hlinkClick', attributes)
|
324
331
|
end
|
325
332
|
|
333
|
+
#
|
334
|
+
# Write the <adec:decorative> element.
|
335
|
+
#
|
336
|
+
def write_decorative
|
337
|
+
@writer.tag_elements('a:extLst') do
|
338
|
+
write_a_uri_ext('{FF2B5EF4-FFF2-40B4-BE49-F238E27FC236}')
|
339
|
+
write_a16_creation_id
|
340
|
+
@writer.end_tag('a:ext')
|
341
|
+
|
342
|
+
write_a_uri_ext('{C183D7F6-B498-43B3-948B-1728B52AA6E4}')
|
343
|
+
write_adec_decorative
|
344
|
+
@writer.end_tag('a:ext')
|
345
|
+
end
|
346
|
+
end
|
347
|
+
|
348
|
+
#
|
349
|
+
# Write the <a:ext> element.
|
350
|
+
#
|
351
|
+
def write_a_uri_ext(uri)
|
352
|
+
attributes = [
|
353
|
+
['uri', uri]
|
354
|
+
]
|
355
|
+
|
356
|
+
@writer.start_tag('a:ext', attributes)
|
357
|
+
end
|
358
|
+
|
359
|
+
#
|
360
|
+
# Write the <adec:decorative> element.
|
361
|
+
#
|
362
|
+
def write_adec_decorative
|
363
|
+
xmlns_adec = 'http://schemas.microsoft.com/office/drawing/2017/decorative'
|
364
|
+
val = 1
|
365
|
+
|
366
|
+
attributes = [
|
367
|
+
['xmlns:adec', xmlns_adec],
|
368
|
+
['val', val]
|
369
|
+
]
|
370
|
+
|
371
|
+
@writer.empty_tag('adec:decorative', attributes)
|
372
|
+
end
|
373
|
+
|
374
|
+
#
|
375
|
+
# Write the <a16:creationId> element.
|
376
|
+
#
|
377
|
+
def write_a16_creation_id
|
378
|
+
xmlns_a_16 = 'http://schemas.microsoft.com/office/drawing/2014/main'
|
379
|
+
id = '{00000000-0008-0000-0000-000002000000}'
|
380
|
+
|
381
|
+
attributes = [
|
382
|
+
['xmlns:a16', xmlns_a_16],
|
383
|
+
['id', id]
|
384
|
+
]
|
385
|
+
|
386
|
+
@writer.empty_tag('a16:creationId', attributes)
|
387
|
+
end
|
388
|
+
|
326
389
|
#
|
327
390
|
# Write the <xdr:cNvGraphicFramePr> element.
|
328
391
|
#
|
@@ -424,9 +487,9 @@ module Writexlsx
|
|
424
487
|
|
425
488
|
|
426
489
|
attributes = [
|
427
|
-
|
428
|
-
|
429
|
-
|
490
|
+
['xmlns:c', xmlns_c],
|
491
|
+
['xmlns:r', xmlns_r]
|
492
|
+
]
|
430
493
|
attributes << r_id_attributes(id)
|
431
494
|
|
432
495
|
@writer.empty_tag('c:chart', attributes)
|
@@ -456,9 +519,9 @@ module Writexlsx
|
|
456
519
|
else
|
457
520
|
# Add attribute for shapes.
|
458
521
|
attributes = [
|
459
|
-
|
460
|
-
|
461
|
-
|
522
|
+
[:macro, ''],
|
523
|
+
[:textlink, '']
|
524
|
+
]
|
462
525
|
@writer.tag_elements('xdr:sp', attributes) do
|
463
526
|
|
464
527
|
# Write the xdr:nvSpPr element.
|
@@ -491,17 +554,17 @@ module Writexlsx
|
|
491
554
|
|
492
555
|
if shape.start
|
493
556
|
attributes = [
|
494
|
-
|
495
|
-
|
496
|
-
|
557
|
+
['id', shape.start],
|
558
|
+
['idx', shape.start_index]
|
559
|
+
]
|
497
560
|
@writer.empty_tag('a:stCxn', attributes)
|
498
561
|
end
|
499
562
|
|
500
563
|
if shape.end
|
501
564
|
attributes = [
|
502
|
-
|
503
|
-
|
504
|
-
|
565
|
+
['id', shape.end],
|
566
|
+
['idx', shape.end_index]
|
567
|
+
]
|
505
568
|
@writer.empty_tag('a:endCxn', attributes)
|
506
569
|
end
|
507
570
|
end
|
@@ -527,10 +590,10 @@ module Writexlsx
|
|
527
590
|
#
|
528
591
|
# Write the <xdr:pic> element.
|
529
592
|
#
|
530
|
-
def write_pic(index, rel_index, col_absolute, row_absolute, width, height, description, url_rel_index, tip)
|
593
|
+
def write_pic(index, rel_index, col_absolute, row_absolute, width, height, description, url_rel_index, tip, decorative)
|
531
594
|
@writer.tag_elements('xdr:pic') do
|
532
595
|
# Write the xdr:nvPicPr element.
|
533
|
-
write_nv_pic_pr(index, rel_index, description, url_rel_index, tip)
|
596
|
+
write_nv_pic_pr(index, rel_index, description, url_rel_index, tip, decorative)
|
534
597
|
# Write the xdr:blipFill element.
|
535
598
|
write_blip_fill(rel_index)
|
536
599
|
|
@@ -546,12 +609,12 @@ module Writexlsx
|
|
546
609
|
#
|
547
610
|
# Write the <xdr:nvPicPr> element.
|
548
611
|
#
|
549
|
-
def write_nv_pic_pr(index, rel_index, description, url_rel_index, tip)
|
612
|
+
def write_nv_pic_pr(index, rel_index, description, url_rel_index, tip, decorative)
|
550
613
|
@writer.tag_elements('xdr:nvPicPr') do
|
551
614
|
# Write the xdr:cNvPr element.
|
552
615
|
write_c_nv_pr(
|
553
616
|
index + 1, "Picture #{index}", description,
|
554
|
-
url_rel_index, tip
|
617
|
+
url_rel_index, tip, decorative
|
555
618
|
)
|
556
619
|
# Write the xdr:cNvPicPr element.
|
557
620
|
write_c_nv_pic_pr
|
@@ -745,9 +808,9 @@ module Writexlsx
|
|
745
808
|
adj_int = (adj * 1000).to_i
|
746
809
|
|
747
810
|
attributes = [
|
748
|
-
|
749
|
-
|
750
|
-
|
811
|
+
[:name, "adj#{suffix}"],
|
812
|
+
[:fmla, "val #{adj_int}"]
|
813
|
+
]
|
751
814
|
@writer.empty_tag('a:gd', attributes)
|
752
815
|
end
|
753
816
|
end
|
@@ -804,15 +867,15 @@ module Writexlsx
|
|
804
867
|
#
|
805
868
|
def write_tx_body(shape)
|
806
869
|
attributes = [
|
807
|
-
|
808
|
-
|
809
|
-
|
810
|
-
|
811
|
-
|
812
|
-
|
813
|
-
|
814
|
-
|
815
|
-
|
870
|
+
[:vertOverflow, "clip"],
|
871
|
+
[:wrap, "square"],
|
872
|
+
[:lIns, "27432"],
|
873
|
+
[:tIns, "22860"],
|
874
|
+
[:rIns, "27432"],
|
875
|
+
[:bIns, "22860"],
|
876
|
+
[:anchor, shape.valign],
|
877
|
+
[:upright, "1"]
|
878
|
+
]
|
816
879
|
@writer.tag_elements('xdr:txBody') do
|
817
880
|
@writer.empty_tag('a:bodyPr', attributes)
|
818
881
|
@writer.empty_tag('a:lstStyle')
|
@@ -822,9 +885,9 @@ module Writexlsx
|
|
822
885
|
rotation *= 60000
|
823
886
|
|
824
887
|
attributes = [
|
825
|
-
|
826
|
-
|
827
|
-
|
888
|
+
[:algn, shape.align],
|
889
|
+
[:rtl, rotation]
|
890
|
+
]
|
828
891
|
@writer.tag_elements('a:pPr', attributes) do
|
829
892
|
attributes = [ [:sz, "1000"] ]
|
830
893
|
@writer.empty_tag('a:defRPr', attributes)
|
@@ -840,14 +903,14 @@ module Writexlsx
|
|
840
903
|
strike = ptrue?(shape.format[:font_strikeout]) ? 'Strike' : 'noStrike'
|
841
904
|
|
842
905
|
attributes = [
|
843
|
-
|
844
|
-
|
845
|
-
|
846
|
-
|
847
|
-
|
848
|
-
|
849
|
-
|
850
|
-
|
906
|
+
[:lang, "en-US"],
|
907
|
+
[:sz, size],
|
908
|
+
[:b, bold],
|
909
|
+
[:i, italic],
|
910
|
+
[:u, underline],
|
911
|
+
[:strike, strike],
|
912
|
+
[:baseline, 0]
|
913
|
+
]
|
851
914
|
@writer.tag_elements('a:rPr', attributes) do
|
852
915
|
color = shape.format[:color]
|
853
916
|
if color
|