fast_excel 0.4.1 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/test.yml +1 -7
- data/CHANGELOG.md +9 -0
- data/Gemfile +1 -1
- data/examples/example.rb +2 -0
- data/examples/example_date_time.rb +38 -0
- data/fast_excel.gemspec +2 -2
- data/lib/fast_excel/binding/format.rb +17 -0
- data/lib/fast_excel/binding/workbook.rb +39 -17
- data/lib/fast_excel/binding/worksheet.rb +57 -13
- data/lib/fast_excel/binding.rb +7 -7
- data/lib/fast_excel.rb +27 -20
- data/libxlsxwriter/.github/FUNDING.yml +1 -0
- data/libxlsxwriter/.github/ISSUE_TEMPLATE.md +85 -0
- data/libxlsxwriter/.github/PULL_REQUEST_TEMPLATE.md +130 -0
- data/libxlsxwriter/.github/workflows/cmake_actions.yml +48 -0
- data/libxlsxwriter/.github/workflows/code_style.yml +23 -0
- data/libxlsxwriter/.github/workflows/coverity.yml +22 -0
- data/libxlsxwriter/.github/workflows/make_actions.yml +52 -0
- data/libxlsxwriter/.github/workflows/valgrind.yml +23 -0
- data/libxlsxwriter/.github/workflows/windows_build.yml +54 -0
- data/libxlsxwriter/.github/workflows/zig_build.yml +22 -0
- data/libxlsxwriter/.gitignore +16 -1
- data/libxlsxwriter/.indent.pro +24 -0
- data/libxlsxwriter/CMakeLists.txt +156 -56
- data/libxlsxwriter/CONTRIBUTING.md +2 -2
- data/libxlsxwriter/Changes.txt +344 -2
- data/libxlsxwriter/LICENSE.txt +66 -8
- data/libxlsxwriter/Makefile +151 -54
- data/libxlsxwriter/Package.swift +42 -0
- data/libxlsxwriter/Readme.md +4 -2
- data/libxlsxwriter/build.zig +324 -0
- data/libxlsxwriter/build.zig.zon +11 -0
- data/libxlsxwriter/cmake/FindMINIZIP.cmake +3 -3
- data/libxlsxwriter/cocoapods/libxlsxwriter-umbrella.h +6 -0
- data/libxlsxwriter/include/xlsxwriter/app.h +2 -1
- data/libxlsxwriter/include/xlsxwriter/chart.h +236 -32
- data/libxlsxwriter/include/xlsxwriter/chartsheet.h +7 -7
- data/libxlsxwriter/include/xlsxwriter/comment.h +76 -0
- data/libxlsxwriter/include/xlsxwriter/common.h +111 -50
- data/libxlsxwriter/include/xlsxwriter/content_types.h +8 -1
- data/libxlsxwriter/include/xlsxwriter/core.h +1 -1
- data/libxlsxwriter/include/xlsxwriter/custom.h +1 -1
- data/libxlsxwriter/include/xlsxwriter/drawing.h +11 -20
- data/libxlsxwriter/include/xlsxwriter/format.h +121 -8
- data/libxlsxwriter/include/xlsxwriter/hash_table.h +1 -1
- data/libxlsxwriter/include/xlsxwriter/metadata.h +49 -0
- data/libxlsxwriter/include/xlsxwriter/packager.h +27 -16
- data/libxlsxwriter/include/xlsxwriter/relationships.h +1 -1
- data/libxlsxwriter/include/xlsxwriter/shared_strings.h +1 -1
- data/libxlsxwriter/include/xlsxwriter/styles.h +13 -7
- data/libxlsxwriter/include/xlsxwriter/table.h +51 -0
- data/libxlsxwriter/include/xlsxwriter/theme.h +1 -1
- data/libxlsxwriter/include/xlsxwriter/third_party/emyg_dtoa.h +26 -0
- data/libxlsxwriter/include/xlsxwriter/third_party/ioapi.h +27 -25
- data/libxlsxwriter/include/xlsxwriter/third_party/md5.h +45 -0
- data/libxlsxwriter/include/xlsxwriter/third_party/zip.h +155 -153
- data/libxlsxwriter/include/xlsxwriter/utility.h +70 -8
- data/libxlsxwriter/include/xlsxwriter/vml.h +55 -0
- data/libxlsxwriter/include/xlsxwriter/workbook.h +218 -47
- data/libxlsxwriter/include/xlsxwriter/worksheet.h +2770 -241
- data/libxlsxwriter/include/xlsxwriter/xmlwriter.h +12 -8
- data/libxlsxwriter/include/xlsxwriter.h +4 -2
- data/libxlsxwriter/libxlsxwriter.podspec +8 -5
- data/libxlsxwriter/src/Makefile +58 -21
- data/libxlsxwriter/src/app.c +5 -2
- data/libxlsxwriter/src/chart.c +396 -81
- data/libxlsxwriter/src/chartsheet.c +22 -22
- data/libxlsxwriter/src/comment.c +443 -0
- data/libxlsxwriter/src/content_types.c +40 -1
- data/libxlsxwriter/src/core.c +2 -2
- data/libxlsxwriter/src/custom.c +1 -1
- data/libxlsxwriter/src/drawing.c +160 -40
- data/libxlsxwriter/src/format.c +109 -25
- data/libxlsxwriter/src/hash_table.c +1 -1
- data/libxlsxwriter/src/metadata.c +283 -0
- data/libxlsxwriter/src/packager.c +794 -94
- data/libxlsxwriter/src/relationships.c +1 -1
- data/libxlsxwriter/src/shared_strings.c +2 -4
- data/libxlsxwriter/src/styles.c +353 -58
- data/libxlsxwriter/src/table.c +304 -0
- data/libxlsxwriter/src/theme.c +1 -1
- data/libxlsxwriter/src/utility.c +143 -43
- data/libxlsxwriter/src/vml.c +1062 -0
- data/libxlsxwriter/src/workbook.c +567 -77
- data/libxlsxwriter/src/worksheet.c +6668 -1462
- data/libxlsxwriter/src/xmlwriter.c +95 -5
- data/libxlsxwriter/third_party/dtoa/Makefile +42 -0
- data/libxlsxwriter/third_party/dtoa/emyg_dtoa.c +461 -0
- data/libxlsxwriter/third_party/dtoa/emyg_dtoa.h +26 -0
- data/libxlsxwriter/third_party/md5/Makefile +42 -0
- data/libxlsxwriter/third_party/md5/md5.c +291 -0
- data/libxlsxwriter/third_party/md5/md5.h +45 -0
- data/libxlsxwriter/third_party/minizip/Makefile +3 -8
- data/libxlsxwriter/third_party/minizip/Makefile.orig +8 -4
- data/libxlsxwriter/third_party/minizip/MiniZip64_Changes.txt +1 -1
- data/libxlsxwriter/third_party/minizip/configure.ac +1 -1
- data/libxlsxwriter/third_party/minizip/crypt.h +13 -16
- data/libxlsxwriter/third_party/minizip/ioapi.c +31 -57
- data/libxlsxwriter/third_party/minizip/ioapi.h +31 -23
- data/libxlsxwriter/third_party/minizip/iowin32.c +29 -45
- data/libxlsxwriter/third_party/minizip/iowin32.h +4 -4
- data/libxlsxwriter/third_party/minizip/miniunz.c +29 -56
- data/libxlsxwriter/third_party/minizip/minizip.c +38 -49
- data/libxlsxwriter/third_party/minizip/mztools.c +1 -7
- data/libxlsxwriter/third_party/minizip/unzip.c +202 -342
- data/libxlsxwriter/third_party/minizip/unzip.h +74 -74
- data/libxlsxwriter/third_party/minizip/zip.c +165 -218
- data/libxlsxwriter/third_party/minizip/zip.h +164 -154
- data/libxlsxwriter/third_party/tmpfileplus/Makefile +3 -3
- data/libxlsxwriter/version.txt +1 -1
- data/test/auto_width_test.rb +20 -0
- data/test/default_format_test.rb +1 -1
- data/test/validations_test.rb +3 -3
- data/test/worksheet_test.rb +6 -1
- metadata +33 -7
- data/libxlsxwriter/.travis.yml +0 -37
@@ -1,7 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
* libxlsxwriter
|
3
3
|
*
|
4
|
-
* Copyright 2014-
|
4
|
+
* Copyright 2014-2022, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
|
5
5
|
*/
|
6
6
|
|
7
7
|
/**
|
@@ -57,6 +57,7 @@
|
|
57
57
|
/* Define the tree.h RB structs for the red-black head types. */
|
58
58
|
RB_HEAD(lxw_worksheet_names, lxw_worksheet_name);
|
59
59
|
RB_HEAD(lxw_chartsheet_names, lxw_chartsheet_name);
|
60
|
+
RB_HEAD(lxw_image_md5s, lxw_image_md5);
|
60
61
|
|
61
62
|
/* Define the queue.h structs for the workbook lists. */
|
62
63
|
STAILQ_HEAD(lxw_sheets, lxw_sheet);
|
@@ -65,7 +66,7 @@ STAILQ_HEAD(lxw_chartsheets, lxw_chartsheet);
|
|
65
66
|
STAILQ_HEAD(lxw_charts, lxw_chart);
|
66
67
|
TAILQ_HEAD(lxw_defined_names, lxw_defined_name);
|
67
68
|
|
68
|
-
/*
|
69
|
+
/* Struct to hold the 2 sheet types. */
|
69
70
|
typedef struct lxw_sheet {
|
70
71
|
uint8_t is_chartsheet;
|
71
72
|
|
@@ -93,6 +94,14 @@ typedef struct lxw_chartsheet_name {
|
|
93
94
|
RB_ENTRY (lxw_chartsheet_name) tree_pointers;
|
94
95
|
} lxw_chartsheet_name;
|
95
96
|
|
97
|
+
/* Struct to represent an image MD5/ID pair. */
|
98
|
+
typedef struct lxw_image_md5 {
|
99
|
+
uint32_t id;
|
100
|
+
char *md5;
|
101
|
+
|
102
|
+
RB_ENTRY (lxw_image_md5) tree_pointers;
|
103
|
+
} lxw_image_md5;
|
104
|
+
|
96
105
|
/* Wrapper around RB_GENERATE_STATIC from tree.h to avoid unused function
|
97
106
|
* warnings and to avoid portability issues with the _unused attribute. */
|
98
107
|
#define LXW_RB_GENERATE_WORKSHEET_NAMES(name, type, field, cmp) \
|
@@ -117,6 +126,17 @@ typedef struct lxw_chartsheet_name {
|
|
117
126
|
/* Add unused struct to allow adding a semicolon */ \
|
118
127
|
struct lxw_rb_generate_charsheet_names{int unused;}
|
119
128
|
|
129
|
+
#define LXW_RB_GENERATE_IMAGE_MD5S(name, type, field, cmp) \
|
130
|
+
RB_GENERATE_INSERT_COLOR(name, type, field, static) \
|
131
|
+
RB_GENERATE_REMOVE_COLOR(name, type, field, static) \
|
132
|
+
RB_GENERATE_INSERT(name, type, field, cmp, static) \
|
133
|
+
RB_GENERATE_REMOVE(name, type, field, static) \
|
134
|
+
RB_GENERATE_FIND(name, type, field, cmp, static) \
|
135
|
+
RB_GENERATE_NEXT(name, type, field, static) \
|
136
|
+
RB_GENERATE_MINMAX(name, type, field, static) \
|
137
|
+
/* Add unused struct to allow adding a semicolon */ \
|
138
|
+
struct lxw_rb_generate_image_md5s{int unused;}
|
139
|
+
|
120
140
|
/**
|
121
141
|
* @brief Macro to loop over all the worksheets in a workbook.
|
122
142
|
*
|
@@ -158,39 +178,43 @@ typedef struct lxw_defined_name {
|
|
158
178
|
} lxw_defined_name;
|
159
179
|
|
160
180
|
/**
|
161
|
-
* Workbook document properties.
|
181
|
+
* Workbook document properties. Set any unused fields to NULL or 0.
|
162
182
|
*/
|
163
183
|
typedef struct lxw_doc_properties {
|
164
184
|
/** The title of the Excel Document. */
|
165
|
-
char *title;
|
185
|
+
const char *title;
|
166
186
|
|
167
187
|
/** The subject of the Excel Document. */
|
168
|
-
char *subject;
|
188
|
+
const char *subject;
|
169
189
|
|
170
190
|
/** The author of the Excel Document. */
|
171
|
-
char *author;
|
191
|
+
const char *author;
|
172
192
|
|
173
193
|
/** The manager field of the Excel Document. */
|
174
|
-
char *manager;
|
194
|
+
const char *manager;
|
175
195
|
|
176
196
|
/** The company field of the Excel Document. */
|
177
|
-
char *company;
|
197
|
+
const char *company;
|
178
198
|
|
179
199
|
/** The category of the Excel Document. */
|
180
|
-
char *category;
|
200
|
+
const char *category;
|
181
201
|
|
182
202
|
/** The keywords of the Excel Document. */
|
183
|
-
char *keywords;
|
203
|
+
const char *keywords;
|
184
204
|
|
185
205
|
/** The comment field of the Excel Document. */
|
186
|
-
char *comments;
|
206
|
+
const char *comments;
|
187
207
|
|
188
208
|
/** The status of the Excel Document. */
|
189
|
-
char *status;
|
209
|
+
const char *status;
|
190
210
|
|
191
|
-
/** The hyperlink base
|
192
|
-
char *hyperlink_base;
|
211
|
+
/** The hyperlink base URL of the Excel Document. */
|
212
|
+
const char *hyperlink_base;
|
193
213
|
|
214
|
+
/** The file creation date/time shown in Excel. This defaults to the
|
215
|
+
* current time and date if set to 0. If you wish to create files that are
|
216
|
+
* binary equivalent (for the same input data) then you should set this
|
217
|
+
* creation date/time to a known value. */
|
194
218
|
time_t created;
|
195
219
|
|
196
220
|
} lxw_doc_properties;
|
@@ -205,7 +229,7 @@ typedef struct lxw_doc_properties {
|
|
205
229
|
*
|
206
230
|
* - `constant_memory`: This option reduces the amount of data stored in
|
207
231
|
* memory so that large files can be written efficiently. This option is off
|
208
|
-
* by default. See the
|
232
|
+
* by default. See the notes below for limitations when this mode is on.
|
209
233
|
*
|
210
234
|
* - `tmpdir`: libxlsxwriter stores workbook data in temporary files prior to
|
211
235
|
* assembling the final XLSX file. The temporary files are created in the
|
@@ -219,24 +243,43 @@ typedef struct lxw_doc_properties {
|
|
219
243
|
* for more information. This option is off by default.
|
220
244
|
*
|
221
245
|
* [zip64_wiki]: https://en.wikipedia.org/wiki/Zip_(file_format)#ZIP64
|
222
|
-
|
223
|
-
*
|
224
|
-
*
|
225
|
-
*
|
226
|
-
*
|
227
|
-
*
|
228
|
-
*
|
246
|
+
|
247
|
+
* - `output_buffer`: Output to a buffer instead of a file. The buffer must be
|
248
|
+
* freed manually by calling free(). This option can only be used if filename
|
249
|
+
* is NULL.
|
250
|
+
*
|
251
|
+
* - `output_buffer_size`: Used with output_buffer to get the size of the
|
252
|
+
* created buffer. This option can only be used if filename is NULL.
|
253
|
+
*
|
254
|
+
* @note In `constant_memory` mode each row of in-memory data is written to
|
255
|
+
* disk and then freed when a new row is started via one of the
|
256
|
+
* `worksheet_write_*()` functions. Therefore, once this option is active data
|
257
|
+
* should be written in sequential row by row order. For this reason
|
258
|
+
* `worksheet_merge_range()` and some other row based functionality doesn't
|
259
|
+
* work in this mode. See @ref ww_mem_constant for more details.
|
260
|
+
*
|
261
|
+
* @note Also, in `constant_memory` mode the library uses temp file storage
|
262
|
+
* for worksheet data. This can lead to an issue on OSes that map the `/tmp`
|
263
|
+
* directory into memory since it is possible to consume the "system" memory
|
264
|
+
* even though the "process" memory remains constant. In these cases you
|
265
|
+
* should use an alternative temp file location by using the `tmpdir` option
|
266
|
+
* shown above. See @ref ww_mem_temp for more details.
|
229
267
|
*/
|
230
268
|
typedef struct lxw_workbook_options {
|
231
269
|
/** Optimize the workbook to use constant memory for worksheets. */
|
232
270
|
uint8_t constant_memory;
|
233
271
|
|
234
272
|
/** Directory to use for the temporary files created by libxlsxwriter. */
|
235
|
-
char *tmpdir;
|
273
|
+
const char *tmpdir;
|
236
274
|
|
237
275
|
/** Allow ZIP64 extensions when creating the xlsx file zip container. */
|
238
276
|
uint8_t use_zip64;
|
239
277
|
|
278
|
+
/** Output buffer to use instead of writing to a file */
|
279
|
+
const char **output_buffer;
|
280
|
+
|
281
|
+
/** Used with output_buffer to get the size of the created buffer */
|
282
|
+
size_t *output_buffer_size;
|
240
283
|
} lxw_workbook_options;
|
241
284
|
|
242
285
|
/**
|
@@ -254,6 +297,9 @@ typedef struct lxw_workbook {
|
|
254
297
|
struct lxw_chartsheets *chartsheets;
|
255
298
|
struct lxw_worksheet_names *worksheet_names;
|
256
299
|
struct lxw_chartsheet_names *chartsheet_names;
|
300
|
+
struct lxw_image_md5s *image_md5s;
|
301
|
+
struct lxw_image_md5s *header_image_md5s;
|
302
|
+
struct lxw_image_md5s *background_md5s;
|
257
303
|
struct lxw_charts *charts;
|
258
304
|
struct lxw_charts *ordered_charts;
|
259
305
|
struct lxw_formats *formats;
|
@@ -271,23 +317,35 @@ typedef struct lxw_workbook {
|
|
271
317
|
uint16_t first_sheet;
|
272
318
|
uint16_t active_sheet;
|
273
319
|
uint16_t num_xf_formats;
|
320
|
+
uint16_t num_dxf_formats;
|
274
321
|
uint16_t num_format_count;
|
275
322
|
uint16_t drawing_count;
|
323
|
+
uint16_t comment_count;
|
276
324
|
|
277
325
|
uint16_t font_count;
|
278
326
|
uint16_t border_count;
|
279
327
|
uint16_t fill_count;
|
280
328
|
uint8_t optimize;
|
329
|
+
uint16_t max_url_length;
|
330
|
+
uint8_t read_only;
|
281
331
|
|
282
332
|
uint8_t has_png;
|
283
333
|
uint8_t has_jpeg;
|
284
334
|
uint8_t has_bmp;
|
335
|
+
uint8_t has_gif;
|
336
|
+
uint8_t has_vml;
|
337
|
+
uint8_t has_comments;
|
338
|
+
uint8_t has_metadata;
|
285
339
|
|
286
340
|
lxw_hash_table *used_xf_formats;
|
341
|
+
lxw_hash_table *used_dxf_formats;
|
287
342
|
|
288
343
|
char *vba_project;
|
344
|
+
char *vba_project_signature;
|
289
345
|
char *vba_codename;
|
290
346
|
|
347
|
+
lxw_format *default_url_format;
|
348
|
+
|
291
349
|
} lxw_workbook;
|
292
350
|
|
293
351
|
|
@@ -331,7 +389,9 @@ lxw_workbook *workbook_new(const char *filename);
|
|
331
389
|
* @code
|
332
390
|
* lxw_workbook_options options = {.constant_memory = LXW_TRUE,
|
333
391
|
* .tmpdir = "C:\\Temp",
|
334
|
-
* .use_zip64 = LXW_FALSE
|
392
|
+
* .use_zip64 = LXW_FALSE,
|
393
|
+
* .output_buffer = NULL,
|
394
|
+
* .output_buffer_size = NULL};
|
335
395
|
*
|
336
396
|
* lxw_workbook *workbook = workbook_new_opt("filename.xlsx", &options);
|
337
397
|
* @endcode
|
@@ -355,23 +415,30 @@ lxw_workbook *workbook_new(const char *filename);
|
|
355
415
|
*
|
356
416
|
* [zip64_wiki]: https://en.wikipedia.org/wiki/Zip_(file_format)#ZIP64
|
357
417
|
*
|
358
|
-
*
|
359
|
-
*
|
360
|
-
*
|
361
|
-
*
|
362
|
-
*
|
363
|
-
*
|
418
|
+
* - `output_buffer`: Output to a memory buffer instead of a file. The buffer
|
419
|
+
* must be freed manually by calling `free()`. This option can only be used if
|
420
|
+
* filename is NULL.
|
421
|
+
*
|
422
|
+
* - `output_buffer_size`: Used with output_buffer to get the size of the
|
423
|
+
* created buffer. This option can only be used if filename is `NULL`.
|
424
|
+
*
|
425
|
+
* @note In `constant_memory` mode each row of in-memory data is written to
|
426
|
+
* disk and then freed when a new row is started via one of the
|
427
|
+
* `worksheet_write_*()` functions. Therefore, once this option is active data
|
428
|
+
* should be written in sequential row by row order. For this reason
|
429
|
+
* `worksheet_merge_range()` and some other row based functionality doesn't
|
430
|
+
* work in this mode. See @ref ww_mem_constant for more details.
|
431
|
+
*
|
432
|
+
* @note Also, in `constant_memory` mode the library uses temp file storage
|
433
|
+
* for worksheet data. This can lead to an issue on OSes that map the `/tmp`
|
434
|
+
* directory into memory since it is possible to consume the "system" memory
|
435
|
+
* even though the "process" memory remains constant. In these cases you
|
436
|
+
* should use an alternative temp file location by using the `tmpdir` option
|
437
|
+
* shown above. See @ref ww_mem_temp for more details.
|
364
438
|
*/
|
365
439
|
lxw_workbook *workbook_new_opt(const char *filename,
|
366
440
|
lxw_workbook_options *options);
|
367
441
|
|
368
|
-
/* Deprecated function name for backwards compatibility. */
|
369
|
-
lxw_workbook *new_workbook(const char *filename);
|
370
|
-
|
371
|
-
/* Deprecated function name for backwards compatibility. */
|
372
|
-
lxw_workbook *new_workbook_opt(const char *filename,
|
373
|
-
lxw_workbook_options *options);
|
374
|
-
|
375
442
|
/**
|
376
443
|
* @brief Add a new worksheet to a workbook.
|
377
444
|
*
|
@@ -404,12 +471,15 @@ lxw_workbook *new_workbook_opt(const char *filename,
|
|
404
471
|
* - The name is less than or equal to 31 UTF-8 characters.
|
405
472
|
* - The name doesn't contain any of the characters: ` [ ] : * ? / \ `
|
406
473
|
* - The name doesn't start or end with an apostrophe.
|
407
|
-
* - The name isn't "History", which is reserved by Excel. (Case insensitive).
|
408
474
|
* - The name isn't already in use. (Case insensitive).
|
409
475
|
*
|
410
476
|
* If any of these errors are encountered the function will return NULL.
|
411
477
|
* You can check for valid name using the `workbook_validate_sheet_name()`
|
412
478
|
* function.
|
479
|
+
*
|
480
|
+
* @note You should also avoid using the worksheet name "History" (case
|
481
|
+
* insensitive) which is reserved in English language versions of
|
482
|
+
* Excel. Non-English versions may have restrictions on the equivalent word.
|
413
483
|
*/
|
414
484
|
lxw_worksheet *workbook_add_worksheet(lxw_workbook *workbook,
|
415
485
|
const char *sheetname);
|
@@ -443,13 +513,16 @@ lxw_worksheet *workbook_add_worksheet(lxw_workbook *workbook,
|
|
443
513
|
* - The name is less than or equal to 31 UTF-8 characters.
|
444
514
|
* - The name doesn't contain any of the characters: ` [ ] : * ? / \ `
|
445
515
|
* - The name doesn't start or end with an apostrophe.
|
446
|
-
* - The name isn't "History", which is reserved by Excel. (Case insensitive).
|
447
516
|
* - The name isn't already in use. (Case insensitive).
|
448
517
|
*
|
449
518
|
* If any of these errors are encountered the function will return NULL.
|
450
519
|
* You can check for valid name using the `workbook_validate_sheet_name()`
|
451
520
|
* function.
|
452
521
|
*
|
522
|
+
* @note You should also avoid using the worksheet name "History" (case
|
523
|
+
* insensitive) which is reserved in English language versions of
|
524
|
+
* Excel. Non-English versions may have restrictions on the equivalent word.
|
525
|
+
*
|
453
526
|
* At least one worksheet should be added to a new workbook when creating a
|
454
527
|
* chartsheet in order to provide data for the chart. The @ref worksheet.h
|
455
528
|
* "Worksheet" object is used to write data and configure a worksheet in the
|
@@ -533,6 +606,8 @@ lxw_format *workbook_default_format(lxw_workbook *workbook);
|
|
533
606
|
* | #LXW_CHART_COLUMN_STACKED_PERCENT | Column chart - percentage stacked. |
|
534
607
|
* | #LXW_CHART_DOUGHNUT | Doughnut chart. |
|
535
608
|
* | #LXW_CHART_LINE | Line chart. |
|
609
|
+
* | #LXW_CHART_LINE_STACKED | Line chart - stacked. |
|
610
|
+
* | #LXW_CHART_LINE_STACKED_PERCENT | Line chart - percentage stacked. |
|
536
611
|
* | #LXW_CHART_PIE | Pie chart. |
|
537
612
|
* | #LXW_CHART_SCATTER | Scatter chart. |
|
538
613
|
* | #LXW_CHART_SCATTER_STRAIGHT | Scatter chart - straight. |
|
@@ -600,10 +675,11 @@ lxw_error workbook_close(lxw_workbook *workbook);
|
|
600
675
|
* - `keywords`
|
601
676
|
* - `comments`
|
602
677
|
* - `hyperlink_base`
|
678
|
+
* - `created`
|
603
679
|
*
|
604
680
|
* The properties are specified via a `lxw_doc_properties` struct. All the
|
605
|
-
*
|
606
|
-
*
|
681
|
+
* fields are all optional. An example of how to create and pass the
|
682
|
+
* properties is:
|
607
683
|
*
|
608
684
|
* @code
|
609
685
|
* // Create a properties structure and set some of the fields.
|
@@ -625,6 +701,12 @@ lxw_error workbook_close(lxw_workbook *workbook);
|
|
625
701
|
*
|
626
702
|
* @image html doc_properties.png
|
627
703
|
*
|
704
|
+
* The `created` parameter sets the file creation date/time shown in
|
705
|
+
* Excel. This defaults to the current time and date if set to 0. If you wish
|
706
|
+
* to create files that are binary equivalent (for the same input data) then
|
707
|
+
* you should set this creation date/time to a known value using a `time_t`
|
708
|
+
* value.
|
709
|
+
*
|
628
710
|
*/
|
629
711
|
lxw_error workbook_set_properties(lxw_workbook *workbook,
|
630
712
|
lxw_doc_properties *properties);
|
@@ -777,13 +859,32 @@ lxw_error workbook_set_custom_property_datetime(lxw_workbook *workbook,
|
|
777
859
|
* @endcode
|
778
860
|
*
|
779
861
|
* The rules for names in Excel are explained in the
|
780
|
-
* [Microsoft Office
|
781
|
-
documentation](http://office.microsoft.com/en-001/excel-help/define-and-use-names-in-formulas-HA010147120.aspx).
|
862
|
+
* [Microsoft Office documentation](http://office.microsoft.com/en-001/excel-help/define-and-use-names-in-formulas-HA010147120.aspx).
|
782
863
|
*
|
783
864
|
*/
|
784
865
|
lxw_error workbook_define_name(lxw_workbook *workbook, const char *name,
|
785
866
|
const char *formula);
|
786
867
|
|
868
|
+
/**
|
869
|
+
* @brief Get the default URL format used with `worksheet_write_url()`.
|
870
|
+
*
|
871
|
+
* @param workbook Pointer to a lxw_workbook instance.
|
872
|
+
* @return A lxw_format instance that has hyperlink properties set.
|
873
|
+
*
|
874
|
+
* This function returns a lxw_format instance that is used for the default
|
875
|
+
* blue underline hyperlink in the `worksheet_write_url()` function when a
|
876
|
+
* format isn't specified:
|
877
|
+
*
|
878
|
+
* @code
|
879
|
+
* lxw_format *url_format = workbook_get_default_url_format(workbook);
|
880
|
+
* @endcode
|
881
|
+
*
|
882
|
+
* The format is the hyperlink style defined by Excel for the default theme.
|
883
|
+
* This format is only ever required when overwriting a string URL with
|
884
|
+
* data of a different type. See the example below.
|
885
|
+
*/
|
886
|
+
lxw_format *workbook_get_default_url_format(lxw_workbook *workbook);
|
887
|
+
|
787
888
|
/**
|
788
889
|
* @brief Get a worksheet object from its name.
|
789
890
|
*
|
@@ -834,7 +935,6 @@ lxw_chartsheet *workbook_get_chartsheet_by_name(lxw_workbook *workbook,
|
|
834
935
|
* - The name is less than or equal to 31 UTF-8 characters.
|
835
936
|
* - The name doesn't contain any of the characters: ` [ ] : * ? / \ `
|
836
937
|
* - The name doesn't start or end with an apostrophe.
|
837
|
-
* - The name isn't "History", which is reserved by Excel. (Case insensitive).
|
838
938
|
* - The name isn't already in use. (Case insensitive, see the note below).
|
839
939
|
*
|
840
940
|
* @code
|
@@ -845,6 +945,10 @@ lxw_chartsheet *workbook_get_chartsheet_by_name(lxw_workbook *workbook,
|
|
845
945
|
* `workbook_add_chartsheet()` but it can be explicitly called by the user
|
846
946
|
* beforehand to ensure that the sheet name is valid.
|
847
947
|
*
|
948
|
+
* @note You should also avoid using the worksheet name "History" (case
|
949
|
+
* insensitive) which is reserved in English language versions of
|
950
|
+
* Excel. Non-English versions may have restrictions on the equivalent word.
|
951
|
+
*
|
848
952
|
* @note This function does an ASCII lowercase string comparison to determine
|
849
953
|
* if the sheet name is already in use. It doesn't take UTF-8 characters into
|
850
954
|
* account. Thus it would flag "Café" and "café" as a duplicate (just like
|
@@ -869,13 +973,54 @@ lxw_error workbook_validate_sheet_name(lxw_workbook *workbook,
|
|
869
973
|
* workbook_add_vba_project(workbook, "vbaProject.bin");
|
870
974
|
* @endcode
|
871
975
|
*
|
872
|
-
* Only one `vbaProject.bin file
|
976
|
+
* Only one `vbaProject.bin` file can be added per workbook. The name doesn't
|
977
|
+
* have to be `vbaProject.bin`. Any suitable path/name for an existing VBA bin
|
978
|
+
* file will do.
|
979
|
+
*
|
980
|
+
* Once you add a VBA project had been add to an libxlsxwriter workbook you
|
981
|
+
* should ensure that the file extension is `.xlsm` to prevent Excel from
|
982
|
+
* giving a warning when it opens the file:
|
983
|
+
*
|
984
|
+
* @code
|
985
|
+
* lxw_workbook *workbook = new_workbook("macro.xlsm");
|
986
|
+
* @endcode
|
987
|
+
*
|
988
|
+
* See also @ref working_with_macros
|
873
989
|
*
|
874
990
|
* @return A #lxw_error.
|
875
991
|
*/
|
876
992
|
lxw_error workbook_add_vba_project(lxw_workbook *workbook,
|
877
993
|
const char *filename);
|
878
994
|
|
995
|
+
/**
|
996
|
+
* @brief Add a vbaProject binary and a vbaProjectSignature binary to the Excel
|
997
|
+
* workbook.
|
998
|
+
*
|
999
|
+
* @param workbook Pointer to a lxw_workbook instance.
|
1000
|
+
* @param vba_project The path/filename of the vbaProject.bin file.
|
1001
|
+
* @param signature The path/filename of the vbaProjectSignature.bin file.
|
1002
|
+
*
|
1003
|
+
* The `%workbook_add_signed_vba_project()` function can be used to add digitally
|
1004
|
+
* signed macros or functions to a workbook. The function adds a binary VBA project
|
1005
|
+
* file and a binary VBA project signature file that have been extracted from an
|
1006
|
+
* existing Excel xlsm file with digitally signed macros:
|
1007
|
+
*
|
1008
|
+
* @code
|
1009
|
+
* workbook_add_signed_vba_project(workbook, "vbaProject.bin", "vbaProjectSignature.bin");
|
1010
|
+
* @endcode
|
1011
|
+
*
|
1012
|
+
* Only one `vbaProject.bin` file can be added per workbook. The name doesn't
|
1013
|
+
* have to be `vbaProject.bin`. Any suitable path/name for an existing VBA bin
|
1014
|
+
* file will do. The same applies for `vbaProjectSignature.bin`.
|
1015
|
+
*
|
1016
|
+
* See also @ref working_with_macros
|
1017
|
+
*
|
1018
|
+
* @return A #lxw_error.
|
1019
|
+
*/
|
1020
|
+
lxw_error workbook_add_signed_vba_project(lxw_workbook *workbook,
|
1021
|
+
const char *vba_project,
|
1022
|
+
const char *signature);
|
1023
|
+
|
879
1024
|
/**
|
880
1025
|
* @brief Set the VBA name for the workbook.
|
881
1026
|
*
|
@@ -884,21 +1029,47 @@ lxw_error workbook_add_vba_project(lxw_workbook *workbook,
|
|
884
1029
|
*
|
885
1030
|
* The `workbook_set_vba_name()` function can be used to set the VBA name for
|
886
1031
|
* the workbook. This is sometimes required when a vbaProject macro included
|
887
|
-
* via `workbook_add_vba_project()` refers to the workbook
|
1032
|
+
* via `workbook_add_vba_project()` refers to the workbook by a name other
|
1033
|
+
* than `ThisWorkbook`.
|
888
1034
|
*
|
889
1035
|
* @code
|
890
1036
|
* workbook_set_vba_name(workbook, "MyWorkbook");
|
891
1037
|
* @endcode
|
892
1038
|
*
|
893
|
-
*
|
1039
|
+
* If an Excel VBA name for the workbook isn't specified then libxlsxwriter
|
1040
|
+
* will use `ThisWorkbook`.
|
1041
|
+
*
|
1042
|
+
* See also @ref working_with_macros
|
894
1043
|
*
|
895
1044
|
* @return A #lxw_error.
|
896
1045
|
*/
|
897
1046
|
lxw_error workbook_set_vba_name(lxw_workbook *workbook, const char *name);
|
898
1047
|
|
1048
|
+
/**
|
1049
|
+
* @brief Add a recommendation to open the file in "read-only" mode.
|
1050
|
+
*
|
1051
|
+
* @param workbook Pointer to a lxw_workbook instance.
|
1052
|
+
*
|
1053
|
+
* This function can be used to set the Excel "Read-only Recommended" option
|
1054
|
+
* that is available when saving a file. This presents the user of the file
|
1055
|
+
* with an option to open it in "read-only" mode. This means that any changes
|
1056
|
+
* to the file can't be saved back to the same file and must be saved to a new
|
1057
|
+
* file. It can be set as follows:
|
1058
|
+
*
|
1059
|
+
* @code
|
1060
|
+
* workbook_read_only_recommended(workbook);
|
1061
|
+
* @endcode
|
1062
|
+
*
|
1063
|
+
* Which will raise a dialog like the following when opening the file:
|
1064
|
+
*
|
1065
|
+
* @image html read_only.png
|
1066
|
+
*/
|
1067
|
+
void workbook_read_only_recommended(lxw_workbook *workbook);
|
1068
|
+
|
899
1069
|
void lxw_workbook_free(lxw_workbook *workbook);
|
900
1070
|
void lxw_workbook_assemble_xml_file(lxw_workbook *workbook);
|
901
1071
|
void lxw_workbook_set_default_xf_indices(lxw_workbook *workbook);
|
1072
|
+
void workbook_unset_default_url_format(lxw_workbook *workbook);
|
902
1073
|
|
903
1074
|
/* Declarations required for unit testing. */
|
904
1075
|
#ifdef TESTING
|