fast_excel 0.5.0 → 0.6.1

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.
Files changed (111) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +5 -1
  3. data/.gitignore +3 -0
  4. data/.octocov.yml +28 -0
  5. data/CHANGELOG.md +9 -0
  6. data/Gemfile +4 -2
  7. data/Rakefile +4 -1
  8. data/examples/comment_options.rb +39 -0
  9. data/fast_excel.gemspec +3 -2
  10. data/lib/fast_excel/binding/workbook.rb +53 -6
  11. data/lib/fast_excel/binding/worksheet.rb +28 -4
  12. data/lib/fast_excel/binding.rb +116 -13
  13. data/lib/fast_excel.rb +13 -12
  14. data/libxlsxwriter/.cirrus.yml +9 -0
  15. data/libxlsxwriter/.github/workflows/cmake_actions.yml +10 -6
  16. data/libxlsxwriter/.github/workflows/code_style.yml +2 -0
  17. data/libxlsxwriter/.github/workflows/make_32_actions.yml +43 -0
  18. data/libxlsxwriter/.github/workflows/windows_build.yml +7 -6
  19. data/libxlsxwriter/.github/workflows/zig_build.yml +1 -3
  20. data/libxlsxwriter/.gitignore +9 -7
  21. data/libxlsxwriter/.indent.pro +6 -0
  22. data/libxlsxwriter/CMakeLists.txt +377 -238
  23. data/libxlsxwriter/Changes.txt +189 -0
  24. data/libxlsxwriter/LICENSE.txt +1 -1
  25. data/libxlsxwriter/Makefile +36 -4
  26. data/libxlsxwriter/Readme.md +1 -1
  27. data/libxlsxwriter/build.zig +181 -92
  28. data/libxlsxwriter/build.zig.zon +15 -4
  29. data/libxlsxwriter/cocoapods/libxlsxwriter-umbrella.h +4 -0
  30. data/libxlsxwriter/include/xlsxwriter/app.h +2 -1
  31. data/libxlsxwriter/include/xlsxwriter/chart.h +134 -1
  32. data/libxlsxwriter/include/xlsxwriter/chartsheet.h +2 -1
  33. data/libxlsxwriter/include/xlsxwriter/comment.h +2 -1
  34. data/libxlsxwriter/include/xlsxwriter/common.h +12 -8
  35. data/libxlsxwriter/include/xlsxwriter/content_types.h +3 -1
  36. data/libxlsxwriter/include/xlsxwriter/core.h +2 -1
  37. data/libxlsxwriter/include/xlsxwriter/custom.h +2 -1
  38. data/libxlsxwriter/include/xlsxwriter/drawing.h +2 -1
  39. data/libxlsxwriter/include/xlsxwriter/format.h +34 -3
  40. data/libxlsxwriter/include/xlsxwriter/hash_table.h +2 -1
  41. data/libxlsxwriter/include/xlsxwriter/metadata.h +5 -1
  42. data/libxlsxwriter/include/xlsxwriter/packager.h +6 -1
  43. data/libxlsxwriter/include/xlsxwriter/relationships.h +3 -1
  44. data/libxlsxwriter/include/xlsxwriter/rich_value.h +51 -0
  45. data/libxlsxwriter/include/xlsxwriter/rich_value_rel.h +50 -0
  46. data/libxlsxwriter/include/xlsxwriter/rich_value_structure.h +53 -0
  47. data/libxlsxwriter/include/xlsxwriter/rich_value_types.h +49 -0
  48. data/libxlsxwriter/include/xlsxwriter/shared_strings.h +2 -1
  49. data/libxlsxwriter/include/xlsxwriter/styles.h +2 -1
  50. data/libxlsxwriter/include/xlsxwriter/table.h +2 -1
  51. data/libxlsxwriter/include/xlsxwriter/theme.h +2 -1
  52. data/libxlsxwriter/include/xlsxwriter/third_party/ioapi.h +4 -4
  53. data/libxlsxwriter/include/xlsxwriter/third_party/zip.h +3 -3
  54. data/libxlsxwriter/include/xlsxwriter/utility.h +58 -7
  55. data/libxlsxwriter/include/xlsxwriter/vml.h +2 -1
  56. data/libxlsxwriter/include/xlsxwriter/workbook.h +59 -2
  57. data/libxlsxwriter/include/xlsxwriter/worksheet.h +159 -13
  58. data/libxlsxwriter/include/xlsxwriter/xmlwriter.h +11 -10
  59. data/libxlsxwriter/include/xlsxwriter.h +5 -4
  60. data/libxlsxwriter/libxlsxwriter.podspec +6 -6
  61. data/libxlsxwriter/src/Makefile +2 -1
  62. data/libxlsxwriter/src/app.c +2 -1
  63. data/libxlsxwriter/src/chart.c +360 -63
  64. data/libxlsxwriter/src/chartsheet.c +2 -1
  65. data/libxlsxwriter/src/comment.c +2 -1
  66. data/libxlsxwriter/src/content_types.c +22 -1
  67. data/libxlsxwriter/src/core.c +2 -1
  68. data/libxlsxwriter/src/custom.c +2 -1
  69. data/libxlsxwriter/src/drawing.c +7 -3
  70. data/libxlsxwriter/src/format.c +21 -1
  71. data/libxlsxwriter/src/hash_table.c +2 -1
  72. data/libxlsxwriter/src/metadata.c +176 -20
  73. data/libxlsxwriter/src/packager.c +306 -6
  74. data/libxlsxwriter/src/relationships.c +25 -1
  75. data/libxlsxwriter/src/rich_value.c +191 -0
  76. data/libxlsxwriter/src/rich_value_rel.c +142 -0
  77. data/libxlsxwriter/src/rich_value_structure.c +162 -0
  78. data/libxlsxwriter/src/rich_value_types.c +199 -0
  79. data/libxlsxwriter/src/shared_strings.c +2 -1
  80. data/libxlsxwriter/src/styles.c +31 -7
  81. data/libxlsxwriter/src/table.c +2 -1
  82. data/libxlsxwriter/src/theme.c +2 -1
  83. data/libxlsxwriter/src/utility.c +136 -46
  84. data/libxlsxwriter/src/vml.c +2 -1
  85. data/libxlsxwriter/src/workbook.c +191 -10
  86. data/libxlsxwriter/src/worksheet.c +514 -34
  87. data/libxlsxwriter/src/xmlwriter.c +17 -22
  88. data/libxlsxwriter/third_party/minizip/Makefile.orig +1 -1
  89. data/libxlsxwriter/third_party/minizip/configure.ac +1 -1
  90. data/libxlsxwriter/third_party/minizip/ioapi.h +6 -6
  91. data/libxlsxwriter/third_party/minizip/miniunz.c +16 -2
  92. data/libxlsxwriter/third_party/minizip/unzip.c +4 -4
  93. data/libxlsxwriter/third_party/minizip/unzip.h +1 -1
  94. data/libxlsxwriter/third_party/minizip/zip.c +5 -5
  95. data/libxlsxwriter/third_party/minizip/zip.h +3 -3
  96. data/libxlsxwriter/version.txt +1 -1
  97. data/sonar-project.properties +4 -0
  98. data/test/color_to_hex_test.rb +15 -0
  99. data/test/comment_opt_test.rb +76 -0
  100. data/test/date_test.rb +14 -0
  101. data/test/format_test.rb +5 -1
  102. data/test/get_worksheet_test.rb +28 -0
  103. data/test/test_helper.rb +7 -4
  104. data/test/tmpdir_test.rb +32 -0
  105. data/test/validations_test.rb +25 -19
  106. data/test/worksheet_test.rb +10 -2
  107. metadata +42 -12
  108. data/libxlsxwriter/cmake/FindMINIZIP.cmake +0 -121
  109. data/libxlsxwriter/cmake/FindPackage.cmake +0 -183
  110. data/libxlsxwriter/cmake/i686-toolchain.cmake +0 -7
  111. data/test/reopen_test.rb +0 -22
