write_xlsx 1.11.2 → 1.12.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/.rubocop.yml +3 -0
- data/README.md +1 -1
- data/lib/write_xlsx/format.rb +5 -5
- data/lib/write_xlsx/package/content_types.rb +22 -0
- data/lib/write_xlsx/package/metadata.rb +139 -22
- data/lib/write_xlsx/package/packager.rb +120 -3
- data/lib/write_xlsx/package/relationships.rb +25 -0
- data/lib/write_xlsx/package/rich_value.rb +70 -0
- data/lib/write_xlsx/package/rich_value_rel.rb +70 -0
- data/lib/write_xlsx/package/rich_value_structure.rb +83 -0
- data/lib/write_xlsx/package/rich_value_types.rb +103 -0
- data/lib/write_xlsx/utility.rb +172 -0
- data/lib/write_xlsx/version.rb +1 -1
- data/lib/write_xlsx/workbook.rb +46 -166
- data/lib/write_xlsx/worksheet/cell_data.rb +19 -0
- data/lib/write_xlsx/worksheet/hyperlink.rb +2 -1
- data/lib/write_xlsx/worksheet.rb +93 -22
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b8f704b9674f7d6de467d512cea780114dccc51ed88d99ad4d57727fdafd32b4
|
4
|
+
data.tar.gz: 54df4aec8346b1935bb3b0ba283c11b04f415b3b644308ab8f4cce2f0595d14d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ecbd4957e8b5ee4d9c77e46da68ddfa0f877dd94166551a20c1b76a782209db761a43a86bae340657181ec8993bdc277ee67b66c4c889bc5ad418e6fe2b953c5
|
7
|
+
data.tar.gz: c2a9f0b209de183bbb87ddceb0897dca8708b372d7bb8a5fb7953595440fdaceac60fe4500dafe2ed74585208c6f17b03c554e20c4b5d05af2ec019854b0a259
|
data/.rubocop.yml
CHANGED
data/README.md
CHANGED
@@ -85,7 +85,7 @@ the first worksheet in an Excel XML spreadsheet called ruby.xlsx:
|
|
85
85
|
Original Perl module was written by John McNamara(jmcnamara@cpan.org).
|
86
86
|
|
87
87
|
Converted to ruby by Hideo NAKAMURA(nakamrua.hideo@gmail.com)
|
88
|
-
Copyright (c) 2012-
|
88
|
+
Copyright (c) 2012-2024 Hideo NAKAMURA.
|
89
89
|
|
90
90
|
See LICENSE.txt for further details.
|
91
91
|
|
data/lib/write_xlsx/format.rb
CHANGED
@@ -146,10 +146,10 @@ module Writexlsx
|
|
146
146
|
return
|
147
147
|
end
|
148
148
|
|
149
|
-
# Indent is only allowed for
|
150
|
-
#
|
151
|
-
#
|
152
|
-
@text_h_align = 1 if @indent != 0 && ![1, 3, 7].include?(@text_h_align)
|
149
|
+
# Indent is only allowed for some alignment properties. If it is defined
|
150
|
+
# for any other alignment or no alignment has been set then default to
|
151
|
+
# left alignment.
|
152
|
+
@text_h_align = 1 if @indent != 0 && ![1, 3, 7].include?(@text_h_align) && ![1, 3, 5].include?(@text_v_align)
|
153
153
|
|
154
154
|
# Check for properties that are mutually exclusive.
|
155
155
|
@shrink = 0 if @text_wrap != 0
|
@@ -178,8 +178,8 @@ module Writexlsx
|
|
178
178
|
align << %w[vertical justify] if @text_v_align == 4
|
179
179
|
align << %w[vertical distributed] if @text_v_align == 5
|
180
180
|
|
181
|
-
align << ['indent', @indent] if @indent != 0
|
182
181
|
align << ['textRotation', @rotation] if @rotation != 0
|
182
|
+
align << ['indent', @indent] if @indent != 0
|
183
183
|
|
184
184
|
align << ['wrapText', 1] if @text_wrap != 0
|
185
185
|
align << ['shrinkToFit', 1] if @shrink != 0
|
@@ -199,6 +199,28 @@ module Writexlsx
|
|
199
199
|
)
|
200
200
|
end
|
201
201
|
|
202
|
+
def add_richvalue
|
203
|
+
add_override(
|
204
|
+
'/xl/richData/rdRichValueTypes.xml',
|
205
|
+
'application/vnd.ms-excel.rdrichvaluetypes+xml'
|
206
|
+
)
|
207
|
+
|
208
|
+
add_override(
|
209
|
+
'/xl/richData/rdrichvalue.xml',
|
210
|
+
'application/vnd.ms-excel.rdrichvalue+xml'
|
211
|
+
)
|
212
|
+
|
213
|
+
add_override(
|
214
|
+
'/xl/richData/rdrichvaluestructure.xml',
|
215
|
+
'application/vnd.ms-excel.rdrichvaluestructure+xml'
|
216
|
+
)
|
217
|
+
|
218
|
+
add_override(
|
219
|
+
'/xl/richData/richValueRel.xml',
|
220
|
+
'application/vnd.ms-excel.richvaluerel+xml'
|
221
|
+
)
|
222
|
+
end
|
223
|
+
|
202
224
|
private
|
203
225
|
|
204
226
|
def change_the_workbook_xml_content_type_from_xlsx_to_xlsm
|
@@ -12,9 +12,15 @@ module Writexlsx
|
|
12
12
|
class Metadata
|
13
13
|
include Writexlsx::Utility
|
14
14
|
|
15
|
+
attr_writer :has_dynamic_functions
|
16
|
+
attr_writer :num_embedded_images
|
17
|
+
|
15
18
|
def initialize(workbook)
|
16
19
|
@writer = Package::XMLWriterSimple.new
|
17
|
-
@workbook
|
20
|
+
@workbook = workbook
|
21
|
+
@has_dynamic_functions = false
|
22
|
+
@has_embedded_images = false
|
23
|
+
@num_embedded_images = 0
|
18
24
|
end
|
19
25
|
|
20
26
|
def set_xml_writer(filename)
|
@@ -22,15 +28,23 @@ module Writexlsx
|
|
22
28
|
end
|
23
29
|
|
24
30
|
def assemble_xml_file
|
31
|
+
@has_embedded_images = true if @num_embedded_images > 0
|
32
|
+
|
25
33
|
write_xml_declaration do
|
26
34
|
# Write the metadata element.
|
27
35
|
write_metadata
|
36
|
+
|
28
37
|
# Write the metadataTypes element.
|
29
38
|
write_metadata_types
|
39
|
+
|
30
40
|
# Write the futureMetadata element.
|
31
|
-
|
41
|
+
write_cell_future_metadata if @has_dynamic_functions
|
42
|
+
write_value_future_metadata if @has_embedded_images
|
43
|
+
|
32
44
|
# Write the cellMetadata element.
|
33
|
-
write_cell_metadata
|
45
|
+
write_cell_metadata if @has_dynamic_functions
|
46
|
+
write_value_metadata if @has_embedded_images
|
47
|
+
|
34
48
|
@writer.end_tag('metadata')
|
35
49
|
end
|
36
50
|
end
|
@@ -42,14 +56,23 @@ module Writexlsx
|
|
42
56
|
#
|
43
57
|
def write_metadata
|
44
58
|
xmlns = 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'
|
45
|
-
xmlns_xda =
|
46
|
-
'http://schemas.microsoft.com/office/spreadsheetml/2017/dynamicarray'
|
47
|
-
|
48
59
|
attributes = [
|
49
|
-
['xmlns', xmlns]
|
50
|
-
['xmlns:xda', xmlns_xda]
|
60
|
+
['xmlns', xmlns]
|
51
61
|
]
|
52
62
|
|
63
|
+
if @has_embedded_images
|
64
|
+
attributes << [
|
65
|
+
'xmlns:xlrd',
|
66
|
+
'http://schemas.microsoft.com/office/spreadsheetml/2017/richdata'
|
67
|
+
]
|
68
|
+
end
|
69
|
+
if @has_dynamic_functions
|
70
|
+
attributes << [
|
71
|
+
'xmlns:xda',
|
72
|
+
'http://schemas.microsoft.com/office/spreadsheetml/2017/dynamicarray'
|
73
|
+
]
|
74
|
+
end
|
75
|
+
|
53
76
|
@writer.start_tag('metadata', attributes)
|
54
77
|
end
|
55
78
|
|
@@ -57,18 +80,23 @@ module Writexlsx
|
|
57
80
|
# Write the <metadataTypes> element.
|
58
81
|
#
|
59
82
|
def write_metadata_types
|
60
|
-
|
83
|
+
count =
|
84
|
+
(@has_dynamic_functions ? 1 : 0) +
|
85
|
+
(@has_embedded_images ? 1 : 0)
|
86
|
+
|
87
|
+
attributes = [['count', count]]
|
61
88
|
|
62
89
|
@writer.tag_elements('metadataTypes', attributes) do
|
63
90
|
# Write the metadataType element.
|
64
|
-
|
91
|
+
write_cell_metadata_type if @has_dynamic_functions
|
92
|
+
write_value_metadata_type if @has_embedded_images
|
65
93
|
end
|
66
94
|
end
|
67
95
|
|
68
96
|
#
|
69
97
|
# Write the <metadataType> element.
|
70
98
|
#
|
71
|
-
def
|
99
|
+
def write_cell_metadata_type
|
72
100
|
attributes = [
|
73
101
|
%w[name XLDAPR],
|
74
102
|
['minSupportedVersion', 120000],
|
@@ -88,10 +116,32 @@ module Writexlsx
|
|
88
116
|
@writer.empty_tag('metadataType', attributes)
|
89
117
|
end
|
90
118
|
|
119
|
+
#
|
120
|
+
# Write the <metadataType> element.
|
121
|
+
#
|
122
|
+
def write_value_metadata_type
|
123
|
+
attributes = [
|
124
|
+
%w[name XLRICHVALUE],
|
125
|
+
['minSupportedVersion', 120000],
|
126
|
+
['copy', 1],
|
127
|
+
['pasteAll', 1],
|
128
|
+
['pasteValues', 1],
|
129
|
+
['merge', 1],
|
130
|
+
['splitFirst', 1],
|
131
|
+
['rowColShift', 1],
|
132
|
+
['clearFormats', 1],
|
133
|
+
['clearComments', 1],
|
134
|
+
['assign', 1],
|
135
|
+
['coerce', 1]
|
136
|
+
]
|
137
|
+
|
138
|
+
@writer.empty_tag('metadataType', attributes)
|
139
|
+
end
|
140
|
+
|
91
141
|
#
|
92
142
|
# Write the <futureMetadata> element.
|
93
143
|
#
|
94
|
-
def
|
144
|
+
def write_cell_future_metadata
|
95
145
|
attributes = [
|
96
146
|
%w[name XLDAPR],
|
97
147
|
['count', 1]
|
@@ -101,7 +151,34 @@ module Writexlsx
|
|
101
151
|
@writer.tag_elements('bk') do
|
102
152
|
@writer.tag_elements('extLst') do
|
103
153
|
# Write the ext element.
|
104
|
-
|
154
|
+
write_cell_ext
|
155
|
+
|
156
|
+
@writer.end_tag('ext')
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
#
|
163
|
+
# Write the <futureMetadata> element.
|
164
|
+
#
|
165
|
+
def write_value_future_metadata
|
166
|
+
num_images = @num_embedded_images
|
167
|
+
|
168
|
+
attributes = [
|
169
|
+
%w[name XLRICHVALUE],
|
170
|
+
['count', num_images]
|
171
|
+
]
|
172
|
+
|
173
|
+
@writer.tag_elements('futureMetadata', attributes) do
|
174
|
+
(0..(num_images - 1)).each do |i|
|
175
|
+
@writer.tag_elements('bk') do
|
176
|
+
@writer.tag_elements('extLst') do
|
177
|
+
# Write the ext element.
|
178
|
+
write_value_ext(i)
|
179
|
+
|
180
|
+
@writer.end_tag('ext')
|
181
|
+
end
|
105
182
|
end
|
106
183
|
end
|
107
184
|
end
|
@@ -110,12 +187,23 @@ module Writexlsx
|
|
110
187
|
#
|
111
188
|
# Write the <ext> element.
|
112
189
|
#
|
113
|
-
def
|
190
|
+
def write_cell_ext
|
114
191
|
attributes = [['uri', '{bdbb8cdc-fa1e-496e-a857-3c3f30c029c3}']]
|
115
|
-
@writer.
|
116
|
-
|
117
|
-
|
118
|
-
|
192
|
+
@writer.start_tag('ext', attributes)
|
193
|
+
|
194
|
+
# Write the xda:dynamicArrayProperties element.
|
195
|
+
write_xda_dynamic_array_properties
|
196
|
+
end
|
197
|
+
|
198
|
+
#
|
199
|
+
# Write the <ext> element.
|
200
|
+
#
|
201
|
+
def write_value_ext(num)
|
202
|
+
attributes = [['uri', '{3e2802c4-a4d2-4d8b-9148-e3be6c30e623}']]
|
203
|
+
@writer.start_tag('ext', attributes)
|
204
|
+
|
205
|
+
# Write the <xlrd:rvb> element.
|
206
|
+
write_xlrd_rvb(num)
|
119
207
|
end
|
120
208
|
|
121
209
|
#
|
@@ -141,7 +229,27 @@ module Writexlsx
|
|
141
229
|
@writer.tag_elements('cellMetadata', attributes) do
|
142
230
|
@writer.tag_elements('bk') do
|
143
231
|
# Write the rc element.
|
144
|
-
write_rc
|
232
|
+
write_rc(1, 0)
|
233
|
+
end
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
#
|
238
|
+
# Write the <valueMetadata> element.
|
239
|
+
#
|
240
|
+
def write_value_metadata
|
241
|
+
count = @num_embedded_images
|
242
|
+
type = 1
|
243
|
+
type = 2 if @has_dynamic_functions
|
244
|
+
|
245
|
+
attributes = [['count', count]]
|
246
|
+
|
247
|
+
@writer.tag_elements('valueMetadata', attributes) do
|
248
|
+
(0..(count - 1)).each do |i|
|
249
|
+
@writer.tag_elements('bk') do
|
250
|
+
# Write the rc element.
|
251
|
+
write_rc(type, i)
|
252
|
+
end
|
145
253
|
end
|
146
254
|
end
|
147
255
|
end
|
@@ -149,13 +257,22 @@ module Writexlsx
|
|
149
257
|
#
|
150
258
|
# Write the <rc> element.
|
151
259
|
#
|
152
|
-
def write_rc
|
260
|
+
def write_rc(type, value)
|
153
261
|
attributes = [
|
154
|
-
['t',
|
155
|
-
['v',
|
262
|
+
['t', type],
|
263
|
+
['v', value]
|
156
264
|
]
|
157
265
|
@writer.empty_tag('rc', attributes)
|
158
266
|
end
|
267
|
+
|
268
|
+
#
|
269
|
+
# Write the <xlrd:rvb> element.
|
270
|
+
#
|
271
|
+
def write_xlrd_rvb(value)
|
272
|
+
attributes = [['i', value]]
|
273
|
+
|
274
|
+
@writer.empty_tag('xlrd:rvb', attributes)
|
275
|
+
end
|
159
276
|
end
|
160
277
|
end
|
161
278
|
end
|
@@ -10,6 +10,10 @@ require 'write_xlsx/package/core'
|
|
10
10
|
require 'write_xlsx/package/custom'
|
11
11
|
require 'write_xlsx/package/metadata'
|
12
12
|
require 'write_xlsx/package/relationships'
|
13
|
+
require 'write_xlsx/package/rich_value'
|
14
|
+
require 'write_xlsx/package/rich_value_rel'
|
15
|
+
require 'write_xlsx/package/rich_value_structure'
|
16
|
+
require 'write_xlsx/package/rich_value_types'
|
13
17
|
require 'write_xlsx/package/shared_strings'
|
14
18
|
require 'write_xlsx/package/styles'
|
15
19
|
require 'write_xlsx/package/table'
|
@@ -56,9 +60,11 @@ module Writexlsx
|
|
56
60
|
write_worksheet_rels_files
|
57
61
|
write_chartsheet_rels_files
|
58
62
|
write_drawing_rels_files
|
63
|
+
write_rich_value_rels_files
|
59
64
|
add_image_files
|
60
65
|
add_vba_project
|
61
66
|
write_metadata_file
|
67
|
+
write_rich_value_files
|
62
68
|
end
|
63
69
|
|
64
70
|
private
|
@@ -184,12 +190,81 @@ module Writexlsx
|
|
184
190
|
|
185
191
|
return unless @workbook.has_metadata?
|
186
192
|
|
193
|
+
metadata.has_dynamic_functions = @workbook.has_dynamic_functions?
|
194
|
+
metadata.num_embedded_images = @workbook.embedded_images.size
|
195
|
+
|
187
196
|
FileUtils.mkdir_p("#{@package_dir}/xl")
|
188
197
|
|
189
198
|
metadata.set_xml_writer("#{@package_dir}/xl/metadata.xml")
|
190
199
|
metadata.assemble_xml_file
|
191
200
|
end
|
192
201
|
|
202
|
+
#
|
203
|
+
# Write the rdrichvalue(*).xml file.
|
204
|
+
#
|
205
|
+
def write_rich_value_files
|
206
|
+
dir = @package_dir
|
207
|
+
|
208
|
+
return unless @workbook.has_embedded_images?
|
209
|
+
|
210
|
+
FileUtils.mkdir_p("#{dir}/xl/richData")
|
211
|
+
|
212
|
+
write_rich_value_file
|
213
|
+
write_rich_value_structure_file
|
214
|
+
write_rich_value_types_file
|
215
|
+
write_rich_value_rel
|
216
|
+
end
|
217
|
+
|
218
|
+
#
|
219
|
+
# Write the rdrichvalue.xml file.
|
220
|
+
#
|
221
|
+
def write_rich_value_file
|
222
|
+
dir = @package_dir
|
223
|
+
rich_value = Package::RichValue.new
|
224
|
+
|
225
|
+
rich_value.embedded_images = @workbook.embedded_images
|
226
|
+
|
227
|
+
rich_value.set_xml_writer("#{dir}/xl/richData/rdrichvalue.xml")
|
228
|
+
rich_value.assemble_xml_file
|
229
|
+
end
|
230
|
+
|
231
|
+
#
|
232
|
+
# Write the rdrichvaluestructure.xml file.
|
233
|
+
#
|
234
|
+
def write_rich_value_structure_file
|
235
|
+
dir = @package_dir
|
236
|
+
rich_value = Package::RichValueStructure.new
|
237
|
+
|
238
|
+
rich_value.has_embedded_descriptions = @workbook.has_embedded_descriptions?
|
239
|
+
|
240
|
+
rich_value.set_xml_writer("#{dir}/xl/richData/rdrichvaluestructure.xml")
|
241
|
+
rich_value.assemble_xml_file
|
242
|
+
end
|
243
|
+
|
244
|
+
#
|
245
|
+
# Write the rdRichValueTypes.xml file.
|
246
|
+
#
|
247
|
+
def write_rich_value_types_file
|
248
|
+
rich_value = Package::RichValueTypes.new
|
249
|
+
dir = @package_dir
|
250
|
+
|
251
|
+
rich_value.set_xml_writer("#{dir}/xl/richData/rdRichValueTypes.xml")
|
252
|
+
rich_value.assemble_xml_file
|
253
|
+
end
|
254
|
+
|
255
|
+
#
|
256
|
+
# Write the rdrichvalue.xml file.
|
257
|
+
#
|
258
|
+
def write_rich_value_rel
|
259
|
+
dir = @package_dir
|
260
|
+
rich_value = Package::RichValueRel.new
|
261
|
+
|
262
|
+
rich_value.value_count = @workbook.embedded_images.size
|
263
|
+
|
264
|
+
rich_value.set_xml_writer("#{dir}/xl/richData/richValueRel.xml")
|
265
|
+
rich_value.assemble_xml_file
|
266
|
+
end
|
267
|
+
|
193
268
|
#
|
194
269
|
# Write the custom.xml file.
|
195
270
|
#
|
@@ -226,8 +301,10 @@ module Writexlsx
|
|
226
301
|
content.add_vba_project if @workbook.vba_project
|
227
302
|
# Add the custom properties if present.
|
228
303
|
content.add_custom_properties unless @workbook.custom_properties.empty?
|
229
|
-
# Add the
|
304
|
+
# Add the RichValue file if present.
|
230
305
|
content.add_metadata if @workbook.has_metadata?
|
306
|
+
# Add the metadata file if present.
|
307
|
+
content.add_richvalue if @workbook.has_embedded_images?
|
231
308
|
|
232
309
|
content.set_xml_writer("#{@package_dir}/[Content_Types].xml")
|
233
310
|
content.assemble_xml_file
|
@@ -340,6 +417,11 @@ module Writexlsx
|
|
340
417
|
)
|
341
418
|
end
|
342
419
|
|
420
|
+
# Add the RichValue files if present.
|
421
|
+
if @workbook.has_embedded_images?
|
422
|
+
rels.add_rich_value_relationships
|
423
|
+
end
|
424
|
+
|
343
425
|
rels.set_xml_writer("#{@package_dir}/xl/_rels/workbook.xml.rels")
|
344
426
|
rels.assemble_xml_file
|
345
427
|
end
|
@@ -367,15 +449,50 @@ module Writexlsx
|
|
367
449
|
@workbook.worksheets.write_drawing_rels_files(@package_dir)
|
368
450
|
end
|
369
451
|
|
452
|
+
#
|
453
|
+
# Write the richValueRel.xml.rels files for worksheets that contain embedded
|
454
|
+
# images.
|
455
|
+
#
|
456
|
+
def write_rich_value_rels_files
|
457
|
+
return if @workbook.embedded_images.empty?
|
458
|
+
|
459
|
+
dir = @package_dir
|
460
|
+
|
461
|
+
# Create the .rels dirs.
|
462
|
+
FileUtils.mkdir_p("#{dir}/xl/richData/_rels")
|
463
|
+
|
464
|
+
rels = Package::Relationships.new
|
465
|
+
|
466
|
+
@workbook.embedded_images.each_with_index do |image_data, index|
|
467
|
+
file_type = image_data[1]
|
468
|
+
image_file = "../media/image#{index + 1}.#{file_type}"
|
469
|
+
|
470
|
+
rels.add_worksheet_relationship('/image', image_file)
|
471
|
+
end
|
472
|
+
|
473
|
+
# Create the .rels file.
|
474
|
+
rels.set_xml_writer("#{dir}/xl/richData/_rels/richValueRel.xml.rels")
|
475
|
+
rels.assemble_xml_file
|
476
|
+
end
|
477
|
+
|
370
478
|
#
|
371
479
|
# Write the /xl/media/image?.xml files.
|
372
480
|
#
|
373
481
|
def add_image_files
|
482
|
+
index = 1
|
483
|
+
|
374
484
|
dir = "#{@package_dir}/xl/media"
|
375
485
|
|
376
|
-
@workbook.
|
486
|
+
@workbook.embedded_images.each do |image|
|
487
|
+
FileUtils.mkdir_p(dir)
|
488
|
+
FileUtils.cp(image[0], "#{dir}/image#{index}.#{image[1]}")
|
489
|
+
index += 1
|
490
|
+
end
|
491
|
+
|
492
|
+
@workbook.images.each do |image|
|
377
493
|
FileUtils.mkdir_p(dir)
|
378
|
-
FileUtils.cp(image[0], "#{dir}/image#{index
|
494
|
+
FileUtils.cp(image[0], "#{dir}/image#{index}.#{image[1]}")
|
495
|
+
index += 1
|
379
496
|
end
|
380
497
|
end
|
381
498
|
|
@@ -58,6 +58,31 @@ module Writexlsx
|
|
58
58
|
@rels.push([Document_schema + type, target, target_mode])
|
59
59
|
end
|
60
60
|
|
61
|
+
#
|
62
|
+
# Add relationships for RichValue files.
|
63
|
+
#
|
64
|
+
def add_rich_value_relationships
|
65
|
+
@rels << [
|
66
|
+
'http://schemas.microsoft.com/office/2022/10/relationships/richValueRel',
|
67
|
+
'richData/richValueRel.xml'
|
68
|
+
]
|
69
|
+
|
70
|
+
@rels << [
|
71
|
+
'http://schemas.microsoft.com/office/2017/06/relationships/rdRichValue',
|
72
|
+
'richData/rdrichvalue.xml'
|
73
|
+
]
|
74
|
+
|
75
|
+
@rels << [
|
76
|
+
'http://schemas.microsoft.com/office/2017/06/relationships/rdRichValueStructure',
|
77
|
+
'richData/rdrichvaluestructure.xml'
|
78
|
+
]
|
79
|
+
|
80
|
+
@rels << [
|
81
|
+
'http://schemas.microsoft.com/office/2017/06/relationships/rdRichValueTypes',
|
82
|
+
'richData/rdRichValueTypes.xml'
|
83
|
+
]
|
84
|
+
end
|
85
|
+
|
61
86
|
private
|
62
87
|
|
63
88
|
#
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'write_xlsx/package/xml_writer_simple'
|
5
|
+
require 'write_xlsx/utility'
|
6
|
+
|
7
|
+
module Writexlsx
|
8
|
+
module Package
|
9
|
+
class RichValue
|
10
|
+
include Writexlsx::Utility
|
11
|
+
|
12
|
+
attr_accessor :embedded_images
|
13
|
+
|
14
|
+
def initialize
|
15
|
+
@writer = Package::XMLWriterSimple.new
|
16
|
+
@embedded_images = []
|
17
|
+
end
|
18
|
+
|
19
|
+
def set_xml_writer(filename)
|
20
|
+
@writer.set_xml_writer(filename)
|
21
|
+
end
|
22
|
+
|
23
|
+
def assemble_xml_file
|
24
|
+
write_xml_declaration do
|
25
|
+
write_rv_data
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def write_rv_data
|
32
|
+
xmlns = 'http://schemas.microsoft.com/office/spreadsheetml/2017/richdata'
|
33
|
+
|
34
|
+
attributes = [
|
35
|
+
['xmlns', xmlns],
|
36
|
+
['count', @embedded_images.size]
|
37
|
+
]
|
38
|
+
|
39
|
+
@writer.tag_elements('rvData', attributes) do
|
40
|
+
@embedded_images.each_with_index do |image, index|
|
41
|
+
write_rv(index, image[2], image[3])
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
#
|
47
|
+
# Write the <rv> element.
|
48
|
+
#
|
49
|
+
def write_rv(index, description, decorative)
|
50
|
+
value = 5
|
51
|
+
value = 6 if ptrue?(decorative)
|
52
|
+
|
53
|
+
attributes = [['s', 0]]
|
54
|
+
|
55
|
+
@writer.tag_elements('rv', attributes) do
|
56
|
+
write_v(index)
|
57
|
+
write_v(value)
|
58
|
+
write_v(description) if ptrue?(description)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
#
|
63
|
+
# Write the <v> element.
|
64
|
+
#
|
65
|
+
def write_v(data)
|
66
|
+
@writer.data_element('v', data)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'write_xlsx/package/xml_writer_simple'
|
5
|
+
require 'write_xlsx/utility'
|
6
|
+
|
7
|
+
module Writexlsx
|
8
|
+
module Package
|
9
|
+
#
|
10
|
+
# RichValueRel - A class for writing the Excel XLSX richValueRel.xml file.
|
11
|
+
#
|
12
|
+
# Used in conjunction with Excel::Writer::XLSX
|
13
|
+
#
|
14
|
+
# Copyright 2000-2024, John McNamara, jmcnamara@cpan.org
|
15
|
+
#
|
16
|
+
# Convert to Ruby by Hideo Nakamura, nakamura.hideo@gmail.com
|
17
|
+
#
|
18
|
+
class RichValueRel
|
19
|
+
include Writexlsx::Utility
|
20
|
+
|
21
|
+
attr_writer :value_count
|
22
|
+
|
23
|
+
def initialize
|
24
|
+
@writer = Package::XMLWriterSimple.new
|
25
|
+
@value_count = 0
|
26
|
+
end
|
27
|
+
|
28
|
+
def set_xml_writer(filename)
|
29
|
+
@writer.set_xml_writer(filename)
|
30
|
+
end
|
31
|
+
|
32
|
+
def assemble_xml_file
|
33
|
+
write_xml_declaration do
|
34
|
+
write_rich_value_rels
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
#
|
41
|
+
# Write the <richValueRels> element.
|
42
|
+
#
|
43
|
+
def write_rich_value_rels
|
44
|
+
xmlns = 'http://schemas.microsoft.com/office/spreadsheetml/2022/richvaluerel'
|
45
|
+
xmlns_r = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'
|
46
|
+
|
47
|
+
attributes = [
|
48
|
+
['xmlns', xmlns],
|
49
|
+
['xmlns:r', xmlns_r]
|
50
|
+
]
|
51
|
+
|
52
|
+
@writer.tag_elements('richValueRels', attributes) do
|
53
|
+
(0..(@value_count - 1)).each do |index|
|
54
|
+
# Write the rel element.
|
55
|
+
write_rel(index + 1)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
#
|
61
|
+
# Write the <rel> element.
|
62
|
+
#
|
63
|
+
def write_rel(id)
|
64
|
+
attributes = [['r:id', "rId#{id}"]]
|
65
|
+
|
66
|
+
@writer.empty_tag('rel', attributes)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|