@@ -3,7 +3,8 @@
3
3
  *
4
4
  * Used in conjunction with the libxlsxwriter library.
5
5
  *
6
- * Copyright 2014-2022, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
6
+ * SPDX-License-Identifier: BSD-2-Clause
7
+ * Copyright 2014-2026, John McNamara, jmcnamara@cpan.org.
7
8
  *
8
9
  */
9
10
 
@@ -3,7 +3,8 @@
3
3
  *
4
4
  * Used in conjunction with the libxlsxwriter library.
5
5
  *
6
- * Copyright 2014-2022, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
6
+ * SPDX-License-Identifier: BSD-2-Clause
7
+ * Copyright 2014-2026, John McNamara, jmcnamara@cpan.org.
7
8
  *
8
9
  */
9
10
 
@@ -3,7 +3,8 @@
3
3
  *
4
4
  * Used in conjunction with the libxlsxwriter library.
5
5
  *
6
- * Copyright 2014-2022, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
6
+ * SPDX-License-Identifier: BSD-2-Clause
7
+ * Copyright 2014-2026, John McNamara, jmcnamara@cpan.org.
7
8
  *
8
9
  */
9
10
 
@@ -505,8 +506,11 @@ _drawing_write_a_off(lxw_drawing *self, lxw_drawing_object *drawing_object)
505
506
  struct xml_attribute *attribute;
506
507
 
507
508
  LXW_INIT_ATTRIBUTES();
508
- LXW_PUSH_ATTRIBUTES_INT("x", drawing_object->col_absolute);
509
- LXW_PUSH_ATTRIBUTES_INT("y", drawing_object->row_absolute);
509
+
510
+ /* Use %d to allow for writing uint64_t on ansi 32bit systems. The largest
511
+ Excel value will fit without losing precision. */
512
+ LXW_PUSH_ATTRIBUTES_DBL("x", drawing_object->col_absolute);
513
+ LXW_PUSH_ATTRIBUTES_DBL("y", drawing_object->row_absolute);
510
514
 
511
515
  lxw_xml_empty_tag(self->file, "a:off", &attributes);
512
516
 
@@ -3,7 +3,8 @@
3
3
  *
4
4
  * Used in conjunction with the libxlsxwriter library.
5
5
  *
6
- * Copyright 2014-2022, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
6
+ * SPDX-License-Identifier: BSD-2-Clause
7
+ * Copyright 2014-2026, John McNamara, jmcnamara@cpan.org.
7
8
  *
8
9
  */
9
10
 
@@ -546,6 +547,12 @@ format_set_text_justlast(lxw_format *self)
546
547
  void
547
548
  format_set_pattern(lxw_format *self, uint8_t value)
548
549
  {
550
+ if (value > LXW_PATTERN_GRAY_0625) {
551
+ LXW_WARN_FORMAT1("format_set_pattern(): invalid pattern value: %d",
552
+ value);
553
+ return;
554
+ }
555
+
549
556
  self->pattern = value;
550
557
  }
551
558
 
@@ -689,6 +696,12 @@ format_set_diag_color(lxw_format *self, lxw_color_t color)
689
696
  void
690
697
  format_set_diag_border(lxw_format *self, uint8_t style)
691
698
  {
699
+ if (style > LXW_BORDER_SLANT_DASH_DOT) {
700
+ LXW_WARN_FORMAT1("format_set_diag_border(): invalid border style: %d",
701
+ style);
702
+ return;
703
+ }
704
+
692
705
  self->diag_border = style;
693
706
  }
694
707
 
@@ -707,6 +720,13 @@ format_set_num_format_index(lxw_format *self, uint8_t value)
707
720
  void
708
721
  format_set_valign(lxw_format *self, uint8_t value)
709
722
  {
723
+ if (value > LXW_ALIGN_VERTICAL_DISTRIBUTED) {
724
+ LXW_WARN_FORMAT1
725
+ ("format_set_valign(): invalid vertical alignment value: %d",
726
+ value);
727
+ return;
728
+ }
729
+
710
730
  self->text_v_align = value;
711
731
  }
712
732
 
@@ -3,7 +3,8 @@
3
3
  *
4
4
  * Used in conjunction with the libxlsxwriter library.
5
5
  *
6
- * Copyright 2014-2022, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
6
+ * SPDX-License-Identifier: BSD-2-Clause
7
+ * Copyright 2014-2026, John McNamara, jmcnamara@cpan.org.
7
8
  *
8
9
  */
9
10
 
@@ -3,7 +3,8 @@
3
3
  *
4
4
  * Used in conjunction with the libxlsxwriter library.
5
5
  *
6
- * Copyright 2014-2022, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
6
+ * SPDX-License-Identifier: BSD-2-Clause
7
+ * Copyright 2014-2026, John McNamara, jmcnamara@cpan.org.
7
8
  *
8
9
  */
9
10
 
@@ -76,10 +77,17 @@ _metadata_write_metadata(lxw_metadata *self)
76
77
  "spreadsheetml/2006/main";
77
78
  char xmlns_xda[] = "http://schemas.microsoft.com/office/"
78
79
  "spreadsheetml/2017/dynamicarray";
80
+ char xmlns_xlrd[] = "http://schemas.microsoft.com/office/"
81
+ "spreadsheetml/2017/richdata";
79
82
 
80
83
  LXW_INIT_ATTRIBUTES();
81
84
  LXW_PUSH_ATTRIBUTES_STR("xmlns", xmlns);
82
- LXW_PUSH_ATTRIBUTES_STR("xmlns:xda", xmlns_xda);
85
+
86
+ if (self->has_embedded_images)
87
+ LXW_PUSH_ATTRIBUTES_STR("xmlns:xlrd", xmlns_xlrd);
88
+
89
+ if (self->has_dynamic_functions)
90
+ LXW_PUSH_ATTRIBUTES_STR("xmlns:xda", xmlns_xda);
83
91
 
84
92
  lxw_xml_start_tag(self->file, "metadata", &attributes);
85
93
 
@@ -87,10 +95,10 @@ _metadata_write_metadata(lxw_metadata *self)
87
95
  }
88
96
 
89
97
  /*
90
- * Write the <metadataType> element.
98
+ * Write the <metadataType> element for dynamic functions.
91
99
  */
92
100
  STATIC void
93
- _metadata_write_metadata_type(lxw_metadata *self)
101
+ _metadata_write_cell_metadata_type(lxw_metadata *self)
94
102
  {
95
103
  struct xml_attribute_list attributes;
96
104
  struct xml_attribute *attribute;
@@ -115,6 +123,34 @@ _metadata_write_metadata_type(lxw_metadata *self)
115
123
  LXW_FREE_ATTRIBUTES();
116
124
  }
117
125
 
126
+ /*
127
+ * Write the <metadataType> element for embedded images.
128
+ */
129
+ STATIC void
130
+ _metadata_write_value_metadata_type(lxw_metadata *self)
131
+ {
132
+ struct xml_attribute_list attributes;
133
+ struct xml_attribute *attribute;
134
+
135
+ LXW_INIT_ATTRIBUTES();
136
+ LXW_PUSH_ATTRIBUTES_STR("name", "XLRICHVALUE");
137
+ LXW_PUSH_ATTRIBUTES_INT("minSupportedVersion", 120000);
138
+ LXW_PUSH_ATTRIBUTES_INT("copy", 1);
139
+ LXW_PUSH_ATTRIBUTES_INT("pasteAll", 1);
140
+ LXW_PUSH_ATTRIBUTES_INT("pasteValues", 1);
141
+ LXW_PUSH_ATTRIBUTES_INT("merge", 1);
142
+ LXW_PUSH_ATTRIBUTES_INT("splitFirst", 1);
143
+ LXW_PUSH_ATTRIBUTES_INT("rowColShift", 1);
144
+ LXW_PUSH_ATTRIBUTES_INT("clearFormats", 1);
145
+ LXW_PUSH_ATTRIBUTES_INT("clearComments", 1);
146
+ LXW_PUSH_ATTRIBUTES_INT("assign", 1);
147
+ LXW_PUSH_ATTRIBUTES_INT("coerce", 1);
148
+
149
+ lxw_xml_empty_tag(self->file, "metadataType", &attributes);
150
+
151
+ LXW_FREE_ATTRIBUTES();
152
+ }
153
+
118
154
  /*
119
155
  * Write the <metadataTypes> element.
120
156
  */
@@ -123,14 +159,24 @@ _metadata_write_metadata_types(lxw_metadata *self)
123
159
  {
124
160
  struct xml_attribute_list attributes;
125
161
  struct xml_attribute *attribute;
162
+ uint8_t count = 0;
163
+
164
+ if (self->has_dynamic_functions)
165
+ count++;
166
+
167
+ if (self->has_embedded_images)
168
+ count++;
126
169
 
127
170
  LXW_INIT_ATTRIBUTES();
128
- LXW_PUSH_ATTRIBUTES_INT("count", 1);
171
+ LXW_PUSH_ATTRIBUTES_INT("count", count);
129
172
 
130
173
  lxw_xml_start_tag(self->file, "metadataTypes", &attributes);
131
174
 
132
175
  /* Write the metadataType element. */
133
- _metadata_write_metadata_type(self);
176
+ if (self->has_dynamic_functions)
177
+ _metadata_write_cell_metadata_type(self);
178
+ if (self->has_embedded_images)
179
+ _metadata_write_value_metadata_type(self);
134
180
 
135
181
  lxw_xml_end_tag(self->file, "metadataTypes");
136
182
 
@@ -156,10 +202,10 @@ _metadata_write_xda_dynamic_array_properties(lxw_metadata *self)
156
202
  }
157
203
 
158
204
  /*
159
- * Write the <ext> element.
205
+ * Write the <ext> element for dynamic functions.
160
206
  */
161
207
  STATIC void
162
- _metadata_write_ext(lxw_metadata *self)
208
+ _metadata_write_cell_ext(lxw_metadata *self)
163
209
  {
164
210
  struct xml_attribute_list attributes;
165
211
  struct xml_attribute *attribute;
@@ -178,10 +224,49 @@ _metadata_write_ext(lxw_metadata *self)
178
224
  }
179
225
 
180
226
  /*
181
- * Write the <futureMetadata> element.
227
+ * Write the <xlrd:rvb> element.
182
228
  */
183
229
  STATIC void
184
- _metadata_write_future_metadata(lxw_metadata *self)
230
+ _metadata_write_xlrd_rvb(lxw_metadata *self, uint32_t index)
231
+ {
232
+ struct xml_attribute_list attributes;
233
+ struct xml_attribute *attribute;
234
+
235
+ LXW_INIT_ATTRIBUTES();
236
+ LXW_PUSH_ATTRIBUTES_INT("i", index);
237
+
238
+ lxw_xml_empty_tag(self->file, "xlrd:rvb", &attributes);
239
+
240
+ LXW_FREE_ATTRIBUTES();
241
+ }
242
+
243
+ /*
244
+ * Write the <ext> element for embedded images.
245
+ */
246
+ STATIC void
247
+ _metadata_write_value_ext(lxw_metadata *self, uint32_t index)
248
+ {
249
+ struct xml_attribute_list attributes;
250
+ struct xml_attribute *attribute;
251
+
252
+ LXW_INIT_ATTRIBUTES();
253
+ LXW_PUSH_ATTRIBUTES_STR("uri", "{3e2802c4-a4d2-4d8b-9148-e3be6c30e623}");
254
+
255
+ lxw_xml_start_tag(self->file, "ext", &attributes);
256
+
257
+ /* Write the xlrd:rvb element. */
258
+ _metadata_write_xlrd_rvb(self, index);
259
+
260
+ lxw_xml_end_tag(self->file, "ext");
261
+
262
+ LXW_FREE_ATTRIBUTES();
263
+ }
264
+
265
+ /*
266
+ * Write the <futureMetadata> element for dynamic functions.
267
+ */
268
+ STATIC void
269
+ _metadata_write_cell_future_metadata(lxw_metadata *self)
185
270
  {
186
271
  struct xml_attribute_list attributes;
187
272
  struct xml_attribute *attribute;
@@ -193,14 +278,12 @@ _metadata_write_future_metadata(lxw_metadata *self)
193
278
  lxw_xml_start_tag(self->file, "futureMetadata", &attributes);
194
279
 
195
280
  lxw_xml_start_tag(self->file, "bk", NULL);
196
-
197
281
  lxw_xml_start_tag(self->file, "extLst", NULL);
198
282
 
199
283
  /* Write the ext element. */
200
- _metadata_write_ext(self);
284
+ _metadata_write_cell_ext(self);
201
285
 
202
286
  lxw_xml_end_tag(self->file, "extLst");
203
-
204
287
  lxw_xml_end_tag(self->file, "bk");
205
288
 
206
289
  lxw_xml_end_tag(self->file, "futureMetadata");
@@ -208,18 +291,52 @@ _metadata_write_future_metadata(lxw_metadata *self)
208
291
  LXW_FREE_ATTRIBUTES();
209
292
  }
210
293
 
294
+ /*
295
+ * Write the <futureMetadata> element for embedded images.
296
+ */
297
+ STATIC void
298
+ _metadata_write_value_future_metadata(lxw_metadata *self)
299
+ {
300
+ struct xml_attribute_list attributes;
301
+ struct xml_attribute *attribute;
302
+ uint32_t i;
303
+
304
+ LXW_INIT_ATTRIBUTES();
305
+ LXW_PUSH_ATTRIBUTES_STR("name", "XLRICHVALUE");
306
+ LXW_PUSH_ATTRIBUTES_INT("count", self->num_embedded_images);
307
+
308
+ lxw_xml_start_tag(self->file, "futureMetadata", &attributes);
309
+
310
+ for (i = 0; i < self->num_embedded_images; i++) {
311
+ lxw_xml_start_tag(self->file, "bk", NULL);
312
+
313
+ lxw_xml_start_tag(self->file, "extLst", NULL);
314
+
315
+ /* Write the ext element. */
316
+ _metadata_write_value_ext(self, i);
317
+
318
+ lxw_xml_end_tag(self->file, "extLst");
319
+ lxw_xml_end_tag(self->file, "bk");
320
+
321
+ }
322
+
323
+ lxw_xml_end_tag(self->file, "futureMetadata");
324
+
325
+ LXW_FREE_ATTRIBUTES();
326
+ }
327
+
211
328
  /*
212
329
  * Write the <rc> element.
213
330
  */
214
331
  STATIC void
215
- _metadata_write_rc(lxw_metadata *self)
332
+ _metadata_write_rc(lxw_metadata *self, uint8_t type, uint32_t index)
216
333
  {
217
334
  struct xml_attribute_list attributes;
218
335
  struct xml_attribute *attribute;
219
336
 
220
337
  LXW_INIT_ATTRIBUTES();
221
- LXW_PUSH_ATTRIBUTES_STR("t", "1");
222
- LXW_PUSH_ATTRIBUTES_STR("v", "0");
338
+ LXW_PUSH_ATTRIBUTES_INT("t", type);
339
+ LXW_PUSH_ATTRIBUTES_INT("v", index);
223
340
 
224
341
  lxw_xml_empty_tag(self->file, "rc", &attributes);
225
342
 
@@ -227,7 +344,7 @@ _metadata_write_rc(lxw_metadata *self)
227
344
  }
228
345
 
229
346
  /*
230
- * Write the <cellMetadata> element.
347
+ * Write the <cellMetadata> element for dynamic functions.
231
348
  */
232
349
  STATIC void
233
350
  _metadata_write_cell_metadata(lxw_metadata *self)
@@ -243,7 +360,7 @@ _metadata_write_cell_metadata(lxw_metadata *self)
243
360
  lxw_xml_start_tag(self->file, "bk", NULL);
244
361
 
245
362
  /* Write the rc element. */
246
- _metadata_write_rc(self);
363
+ _metadata_write_rc(self, 1, 0);
247
364
 
248
365
  lxw_xml_end_tag(self->file, "bk");
249
366
 
@@ -252,6 +369,39 @@ _metadata_write_cell_metadata(lxw_metadata *self)
252
369
  LXW_FREE_ATTRIBUTES();
253
370
  }
254
371
 
372
+ /*
373
+ * Write the <cellMetadata> element for embedded images.
374
+ */
375
+ STATIC void
376
+ _metadata_write_value_metadata(lxw_metadata *self)
377
+ {
378
+ struct xml_attribute_list attributes;
379
+ struct xml_attribute *attribute;
380
+ uint8_t type = 1;
381
+ uint32_t i;
382
+
383
+ if (self->has_dynamic_functions)
384
+ type = 2;
385
+
386
+ LXW_INIT_ATTRIBUTES();
387
+ LXW_PUSH_ATTRIBUTES_INT("count", self->num_embedded_images);
388
+
389
+ lxw_xml_start_tag(self->file, "valueMetadata", &attributes);
390
+
391
+ for (i = 0; i < self->num_embedded_images; i++) {
392
+ lxw_xml_start_tag(self->file, "bk", NULL);
393
+
394
+ /* Write the rc element. */
395
+ _metadata_write_rc(self, type, i);
396
+
397
+ lxw_xml_end_tag(self->file, "bk");
398
+ }
399
+
400
+ lxw_xml_end_tag(self->file, "valueMetadata");
401
+
402
+ LXW_FREE_ATTRIBUTES();
403
+ }
404
+
255
405
  /*****************************************************************************
256
406
  *
257
407
  * XML file assembly functions.
@@ -274,10 +424,16 @@ lxw_metadata_assemble_xml_file(lxw_metadata *self)
274
424
  _metadata_write_metadata_types(self);
275
425
 
276
426
  /* Write the futureMetadata element. */
277
- _metadata_write_future_metadata(self);
427
+ if (self->has_dynamic_functions)
428
+ _metadata_write_cell_future_metadata(self);
429
+ if (self->has_embedded_images)
430
+ _metadata_write_value_future_metadata(self);
278
431
 
279
432
  /* Write the cellMetadata element. */
280
- _metadata_write_cell_metadata(self);
433
+ if (self->has_dynamic_functions)
434
+ _metadata_write_cell_metadata(self);
435
+ if (self->has_embedded_images)
436
+ _metadata_write_value_metadata(self);
281
437
 
282
438
  lxw_xml_end_tag(self->file, "metadata");
283
439
  }