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
|
/**
|
@@ -46,7 +46,6 @@
|
|
46
46
|
#include <stdio.h>
|
47
47
|
#include <stdlib.h>
|
48
48
|
#include <stdint.h>
|
49
|
-
#include <string.h>
|
50
49
|
|
51
50
|
#include "shared_strings.h"
|
52
51
|
#include "chart.h"
|
@@ -55,24 +54,33 @@
|
|
55
54
|
#include "format.h"
|
56
55
|
#include "styles.h"
|
57
56
|
#include "utility.h"
|
57
|
+
#include "relationships.h"
|
58
58
|
|
59
|
-
#define LXW_ROW_MAX
|
60
|
-
#define LXW_COL_MAX
|
61
|
-
#define LXW_COL_META_MAX
|
62
|
-
#define LXW_HEADER_FOOTER_MAX
|
63
|
-
#define LXW_MAX_NUMBER_URLS
|
64
|
-
#define LXW_PANE_NAME_LENGTH
|
59
|
+
#define LXW_ROW_MAX 1048576
|
60
|
+
#define LXW_COL_MAX 16384
|
61
|
+
#define LXW_COL_META_MAX 128
|
62
|
+
#define LXW_HEADER_FOOTER_MAX 255
|
63
|
+
#define LXW_MAX_NUMBER_URLS 65530
|
64
|
+
#define LXW_PANE_NAME_LENGTH 12 /* bottomRight + 1 */
|
65
|
+
#define LXW_IMAGE_BUFFER_SIZE 1024
|
66
|
+
#define LXW_HEADER_FOOTER_OBJS_MAX 6 /* Header/footer image objs. */
|
65
67
|
|
66
68
|
/* The Excel 2007 specification says that the maximum number of page
|
67
69
|
* breaks is 1026. However, in practice it is actually 1023. */
|
68
70
|
#define LXW_BREAKS_MAX 1023
|
69
71
|
|
70
|
-
/** Default column width in
|
72
|
+
/** Default Excel column width in character units. */
|
71
73
|
#define LXW_DEF_COL_WIDTH (double)8.43
|
72
74
|
|
73
|
-
/** Default
|
75
|
+
/** Default Excel column height in character units. */
|
74
76
|
#define LXW_DEF_ROW_HEIGHT (double)15.0
|
75
77
|
|
78
|
+
/** Default Excel column width in pixels. */
|
79
|
+
#define LXW_DEF_COL_WIDTH_PIXELS 64
|
80
|
+
|
81
|
+
/** Default Excel column height in pixels. */
|
82
|
+
#define LXW_DEF_ROW_HEIGHT_PIXELS 20
|
83
|
+
|
76
84
|
/** Gridline options using in `worksheet_gridlines()`. */
|
77
85
|
enum lxw_gridlines {
|
78
86
|
/** Hide screen and print gridlines. */
|
@@ -202,6 +210,506 @@ enum lxw_validation_error_types {
|
|
202
210
|
LXW_VALIDATION_ERROR_TYPE_INFORMATION
|
203
211
|
};
|
204
212
|
|
213
|
+
/** Set the display type for a cell comment. This is hidden by default but
|
214
|
+
* can be set to visible with the `worksheet_show_comments()` function. */
|
215
|
+
enum lxw_comment_display_types {
|
216
|
+
/** Default to the worksheet default which can be hidden or visible.*/
|
217
|
+
LXW_COMMENT_DISPLAY_DEFAULT,
|
218
|
+
|
219
|
+
/** Hide the cell comment. Usually the default. */
|
220
|
+
LXW_COMMENT_DISPLAY_HIDDEN,
|
221
|
+
|
222
|
+
/** Show the cell comment. Can also be set for the worksheet with the
|
223
|
+
* `worksheet_show_comments()` function.*/
|
224
|
+
LXW_COMMENT_DISPLAY_VISIBLE
|
225
|
+
};
|
226
|
+
|
227
|
+
/** @brief Type definitions for conditional formats.
|
228
|
+
*
|
229
|
+
* Values used to set the "type" field of conditional format.
|
230
|
+
*/
|
231
|
+
enum lxw_conditional_format_types {
|
232
|
+
LXW_CONDITIONAL_TYPE_NONE,
|
233
|
+
|
234
|
+
/** The Cell type is the most common conditional formatting type. It is
|
235
|
+
* used when a format is applied to a cell based on a simple
|
236
|
+
* criterion. */
|
237
|
+
LXW_CONDITIONAL_TYPE_CELL,
|
238
|
+
|
239
|
+
/** The Text type is used to specify Excel's "Specific Text" style
|
240
|
+
* conditional format. */
|
241
|
+
LXW_CONDITIONAL_TYPE_TEXT,
|
242
|
+
|
243
|
+
/** The Time Period type is used to specify Excel's "Dates Occurring"
|
244
|
+
* style conditional format. */
|
245
|
+
LXW_CONDITIONAL_TYPE_TIME_PERIOD,
|
246
|
+
|
247
|
+
/** The Average type is used to specify Excel's "Average" style
|
248
|
+
* conditional format. */
|
249
|
+
LXW_CONDITIONAL_TYPE_AVERAGE,
|
250
|
+
|
251
|
+
/** The Duplicate type is used to highlight duplicate cells in a range. */
|
252
|
+
LXW_CONDITIONAL_TYPE_DUPLICATE,
|
253
|
+
|
254
|
+
/** The Unique type is used to highlight unique cells in a range. */
|
255
|
+
LXW_CONDITIONAL_TYPE_UNIQUE,
|
256
|
+
|
257
|
+
/** The Top type is used to specify the top n values by number or
|
258
|
+
* percentage in a range. */
|
259
|
+
LXW_CONDITIONAL_TYPE_TOP,
|
260
|
+
|
261
|
+
/** The Bottom type is used to specify the bottom n values by number or
|
262
|
+
* percentage in a range. */
|
263
|
+
LXW_CONDITIONAL_TYPE_BOTTOM,
|
264
|
+
|
265
|
+
/** The Blanks type is used to highlight blank cells in a range. */
|
266
|
+
LXW_CONDITIONAL_TYPE_BLANKS,
|
267
|
+
|
268
|
+
/** The No Blanks type is used to highlight non blank cells in a range. */
|
269
|
+
LXW_CONDITIONAL_TYPE_NO_BLANKS,
|
270
|
+
|
271
|
+
/** The Errors type is used to highlight error cells in a range. */
|
272
|
+
LXW_CONDITIONAL_TYPE_ERRORS,
|
273
|
+
|
274
|
+
/** The No Errors type is used to highlight non error cells in a range. */
|
275
|
+
LXW_CONDITIONAL_TYPE_NO_ERRORS,
|
276
|
+
|
277
|
+
/** The Formula type is used to specify a conditional format based on a
|
278
|
+
* user defined formula. */
|
279
|
+
LXW_CONDITIONAL_TYPE_FORMULA,
|
280
|
+
|
281
|
+
/** The 2 Color Scale type is used to specify Excel's "2 Color Scale"
|
282
|
+
* style conditional format. */
|
283
|
+
LXW_CONDITIONAL_2_COLOR_SCALE,
|
284
|
+
|
285
|
+
/** The 3 Color Scale type is used to specify Excel's "3 Color Scale"
|
286
|
+
* style conditional format. */
|
287
|
+
LXW_CONDITIONAL_3_COLOR_SCALE,
|
288
|
+
|
289
|
+
/** The Data Bar type is used to specify Excel's "Data Bar" style
|
290
|
+
* conditional format. */
|
291
|
+
LXW_CONDITIONAL_DATA_BAR,
|
292
|
+
|
293
|
+
/** The Icon Set type is used to specify a conditional format with a set
|
294
|
+
* of icons such as traffic lights or arrows. */
|
295
|
+
LXW_CONDITIONAL_TYPE_ICON_SETS,
|
296
|
+
|
297
|
+
LXW_CONDITIONAL_TYPE_LAST
|
298
|
+
};
|
299
|
+
|
300
|
+
/** @brief The criteria used in a conditional format.
|
301
|
+
*
|
302
|
+
* Criteria used to define how a conditional format works.
|
303
|
+
*/
|
304
|
+
enum lxw_conditional_criteria {
|
305
|
+
LXW_CONDITIONAL_CRITERIA_NONE,
|
306
|
+
|
307
|
+
/** Format cells equal to a value. */
|
308
|
+
LXW_CONDITIONAL_CRITERIA_EQUAL_TO,
|
309
|
+
|
310
|
+
/** Format cells not equal to a value. */
|
311
|
+
LXW_CONDITIONAL_CRITERIA_NOT_EQUAL_TO,
|
312
|
+
|
313
|
+
/** Format cells greater than a value. */
|
314
|
+
LXW_CONDITIONAL_CRITERIA_GREATER_THAN,
|
315
|
+
|
316
|
+
/** Format cells less than a value. */
|
317
|
+
LXW_CONDITIONAL_CRITERIA_LESS_THAN,
|
318
|
+
|
319
|
+
/** Format cells greater than or equal to a value. */
|
320
|
+
LXW_CONDITIONAL_CRITERIA_GREATER_THAN_OR_EQUAL_TO,
|
321
|
+
|
322
|
+
/** Format cells less than or equal to a value. */
|
323
|
+
LXW_CONDITIONAL_CRITERIA_LESS_THAN_OR_EQUAL_TO,
|
324
|
+
|
325
|
+
/** Format cells between two values. */
|
326
|
+
LXW_CONDITIONAL_CRITERIA_BETWEEN,
|
327
|
+
|
328
|
+
/** Format cells that is not between two values. */
|
329
|
+
LXW_CONDITIONAL_CRITERIA_NOT_BETWEEN,
|
330
|
+
|
331
|
+
/** Format cells that contain the specified text. */
|
332
|
+
LXW_CONDITIONAL_CRITERIA_TEXT_CONTAINING,
|
333
|
+
|
334
|
+
/** Format cells that don't contain the specified text. */
|
335
|
+
LXW_CONDITIONAL_CRITERIA_TEXT_NOT_CONTAINING,
|
336
|
+
|
337
|
+
/** Format cells that begin with the specified text. */
|
338
|
+
LXW_CONDITIONAL_CRITERIA_TEXT_BEGINS_WITH,
|
339
|
+
|
340
|
+
/** Format cells that end with the specified text. */
|
341
|
+
LXW_CONDITIONAL_CRITERIA_TEXT_ENDS_WITH,
|
342
|
+
|
343
|
+
/** Format cells with a date of yesterday. */
|
344
|
+
LXW_CONDITIONAL_CRITERIA_TIME_PERIOD_YESTERDAY,
|
345
|
+
|
346
|
+
/** Format cells with a date of today. */
|
347
|
+
LXW_CONDITIONAL_CRITERIA_TIME_PERIOD_TODAY,
|
348
|
+
|
349
|
+
/** Format cells with a date of tomorrow. */
|
350
|
+
LXW_CONDITIONAL_CRITERIA_TIME_PERIOD_TOMORROW,
|
351
|
+
|
352
|
+
/** Format cells with a date in the last 7 days. */
|
353
|
+
LXW_CONDITIONAL_CRITERIA_TIME_PERIOD_LAST_7_DAYS,
|
354
|
+
|
355
|
+
/** Format cells with a date in the last week. */
|
356
|
+
LXW_CONDITIONAL_CRITERIA_TIME_PERIOD_LAST_WEEK,
|
357
|
+
|
358
|
+
/** Format cells with a date in the current week. */
|
359
|
+
LXW_CONDITIONAL_CRITERIA_TIME_PERIOD_THIS_WEEK,
|
360
|
+
|
361
|
+
/** Format cells with a date in the next week. */
|
362
|
+
LXW_CONDITIONAL_CRITERIA_TIME_PERIOD_NEXT_WEEK,
|
363
|
+
|
364
|
+
/** Format cells with a date in the last month. */
|
365
|
+
LXW_CONDITIONAL_CRITERIA_TIME_PERIOD_LAST_MONTH,
|
366
|
+
|
367
|
+
/** Format cells with a date in the current month. */
|
368
|
+
LXW_CONDITIONAL_CRITERIA_TIME_PERIOD_THIS_MONTH,
|
369
|
+
|
370
|
+
/** Format cells with a date in the next month. */
|
371
|
+
LXW_CONDITIONAL_CRITERIA_TIME_PERIOD_NEXT_MONTH,
|
372
|
+
|
373
|
+
/** Format cells above the average for the range. */
|
374
|
+
LXW_CONDITIONAL_CRITERIA_AVERAGE_ABOVE,
|
375
|
+
|
376
|
+
/** Format cells below the average for the range. */
|
377
|
+
LXW_CONDITIONAL_CRITERIA_AVERAGE_BELOW,
|
378
|
+
|
379
|
+
/** Format cells above or equal to the average for the range. */
|
380
|
+
LXW_CONDITIONAL_CRITERIA_AVERAGE_ABOVE_OR_EQUAL,
|
381
|
+
|
382
|
+
/** Format cells below or equal to the average for the range. */
|
383
|
+
LXW_CONDITIONAL_CRITERIA_AVERAGE_BELOW_OR_EQUAL,
|
384
|
+
|
385
|
+
/** Format cells 1 standard deviation above the average for the range. */
|
386
|
+
LXW_CONDITIONAL_CRITERIA_AVERAGE_1_STD_DEV_ABOVE,
|
387
|
+
|
388
|
+
/** Format cells 1 standard deviation below the average for the range. */
|
389
|
+
LXW_CONDITIONAL_CRITERIA_AVERAGE_1_STD_DEV_BELOW,
|
390
|
+
|
391
|
+
/** Format cells 2 standard deviation above the average for the range. */
|
392
|
+
LXW_CONDITIONAL_CRITERIA_AVERAGE_2_STD_DEV_ABOVE,
|
393
|
+
|
394
|
+
/** Format cells 2 standard deviation below the average for the range. */
|
395
|
+
LXW_CONDITIONAL_CRITERIA_AVERAGE_2_STD_DEV_BELOW,
|
396
|
+
|
397
|
+
/** Format cells 3 standard deviation above the average for the range. */
|
398
|
+
LXW_CONDITIONAL_CRITERIA_AVERAGE_3_STD_DEV_ABOVE,
|
399
|
+
|
400
|
+
/** Format cells 3 standard deviation below the average for the range. */
|
401
|
+
LXW_CONDITIONAL_CRITERIA_AVERAGE_3_STD_DEV_BELOW,
|
402
|
+
|
403
|
+
/** Format cells in the top of bottom percentage. */
|
404
|
+
LXW_CONDITIONAL_CRITERIA_TOP_OR_BOTTOM_PERCENT
|
405
|
+
};
|
406
|
+
|
407
|
+
/** @brief Conditional format rule types.
|
408
|
+
*
|
409
|
+
* Conditional format rule types that apply to Color Scale and Data Bars.
|
410
|
+
*/
|
411
|
+
enum lxw_conditional_format_rule_types {
|
412
|
+
LXW_CONDITIONAL_RULE_TYPE_NONE,
|
413
|
+
|
414
|
+
/** Conditional format rule type: matches the minimum values in the
|
415
|
+
* range. Can only be applied to min_rule_type.*/
|
416
|
+
LXW_CONDITIONAL_RULE_TYPE_MINIMUM,
|
417
|
+
|
418
|
+
/** Conditional format rule type: use a number to set the bound.*/
|
419
|
+
LXW_CONDITIONAL_RULE_TYPE_NUMBER,
|
420
|
+
|
421
|
+
/** Conditional format rule type: use a percentage to set the bound.*/
|
422
|
+
LXW_CONDITIONAL_RULE_TYPE_PERCENT,
|
423
|
+
|
424
|
+
/** Conditional format rule type: use a percentile to set the bound.*/
|
425
|
+
LXW_CONDITIONAL_RULE_TYPE_PERCENTILE,
|
426
|
+
|
427
|
+
/** Conditional format rule type: use a formula to set the bound.*/
|
428
|
+
LXW_CONDITIONAL_RULE_TYPE_FORMULA,
|
429
|
+
|
430
|
+
/** Conditional format rule type: matches the maximum values in the
|
431
|
+
* range. Can only be applied to max_rule_type.*/
|
432
|
+
LXW_CONDITIONAL_RULE_TYPE_MAXIMUM,
|
433
|
+
|
434
|
+
/* Used internally for Excel2010 bars. Not documented. */
|
435
|
+
LXW_CONDITIONAL_RULE_TYPE_AUTO_MIN,
|
436
|
+
|
437
|
+
/* Used internally for Excel2010 bars. Not documented. */
|
438
|
+
LXW_CONDITIONAL_RULE_TYPE_AUTO_MAX
|
439
|
+
};
|
440
|
+
|
441
|
+
/** @brief Conditional format data bar directions.
|
442
|
+
*
|
443
|
+
* Values used to set the bar direction of a conditional format data bar.
|
444
|
+
*/
|
445
|
+
enum lxw_conditional_format_bar_direction {
|
446
|
+
|
447
|
+
/** Data bar direction is set by Excel based on the context of the data
|
448
|
+
* displayed. */
|
449
|
+
LXW_CONDITIONAL_BAR_DIRECTION_CONTEXT,
|
450
|
+
|
451
|
+
/** Data bar direction is from right to left. */
|
452
|
+
LXW_CONDITIONAL_BAR_DIRECTION_RIGHT_TO_LEFT,
|
453
|
+
|
454
|
+
/** Data bar direction is from left to right. */
|
455
|
+
LXW_CONDITIONAL_BAR_DIRECTION_LEFT_TO_RIGHT
|
456
|
+
};
|
457
|
+
|
458
|
+
/** @brief Conditional format data bar axis options.
|
459
|
+
*
|
460
|
+
* Values used to set the position of the axis in a conditional format data
|
461
|
+
* bar.
|
462
|
+
*/
|
463
|
+
enum lxw_conditional_bar_axis_position {
|
464
|
+
|
465
|
+
/** Data bar axis position is set by Excel based on the context of the
|
466
|
+
* data displayed. */
|
467
|
+
LXW_CONDITIONAL_BAR_AXIS_AUTOMATIC,
|
468
|
+
|
469
|
+
/** Data bar axis position is set at the midpoint. */
|
470
|
+
LXW_CONDITIONAL_BAR_AXIS_MIDPOINT,
|
471
|
+
|
472
|
+
/** Data bar axis is turned off. */
|
473
|
+
LXW_CONDITIONAL_BAR_AXIS_NONE
|
474
|
+
};
|
475
|
+
|
476
|
+
/** @brief Icon types used in the #lxw_conditional_format icon_style field.
|
477
|
+
*
|
478
|
+
* Definitions of icon styles used with Icon Set conditional formats.
|
479
|
+
*/
|
480
|
+
enum lxw_conditional_icon_types {
|
481
|
+
|
482
|
+
/** Icon style: 3 colored arrows showing up, sideways and down. */
|
483
|
+
LXW_CONDITIONAL_ICONS_3_ARROWS_COLORED,
|
484
|
+
|
485
|
+
/** Icon style: 3 gray arrows showing up, sideways and down. */
|
486
|
+
LXW_CONDITIONAL_ICONS_3_ARROWS_GRAY,
|
487
|
+
|
488
|
+
/** Icon style: 3 colored flags in red, yellow and green. */
|
489
|
+
LXW_CONDITIONAL_ICONS_3_FLAGS,
|
490
|
+
|
491
|
+
/** Icon style: 3 traffic lights - rounded. */
|
492
|
+
LXW_CONDITIONAL_ICONS_3_TRAFFIC_LIGHTS_UNRIMMED,
|
493
|
+
|
494
|
+
/** Icon style: 3 traffic lights with a rim - squarish. */
|
495
|
+
LXW_CONDITIONAL_ICONS_3_TRAFFIC_LIGHTS_RIMMED,
|
496
|
+
|
497
|
+
/** Icon style: 3 colored shapes - a circle, triangle and diamond. */
|
498
|
+
LXW_CONDITIONAL_ICONS_3_SIGNS,
|
499
|
+
|
500
|
+
/** Icon style: 3 circled symbols with tick mark, exclamation and
|
501
|
+
* cross. */
|
502
|
+
LXW_CONDITIONAL_ICONS_3_SYMBOLS_CIRCLED,
|
503
|
+
|
504
|
+
/** Icon style: 3 symbols with tick mark, exclamation and cross. */
|
505
|
+
LXW_CONDITIONAL_ICONS_3_SYMBOLS_UNCIRCLED,
|
506
|
+
|
507
|
+
/** Icon style: 4 colored arrows showing up, diagonal up, diagonal down
|
508
|
+
* and down. */
|
509
|
+
LXW_CONDITIONAL_ICONS_4_ARROWS_COLORED,
|
510
|
+
|
511
|
+
/** Icon style: 4 gray arrows showing up, diagonal up, diagonal down and
|
512
|
+
* down. */
|
513
|
+
LXW_CONDITIONAL_ICONS_4_ARROWS_GRAY,
|
514
|
+
|
515
|
+
/** Icon style: 4 circles in 4 colors going from red to black. */
|
516
|
+
LXW_CONDITIONAL_ICONS_4_RED_TO_BLACK,
|
517
|
+
|
518
|
+
/** Icon style: 4 histogram ratings. */
|
519
|
+
LXW_CONDITIONAL_ICONS_4_RATINGS,
|
520
|
+
|
521
|
+
/** Icon style: 4 traffic lights. */
|
522
|
+
LXW_CONDITIONAL_ICONS_4_TRAFFIC_LIGHTS,
|
523
|
+
|
524
|
+
/** Icon style: 5 colored arrows showing up, diagonal up, sideways,
|
525
|
+
* diagonal down and down. */
|
526
|
+
LXW_CONDITIONAL_ICONS_5_ARROWS_COLORED,
|
527
|
+
|
528
|
+
/** Icon style: 5 gray arrows showing up, diagonal up, sideways, diagonal
|
529
|
+
* down and down. */
|
530
|
+
LXW_CONDITIONAL_ICONS_5_ARROWS_GRAY,
|
531
|
+
|
532
|
+
/** Icon style: 5 histogram ratings. */
|
533
|
+
LXW_CONDITIONAL_ICONS_5_RATINGS,
|
534
|
+
|
535
|
+
/** Icon style: 5 quarters, from 0 to 4 quadrants filled. */
|
536
|
+
LXW_CONDITIONAL_ICONS_5_QUARTERS
|
537
|
+
};
|
538
|
+
|
539
|
+
/** @brief The type of table style.
|
540
|
+
*
|
541
|
+
* The type of table style (Light, Medium or Dark).
|
542
|
+
*/
|
543
|
+
enum lxw_table_style_type {
|
544
|
+
|
545
|
+
LXW_TABLE_STYLE_TYPE_DEFAULT,
|
546
|
+
|
547
|
+
/** Light table style. */
|
548
|
+
LXW_TABLE_STYLE_TYPE_LIGHT,
|
549
|
+
|
550
|
+
/** Light table style. */
|
551
|
+
LXW_TABLE_STYLE_TYPE_MEDIUM,
|
552
|
+
|
553
|
+
/** Light table style. */
|
554
|
+
LXW_TABLE_STYLE_TYPE_DARK
|
555
|
+
};
|
556
|
+
|
557
|
+
/**
|
558
|
+
* @brief Standard Excel functions for totals in tables.
|
559
|
+
*
|
560
|
+
* Definitions for the standard Excel functions that are available via the
|
561
|
+
* dropdown in the total row of an Excel table.
|
562
|
+
*
|
563
|
+
*/
|
564
|
+
enum lxw_table_total_functions {
|
565
|
+
|
566
|
+
LXW_TABLE_FUNCTION_NONE = 0,
|
567
|
+
|
568
|
+
/** Use the average function as the table total. */
|
569
|
+
LXW_TABLE_FUNCTION_AVERAGE = 101,
|
570
|
+
|
571
|
+
/** Use the count numbers function as the table total. */
|
572
|
+
LXW_TABLE_FUNCTION_COUNT_NUMS = 102,
|
573
|
+
|
574
|
+
/** Use the count function as the table total. */
|
575
|
+
LXW_TABLE_FUNCTION_COUNT = 103,
|
576
|
+
|
577
|
+
/** Use the max function as the table total. */
|
578
|
+
LXW_TABLE_FUNCTION_MAX = 104,
|
579
|
+
|
580
|
+
/** Use the min function as the table total. */
|
581
|
+
LXW_TABLE_FUNCTION_MIN = 105,
|
582
|
+
|
583
|
+
/** Use the standard deviation function as the table total. */
|
584
|
+
LXW_TABLE_FUNCTION_STD_DEV = 107,
|
585
|
+
|
586
|
+
/** Use the sum function as the table total. */
|
587
|
+
LXW_TABLE_FUNCTION_SUM = 109,
|
588
|
+
|
589
|
+
/** Use the var function as the table total. */
|
590
|
+
LXW_TABLE_FUNCTION_VAR = 110
|
591
|
+
};
|
592
|
+
|
593
|
+
/** @brief The criteria used in autofilter rules.
|
594
|
+
*
|
595
|
+
* Criteria used to define an autofilter rule condition.
|
596
|
+
*/
|
597
|
+
enum lxw_filter_criteria {
|
598
|
+
LXW_FILTER_CRITERIA_NONE,
|
599
|
+
|
600
|
+
/** Filter cells equal to a value. */
|
601
|
+
LXW_FILTER_CRITERIA_EQUAL_TO,
|
602
|
+
|
603
|
+
/** Filter cells not equal to a value. */
|
604
|
+
LXW_FILTER_CRITERIA_NOT_EQUAL_TO,
|
605
|
+
|
606
|
+
/** Filter cells greater than a value. */
|
607
|
+
LXW_FILTER_CRITERIA_GREATER_THAN,
|
608
|
+
|
609
|
+
/** Filter cells less than a value. */
|
610
|
+
LXW_FILTER_CRITERIA_LESS_THAN,
|
611
|
+
|
612
|
+
/** Filter cells greater than or equal to a value. */
|
613
|
+
LXW_FILTER_CRITERIA_GREATER_THAN_OR_EQUAL_TO,
|
614
|
+
|
615
|
+
/** Filter cells less than or equal to a value. */
|
616
|
+
LXW_FILTER_CRITERIA_LESS_THAN_OR_EQUAL_TO,
|
617
|
+
|
618
|
+
/** Filter cells that are blank. */
|
619
|
+
LXW_FILTER_CRITERIA_BLANKS,
|
620
|
+
|
621
|
+
/** Filter cells that are not blank. */
|
622
|
+
LXW_FILTER_CRITERIA_NON_BLANKS
|
623
|
+
};
|
624
|
+
|
625
|
+
/**
|
626
|
+
* @brief And/or operator when using 2 filter rules.
|
627
|
+
*
|
628
|
+
* And/or operator conditions when using 2 filter rules with
|
629
|
+
* worksheet_filter_column2(). In general LXW_FILTER_OR is used with
|
630
|
+
* LXW_FILTER_CRITERIA_EQUAL_TO and LXW_FILTER_AND is used with the other
|
631
|
+
* filter criteria.
|
632
|
+
*/
|
633
|
+
enum lxw_filter_operator {
|
634
|
+
/** Logical "and" of 2 filter rules. */
|
635
|
+
LXW_FILTER_AND,
|
636
|
+
|
637
|
+
/** Logical "or" of 2 filter rules. */
|
638
|
+
LXW_FILTER_OR
|
639
|
+
};
|
640
|
+
|
641
|
+
/* Internal filter types. */
|
642
|
+
enum lxw_filter_type {
|
643
|
+
LXW_FILTER_TYPE_NONE,
|
644
|
+
|
645
|
+
LXW_FILTER_TYPE_SINGLE,
|
646
|
+
|
647
|
+
LXW_FILTER_TYPE_AND,
|
648
|
+
|
649
|
+
LXW_FILTER_TYPE_OR,
|
650
|
+
|
651
|
+
LXW_FILTER_TYPE_STRING_LIST
|
652
|
+
};
|
653
|
+
|
654
|
+
/** Options to control the positioning of worksheet objects such as images
|
655
|
+
* or charts. See @ref working_with_object_positioning. */
|
656
|
+
enum lxw_object_position {
|
657
|
+
|
658
|
+
/** Default positioning for the object. */
|
659
|
+
LXW_OBJECT_POSITION_DEFAULT,
|
660
|
+
|
661
|
+
/** Move and size the worksheet object with the cells. */
|
662
|
+
LXW_OBJECT_MOVE_AND_SIZE,
|
663
|
+
|
664
|
+
/** Move but don't size the worksheet object with the cells. */
|
665
|
+
LXW_OBJECT_MOVE_DONT_SIZE,
|
666
|
+
|
667
|
+
/** Don't move or size the worksheet object with the cells. */
|
668
|
+
LXW_OBJECT_DONT_MOVE_DONT_SIZE,
|
669
|
+
|
670
|
+
/** Same as #LXW_OBJECT_MOVE_AND_SIZE except libxlsxwriter applies hidden
|
671
|
+
* cells after the object is inserted. */
|
672
|
+
LXW_OBJECT_MOVE_AND_SIZE_AFTER
|
673
|
+
};
|
674
|
+
|
675
|
+
/** Options for ignoring worksheet errors/warnings. See worksheet_ignore_errors(). */
|
676
|
+
enum lxw_ignore_errors {
|
677
|
+
|
678
|
+
/** Turn off errors/warnings for numbers stores as text. */
|
679
|
+
LXW_IGNORE_NUMBER_STORED_AS_TEXT = 1,
|
680
|
+
|
681
|
+
/** Turn off errors/warnings for formula errors (such as divide by
|
682
|
+
* zero). */
|
683
|
+
LXW_IGNORE_EVAL_ERROR,
|
684
|
+
|
685
|
+
/** Turn off errors/warnings for formulas that differ from surrounding
|
686
|
+
* formulas. */
|
687
|
+
LXW_IGNORE_FORMULA_DIFFERS,
|
688
|
+
|
689
|
+
/** Turn off errors/warnings for formulas that omit cells in a range. */
|
690
|
+
LXW_IGNORE_FORMULA_RANGE,
|
691
|
+
|
692
|
+
/** Turn off errors/warnings for unlocked cells that contain formulas. */
|
693
|
+
LXW_IGNORE_FORMULA_UNLOCKED,
|
694
|
+
|
695
|
+
/** Turn off errors/warnings for formulas that refer to empty cells. */
|
696
|
+
LXW_IGNORE_EMPTY_CELL_REFERENCE,
|
697
|
+
|
698
|
+
/** Turn off errors/warnings for cells in a table that do not comply with
|
699
|
+
* applicable data validation rules. */
|
700
|
+
LXW_IGNORE_LIST_DATA_VALIDATION,
|
701
|
+
|
702
|
+
/** Turn off errors/warnings for cell formulas that differ from the column
|
703
|
+
* formula. */
|
704
|
+
LXW_IGNORE_CALCULATED_COLUMN,
|
705
|
+
|
706
|
+
/** Turn off errors/warnings for formulas that contain a two digit text
|
707
|
+
* representation of a year. */
|
708
|
+
LXW_IGNORE_TWO_DIGIT_TEXT_YEAR,
|
709
|
+
|
710
|
+
LXW_IGNORE_LAST_OPTION
|
711
|
+
};
|
712
|
+
|
205
713
|
enum cell_types {
|
206
714
|
NUMBER_CELL = 1,
|
207
715
|
STRING_CELL,
|
@@ -209,8 +717,10 @@ enum cell_types {
|
|
209
717
|
INLINE_RICH_STRING_CELL,
|
210
718
|
FORMULA_CELL,
|
211
719
|
ARRAY_FORMULA_CELL,
|
720
|
+
DYNAMIC_ARRAY_FORMULA_CELL,
|
212
721
|
BLANK_CELL,
|
213
722
|
BOOLEAN_CELL,
|
723
|
+
COMMENT,
|
214
724
|
HYPERLINK_URL,
|
215
725
|
HYPERLINK_INTERNAL,
|
216
726
|
HYPERLINK_EXTERNAL
|
@@ -223,8 +733,20 @@ enum pane_types {
|
|
223
733
|
FREEZE_SPLIT_PANES
|
224
734
|
};
|
225
735
|
|
736
|
+
enum lxw_image_position {
|
737
|
+
HEADER_LEFT = 0,
|
738
|
+
HEADER_CENTER,
|
739
|
+
HEADER_RIGHT,
|
740
|
+
FOOTER_LEFT,
|
741
|
+
FOOTER_CENTER,
|
742
|
+
FOOTER_RIGHT
|
743
|
+
};
|
744
|
+
|
226
745
|
/* Define the tree.h RB structs for the red-black head types. */
|
227
746
|
RB_HEAD(lxw_table_cells, lxw_cell);
|
747
|
+
RB_HEAD(lxw_drawing_rel_ids, lxw_drawing_rel_id);
|
748
|
+
RB_HEAD(lxw_vml_drawing_rel_ids, lxw_drawing_rel_id);
|
749
|
+
RB_HEAD(lxw_cond_format_hash, lxw_cond_format_hash_element);
|
228
750
|
|
229
751
|
/* Define a RB_TREE struct manually to add extra members. */
|
230
752
|
struct lxw_table_rows {
|
@@ -257,11 +779,47 @@ struct lxw_table_rows {
|
|
257
779
|
/* Add unused struct to allow adding a semicolon */ \
|
258
780
|
struct lxw_rb_generate_cell{int unused;}
|
259
781
|
|
782
|
+
#define LXW_RB_GENERATE_DRAWING_REL_IDS(name, type, field, cmp) \
|
783
|
+
RB_GENERATE_INSERT_COLOR(name, type, field, static) \
|
784
|
+
RB_GENERATE_REMOVE_COLOR(name, type, field, static) \
|
785
|
+
RB_GENERATE_INSERT(name, type, field, cmp, static) \
|
786
|
+
RB_GENERATE_REMOVE(name, type, field, static) \
|
787
|
+
RB_GENERATE_FIND(name, type, field, cmp, static) \
|
788
|
+
RB_GENERATE_NEXT(name, type, field, static) \
|
789
|
+
RB_GENERATE_MINMAX(name, type, field, static) \
|
790
|
+
/* Add unused struct to allow adding a semicolon */ \
|
791
|
+
struct lxw_rb_generate_drawing_rel_ids{int unused;}
|
792
|
+
|
793
|
+
#define LXW_RB_GENERATE_VML_DRAWING_REL_IDS(name, type, field, cmp) \
|
794
|
+
RB_GENERATE_INSERT_COLOR(name, type, field, static) \
|
795
|
+
RB_GENERATE_REMOVE_COLOR(name, type, field, static) \
|
796
|
+
RB_GENERATE_INSERT(name, type, field, cmp, static) \
|
797
|
+
RB_GENERATE_REMOVE(name, type, field, static) \
|
798
|
+
RB_GENERATE_FIND(name, type, field, cmp, static) \
|
799
|
+
RB_GENERATE_NEXT(name, type, field, static) \
|
800
|
+
RB_GENERATE_MINMAX(name, type, field, static) \
|
801
|
+
/* Add unused struct to allow adding a semicolon */ \
|
802
|
+
struct lxw_rb_generate_vml_drawing_rel_ids{int unused;}
|
803
|
+
|
804
|
+
#define LXW_RB_GENERATE_COND_FORMAT_HASH(name, type, field, cmp) \
|
805
|
+
RB_GENERATE_INSERT_COLOR(name, type, field, static) \
|
806
|
+
RB_GENERATE_REMOVE_COLOR(name, type, field, static) \
|
807
|
+
RB_GENERATE_INSERT(name, type, field, cmp, static) \
|
808
|
+
RB_GENERATE_REMOVE(name, type, field, static) \
|
809
|
+
RB_GENERATE_FIND(name, type, field, cmp, static) \
|
810
|
+
RB_GENERATE_NEXT(name, type, field, static) \
|
811
|
+
RB_GENERATE_MINMAX(name, type, field, static) \
|
812
|
+
/* Add unused struct to allow adding a semicolon */ \
|
813
|
+
struct lxw_rb_generate_cond_format_hash{int unused;}
|
814
|
+
|
260
815
|
STAILQ_HEAD(lxw_merged_ranges, lxw_merged_range);
|
261
816
|
STAILQ_HEAD(lxw_selections, lxw_selection);
|
262
|
-
STAILQ_HEAD(lxw_data_validations,
|
263
|
-
STAILQ_HEAD(
|
264
|
-
STAILQ_HEAD(
|
817
|
+
STAILQ_HEAD(lxw_data_validations, lxw_data_val_obj);
|
818
|
+
STAILQ_HEAD(lxw_cond_format_list, lxw_cond_format_obj);
|
819
|
+
STAILQ_HEAD(lxw_image_props, lxw_object_properties);
|
820
|
+
STAILQ_HEAD(lxw_chart_props, lxw_object_properties);
|
821
|
+
STAILQ_HEAD(lxw_comment_objs, lxw_vml_obj);
|
822
|
+
STAILQ_HEAD(lxw_table_objs, lxw_table_obj);
|
265
823
|
|
266
824
|
/**
|
267
825
|
* @brief Options for rows and columns.
|
@@ -279,9 +837,13 @@ STAILQ_HEAD(lxw_chart_data, lxw_image_options);
|
|
279
837
|
*
|
280
838
|
*/
|
281
839
|
typedef struct lxw_row_col_options {
|
282
|
-
/** Hide the row/column
|
840
|
+
/** Hide the row/column. @ref ww_outlines_grouping.*/
|
283
841
|
uint8_t hidden;
|
842
|
+
|
843
|
+
/** Outline level. See @ref ww_outlines_grouping.*/
|
284
844
|
uint8_t level;
|
845
|
+
|
846
|
+
/** Set the outline row as collapsed. See @ref ww_outlines_grouping.*/
|
285
847
|
uint8_t collapsed;
|
286
848
|
} lxw_row_col_options;
|
287
849
|
|
@@ -326,6 +888,7 @@ typedef struct lxw_print_area {
|
|
326
888
|
|
327
889
|
typedef struct lxw_autofilter {
|
328
890
|
uint8_t in_use;
|
891
|
+
uint8_t has_rules;
|
329
892
|
lxw_row_t first_row;
|
330
893
|
lxw_row_t last_row;
|
331
894
|
lxw_col_t first_col;
|
@@ -405,8 +968,6 @@ typedef struct lxw_data_validation {
|
|
405
968
|
*/
|
406
969
|
uint8_t dropdown;
|
407
970
|
|
408
|
-
uint8_t is_between;
|
409
|
-
|
410
971
|
/**
|
411
972
|
* This parameter is used to set the limiting value to which the criteria
|
412
973
|
* is applied using a whole or decimal number.
|
@@ -418,7 +979,7 @@ typedef struct lxw_data_validation {
|
|
418
979
|
* is applied using a cell reference. It is valid for any of the
|
419
980
|
* `_FORMULA` validation types.
|
420
981
|
*/
|
421
|
-
char *value_formula;
|
982
|
+
const char *value_formula;
|
422
983
|
|
423
984
|
/**
|
424
985
|
* This parameter is used to set a list of strings for a drop down list.
|
@@ -437,96 +998,702 @@ typedef struct lxw_data_validation {
|
|
437
998
|
* Note, the string list is restricted by Excel to 255 characters,
|
438
999
|
* including comma separators.
|
439
1000
|
*/
|
440
|
-
char **value_list;
|
1001
|
+
const char **value_list;
|
1002
|
+
|
1003
|
+
/**
|
1004
|
+
* This parameter is used to set the limiting value to which the date or
|
1005
|
+
* time criteria is applied using a #lxw_datetime struct.
|
1006
|
+
*/
|
1007
|
+
lxw_datetime value_datetime;
|
1008
|
+
|
1009
|
+
/**
|
1010
|
+
* This parameter is the same as `value_number` but for the minimum value
|
1011
|
+
* when a `BETWEEN` criteria is used.
|
1012
|
+
*/
|
1013
|
+
double minimum_number;
|
1014
|
+
|
1015
|
+
/**
|
1016
|
+
* This parameter is the same as `value_formula` but for the minimum value
|
1017
|
+
* when a `BETWEEN` criteria is used.
|
1018
|
+
*/
|
1019
|
+
const char *minimum_formula;
|
1020
|
+
|
1021
|
+
/**
|
1022
|
+
* This parameter is the same as `value_datetime` but for the minimum value
|
1023
|
+
* when a `BETWEEN` criteria is used.
|
1024
|
+
*/
|
1025
|
+
lxw_datetime minimum_datetime;
|
1026
|
+
|
1027
|
+
/**
|
1028
|
+
* This parameter is the same as `value_number` but for the maximum value
|
1029
|
+
* when a `BETWEEN` criteria is used.
|
1030
|
+
*/
|
1031
|
+
double maximum_number;
|
1032
|
+
|
1033
|
+
/**
|
1034
|
+
* This parameter is the same as `value_formula` but for the maximum value
|
1035
|
+
* when a `BETWEEN` criteria is used.
|
1036
|
+
*/
|
1037
|
+
const char *maximum_formula;
|
1038
|
+
|
1039
|
+
/**
|
1040
|
+
* This parameter is the same as `value_datetime` but for the maximum value
|
1041
|
+
* when a `BETWEEN` criteria is used.
|
1042
|
+
*/
|
1043
|
+
lxw_datetime maximum_datetime;
|
1044
|
+
|
1045
|
+
/**
|
1046
|
+
* The input_title parameter is used to set the title of the input message
|
1047
|
+
* that is displayed when a cell is entered. It has no default value and
|
1048
|
+
* is only displayed if the input message is displayed. See the
|
1049
|
+
* `input_message` parameter below.
|
1050
|
+
*
|
1051
|
+
* The maximum title length is 32 characters.
|
1052
|
+
*/
|
1053
|
+
const char *input_title;
|
1054
|
+
|
1055
|
+
/**
|
1056
|
+
* The input_message parameter is used to set the input message that is
|
1057
|
+
* displayed when a cell is entered. It has no default value.
|
1058
|
+
*
|
1059
|
+
* The message can be split over several lines using newlines. The maximum
|
1060
|
+
* message length is 255 characters.
|
1061
|
+
*/
|
1062
|
+
const char *input_message;
|
1063
|
+
|
1064
|
+
/**
|
1065
|
+
* The error_title parameter is used to set the title of the error message
|
1066
|
+
* that is displayed when the data validation criteria is not met. The
|
1067
|
+
* default error title is 'Microsoft Excel'. The maximum title length is
|
1068
|
+
* 32 characters.
|
1069
|
+
*/
|
1070
|
+
const char *error_title;
|
1071
|
+
|
1072
|
+
/**
|
1073
|
+
* The error_message parameter is used to set the error message that is
|
1074
|
+
* displayed when a cell is entered. The default error message is "The
|
1075
|
+
* value you entered is not valid. A user has restricted values that can
|
1076
|
+
* be entered into the cell".
|
1077
|
+
*
|
1078
|
+
* The message can be split over several lines using newlines. The maximum
|
1079
|
+
* message length is 255 characters.
|
1080
|
+
*/
|
1081
|
+
const char *error_message;
|
1082
|
+
|
1083
|
+
} lxw_data_validation;
|
1084
|
+
|
1085
|
+
/* A copy of lxw_data_validation which is used internally and which contains
|
1086
|
+
* some additional fields.
|
1087
|
+
*/
|
1088
|
+
typedef struct lxw_data_val_obj {
|
1089
|
+
uint8_t validate;
|
1090
|
+
uint8_t criteria;
|
1091
|
+
uint8_t ignore_blank;
|
1092
|
+
uint8_t show_input;
|
1093
|
+
uint8_t show_error;
|
1094
|
+
uint8_t error_type;
|
1095
|
+
uint8_t dropdown;
|
1096
|
+
double value_number;
|
1097
|
+
char *value_formula;
|
1098
|
+
char **value_list;
|
1099
|
+
double minimum_number;
|
1100
|
+
char *minimum_formula;
|
1101
|
+
lxw_datetime minimum_datetime;
|
1102
|
+
double maximum_number;
|
1103
|
+
char *maximum_formula;
|
1104
|
+
lxw_datetime maximum_datetime;
|
1105
|
+
char *input_title;
|
1106
|
+
char *input_message;
|
1107
|
+
char *error_title;
|
1108
|
+
char *error_message;
|
1109
|
+
char sqref[LXW_MAX_CELL_RANGE_LENGTH];
|
1110
|
+
|
1111
|
+
STAILQ_ENTRY (lxw_data_val_obj) list_pointers;
|
1112
|
+
} lxw_data_val_obj;
|
1113
|
+
|
1114
|
+
/**
|
1115
|
+
* @brief Worksheet conditional formatting options.
|
1116
|
+
*
|
1117
|
+
* The fields/options in the the lxw_conditional_format are used to define a
|
1118
|
+
* worksheet conditional format. It is used in conjunction with
|
1119
|
+
* `worksheet_conditional_format()`.
|
1120
|
+
*
|
1121
|
+
*/
|
1122
|
+
typedef struct lxw_conditional_format {
|
1123
|
+
|
1124
|
+
/** The type of conditional format such as #LXW_CONDITIONAL_TYPE_CELL or
|
1125
|
+
* #LXW_CONDITIONAL_DATA_BAR. Should be a #lxw_conditional_format_types
|
1126
|
+
* value.*/
|
1127
|
+
uint8_t type;
|
1128
|
+
|
1129
|
+
/** The criteria parameter is used to set the criteria by which the cell
|
1130
|
+
* data will be evaluated. For example in the expression `a > 5 the
|
1131
|
+
* criteria is `>` or, in libxlsxwriter terms,
|
1132
|
+
* #LXW_CONDITIONAL_CRITERIA_GREATER_THAN. The criteria that are
|
1133
|
+
* applicable depend on the conditional format type. The criteria
|
1134
|
+
* options are defined in #lxw_conditional_criteria. */
|
1135
|
+
uint8_t criteria;
|
1136
|
+
|
1137
|
+
/** The number value to which the condition refers. For example in the
|
1138
|
+
* expression `a > 5`, the value is 5.*/
|
1139
|
+
double value;
|
1140
|
+
|
1141
|
+
/** The string value to which the condition refers, such as `"=A1"`. If a
|
1142
|
+
* value_string exists in the struct then the number value is
|
1143
|
+
* ignored. Note, if the condition refers to a text string then it must
|
1144
|
+
* be double quoted like this `"foo"`. */
|
1145
|
+
const char *value_string;
|
1146
|
+
|
1147
|
+
/** The format field is used to specify the #lxw_format format that will
|
1148
|
+
* be applied to the cell when the conditional formatting criterion is
|
1149
|
+
* met. The #lxw_format is created using the `workbook_add_format()`
|
1150
|
+
* method in the same way as cell formats.
|
1151
|
+
*
|
1152
|
+
* @note In Excel, a conditional format is superimposed over the existing
|
1153
|
+
* cell format and not all cell format properties can be
|
1154
|
+
* modified. Properties that @b cannot be modified, in Excel, by a
|
1155
|
+
* conditional format are: font name, font size, superscript and
|
1156
|
+
* subscript, diagonal borders, all alignment properties and all
|
1157
|
+
* protection properties. */
|
1158
|
+
lxw_format *format;
|
1159
|
+
|
1160
|
+
/** The minimum value used for Cell, Color Scale and Data Bar conditional
|
1161
|
+
* formats. For Cell types this is usually used with a "Between" style criteria. */
|
1162
|
+
double min_value;
|
1163
|
+
|
1164
|
+
/** The minimum string value used for Cell, Color Scale and Data Bar conditional
|
1165
|
+
* formats. Usually used to set ranges like `=A1`. */
|
1166
|
+
const char *min_value_string;
|
1167
|
+
|
1168
|
+
/** The rule used for the minimum condition in Color Scale and Data Bar
|
1169
|
+
* conditional formats. The rule types are defined in
|
1170
|
+
* #lxw_conditional_format_rule_types. */
|
1171
|
+
uint8_t min_rule_type;
|
1172
|
+
|
1173
|
+
/** The color used for the minimum Color Scale conditional format.
|
1174
|
+
* See @ref working_with_colors. */
|
1175
|
+
lxw_color_t min_color;
|
1176
|
+
|
1177
|
+
/** The middle value used for Color Scale and Data Bar conditional
|
1178
|
+
* formats. */
|
1179
|
+
double mid_value;
|
1180
|
+
|
1181
|
+
/** The middle string value used for Color Scale and Data Bar conditional
|
1182
|
+
* formats. Usually used to set ranges like `=A1`. */
|
1183
|
+
const char *mid_value_string;
|
1184
|
+
|
1185
|
+
/** The rule used for the middle condition in Color Scale and Data Bar
|
1186
|
+
* conditional formats. The rule types are defined in
|
1187
|
+
* #lxw_conditional_format_rule_types. */
|
1188
|
+
uint8_t mid_rule_type;
|
1189
|
+
|
1190
|
+
/** The color used for the middle Color Scale conditional format.
|
1191
|
+
* See @ref working_with_colors. */
|
1192
|
+
lxw_color_t mid_color;
|
1193
|
+
|
1194
|
+
/** The maximum value used for Cell, Color Scale and Data Bar conditional
|
1195
|
+
* formats. For Cell types this is usually used with a "Between" style
|
1196
|
+
* criteria. */
|
1197
|
+
double max_value;
|
1198
|
+
|
1199
|
+
/** The maximum string value used for Cell, Color Scale and Data Bar conditional
|
1200
|
+
* formats. Usually used to set ranges like `=A1`. */
|
1201
|
+
const char *max_value_string;
|
1202
|
+
|
1203
|
+
/** The rule used for the maximum condition in Color Scale and Data Bar
|
1204
|
+
* conditional formats. The rule types are defined in
|
1205
|
+
* #lxw_conditional_format_rule_types. */
|
1206
|
+
uint8_t max_rule_type;
|
1207
|
+
|
1208
|
+
/** The color used for the maximum Color Scale conditional format.
|
1209
|
+
* See @ref working_with_colors. */
|
1210
|
+
lxw_color_t max_color;
|
1211
|
+
|
1212
|
+
/** The bar_color field sets the fill color for data bars. See @ref
|
1213
|
+
* working_with_colors. */
|
1214
|
+
lxw_color_t bar_color;
|
1215
|
+
|
1216
|
+
/** The bar_only field sets The bar_only field displays a bar data but
|
1217
|
+
* not the data in the cells. */
|
1218
|
+
uint8_t bar_only;
|
1219
|
+
|
1220
|
+
/** In Excel 2010 additional data bar properties were added such as solid
|
1221
|
+
* (non-gradient) bars and control over how negative values are
|
1222
|
+
* displayed. These properties can shown below.
|
1223
|
+
*
|
1224
|
+
* The data_bar_2010 field sets Excel 2010 style data bars even when
|
1225
|
+
* Excel 2010 specific properties aren't used. */
|
1226
|
+
uint8_t data_bar_2010;
|
1227
|
+
|
1228
|
+
/** The bar_solid field turns on a solid (non-gradient) fill for data
|
1229
|
+
* bars. Set to LXW_TRUE to turn on. Excel 2010 only. */
|
1230
|
+
uint8_t bar_solid;
|
1231
|
+
|
1232
|
+
/** The bar_negative_color field sets the color fill for the negative
|
1233
|
+
* portion of a data bar. See @ref working_with_colors. Excel 2010 only. */
|
1234
|
+
lxw_color_t bar_negative_color;
|
1235
|
+
|
1236
|
+
/** The bar_border_color field sets the color for the border line of a
|
1237
|
+
* data bar. See @ref working_with_colors. Excel 2010 only. */
|
1238
|
+
lxw_color_t bar_border_color;
|
1239
|
+
|
1240
|
+
/** The bar_negative_border_color field sets the color for the border of
|
1241
|
+
* the negative portion of a data bar. See @ref
|
1242
|
+
* working_with_colors. Excel 2010 only. */
|
1243
|
+
lxw_color_t bar_negative_border_color;
|
1244
|
+
|
1245
|
+
/** The bar_negative_color_same field sets the fill color for the negative
|
1246
|
+
* portion of a data bar to be the same as the fill color for the
|
1247
|
+
* positive portion of the data bar. Set to LXW_TRUE to turn on. Excel
|
1248
|
+
* 2010 only. */
|
1249
|
+
uint8_t bar_negative_color_same;
|
1250
|
+
|
1251
|
+
/** The bar_negative_border_color_same field sets the border color for the
|
1252
|
+
* negative portion of a data bar to be the same as the border color for
|
1253
|
+
* the positive portion of the data bar. Set to LXW_TRUE to turn
|
1254
|
+
* on. Excel 2010 only. */
|
1255
|
+
uint8_t bar_negative_border_color_same;
|
1256
|
+
|
1257
|
+
/** The bar_no_border field turns off the border for data bars. Set to
|
1258
|
+
* LXW_TRUE to enable. Excel 2010 only. */
|
1259
|
+
uint8_t bar_no_border;
|
1260
|
+
|
1261
|
+
/** The bar_direction field sets the direction for data bars. This
|
1262
|
+
* property can be either left for left-to-right or right for
|
1263
|
+
* right-to-left. If the property isn't set then Excel will adjust the
|
1264
|
+
* position automatically based on the context. Should be a
|
1265
|
+
* #lxw_conditional_format_bar_direction value. Excel 2010 only. */
|
1266
|
+
uint8_t bar_direction;
|
1267
|
+
|
1268
|
+
/** The bar_axis_position field sets the position within the cells for the
|
1269
|
+
* axis that is shown in data bars when there are negative values to
|
1270
|
+
* display. The property can be either middle or none. If the property
|
1271
|
+
* isn't set then Excel will position the axis based on the range of
|
1272
|
+
* positive and negative values. Should be a
|
1273
|
+
* lxw_conditional_bar_axis_position value. Excel 2010 only. */
|
1274
|
+
uint8_t bar_axis_position;
|
1275
|
+
|
1276
|
+
/** The bar_axis_color field sets the color for the axis that is shown
|
1277
|
+
* in data bars when there are negative values to display. See @ref
|
1278
|
+
* working_with_colors. Excel 2010 only. */
|
1279
|
+
lxw_color_t bar_axis_color;
|
1280
|
+
|
1281
|
+
/** The Icons Sets style is specified by the icon_style parameter. Should
|
1282
|
+
* be a #lxw_conditional_icon_types. */
|
1283
|
+
uint8_t icon_style;
|
1284
|
+
|
1285
|
+
/** The order of Icon Sets icons can be reversed by setting reverse_icons
|
1286
|
+
* to LXW_TRUE. */
|
1287
|
+
uint8_t reverse_icons;
|
1288
|
+
|
1289
|
+
/** The icons can be displayed without the cell value by settings the
|
1290
|
+
* icons_only parameter to LXW_TRUE. */
|
1291
|
+
uint8_t icons_only;
|
1292
|
+
|
1293
|
+
/** The multi_range field is used to extend a conditional format over
|
1294
|
+
* non-contiguous ranges.
|
1295
|
+
*
|
1296
|
+
* It is possible to apply the conditional format to different cell
|
1297
|
+
* ranges in a worksheet using multiple calls to
|
1298
|
+
* `worksheet_conditional_format()`. However, as a minor optimization it
|
1299
|
+
* is also possible in Excel to apply the same conditional format to
|
1300
|
+
* different non-contiguous cell ranges.
|
1301
|
+
*
|
1302
|
+
* This is replicated in `worksheet_conditional_format()` using the
|
1303
|
+
* multi_range option. The range must contain the primary range for the
|
1304
|
+
* conditional format and any others separated by spaces. For example
|
1305
|
+
* `"A1 C1:C5 E2 G1:G100"`.
|
1306
|
+
*/
|
1307
|
+
const char *multi_range;
|
1308
|
+
|
1309
|
+
/** The stop_if_true parameter can be used to set the "stop if true"
|
1310
|
+
* feature of a conditional formatting rule when more than one rule is
|
1311
|
+
* applied to a cell or a range of cells. When this parameter is set then
|
1312
|
+
* subsequent rules are not evaluated if the current rule is true. Set to
|
1313
|
+
* LXW_TRUE to turn on. */
|
1314
|
+
uint8_t stop_if_true;
|
1315
|
+
|
1316
|
+
} lxw_conditional_format;
|
1317
|
+
|
1318
|
+
/* Internal */
|
1319
|
+
typedef struct lxw_cond_format_obj {
|
1320
|
+
uint8_t type;
|
1321
|
+
uint8_t criteria;
|
1322
|
+
|
1323
|
+
double min_value;
|
1324
|
+
char *min_value_string;
|
1325
|
+
uint8_t min_rule_type;
|
1326
|
+
lxw_color_t min_color;
|
1327
|
+
|
1328
|
+
double mid_value;
|
1329
|
+
char *mid_value_string;
|
1330
|
+
uint8_t mid_value_type;
|
1331
|
+
uint8_t mid_rule_type;
|
1332
|
+
lxw_color_t mid_color;
|
1333
|
+
|
1334
|
+
double max_value;
|
1335
|
+
char *max_value_string;
|
1336
|
+
uint8_t max_value_type;
|
1337
|
+
uint8_t max_rule_type;
|
1338
|
+
lxw_color_t max_color;
|
1339
|
+
|
1340
|
+
uint8_t data_bar_2010;
|
1341
|
+
uint8_t auto_min;
|
1342
|
+
uint8_t auto_max;
|
1343
|
+
uint8_t bar_only;
|
1344
|
+
uint8_t bar_solid;
|
1345
|
+
uint8_t bar_negative_color_same;
|
1346
|
+
uint8_t bar_negative_border_color_same;
|
1347
|
+
uint8_t bar_no_border;
|
1348
|
+
uint8_t bar_direction;
|
1349
|
+
uint8_t bar_axis_position;
|
1350
|
+
lxw_color_t bar_color;
|
1351
|
+
lxw_color_t bar_negative_color;
|
1352
|
+
lxw_color_t bar_border_color;
|
1353
|
+
lxw_color_t bar_negative_border_color;
|
1354
|
+
lxw_color_t bar_axis_color;
|
1355
|
+
|
1356
|
+
uint8_t icon_style;
|
1357
|
+
uint8_t reverse_icons;
|
1358
|
+
uint8_t icons_only;
|
1359
|
+
|
1360
|
+
uint8_t stop_if_true;
|
1361
|
+
uint8_t has_max;
|
1362
|
+
char *type_string;
|
1363
|
+
char *guid;
|
1364
|
+
|
1365
|
+
int32_t dxf_index;
|
1366
|
+
uint32_t dxf_priority;
|
1367
|
+
|
1368
|
+
char first_cell[LXW_MAX_CELL_NAME_LENGTH];
|
1369
|
+
char sqref[LXW_MAX_ATTRIBUTE_LENGTH];
|
1370
|
+
|
1371
|
+
STAILQ_ENTRY (lxw_cond_format_obj) list_pointers;
|
1372
|
+
} lxw_cond_format_obj;
|
1373
|
+
|
1374
|
+
typedef struct lxw_cond_format_hash_element {
|
1375
|
+
char sqref[LXW_MAX_ATTRIBUTE_LENGTH];
|
1376
|
+
|
1377
|
+
struct lxw_cond_format_list *cond_formats;
|
1378
|
+
|
1379
|
+
RB_ENTRY (lxw_cond_format_hash_element) tree_pointers;
|
1380
|
+
} lxw_cond_format_hash_element;
|
1381
|
+
|
1382
|
+
/**
|
1383
|
+
* @brief Table columns options.
|
1384
|
+
*
|
1385
|
+
* Structure to set the options of a table column added with
|
1386
|
+
* worksheet_add_table(). See @ref ww_tables_columns.
|
1387
|
+
*/
|
1388
|
+
typedef struct lxw_table_column {
|
1389
|
+
|
1390
|
+
/** Set the header name/caption for the column. If NULL the header defaults
|
1391
|
+
* to Column 1, Column 2, etc. */
|
1392
|
+
const char *header;
|
1393
|
+
|
1394
|
+
/** Set the formula for the column. */
|
1395
|
+
const char *formula;
|
1396
|
+
|
1397
|
+
/** Set the string description for the column total. */
|
1398
|
+
const char *total_string;
|
1399
|
+
|
1400
|
+
/** Set the function for the column total. */
|
1401
|
+
uint8_t total_function;
|
1402
|
+
|
1403
|
+
/** Set the format for the column header. */
|
1404
|
+
lxw_format *header_format;
|
1405
|
+
|
1406
|
+
/** Set the format for the data rows in the column. */
|
1407
|
+
lxw_format *format;
|
1408
|
+
|
1409
|
+
/** Set the formula value for the column total (not generally required). */
|
1410
|
+
double total_value;
|
1411
|
+
|
1412
|
+
} lxw_table_column;
|
1413
|
+
|
1414
|
+
/**
|
1415
|
+
* @brief Worksheet table options.
|
1416
|
+
*
|
1417
|
+
* Options used to define worksheet tables. See @ref working_with_tables for
|
1418
|
+
* more information.
|
1419
|
+
*
|
1420
|
+
*/
|
1421
|
+
typedef struct lxw_table_options {
|
1422
|
+
|
1423
|
+
/**
|
1424
|
+
* The `name` parameter is used to set the name of the table. This
|
1425
|
+
* parameter is optional and by default tables are named `Table1`,
|
1426
|
+
* `Table2`, etc. in the worksheet order that they are added.
|
1427
|
+
*
|
1428
|
+
* @code
|
1429
|
+
* lxw_table_options options = {.name = "Sales"};
|
1430
|
+
*
|
1431
|
+
* worksheet_add_table(worksheet, RANGE("B3:G8"), &options);
|
1432
|
+
* @endcode
|
1433
|
+
*
|
1434
|
+
* If you override the table name you must ensure that it doesn't clash
|
1435
|
+
* with an existing table name and that it follows Excel's requirements
|
1436
|
+
* for table names, see the Microsoft Office documentation on
|
1437
|
+
* [Naming an Excel Table]
|
1438
|
+
* (https://support.microsoft.com/en-us/office/rename-an-excel-table-fbf49a4f-82a3-43eb-8ba2-44d21233b114).
|
1439
|
+
*/
|
1440
|
+
const char *name;
|
1441
|
+
|
1442
|
+
/**
|
1443
|
+
* The `no_header_row` parameter can be used to turn off the header row in
|
1444
|
+
* the table. It is on by default:
|
1445
|
+
*
|
1446
|
+
* @code
|
1447
|
+
* lxw_table_options options = {.no_header_row = LXW_TRUE};
|
1448
|
+
*
|
1449
|
+
* worksheet_add_table(worksheet, RANGE("B4:F7"), &options);
|
1450
|
+
* @endcode
|
1451
|
+
*
|
1452
|
+
* @image html tables4.png
|
1453
|
+
*
|
1454
|
+
* Without this option the header row will contain default captions such
|
1455
|
+
* as `Column 1`, ``Column 2``, etc. These captions can be overridden
|
1456
|
+
* using the `columns` parameter shown below.
|
1457
|
+
*
|
1458
|
+
*/
|
1459
|
+
uint8_t no_header_row;
|
1460
|
+
|
1461
|
+
/**
|
1462
|
+
* The `no_autofilter` parameter can be used to turn off the autofilter in
|
1463
|
+
* the header row. It is on by default:
|
1464
|
+
*
|
1465
|
+
* @code
|
1466
|
+
* lxw_table_options options = {.no_autofilter = LXW_TRUE};
|
1467
|
+
*
|
1468
|
+
* worksheet_add_table(worksheet, RANGE("B3:F7"), &options);
|
1469
|
+
* @endcode
|
1470
|
+
*
|
1471
|
+
* @image html tables3.png
|
1472
|
+
*
|
1473
|
+
* The autofilter is only shown if the `no_header_row` parameter is off
|
1474
|
+
* (the default). Filter conditions within the table are not supported.
|
1475
|
+
*
|
1476
|
+
*/
|
1477
|
+
uint8_t no_autofilter;
|
1478
|
+
|
1479
|
+
/**
|
1480
|
+
* The `no_banded_rows` parameter can be used to turn off the rows of alternating
|
1481
|
+
* color in the table. It is on by default:
|
1482
|
+
*
|
1483
|
+
* @code
|
1484
|
+
* lxw_table_options options = {.no_banded_rows = LXW_TRUE};
|
1485
|
+
*
|
1486
|
+
* worksheet_add_table(worksheet, RANGE("B3:F7"), &options);
|
1487
|
+
* @endcode
|
1488
|
+
*
|
1489
|
+
* @image html tables6.png
|
1490
|
+
*
|
1491
|
+
*/
|
1492
|
+
uint8_t no_banded_rows;
|
1493
|
+
|
1494
|
+
/**
|
1495
|
+
* The `banded_columns` parameter can be used to used to create columns of
|
1496
|
+
* alternating color in the table. It is off by default:
|
1497
|
+
*
|
1498
|
+
* @code
|
1499
|
+
* lxw_table_options options = {.banded_columns = LXW_TRUE};
|
1500
|
+
*
|
1501
|
+
* worksheet_add_table(worksheet, RANGE("B3:F7"), &options);
|
1502
|
+
* @endcode
|
1503
|
+
*
|
1504
|
+
* The banded columns formatting is shown in the image in the previous
|
1505
|
+
* section above.
|
1506
|
+
*/
|
1507
|
+
uint8_t banded_columns;
|
1508
|
+
|
1509
|
+
/**
|
1510
|
+
* The `first_column` parameter can be used to highlight the first column
|
1511
|
+
* of the table. The type of highlighting will depend on the `style_type`
|
1512
|
+
* of the table. It may be bold text or a different color. It is off by
|
1513
|
+
* default:
|
1514
|
+
*
|
1515
|
+
* @code
|
1516
|
+
* lxw_table_options options = {.first_column = LXW_TRUE, .last_column = LXW_TRUE};
|
1517
|
+
*
|
1518
|
+
* worksheet_add_table(worksheet, RANGE("B3:F7"), &options);
|
1519
|
+
* @endcode
|
1520
|
+
*
|
1521
|
+
* @image html tables5.png
|
1522
|
+
*/
|
1523
|
+
uint8_t first_column;
|
1524
|
+
|
1525
|
+
/**
|
1526
|
+
* The `last_column` parameter can be used to highlight the last column of
|
1527
|
+
* the table. The type of highlighting will depend on the `style` of the
|
1528
|
+
* table. It may be bold text or a different color. It is off by default:
|
1529
|
+
*
|
1530
|
+
* @code
|
1531
|
+
* lxw_table_options options = {.first_column = LXW_TRUE, .last_column = LXW_TRUE};
|
1532
|
+
*
|
1533
|
+
* worksheet_add_table(worksheet, RANGE("B3:F7"), &options);
|
1534
|
+
* @endcode
|
1535
|
+
*
|
1536
|
+
* The `last_column` formatting is shown in the image in the previous
|
1537
|
+
* section above.
|
1538
|
+
*/
|
1539
|
+
uint8_t last_column;
|
1540
|
+
|
1541
|
+
/**
|
1542
|
+
* The `style_type` parameter can be used to set the style of the table,
|
1543
|
+
* in conjunction with the `style_type_number` parameter:
|
1544
|
+
*
|
1545
|
+
* @code
|
1546
|
+
* lxw_table_options options = {
|
1547
|
+
* .style_type = LXW_TABLE_STYLE_TYPE_LIGHT,
|
1548
|
+
* .style_type_number = 11,
|
1549
|
+
* };
|
1550
|
+
*
|
1551
|
+
* worksheet_add_table(worksheet, RANGE("B3:G8"), &options);
|
1552
|
+
* @endcode
|
1553
|
+
*
|
1554
|
+
*
|
1555
|
+
* @image html tables11.png
|
1556
|
+
*
|
1557
|
+
* There are three types of table style in Excel: Light, Medium and Dark
|
1558
|
+
* which are represented using the #lxw_table_style_type enum values:
|
1559
|
+
*
|
1560
|
+
* - #LXW_TABLE_STYLE_TYPE_LIGHT
|
1561
|
+
*
|
1562
|
+
* - #LXW_TABLE_STYLE_TYPE_MEDIUM
|
1563
|
+
*
|
1564
|
+
* - #LXW_TABLE_STYLE_TYPE_DARK
|
1565
|
+
*
|
1566
|
+
* Within those ranges there are between 11 and 28 other style types which
|
1567
|
+
* can be set with `style_type_number` (depending on the style type).
|
1568
|
+
* Check Excel to find the style that you want. The dialog with the
|
1569
|
+
* options laid out in numeric order are shown below:
|
1570
|
+
*
|
1571
|
+
* @image html tables14.png
|
1572
|
+
*
|
1573
|
+
* The default table style in Excel is 'Table Style Medium 9' (highlighted
|
1574
|
+
* with a green border in the image above), which is set by default in
|
1575
|
+
* libxlsxwriter as:
|
1576
|
+
*
|
1577
|
+
* @code
|
1578
|
+
* lxw_table_options options = {
|
1579
|
+
* .style_type = LXW_TABLE_STYLE_TYPE_MEDIUM,
|
1580
|
+
* .style_type_number = 9,
|
1581
|
+
* };
|
1582
|
+
* @endcode
|
1583
|
+
*
|
1584
|
+
* You can also turn the table style off by setting it to Light 0:
|
1585
|
+
*
|
1586
|
+
* @code
|
1587
|
+
* lxw_table_options options = {
|
1588
|
+
* .style_type = LXW_TABLE_STYLE_TYPE_LIGHT,
|
1589
|
+
* .style_type_number = 0,
|
1590
|
+
* };
|
1591
|
+
* @endcode
|
1592
|
+
*
|
1593
|
+
* @image html tables13.png
|
1594
|
+
*
|
1595
|
+
*/
|
1596
|
+
uint8_t style_type;
|
441
1597
|
|
442
1598
|
/**
|
443
|
-
*
|
444
|
-
*
|
445
|
-
|
446
|
-
lxw_datetime value_datetime;
|
1599
|
+
* The `style_type_number` parameter is used with `style_type` to set the
|
1600
|
+
* style of a worksheet table. */
|
1601
|
+
uint8_t style_type_number;
|
447
1602
|
|
448
1603
|
/**
|
449
|
-
*
|
450
|
-
*
|
1604
|
+
* The `total_row` parameter can be used to turn on the total row in the
|
1605
|
+
* last row of a table. It is distinguished from the other rows by a
|
1606
|
+
* different formatting and also with dropdown `SUBTOTAL` functions:
|
1607
|
+
*
|
1608
|
+
* @code
|
1609
|
+
* lxw_table_options options = {.total_row = LXW_TRUE};
|
1610
|
+
*
|
1611
|
+
* worksheet_add_table(worksheet, RANGE("B3:G8"), &options);
|
1612
|
+
* @endcode
|
1613
|
+
*
|
1614
|
+
* @image html tables9.png
|
1615
|
+
*
|
1616
|
+
* The default total row doesn't have any captions or functions. These
|
1617
|
+
* must by specified via the `columns` parameter below.
|
451
1618
|
*/
|
452
|
-
|
1619
|
+
uint8_t total_row;
|
453
1620
|
|
454
1621
|
/**
|
455
|
-
*
|
456
|
-
*
|
1622
|
+
* The `columns` parameter can be used to set properties for columns
|
1623
|
+
* within the table. See @ref ww_tables_columns for a detailed
|
1624
|
+
* explanation.
|
457
1625
|
*/
|
458
|
-
|
1626
|
+
lxw_table_column **columns;
|
459
1627
|
|
460
|
-
|
461
|
-
* This parameter is the same as `value_datetime` but for the minimum value
|
462
|
-
* when a `BETWEEN` criteria is used.
|
463
|
-
*/
|
464
|
-
lxw_datetime minimum_datetime;
|
1628
|
+
} lxw_table_options;
|
465
1629
|
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
1630
|
+
typedef struct lxw_table_obj {
|
1631
|
+
char *name;
|
1632
|
+
char *total_string;
|
1633
|
+
lxw_table_column **columns;
|
1634
|
+
uint8_t banded_columns;
|
1635
|
+
uint8_t first_column;
|
1636
|
+
uint8_t last_column;
|
1637
|
+
uint8_t no_autofilter;
|
1638
|
+
uint8_t no_banded_rows;
|
1639
|
+
uint8_t no_header_row;
|
1640
|
+
uint8_t style_type;
|
1641
|
+
uint8_t style_type_number;
|
1642
|
+
uint8_t total_row;
|
471
1643
|
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
1644
|
+
lxw_row_t first_row;
|
1645
|
+
lxw_col_t first_col;
|
1646
|
+
lxw_row_t last_row;
|
1647
|
+
lxw_col_t last_col;
|
1648
|
+
lxw_col_t num_cols;
|
1649
|
+
uint32_t id;
|
477
1650
|
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
*/
|
482
|
-
lxw_datetime maximum_datetime;
|
1651
|
+
char sqref[LXW_MAX_ATTRIBUTE_LENGTH];
|
1652
|
+
char filter_sqref[LXW_MAX_ATTRIBUTE_LENGTH];
|
1653
|
+
STAILQ_ENTRY (lxw_table_obj) list_pointers;
|
483
1654
|
|
484
|
-
|
485
|
-
* The input_title parameter is used to set the title of the input message
|
486
|
-
* that is displayed when a cell is entered. It has no default value and
|
487
|
-
* is only displayed if the input message is displayed. See the
|
488
|
-
* `input_message` parameter below.
|
489
|
-
*
|
490
|
-
* The maximum title length is 32 characters.
|
491
|
-
*/
|
492
|
-
char *input_title;
|
1655
|
+
} lxw_table_obj;
|
493
1656
|
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
char *input_message;
|
1657
|
+
/**
|
1658
|
+
* @brief Options for autofilter rules.
|
1659
|
+
*
|
1660
|
+
* Options to define an autofilter rule.
|
1661
|
+
*
|
1662
|
+
*/
|
1663
|
+
typedef struct lxw_filter_rule {
|
502
1664
|
|
503
|
-
/**
|
504
|
-
|
505
|
-
* that is displayed when the data validation criteria is not met. The
|
506
|
-
* default error title is 'Microsoft Excel'. The maximum title length is
|
507
|
-
* 32 characters.
|
508
|
-
*/
|
509
|
-
char *error_title;
|
1665
|
+
/** The #lxw_filter_criteria to define the rule. */
|
1666
|
+
uint8_t criteria;
|
510
1667
|
|
511
|
-
/**
|
512
|
-
|
513
|
-
* displayed when a cell is entered. The default error message is "The
|
514
|
-
* value you entered is not valid. A user has restricted values that can
|
515
|
-
* be entered into the cell".
|
516
|
-
*
|
517
|
-
* The message can be split over several lines using newlines. The maximum
|
518
|
-
* message length is 255 characters.
|
519
|
-
*/
|
520
|
-
char *error_message;
|
1668
|
+
/** String value to which the criteria applies. */
|
1669
|
+
const char *value_string;
|
521
1670
|
|
522
|
-
|
1671
|
+
/** Numeric value to which the criteria applies (if value_string isn't used). */
|
1672
|
+
double value;
|
523
1673
|
|
524
|
-
|
1674
|
+
} lxw_filter_rule;
|
525
1675
|
|
526
|
-
|
1676
|
+
typedef struct lxw_filter_rule_obj {
|
1677
|
+
|
1678
|
+
uint8_t type;
|
1679
|
+
uint8_t is_custom;
|
1680
|
+
uint8_t has_blanks;
|
1681
|
+
lxw_col_t col_num;
|
1682
|
+
|
1683
|
+
uint8_t criteria1;
|
1684
|
+
uint8_t criteria2;
|
1685
|
+
double value1;
|
1686
|
+
double value2;
|
1687
|
+
char *value1_string;
|
1688
|
+
char *value2_string;
|
1689
|
+
|
1690
|
+
uint16_t num_list_filters;
|
1691
|
+
char **list;
|
1692
|
+
|
1693
|
+
} lxw_filter_rule_obj;
|
527
1694
|
|
528
1695
|
/**
|
529
|
-
* @brief Options for inserted images
|
1696
|
+
* @brief Options for inserted images.
|
530
1697
|
*
|
531
1698
|
* Options for modifying images inserted via `worksheet_insert_image_opt()`.
|
532
1699
|
*
|
@@ -545,19 +1712,88 @@ typedef struct lxw_image_options {
|
|
545
1712
|
/** Y scale of the image as a decimal. */
|
546
1713
|
double y_scale;
|
547
1714
|
|
1715
|
+
/** Object position - use one of the values of #lxw_object_position.
|
1716
|
+
* See @ref working_with_object_positioning.*/
|
1717
|
+
uint8_t object_position;
|
1718
|
+
|
1719
|
+
/** Optional description or "Alt text" for the image. This field can be
|
1720
|
+
* used to provide a text description of the image to help
|
1721
|
+
* accessibility. Defaults to the image filename as in Excel. Set to ""
|
1722
|
+
* to ignore the description field. */
|
1723
|
+
const char *description;
|
1724
|
+
|
1725
|
+
/** Optional parameter to help accessibility. It is used to mark the image
|
1726
|
+
* as decorative, and thus uninformative, for automated screen
|
1727
|
+
* readers. As in Excel, if this parameter is in use the `description`
|
1728
|
+
* field isn't written. */
|
1729
|
+
uint8_t decorative;
|
1730
|
+
|
1731
|
+
/** Add an optional hyperlink to the image. Follows the same URL rules
|
1732
|
+
* and types as `worksheet_write_url()`. */
|
1733
|
+
const char *url;
|
1734
|
+
|
1735
|
+
/** Add an optional mouseover tip for a hyperlink to the image. */
|
1736
|
+
const char *tip;
|
1737
|
+
|
1738
|
+
} lxw_image_options;
|
1739
|
+
|
1740
|
+
/**
|
1741
|
+
* @brief Options for inserted charts.
|
1742
|
+
*
|
1743
|
+
* Options for modifying charts inserted via `worksheet_insert_chart_opt()`.
|
1744
|
+
*
|
1745
|
+
*/
|
1746
|
+
typedef struct lxw_chart_options {
|
1747
|
+
|
1748
|
+
/** Offset from the left of the cell in pixels. */
|
1749
|
+
int32_t x_offset;
|
1750
|
+
|
1751
|
+
/** Offset from the top of the cell in pixels. */
|
1752
|
+
int32_t y_offset;
|
1753
|
+
|
1754
|
+
/** X scale of the chart as a decimal. */
|
1755
|
+
double x_scale;
|
1756
|
+
|
1757
|
+
/** Y scale of the chart as a decimal. */
|
1758
|
+
double y_scale;
|
1759
|
+
|
1760
|
+
/** Object position - use one of the values of #lxw_object_position.
|
1761
|
+
* See @ref working_with_object_positioning.*/
|
1762
|
+
uint8_t object_position;
|
1763
|
+
|
1764
|
+
/** Optional description or "Alt text" for the chart. This field can be
|
1765
|
+
* used to provide a text description of the chart to help
|
1766
|
+
* accessibility. Defaults to the image filename as in Excel. Set to NULL
|
1767
|
+
* to ignore the description field. */
|
1768
|
+
const char *description;
|
1769
|
+
|
1770
|
+
/** Optional parameter to help accessibility. It is used to mark the chart
|
1771
|
+
* as decorative, and thus uninformative, for automated screen
|
1772
|
+
* readers. As in Excel, if this parameter is in use the `description`
|
1773
|
+
* field isn't written. */
|
1774
|
+
uint8_t decorative;
|
1775
|
+
|
1776
|
+
} lxw_chart_options;
|
1777
|
+
|
1778
|
+
/* Internal struct to represent lxw_image_options and lxw_chart_options
|
1779
|
+
* values as well as internal metadata.
|
1780
|
+
*/
|
1781
|
+
typedef struct lxw_object_properties {
|
1782
|
+
int32_t x_offset;
|
1783
|
+
int32_t y_offset;
|
1784
|
+
double x_scale;
|
1785
|
+
double y_scale;
|
548
1786
|
lxw_row_t row;
|
549
1787
|
lxw_col_t col;
|
550
1788
|
char *filename;
|
551
1789
|
char *description;
|
552
1790
|
char *url;
|
553
1791
|
char *tip;
|
554
|
-
uint8_t
|
555
|
-
|
556
|
-
/* Internal metadata. */
|
1792
|
+
uint8_t object_position;
|
557
1793
|
FILE *stream;
|
558
1794
|
uint8_t image_type;
|
559
1795
|
uint8_t is_image_buffer;
|
560
|
-
|
1796
|
+
char *image_buffer;
|
561
1797
|
size_t image_buffer_size;
|
562
1798
|
double width;
|
563
1799
|
double height;
|
@@ -565,21 +1801,200 @@ typedef struct lxw_image_options {
|
|
565
1801
|
double x_dpi;
|
566
1802
|
double y_dpi;
|
567
1803
|
lxw_chart *chart;
|
1804
|
+
uint8_t is_duplicate;
|
1805
|
+
uint8_t is_background;
|
1806
|
+
char *md5;
|
1807
|
+
char *image_position;
|
1808
|
+
uint8_t decorative;
|
568
1809
|
|
569
|
-
STAILQ_ENTRY (
|
1810
|
+
STAILQ_ENTRY (lxw_object_properties) list_pointers;
|
1811
|
+
} lxw_object_properties;
|
570
1812
|
|
571
|
-
|
1813
|
+
/**
|
1814
|
+
* @brief Options for inserted comments.
|
1815
|
+
*
|
1816
|
+
* Options for modifying comments inserted via `worksheet_write_comment_opt()`.
|
1817
|
+
*
|
1818
|
+
*/
|
1819
|
+
typedef struct lxw_comment_options {
|
1820
|
+
|
1821
|
+
/** This option is used to make a cell comment visible when the worksheet
|
1822
|
+
* is opened. The default behavior in Excel is that comments are
|
1823
|
+
* initially hidden. However, it is also possible in Excel to make
|
1824
|
+
* individual comments or all comments visible. You can make all
|
1825
|
+
* comments in the worksheet visible using the
|
1826
|
+
* `worksheet_show_comments()` function. Defaults to
|
1827
|
+
* LXW_COMMENT_DISPLAY_DEFAULT. See also @ref ww_comments_visible. */
|
1828
|
+
uint8_t visible;
|
1829
|
+
|
1830
|
+
/** This option is used to indicate the author of the cell comment. Excel
|
1831
|
+
* displays the author in the status bar at the bottom of the
|
1832
|
+
* worksheet. The default author for all cell comments in a worksheet can
|
1833
|
+
* be set using the `worksheet_set_comments_author()` function. Set to
|
1834
|
+
* NULL if not required. See also @ref ww_comments_author. */
|
1835
|
+
const char *author;
|
1836
|
+
|
1837
|
+
/** This option is used to set the width of the cell comment box
|
1838
|
+
* explicitly in pixels. The default width is 128 pixels. See also @ref
|
1839
|
+
* ww_comments_width. */
|
1840
|
+
uint16_t width;
|
1841
|
+
|
1842
|
+
/** This option is used to set the height of the cell comment box
|
1843
|
+
* explicitly in pixels. The default height is 74 pixels. See also @ref
|
1844
|
+
* ww_comments_height. */
|
1845
|
+
uint16_t height;
|
1846
|
+
|
1847
|
+
/** X scale of the comment as a decimal. See also
|
1848
|
+
* @ref ww_comments_x_scale. */
|
1849
|
+
double x_scale;
|
1850
|
+
|
1851
|
+
/** Y scale of the comment as a decimal. See also
|
1852
|
+
* @ref ww_comments_y_scale. */
|
1853
|
+
double y_scale;
|
1854
|
+
|
1855
|
+
/** This option is used to set the background color of cell comment
|
1856
|
+
* box. The color should be an RGB integer value, see @ref
|
1857
|
+
* working_with_colors. See also @ref ww_comments_color. */
|
1858
|
+
lxw_color_t color;
|
1859
|
+
|
1860
|
+
/** This option is used to set the font for the comment. The default font
|
1861
|
+
* is 'Tahoma'. See also @ref ww_comments_font_name. */
|
1862
|
+
const char *font_name;
|
1863
|
+
|
1864
|
+
/** This option is used to set the font size for the comment. The default
|
1865
|
+
* is 8. See also @ref ww_comments_font_size. */
|
1866
|
+
double font_size;
|
1867
|
+
|
1868
|
+
/** This option is used to set the font family number for the comment.
|
1869
|
+
* Not required very often. Set to 0. */
|
1870
|
+
uint8_t font_family;
|
1871
|
+
|
1872
|
+
/** This option is used to set the row in which the comment will
|
1873
|
+
* appear. By default Excel displays comments one cell to the right and
|
1874
|
+
* one cell above the cell to which the comment relates. The `start_row`
|
1875
|
+
* and `start_col` options should both be set to 0 if not used. See also
|
1876
|
+
* @ref ww_comments_start_row. */
|
1877
|
+
lxw_row_t start_row;
|
1878
|
+
|
1879
|
+
/** This option is used to set the column in which the comment will
|
1880
|
+
* appear. See the `start_row` option for more information and see also
|
1881
|
+
* @ref ww_comments_start_col. */
|
1882
|
+
lxw_col_t start_col;
|
1883
|
+
|
1884
|
+
/** Offset from the left of the cell in pixels. See also
|
1885
|
+
* @ref ww_comments_x_offset. */
|
1886
|
+
int32_t x_offset;
|
1887
|
+
|
1888
|
+
/** Offset from the top of the cell in pixels. See also
|
1889
|
+
* @ref ww_comments_y_offset. */
|
1890
|
+
int32_t y_offset;
|
1891
|
+
|
1892
|
+
} lxw_comment_options;
|
1893
|
+
|
1894
|
+
/**
|
1895
|
+
* @brief Options for inserted buttons.
|
1896
|
+
*
|
1897
|
+
* Options for modifying buttons inserted via `worksheet_insert_button()`.
|
1898
|
+
*
|
1899
|
+
*/
|
1900
|
+
typedef struct lxw_button_options {
|
1901
|
+
|
1902
|
+
/** Sets the caption on the button. The default is "Button n" where n is
|
1903
|
+
* the current number of buttons in the worksheet, including this
|
1904
|
+
* button. */
|
1905
|
+
const char *caption;
|
1906
|
+
|
1907
|
+
/** Name of the macro to run when the button is pressed. The macro must be
|
1908
|
+
* included with workbook_add_vba_project(). */
|
1909
|
+
const char *macro;
|
1910
|
+
|
1911
|
+
/** Optional description or "Alt text" for the button. This field can be
|
1912
|
+
* used to provide a text description of the button to help
|
1913
|
+
* accessibility. Set to NULL to ignore the description field. */
|
1914
|
+
const char *description;
|
1915
|
+
|
1916
|
+
/** This option is used to set the width of the cell button box
|
1917
|
+
* explicitly in pixels. The default width is 64 pixels. */
|
1918
|
+
uint16_t width;
|
1919
|
+
|
1920
|
+
/** This option is used to set the height of the cell button box
|
1921
|
+
* explicitly in pixels. The default height is 20 pixels. */
|
1922
|
+
uint16_t height;
|
1923
|
+
|
1924
|
+
/** X scale of the button as a decimal. */
|
1925
|
+
double x_scale;
|
1926
|
+
|
1927
|
+
/** Y scale of the button as a decimal. */
|
1928
|
+
double y_scale;
|
1929
|
+
|
1930
|
+
/** Offset from the left of the cell in pixels. */
|
1931
|
+
int32_t x_offset;
|
1932
|
+
|
1933
|
+
/** Offset from the top of the cell in pixels. */
|
1934
|
+
int32_t y_offset;
|
1935
|
+
|
1936
|
+
} lxw_button_options;
|
1937
|
+
|
1938
|
+
/* Internal structure for VML object options. */
|
1939
|
+
typedef struct lxw_vml_obj {
|
1940
|
+
|
1941
|
+
lxw_row_t row;
|
1942
|
+
lxw_col_t col;
|
1943
|
+
lxw_row_t start_row;
|
1944
|
+
lxw_col_t start_col;
|
1945
|
+
int32_t x_offset;
|
1946
|
+
int32_t y_offset;
|
1947
|
+
uint64_t col_absolute;
|
1948
|
+
uint64_t row_absolute;
|
1949
|
+
uint32_t width;
|
1950
|
+
uint32_t height;
|
1951
|
+
double x_dpi;
|
1952
|
+
double y_dpi;
|
1953
|
+
lxw_color_t color;
|
1954
|
+
uint8_t font_family;
|
1955
|
+
uint8_t visible;
|
1956
|
+
uint32_t author_id;
|
1957
|
+
uint32_t rel_index;
|
1958
|
+
double font_size;
|
1959
|
+
struct lxw_drawing_coords from;
|
1960
|
+
struct lxw_drawing_coords to;
|
1961
|
+
char *author;
|
1962
|
+
char *font_name;
|
1963
|
+
char *text;
|
1964
|
+
char *image_position;
|
1965
|
+
char *name;
|
1966
|
+
char *macro;
|
1967
|
+
STAILQ_ENTRY (lxw_vml_obj) list_pointers;
|
1968
|
+
|
1969
|
+
} lxw_vml_obj;
|
572
1970
|
|
573
1971
|
/**
|
574
1972
|
* @brief Header and footer options.
|
575
1973
|
*
|
576
|
-
* Optional parameters used in the worksheet_set_header_opt() and
|
1974
|
+
* Optional parameters used in the `worksheet_set_header_opt()` and
|
577
1975
|
* worksheet_set_footer_opt() functions.
|
578
1976
|
*
|
579
1977
|
*/
|
580
1978
|
typedef struct lxw_header_footer_options {
|
581
|
-
/** Header or footer margin in inches. Excel default is 0.3.
|
1979
|
+
/** Header or footer margin in inches. Excel default is 0.3. Must by
|
1980
|
+
* larger than 0.0. See `worksheet_set_header_opt()`. */
|
582
1981
|
double margin;
|
1982
|
+
|
1983
|
+
/** The left header image filename, with path if required. This should
|
1984
|
+
* have a corresponding `&G/&[Picture]` placeholder in the `&L` section of
|
1985
|
+
* the header/footer string. See `worksheet_set_header_opt()`. */
|
1986
|
+
const char *image_left;
|
1987
|
+
|
1988
|
+
/** The center header image filename, with path if required. This should
|
1989
|
+
* have a corresponding `&G/&[Picture]` placeholder in the `&C` section of
|
1990
|
+
* the header/footer string. See `worksheet_set_header_opt()`. */
|
1991
|
+
const char *image_center;
|
1992
|
+
|
1993
|
+
/** The right header image filename, with path if required. This should
|
1994
|
+
* have a corresponding `&G/&[Picture]` placeholder in the `&R` section of
|
1995
|
+
* the header/footer string. See `worksheet_set_header_opt()`. */
|
1996
|
+
const char *image_right;
|
1997
|
+
|
583
1998
|
} lxw_header_footer_options;
|
584
1999
|
|
585
2000
|
/**
|
@@ -637,10 +2052,31 @@ typedef struct lxw_protection {
|
|
637
2052
|
/** Turn off chartsheet objects. */
|
638
2053
|
uint8_t no_objects;
|
639
2054
|
|
2055
|
+
} lxw_protection;
|
2056
|
+
|
2057
|
+
/* Internal struct to copy lxw_protection options and internal metadata. */
|
2058
|
+
typedef struct lxw_protection_obj {
|
2059
|
+
uint8_t no_select_locked_cells;
|
2060
|
+
uint8_t no_select_unlocked_cells;
|
2061
|
+
uint8_t format_cells;
|
2062
|
+
uint8_t format_columns;
|
2063
|
+
uint8_t format_rows;
|
2064
|
+
uint8_t insert_columns;
|
2065
|
+
uint8_t insert_rows;
|
2066
|
+
uint8_t insert_hyperlinks;
|
2067
|
+
uint8_t delete_columns;
|
2068
|
+
uint8_t delete_rows;
|
2069
|
+
uint8_t sort;
|
2070
|
+
uint8_t autofilter;
|
2071
|
+
uint8_t pivot_tables;
|
2072
|
+
uint8_t scenarios;
|
2073
|
+
uint8_t objects;
|
2074
|
+
uint8_t no_content;
|
2075
|
+
uint8_t no_objects;
|
640
2076
|
uint8_t no_sheet;
|
641
2077
|
uint8_t is_configured;
|
642
2078
|
char hash[5];
|
643
|
-
}
|
2079
|
+
} lxw_protection_obj;
|
644
2080
|
|
645
2081
|
/**
|
646
2082
|
* @brief Struct to represent a rich string format/string pair.
|
@@ -658,7 +2094,7 @@ typedef struct lxw_rich_string_tuple {
|
|
658
2094
|
lxw_format *format;
|
659
2095
|
|
660
2096
|
/** The string fragment. */
|
661
|
-
char *string;
|
2097
|
+
const char *string;
|
662
2098
|
} lxw_rich_string_tuple;
|
663
2099
|
|
664
2100
|
/**
|
@@ -672,14 +2108,25 @@ typedef struct lxw_worksheet {
|
|
672
2108
|
|
673
2109
|
FILE *file;
|
674
2110
|
FILE *optimize_tmpfile;
|
2111
|
+
char *optimize_buffer;
|
2112
|
+
size_t optimize_buffer_size;
|
675
2113
|
struct lxw_table_rows *table;
|
676
2114
|
struct lxw_table_rows *hyperlinks;
|
2115
|
+
struct lxw_table_rows *comments;
|
677
2116
|
struct lxw_cell **array;
|
678
2117
|
struct lxw_merged_ranges *merged_ranges;
|
679
2118
|
struct lxw_selections *selections;
|
680
2119
|
struct lxw_data_validations *data_validations;
|
681
|
-
struct
|
682
|
-
struct
|
2120
|
+
struct lxw_cond_format_hash *conditional_formats;
|
2121
|
+
struct lxw_image_props *image_props;
|
2122
|
+
struct lxw_chart_props *chart_data;
|
2123
|
+
struct lxw_drawing_rel_ids *drawing_rel_ids;
|
2124
|
+
struct lxw_vml_drawing_rel_ids *vml_drawing_rel_ids;
|
2125
|
+
struct lxw_comment_objs *comment_objs;
|
2126
|
+
struct lxw_comment_objs *header_image_objs;
|
2127
|
+
struct lxw_comment_objs *button_objs;
|
2128
|
+
struct lxw_table_objs *table_objs;
|
2129
|
+
uint16_t table_count;
|
683
2130
|
|
684
2131
|
lxw_row_t dim_rowmin;
|
685
2132
|
lxw_row_t dim_rowmax;
|
@@ -687,11 +2134,11 @@ typedef struct lxw_worksheet {
|
|
687
2134
|
lxw_col_t dim_colmax;
|
688
2135
|
|
689
2136
|
lxw_sst *sst;
|
690
|
-
char *name;
|
691
|
-
char *quoted_name;
|
692
|
-
char *tmpdir;
|
2137
|
+
const char *name;
|
2138
|
+
const char *quoted_name;
|
2139
|
+
const char *tmpdir;
|
693
2140
|
|
694
|
-
|
2141
|
+
uint16_t index;
|
695
2142
|
uint8_t active;
|
696
2143
|
uint8_t selected;
|
697
2144
|
uint8_t hidden;
|
@@ -743,8 +2190,11 @@ typedef struct lxw_worksheet {
|
|
743
2190
|
uint8_t show_zeros;
|
744
2191
|
uint8_t vcenter;
|
745
2192
|
uint8_t zoom_scale_normal;
|
2193
|
+
uint8_t black_white;
|
746
2194
|
uint8_t num_validations;
|
2195
|
+
uint8_t has_dynamic_arrays;
|
747
2196
|
char *vba_codename;
|
2197
|
+
uint16_t num_buttons;
|
748
2198
|
|
749
2199
|
lxw_color_t tab_color;
|
750
2200
|
|
@@ -764,8 +2214,8 @@ typedef struct lxw_worksheet {
|
|
764
2214
|
uint8_t outline_col_level;
|
765
2215
|
|
766
2216
|
uint8_t header_footer_changed;
|
767
|
-
char header
|
768
|
-
char footer
|
2217
|
+
char *header;
|
2218
|
+
char *footer;
|
769
2219
|
|
770
2220
|
struct lxw_repeat_rows repeat_rows;
|
771
2221
|
struct lxw_repeat_cols repeat_cols;
|
@@ -773,21 +2223,71 @@ typedef struct lxw_worksheet {
|
|
773
2223
|
struct lxw_autofilter autofilter;
|
774
2224
|
|
775
2225
|
uint16_t merged_range_count;
|
2226
|
+
uint16_t max_url_length;
|
776
2227
|
|
777
2228
|
lxw_row_t *hbreaks;
|
778
2229
|
lxw_col_t *vbreaks;
|
779
2230
|
uint16_t hbreaks_count;
|
780
2231
|
uint16_t vbreaks_count;
|
781
2232
|
|
2233
|
+
uint32_t drawing_rel_id;
|
2234
|
+
uint32_t vml_drawing_rel_id;
|
782
2235
|
struct lxw_rel_tuples *external_hyperlinks;
|
783
2236
|
struct lxw_rel_tuples *external_drawing_links;
|
784
2237
|
struct lxw_rel_tuples *drawing_links;
|
2238
|
+
struct lxw_rel_tuples *vml_drawing_links;
|
2239
|
+
struct lxw_rel_tuples *external_table_links;
|
785
2240
|
|
786
2241
|
struct lxw_panes panes;
|
2242
|
+
char top_left_cell[LXW_MAX_CELL_NAME_LENGTH];
|
787
2243
|
|
788
|
-
struct
|
2244
|
+
struct lxw_protection_obj protection;
|
789
2245
|
|
790
2246
|
lxw_drawing *drawing;
|
2247
|
+
lxw_format *default_url_format;
|
2248
|
+
|
2249
|
+
uint8_t has_vml;
|
2250
|
+
uint8_t has_comments;
|
2251
|
+
uint8_t has_header_vml;
|
2252
|
+
uint8_t has_background_image;
|
2253
|
+
uint8_t has_buttons;
|
2254
|
+
lxw_rel_tuple *external_vml_comment_link;
|
2255
|
+
lxw_rel_tuple *external_comment_link;
|
2256
|
+
lxw_rel_tuple *external_vml_header_link;
|
2257
|
+
lxw_rel_tuple *external_background_link;
|
2258
|
+
char *comment_author;
|
2259
|
+
char *vml_data_id_str;
|
2260
|
+
char *vml_header_id_str;
|
2261
|
+
uint32_t vml_shape_id;
|
2262
|
+
uint32_t vml_header_id;
|
2263
|
+
uint32_t dxf_priority;
|
2264
|
+
uint8_t comment_display_default;
|
2265
|
+
uint32_t data_bar_2010_index;
|
2266
|
+
|
2267
|
+
uint8_t has_ignore_errors;
|
2268
|
+
char *ignore_number_stored_as_text;
|
2269
|
+
char *ignore_eval_error;
|
2270
|
+
char *ignore_formula_differs;
|
2271
|
+
char *ignore_formula_range;
|
2272
|
+
char *ignore_formula_unlocked;
|
2273
|
+
char *ignore_empty_cell_reference;
|
2274
|
+
char *ignore_list_data_validation;
|
2275
|
+
char *ignore_calculated_column;
|
2276
|
+
char *ignore_two_digit_text_year;
|
2277
|
+
|
2278
|
+
uint16_t excel_version;
|
2279
|
+
|
2280
|
+
lxw_object_properties **header_footer_objs[LXW_HEADER_FOOTER_OBJS_MAX];
|
2281
|
+
lxw_object_properties *header_left_object_props;
|
2282
|
+
lxw_object_properties *header_center_object_props;
|
2283
|
+
lxw_object_properties *header_right_object_props;
|
2284
|
+
lxw_object_properties *footer_left_object_props;
|
2285
|
+
lxw_object_properties *footer_center_object_props;
|
2286
|
+
lxw_object_properties *footer_right_object_props;
|
2287
|
+
lxw_object_properties *background_image;
|
2288
|
+
|
2289
|
+
lxw_filter_rule_obj **filter_rules;
|
2290
|
+
lxw_col_t num_filter_rules;
|
791
2291
|
|
792
2292
|
STAILQ_ENTRY (lxw_worksheet) list_pointers;
|
793
2293
|
|
@@ -797,15 +2297,17 @@ typedef struct lxw_worksheet {
|
|
797
2297
|
* Worksheet initialization data.
|
798
2298
|
*/
|
799
2299
|
typedef struct lxw_worksheet_init_data {
|
800
|
-
|
2300
|
+
uint16_t index;
|
801
2301
|
uint8_t hidden;
|
802
2302
|
uint8_t optimize;
|
803
2303
|
uint16_t *active_sheet;
|
804
2304
|
uint16_t *first_sheet;
|
805
2305
|
lxw_sst *sst;
|
806
|
-
char *name;
|
807
|
-
char *quoted_name;
|
808
|
-
char *tmpdir;
|
2306
|
+
const char *name;
|
2307
|
+
const char *quoted_name;
|
2308
|
+
const char *tmpdir;
|
2309
|
+
lxw_format *default_url_format;
|
2310
|
+
uint16_t max_url_length;
|
809
2311
|
|
810
2312
|
} lxw_worksheet_init_data;
|
811
2313
|
|
@@ -820,6 +2322,7 @@ typedef struct lxw_row {
|
|
820
2322
|
uint8_t row_changed;
|
821
2323
|
uint8_t data_changed;
|
822
2324
|
uint8_t height_changed;
|
2325
|
+
|
823
2326
|
struct lxw_table_cells *cells;
|
824
2327
|
|
825
2328
|
/* tree management pointers for tree.h. */
|
@@ -832,11 +2335,12 @@ typedef struct lxw_cell {
|
|
832
2335
|
lxw_col_t col_num;
|
833
2336
|
enum cell_types type;
|
834
2337
|
lxw_format *format;
|
2338
|
+
lxw_vml_obj *comment;
|
835
2339
|
|
836
2340
|
union {
|
837
2341
|
double number;
|
838
2342
|
int32_t string_id;
|
839
|
-
char *string;
|
2343
|
+
const char *string;
|
840
2344
|
} u;
|
841
2345
|
|
842
2346
|
double formula_result;
|
@@ -848,6 +2352,16 @@ typedef struct lxw_cell {
|
|
848
2352
|
RB_ENTRY (lxw_cell) tree_pointers;
|
849
2353
|
} lxw_cell;
|
850
2354
|
|
2355
|
+
/* Struct to represent a drawing Target/ID pair. */
|
2356
|
+
typedef struct lxw_drawing_rel_id {
|
2357
|
+
uint32_t id;
|
2358
|
+
char *target;
|
2359
|
+
|
2360
|
+
RB_ENTRY (lxw_drawing_rel_id) tree_pointers;
|
2361
|
+
} lxw_drawing_rel_id;
|
2362
|
+
|
2363
|
+
|
2364
|
+
|
851
2365
|
/* *INDENT-OFF* */
|
852
2366
|
#ifdef __cplusplus
|
853
2367
|
extern "C" {
|
@@ -857,7 +2371,7 @@ extern "C" {
|
|
857
2371
|
/**
|
858
2372
|
* @brief Write a number to a worksheet cell.
|
859
2373
|
*
|
860
|
-
* @param worksheet
|
2374
|
+
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
861
2375
|
* @param row The zero indexed row number.
|
862
2376
|
* @param col The zero indexed column number.
|
863
2377
|
* @param number The number to write to the cell.
|
@@ -904,7 +2418,7 @@ lxw_error worksheet_write_number(lxw_worksheet *worksheet,
|
|
904
2418
|
/**
|
905
2419
|
* @brief Write a string to a worksheet cell.
|
906
2420
|
*
|
907
|
-
* @param worksheet
|
2421
|
+
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
908
2422
|
* @param row The zero indexed row number.
|
909
2423
|
* @param col The zero indexed column number.
|
910
2424
|
* @param string String to write to cell.
|
@@ -952,7 +2466,7 @@ lxw_error worksheet_write_string(lxw_worksheet *worksheet,
|
|
952
2466
|
/**
|
953
2467
|
* @brief Write a formula to a worksheet cell.
|
954
2468
|
*
|
955
|
-
* @param worksheet
|
2469
|
+
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
956
2470
|
* @param row The zero indexed row number.
|
957
2471
|
* @param col The zero indexed column number.
|
958
2472
|
* @param formula Formula string to write to cell.
|
@@ -1005,17 +2519,17 @@ lxw_error worksheet_write_formula(lxw_worksheet *worksheet,
|
|
1005
2519
|
/**
|
1006
2520
|
* @brief Write an array formula to a worksheet cell.
|
1007
2521
|
*
|
1008
|
-
* @param worksheet
|
1009
|
-
* @param first_row
|
1010
|
-
* @param first_col
|
1011
|
-
* @param last_row
|
1012
|
-
* @param last_col
|
1013
|
-
* @param formula
|
1014
|
-
* @param format
|
2522
|
+
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
2523
|
+
* @param first_row The first row of the range. (All zero indexed.)
|
2524
|
+
* @param first_col The first column of the range.
|
2525
|
+
* @param last_row The last row of the range.
|
2526
|
+
* @param last_col The last col of the range.
|
2527
|
+
* @param formula Array formula to write to cell.
|
2528
|
+
* @param format A pointer to a Format instance or NULL.
|
1015
2529
|
*
|
1016
2530
|
* @return A #lxw_error code.
|
1017
2531
|
*
|
1018
|
-
|
2532
|
+
* The `%worksheet_write_array_formula()` function writes an array formula to
|
1019
2533
|
* a cell range. In Excel an array formula is a formula that performs a
|
1020
2534
|
* calculation on a set of values.
|
1021
2535
|
*
|
@@ -1039,18 +2553,106 @@ lxw_error worksheet_write_formula(lxw_worksheet *worksheet,
|
|
1039
2553
|
* parameters should be the same:
|
1040
2554
|
*
|
1041
2555
|
* @code
|
1042
|
-
* worksheet_write_array_formula(worksheet, 1, 0, 1, 0, "{=SUM(B1:C1*B2:C2)}", NULL);
|
1043
|
-
* worksheet_write_array_formula(worksheet, RANGE("A2:A2"), "{=SUM(B1:C1*B2:C2)}", NULL);
|
2556
|
+
* worksheet_write_array_formula(worksheet, 1, 0, 1, 0, "{=SUM(B1:C1*B2:C2)}", NULL);
|
2557
|
+
* worksheet_write_array_formula(worksheet, RANGE("A2:A2"), "{=SUM(B1:C1*B2:C2)}", NULL);
|
2558
|
+
* @endcode
|
2559
|
+
*
|
2560
|
+
*/
|
2561
|
+
lxw_error worksheet_write_array_formula(lxw_worksheet *worksheet,
|
2562
|
+
lxw_row_t first_row,
|
2563
|
+
lxw_col_t first_col,
|
2564
|
+
lxw_row_t last_row,
|
2565
|
+
lxw_col_t last_col,
|
2566
|
+
const char *formula,
|
2567
|
+
lxw_format *format);
|
2568
|
+
|
2569
|
+
/**
|
2570
|
+
* @brief Write an Excel 365 dynamic array formula to a worksheet range.
|
2571
|
+
*
|
2572
|
+
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
2573
|
+
* @param first_row The first row of the range. (All zero indexed.)
|
2574
|
+
* @param first_col The first column of the range.
|
2575
|
+
* @param last_row The last row of the range.
|
2576
|
+
* @param last_col The last col of the range.
|
2577
|
+
* @param formula Dynamic Array formula to write to cell.
|
2578
|
+
* @param format A pointer to a Format instance or NULL.
|
2579
|
+
*
|
2580
|
+
* @return A #lxw_error code.
|
2581
|
+
*
|
2582
|
+
*
|
2583
|
+
* The `%worksheet_write_dynamic_array_formula()` function writes an Excel 365
|
2584
|
+
* dynamic array formula to a cell range. Some examples of functions that
|
2585
|
+
* return dynamic arrays are:
|
2586
|
+
*
|
2587
|
+
* - `FILTER`
|
2588
|
+
* - `RANDARRAY`
|
2589
|
+
* - `SEQUENCE`
|
2590
|
+
* - `SORTBY`
|
2591
|
+
* - `SORT`
|
2592
|
+
* - `UNIQUE`
|
2593
|
+
* - `XLOOKUP`
|
2594
|
+
* - `XMATCH`
|
2595
|
+
*
|
2596
|
+
* Dynamic array formulas and their usage in libxlsxwriter is explained in
|
2597
|
+
* detail @ref ww_formulas_dynamic_arrays. The following is a example usage:
|
2598
|
+
*
|
2599
|
+
* @code
|
2600
|
+
* worksheet_write_dynamic_array_formula(worksheet, 1, 5, 1, 5,
|
2601
|
+
* "=_xlfn._xlws.FILTER(A1:D17,C1:C17=K2)",
|
2602
|
+
* NULL);
|
2603
|
+
* @endcode
|
2604
|
+
*
|
2605
|
+
* This formula gives the results shown in the image below.
|
2606
|
+
*
|
2607
|
+
* @image html dynamic_arrays02.png
|
2608
|
+
*
|
2609
|
+
* The need for the `_xlfn._xlws.` prefix in the formula is explained in @ref
|
2610
|
+
* ww_formulas_future.
|
2611
|
+
*/
|
2612
|
+
lxw_error worksheet_write_dynamic_array_formula(lxw_worksheet *worksheet,
|
2613
|
+
lxw_row_t first_row,
|
2614
|
+
lxw_col_t first_col,
|
2615
|
+
lxw_row_t last_row,
|
2616
|
+
lxw_col_t last_col,
|
2617
|
+
const char *formula,
|
2618
|
+
lxw_format *format);
|
2619
|
+
|
2620
|
+
/**
|
2621
|
+
* @brief Write an Excel 365 dynamic array formula to a worksheet cell.
|
2622
|
+
*
|
2623
|
+
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
2624
|
+
* @param row The zero indexed row number.
|
2625
|
+
* @param col The zero indexed column number.
|
2626
|
+
* @param formula Formula string to write to cell.
|
2627
|
+
* @param format A pointer to a Format instance or NULL.
|
2628
|
+
*
|
2629
|
+
* @return A #lxw_error code.
|
2630
|
+
*
|
2631
|
+
* The `%worksheet_write_dynamic_formula()` function is similar to the
|
2632
|
+
* `worksheet_write_dynamic_array_formula()` function, shown above, except
|
2633
|
+
* that it writes a dynamic array formula to a single cell, rather than a
|
2634
|
+
* range. This is a syntactic shortcut since the array range isn't generally
|
2635
|
+
* known for a dynamic range and specifying the initial cell is sufficient for
|
2636
|
+
* Excel, as shown in the example below:
|
2637
|
+
*
|
2638
|
+
* @code
|
2639
|
+
* worksheet_write_dynamic_formula(worksheet, 7, 1,
|
2640
|
+
* "=_xlfn._xlws.SORT(_xlfn.UNIQUE(B2:B17))",
|
2641
|
+
* NULL);
|
1044
2642
|
* @endcode
|
1045
2643
|
*
|
2644
|
+
* This formula gives the following result:
|
2645
|
+
*
|
2646
|
+
* @image html dynamic_arrays01.png
|
2647
|
+
*
|
2648
|
+
* The need for the `_xlfn.` and `_xlfn._xlws.` prefixes in the formula is
|
2649
|
+
* explained in @ref ww_formulas_future.
|
1046
2650
|
*/
|
1047
|
-
lxw_error
|
1048
|
-
|
1049
|
-
|
1050
|
-
|
1051
|
-
|
1052
|
-
const char *formula,
|
1053
|
-
lxw_format *format);
|
2651
|
+
lxw_error worksheet_write_dynamic_formula(lxw_worksheet *worksheet,
|
2652
|
+
lxw_row_t row,
|
2653
|
+
lxw_col_t col,
|
2654
|
+
const char *formula,
|
2655
|
+
lxw_format *format);
|
1054
2656
|
|
1055
2657
|
lxw_error worksheet_write_array_formula_num(lxw_worksheet *worksheet,
|
1056
2658
|
lxw_row_t first_row,
|
@@ -1061,10 +2663,26 @@ lxw_error worksheet_write_array_formula_num(lxw_worksheet *worksheet,
|
|
1061
2663
|
lxw_format *format,
|
1062
2664
|
double result);
|
1063
2665
|
|
2666
|
+
lxw_error worksheet_write_dynamic_array_formula_num(lxw_worksheet *worksheet,
|
2667
|
+
lxw_row_t first_row,
|
2668
|
+
lxw_col_t first_col,
|
2669
|
+
lxw_row_t last_row,
|
2670
|
+
lxw_col_t last_col,
|
2671
|
+
const char *formula,
|
2672
|
+
lxw_format *format,
|
2673
|
+
double result);
|
2674
|
+
|
2675
|
+
lxw_error worksheet_write_dynamic_formula_num(lxw_worksheet *worksheet,
|
2676
|
+
lxw_row_t row,
|
2677
|
+
lxw_col_t col,
|
2678
|
+
const char *formula,
|
2679
|
+
lxw_format *format,
|
2680
|
+
double result);
|
2681
|
+
|
1064
2682
|
/**
|
1065
2683
|
* @brief Write a date or time to a worksheet cell.
|
1066
2684
|
*
|
1067
|
-
* @param worksheet
|
2685
|
+
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
1068
2686
|
* @param row The zero indexed row number.
|
1069
2687
|
* @param col The zero indexed column number.
|
1070
2688
|
* @param datetime The datetime to write to the cell.
|
@@ -1072,7 +2690,7 @@ lxw_error worksheet_write_array_formula_num(lxw_worksheet *worksheet,
|
|
1072
2690
|
*
|
1073
2691
|
* @return A #lxw_error code.
|
1074
2692
|
*
|
1075
|
-
* The
|
2693
|
+
* The `%worksheet_write_datetime()` function can be used to write a date or
|
1076
2694
|
* time to the cell specified by `row` and `column`:
|
1077
2695
|
*
|
1078
2696
|
* @dontinclude dates_and_times02.c
|
@@ -1093,14 +2711,52 @@ lxw_error worksheet_write_datetime(lxw_worksheet *worksheet,
|
|
1093
2711
|
lxw_col_t col, lxw_datetime *datetime,
|
1094
2712
|
lxw_format *format);
|
1095
2713
|
|
1096
|
-
|
1097
|
-
|
1098
|
-
|
1099
|
-
|
1100
|
-
|
2714
|
+
/**
|
2715
|
+
* @brief Write a Unix datetime to a worksheet cell.
|
2716
|
+
*
|
2717
|
+
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
2718
|
+
* @param row The zero indexed row number.
|
2719
|
+
* @param col The zero indexed column number.
|
2720
|
+
* @param unixtime The Unix datetime to write to the cell.
|
2721
|
+
* @param format A pointer to a Format instance or NULL.
|
2722
|
+
*
|
2723
|
+
* @return A #lxw_error code.
|
2724
|
+
*
|
2725
|
+
* The `%worksheet_write_unixtime()` function can be used to write dates and
|
2726
|
+
* times in Unix date format to the cell specified by `row` and
|
2727
|
+
* `column`. [Unix Time](https://en.wikipedia.org/wiki/Unix_time) which is a
|
2728
|
+
* common integer time format. It is defined as the number of seconds since
|
2729
|
+
* the Unix epoch (1970-01-01 00:00 UTC). Negative values can also be used for
|
2730
|
+
* dates prior to 1970:
|
2731
|
+
*
|
2732
|
+
* @dontinclude dates_and_times03.c
|
2733
|
+
* @skip 1970
|
2734
|
+
* @until 2208988800
|
2735
|
+
*
|
2736
|
+
* The `format` parameter should be used to apply formatting to the cell using
|
2737
|
+
* a @ref format.h "Format" object as shown above. Without a date format the
|
2738
|
+
* datetime will appear as a number only.
|
2739
|
+
*
|
2740
|
+
* The output from this code sample is:
|
2741
|
+
*
|
2742
|
+
* @image html date_example03.png
|
2743
|
+
*
|
2744
|
+
* Unixtime is generally represented with a 32 bit `time_t` type which has a
|
2745
|
+
* range of approximately 1900-12-14 to 2038-01-19. To access the full Excel
|
2746
|
+
* date range of 1900-01-01 to 9999-12-31 this function uses a 64 bit
|
2747
|
+
* parameter.
|
2748
|
+
*
|
2749
|
+
* See @ref working_with_dates for more information about handling dates and
|
2750
|
+
* times in libxlsxwriter.
|
2751
|
+
*/
|
2752
|
+
lxw_error worksheet_write_unixtime(lxw_worksheet *worksheet,
|
2753
|
+
lxw_row_t row,
|
2754
|
+
lxw_col_t col, int64_t unixtime,
|
2755
|
+
lxw_format *format);
|
2756
|
+
|
1101
2757
|
/**
|
1102
2758
|
*
|
1103
|
-
* @param worksheet
|
2759
|
+
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
1104
2760
|
* @param row The zero indexed row number.
|
1105
2761
|
* @param col The zero indexed column number.
|
1106
2762
|
* @param url The url to write to the cell.
|
@@ -1113,21 +2769,22 @@ lxw_error worksheet_write_url_opt(lxw_worksheet *worksheet,
|
|
1113
2769
|
* worksheet cell specified by `row` and `column`.
|
1114
2770
|
*
|
1115
2771
|
* @code
|
1116
|
-
* worksheet_write_url(worksheet, 0, 0, "http://libxlsxwriter.github.io",
|
2772
|
+
* worksheet_write_url(worksheet, 0, 0, "http://libxlsxwriter.github.io", NULL);
|
1117
2773
|
* @endcode
|
1118
2774
|
*
|
1119
2775
|
* @image html hyperlinks_short.png
|
1120
2776
|
*
|
1121
2777
|
* The `format` parameter is used to apply formatting to the cell. This
|
1122
|
-
* parameter can be `NULL
|
1123
|
-
*
|
1124
|
-
*
|
2778
|
+
* parameter can be `NULL`, in which case the default Excel blue underlined
|
2779
|
+
* hyperlink style will be used. If required a user defined @ref format.h
|
2780
|
+
* "Format" object can be used:
|
2781
|
+
* underline:
|
1125
2782
|
*
|
1126
2783
|
* @code
|
1127
2784
|
* lxw_format *url_format = workbook_add_format(workbook);
|
1128
2785
|
*
|
1129
2786
|
* format_set_underline (url_format, LXW_UNDERLINE_SINGLE);
|
1130
|
-
* format_set_font_color(url_format,
|
2787
|
+
* format_set_font_color(url_format, LXW_COLOR_RED);
|
1131
2788
|
*
|
1132
2789
|
* @endcode
|
1133
2790
|
*
|
@@ -1135,10 +2792,10 @@ lxw_error worksheet_write_url_opt(lxw_worksheet *worksheet,
|
|
1135
2792
|
* and `mailto:` :
|
1136
2793
|
*
|
1137
2794
|
* @code
|
1138
|
-
* worksheet_write_url(worksheet, 0, 0, "ftp://www.python.org/",
|
1139
|
-
* worksheet_write_url(worksheet, 1, 0, "http://www.python.org/",
|
1140
|
-
* worksheet_write_url(worksheet, 2, 0, "https://www.python.org/",
|
1141
|
-
* worksheet_write_url(worksheet, 3, 0, "mailto:jmcnamara@cpan.org",
|
2795
|
+
* worksheet_write_url(worksheet, 0, 0, "ftp://www.python.org/", NULL);
|
2796
|
+
* worksheet_write_url(worksheet, 1, 0, "http://www.python.org/", NULL);
|
2797
|
+
* worksheet_write_url(worksheet, 2, 0, "https://www.python.org/", NULL);
|
2798
|
+
* worksheet_write_url(worksheet, 3, 0, "mailto:jmcnamara@cpan.org", NULL);
|
1142
2799
|
*
|
1143
2800
|
* @endcode
|
1144
2801
|
*
|
@@ -1147,13 +2804,18 @@ lxw_error worksheet_write_url_opt(lxw_worksheet *worksheet,
|
|
1147
2804
|
* link. However, it is possible to overwrite it with any other
|
1148
2805
|
* `libxlsxwriter` type using the appropriate `worksheet_write_*()`
|
1149
2806
|
* function. The most common case is to overwrite the displayed link text with
|
1150
|
-
* another string
|
2807
|
+
* another string. To do this we must also match the default URL format using
|
2808
|
+
* `workbook_get_default_url_format()`:
|
1151
2809
|
*
|
1152
2810
|
* @code
|
1153
|
-
*
|
1154
|
-
*
|
1155
|
-
*
|
2811
|
+
* // Write a hyperlink with the default blue underline format.
|
2812
|
+
* worksheet_write_url(worksheet, 2, 0, "http://libxlsxwriter.github.io", NULL);
|
2813
|
+
*
|
2814
|
+
* // Get the default url format.
|
2815
|
+
* lxw_format *url_format = workbook_get_default_url_format(workbook);
|
1156
2816
|
*
|
2817
|
+
* // Overwrite the hyperlink with a user defined string and default format.
|
2818
|
+
* worksheet_write_string(worksheet, 2, 0, "Read the documentation.", url_format);
|
1157
2819
|
* @endcode
|
1158
2820
|
*
|
1159
2821
|
* @image html hyperlinks_short2.png
|
@@ -1163,15 +2825,15 @@ lxw_error worksheet_write_url_opt(lxw_worksheet *worksheet,
|
|
1163
2825
|
* worksheet references:
|
1164
2826
|
*
|
1165
2827
|
* @code
|
1166
|
-
* worksheet_write_url(worksheet, 0, 0, "internal:Sheet2!A1",
|
1167
|
-
* worksheet_write_url(worksheet, 1, 0, "internal:Sheet2!B2",
|
1168
|
-
* worksheet_write_url(worksheet, 2, 0, "internal:Sheet2!A1:B2",
|
1169
|
-
* worksheet_write_url(worksheet, 3, 0, "internal:'Sales Data'!A1",
|
1170
|
-
* worksheet_write_url(worksheet, 4, 0, "external:c:\\temp\\foo.xlsx",
|
1171
|
-
* worksheet_write_url(worksheet, 5, 0, "external:c:\\foo.xlsx#Sheet2!A1",
|
1172
|
-
* worksheet_write_url(worksheet, 6, 0, "external:..\\foo.xlsx",
|
1173
|
-
* worksheet_write_url(worksheet, 7, 0, "external:..\\foo.xlsx#Sheet2!A1",
|
1174
|
-
* worksheet_write_url(worksheet, 8, 0, "external:\\\\NET\\share\\foo.xlsx",
|
2828
|
+
* worksheet_write_url(worksheet, 0, 0, "internal:Sheet2!A1", NULL);
|
2829
|
+
* worksheet_write_url(worksheet, 1, 0, "internal:Sheet2!B2", NULL);
|
2830
|
+
* worksheet_write_url(worksheet, 2, 0, "internal:Sheet2!A1:B2", NULL);
|
2831
|
+
* worksheet_write_url(worksheet, 3, 0, "internal:'Sales Data'!A1", NULL);
|
2832
|
+
* worksheet_write_url(worksheet, 4, 0, "external:c:\\temp\\foo.xlsx", NULL);
|
2833
|
+
* worksheet_write_url(worksheet, 5, 0, "external:c:\\foo.xlsx#Sheet2!A1", NULL);
|
2834
|
+
* worksheet_write_url(worksheet, 6, 0, "external:..\\foo.xlsx", NULL);
|
2835
|
+
* worksheet_write_url(worksheet, 7, 0, "external:..\\foo.xlsx#Sheet2!A1", NULL);
|
2836
|
+
* worksheet_write_url(worksheet, 8, 0, "external:\\\\NET\\share\\foo.xlsx", NULL);
|
1175
2837
|
*
|
1176
2838
|
* @endcode
|
1177
2839
|
*
|
@@ -1183,7 +2845,7 @@ lxw_error worksheet_write_url_opt(lxw_worksheet *worksheet,
|
|
1183
2845
|
* `#` character:
|
1184
2846
|
*
|
1185
2847
|
* @code
|
1186
|
-
* worksheet_write_url(worksheet, 0, 0, "external:c:\\foo.xlsx#Sheet2!A1",
|
2848
|
+
* worksheet_write_url(worksheet, 0, 0, "external:c:\\foo.xlsx#Sheet2!A1", NULL);
|
1187
2849
|
* @endcode
|
1188
2850
|
*
|
1189
2851
|
* You can also link to a named range in the target worksheet: For example say
|
@@ -1191,7 +2853,7 @@ lxw_error worksheet_write_url_opt(lxw_worksheet *worksheet,
|
|
1191
2853
|
* you could link to it as follows:
|
1192
2854
|
*
|
1193
2855
|
* @code
|
1194
|
-
* worksheet_write_url(worksheet, 0, 0, "external:c:\\temp\\foo.xlsx#my_name",
|
2856
|
+
* worksheet_write_url(worksheet, 0, 0, "external:c:\\temp\\foo.xlsx#my_name", NULL);
|
1195
2857
|
*
|
1196
2858
|
* @endcode
|
1197
2859
|
*
|
@@ -1199,14 +2861,14 @@ lxw_error worksheet_write_url_opt(lxw_worksheet *worksheet,
|
|
1199
2861
|
* characters are single quoted as follows:
|
1200
2862
|
*
|
1201
2863
|
* @code
|
1202
|
-
* worksheet_write_url(worksheet, 0, 0, "internal:'Sales Data'!A1",
|
2864
|
+
* worksheet_write_url(worksheet, 0, 0, "internal:'Sales Data'!A1", NULL);
|
1203
2865
|
* @endcode
|
1204
2866
|
*
|
1205
2867
|
* Links to network files are also supported. Network files normally begin
|
1206
2868
|
* with two back slashes as follows `\\NETWORK\etc`. In order to represent
|
1207
2869
|
* this in a C string literal the backslashes should be escaped:
|
1208
2870
|
* @code
|
1209
|
-
* worksheet_write_url(worksheet, 0, 0, "external:\\\\NET\\share\\foo.xlsx",
|
2871
|
+
* worksheet_write_url(worksheet, 0, 0, "external:\\\\NET\\share\\foo.xlsx", NULL);
|
1210
2872
|
* @endcode
|
1211
2873
|
*
|
1212
2874
|
*
|
@@ -1214,8 +2876,8 @@ lxw_error worksheet_write_url_opt(lxw_worksheet *worksheet,
|
|
1214
2876
|
* translated internally to backslashes:
|
1215
2877
|
*
|
1216
2878
|
* @code
|
1217
|
-
* worksheet_write_url(worksheet, 0, 0, "external:c:/temp/foo.xlsx",
|
1218
|
-
* worksheet_write_url(worksheet, 1, 0, "external://NET/share/foo.xlsx",
|
2879
|
+
* worksheet_write_url(worksheet, 0, 0, "external:c:/temp/foo.xlsx", NULL);
|
2880
|
+
* worksheet_write_url(worksheet, 1, 0, "external://NET/share/foo.xlsx", NULL);
|
1219
2881
|
*
|
1220
2882
|
* @endcode
|
1221
2883
|
*
|
@@ -1223,20 +2885,33 @@ lxw_error worksheet_write_url_opt(lxw_worksheet *worksheet,
|
|
1223
2885
|
* **Note:**
|
1224
2886
|
*
|
1225
2887
|
* libxlsxwriter will escape the following characters in URLs as required
|
1226
|
-
* by Excel: `\s " < > \ [ ] ^ { }
|
1227
|
-
*
|
1228
|
-
* correctly by the user and will by passed directly to Excel.
|
2888
|
+
* by Excel: `\s " < > \ [ ] ^ { }`. Existing URL `%%xx` style escapes in
|
2889
|
+
* the string are ignored to allow for user-escaped strings.
|
1229
2890
|
*
|
2891
|
+
* **Note:**
|
2892
|
+
*
|
2893
|
+
* The maximum allowable URL length in recent versions of Excel is 2079
|
2894
|
+
* characters. In older versions of Excel (and libxlsxwriter <= 0.8.8) the
|
2895
|
+
* limit was 255 characters.
|
1230
2896
|
*/
|
1231
2897
|
lxw_error worksheet_write_url(lxw_worksheet *worksheet,
|
1232
2898
|
lxw_row_t row,
|
1233
2899
|
lxw_col_t col, const char *url,
|
1234
2900
|
lxw_format *format);
|
1235
2901
|
|
2902
|
+
/* Don't document for now since the string option can be achieved by a
|
2903
|
+
* subsequent cell worksheet_write() as shown in the docs, and the
|
2904
|
+
* tooltip option isn't very useful. */
|
2905
|
+
lxw_error worksheet_write_url_opt(lxw_worksheet *worksheet,
|
2906
|
+
lxw_row_t row_num,
|
2907
|
+
lxw_col_t col_num, const char *url,
|
2908
|
+
lxw_format *format, const char *string,
|
2909
|
+
const char *tooltip);
|
2910
|
+
|
1236
2911
|
/**
|
1237
2912
|
* @brief Write a formatted boolean worksheet cell.
|
1238
2913
|
*
|
1239
|
-
* @param worksheet
|
2914
|
+
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
1240
2915
|
* @param row The zero indexed row number.
|
1241
2916
|
* @param col The zero indexed column number.
|
1242
2917
|
* @param value The boolean value to write to the cell.
|
@@ -1258,7 +2933,7 @@ lxw_error worksheet_write_boolean(lxw_worksheet *worksheet,
|
|
1258
2933
|
/**
|
1259
2934
|
* @brief Write a formatted blank worksheet cell.
|
1260
2935
|
*
|
1261
|
-
* @param worksheet
|
2936
|
+
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
1262
2937
|
* @param row The zero indexed row number.
|
1263
2938
|
* @param col The zero indexed column number.
|
1264
2939
|
* @param format A pointer to a Format instance or NULL.
|
@@ -1287,20 +2962,21 @@ lxw_error worksheet_write_blank(lxw_worksheet *worksheet,
|
|
1287
2962
|
lxw_format *format);
|
1288
2963
|
|
1289
2964
|
/**
|
1290
|
-
* @brief Write a formula to a worksheet cell with a user defined
|
2965
|
+
* @brief Write a formula to a worksheet cell with a user defined numeric
|
2966
|
+
* result.
|
1291
2967
|
*
|
1292
|
-
* @param worksheet
|
2968
|
+
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
1293
2969
|
* @param row The zero indexed row number.
|
1294
2970
|
* @param col The zero indexed column number.
|
1295
2971
|
* @param formula Formula string to write to cell.
|
1296
2972
|
* @param format A pointer to a Format instance or NULL.
|
1297
|
-
* @param result A user defined result for
|
2973
|
+
* @param result A user defined numeric result for the formula.
|
1298
2974
|
*
|
1299
2975
|
* @return A #lxw_error code.
|
1300
2976
|
*
|
1301
2977
|
* The `%worksheet_write_formula_num()` function writes a formula or Excel
|
1302
2978
|
* function to the cell specified by `row` and `column` with a user defined
|
1303
|
-
* result:
|
2979
|
+
* numeric result:
|
1304
2980
|
*
|
1305
2981
|
* @code
|
1306
2982
|
* // Required as a workaround only.
|
@@ -1335,10 +3011,55 @@ lxw_error worksheet_write_formula_num(lxw_worksheet *worksheet,
|
|
1335
3011
|
const char *formula,
|
1336
3012
|
lxw_format *format, double result);
|
1337
3013
|
|
3014
|
+
/**
|
3015
|
+
* @brief Write a formula to a worksheet cell with a user defined string
|
3016
|
+
* result.
|
3017
|
+
*
|
3018
|
+
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
3019
|
+
* @param row The zero indexed row number.
|
3020
|
+
* @param col The zero indexed column number.
|
3021
|
+
* @param formula Formula string to write to cell.
|
3022
|
+
* @param format A pointer to a Format instance or NULL.
|
3023
|
+
* @param result A user defined string result for the formula.
|
3024
|
+
*
|
3025
|
+
* @return A #lxw_error code.
|
3026
|
+
*
|
3027
|
+
* The `%worksheet_write_formula_str()` function writes a formula or Excel
|
3028
|
+
* function to the cell specified by `row` and `column` with a user defined
|
3029
|
+
* string result:
|
3030
|
+
*
|
3031
|
+
* @code
|
3032
|
+
* // The example formula is A & B -> AB.
|
3033
|
+
* worksheet_write_formula_str(worksheet, 0, 0, "=\"A\" & \"B\"", NULL, "AB");
|
3034
|
+
* @endcode
|
3035
|
+
*
|
3036
|
+
* The `%worksheet_write_formula_str()` function is similar to the
|
3037
|
+
* `%worksheet_write_formula_num()` function except it writes a string result
|
3038
|
+
* instead or a numeric result. See `worksheet_write_formula_num()` for more
|
3039
|
+
* details on why/when these functions are required.
|
3040
|
+
*
|
3041
|
+
* One place where the `%worksheet_write_formula_str()` function may be required
|
3042
|
+
* is to specify an empty result which will force a recalculation of the formula
|
3043
|
+
* when loaded in LibreOffice.
|
3044
|
+
*
|
3045
|
+
* @code
|
3046
|
+
* worksheet_write_formula_str(worksheet, 0, 0, "=Sheet1!$A$1", NULL, "");
|
3047
|
+
* @endcode
|
3048
|
+
*
|
3049
|
+
* See the FAQ @ref faq_formula_zero.
|
3050
|
+
*
|
3051
|
+
* See also @ref working_with_formulas.
|
3052
|
+
*/
|
3053
|
+
lxw_error worksheet_write_formula_str(lxw_worksheet *worksheet,
|
3054
|
+
lxw_row_t row,
|
3055
|
+
lxw_col_t col,
|
3056
|
+
const char *formula,
|
3057
|
+
lxw_format *format, const char *result);
|
3058
|
+
|
1338
3059
|
/**
|
1339
3060
|
* @brief Write a "Rich" multi-format string to a worksheet cell.
|
1340
3061
|
*
|
1341
|
-
* @param worksheet
|
3062
|
+
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
1342
3063
|
* @param row The zero indexed row number.
|
1343
3064
|
* @param col The zero indexed column number.
|
1344
3065
|
* @param rich_string An array of format/string lxw_rich_string_tuple fragments.
|
@@ -1410,14 +3131,98 @@ lxw_error worksheet_write_rich_string(lxw_worksheet *worksheet,
|
|
1410
3131
|
lxw_rich_string_tuple *rich_string[],
|
1411
3132
|
lxw_format *format);
|
1412
3133
|
|
3134
|
+
/**
|
3135
|
+
* @brief Write a comment to a worksheet cell.
|
3136
|
+
*
|
3137
|
+
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
3138
|
+
* @param row The zero indexed row number.
|
3139
|
+
* @param col The zero indexed column number.
|
3140
|
+
* @param string The comment string to be written.
|
3141
|
+
*
|
3142
|
+
* @return A #lxw_error code.
|
3143
|
+
*
|
3144
|
+
* The `%worksheet_write_comment()` function is used to add a comment to a
|
3145
|
+
* cell. A comment is indicated in Excel by a small red triangle in the upper
|
3146
|
+
* right-hand corner of the cell. Moving the cursor over the red triangle will
|
3147
|
+
* reveal the comment.
|
3148
|
+
*
|
3149
|
+
* The following example shows how to add a comment to a cell:
|
3150
|
+
*
|
3151
|
+
* @code
|
3152
|
+
* worksheet_write_comment(worksheet, 0, 0, "This is a comment");
|
3153
|
+
* @endcode
|
3154
|
+
*
|
3155
|
+
* @image html comments1.png
|
3156
|
+
*
|
3157
|
+
* See also @ref working_with_comments
|
3158
|
+
*
|
3159
|
+
*/
|
3160
|
+
lxw_error worksheet_write_comment(lxw_worksheet *worksheet,
|
3161
|
+
lxw_row_t row, lxw_col_t col,
|
3162
|
+
const char *string);
|
3163
|
+
|
3164
|
+
/**
|
3165
|
+
* @brief Write a comment to a worksheet cell with options.
|
3166
|
+
*
|
3167
|
+
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
3168
|
+
* @param row The zero indexed row number.
|
3169
|
+
* @param col The zero indexed column number.
|
3170
|
+
* @param string The comment string to be written.
|
3171
|
+
* @param options #lxw_comment_options to control position and format
|
3172
|
+
* of the comment.
|
3173
|
+
*
|
3174
|
+
* @return A #lxw_error code.
|
3175
|
+
*
|
3176
|
+
* The `%worksheet_write_comment_opt()` function is used to add a comment to a
|
3177
|
+
* cell with option that control the position, format and metadata of the
|
3178
|
+
* comment. A comment is indicated in Excel by a small red triangle in the
|
3179
|
+
* upper right-hand corner of the cell. Moving the cursor over the red
|
3180
|
+
* triangle will reveal the comment.
|
3181
|
+
*
|
3182
|
+
* The following example shows how to add a comment to a cell with options:
|
3183
|
+
*
|
3184
|
+
* @code
|
3185
|
+
* lxw_comment_options options = {.visible = LXW_COMMENT_DISPLAY_VISIBLE};
|
3186
|
+
*
|
3187
|
+
* worksheet_write_comment_opt(worksheet, CELL("C6"), "Hello.", &options);
|
3188
|
+
* @endcode
|
3189
|
+
*
|
3190
|
+
* The following options are available in #lxw_comment_options:
|
3191
|
+
*
|
3192
|
+
* - `author`
|
3193
|
+
* - `visible`
|
3194
|
+
* - `width`
|
3195
|
+
* - `height`
|
3196
|
+
* - `x_scale`
|
3197
|
+
* - `y_scale`
|
3198
|
+
* - `color`
|
3199
|
+
* - `font_name`
|
3200
|
+
* - `font_size`
|
3201
|
+
* - `start_row`
|
3202
|
+
* - `start_col`
|
3203
|
+
* - `x_offset`
|
3204
|
+
* - `y_offset`
|
3205
|
+
*
|
3206
|
+
* @image html comments2.png
|
3207
|
+
*
|
3208
|
+
* Comment options are explained in detail in the @ref ww_comments_properties
|
3209
|
+
* section of the docs.
|
3210
|
+
*/
|
3211
|
+
lxw_error worksheet_write_comment_opt(lxw_worksheet *worksheet,
|
3212
|
+
lxw_row_t row, lxw_col_t col,
|
3213
|
+
const char *string,
|
3214
|
+
lxw_comment_options *options);
|
3215
|
+
|
1413
3216
|
/**
|
1414
3217
|
* @brief Set the properties for a row of cells.
|
1415
3218
|
*
|
1416
3219
|
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
1417
3220
|
* @param row The zero indexed row number.
|
1418
|
-
* @param height The row height.
|
3221
|
+
* @param height The row height, in character units.
|
1419
3222
|
* @param format A pointer to a Format instance or NULL.
|
1420
3223
|
*
|
3224
|
+
* @return A #lxw_error code.
|
3225
|
+
*
|
1421
3226
|
* The `%worksheet_set_row()` function is used to change the default
|
1422
3227
|
* properties of a row. The most common use for this function is to change the
|
1423
3228
|
* height of a row:
|
@@ -1427,6 +3232,9 @@ lxw_error worksheet_write_rich_string(lxw_worksheet *worksheet,
|
|
1427
3232
|
* worksheet_set_row(worksheet, 0, 20, NULL);
|
1428
3233
|
* @endcode
|
1429
3234
|
*
|
3235
|
+
* The height is specified in character units. To specify the height in pixels
|
3236
|
+
* use the `worksheet_set_row_pixels()` function.
|
3237
|
+
*
|
1430
3238
|
* The other common use for `%worksheet_set_row()` is to set the a @ref
|
1431
3239
|
* format.h "Format" for all cells in the row:
|
1432
3240
|
*
|
@@ -1474,6 +3282,8 @@ lxw_error worksheet_set_row(lxw_worksheet *worksheet,
|
|
1474
3282
|
* @param format A pointer to a Format instance or NULL.
|
1475
3283
|
* @param options Optional row parameters: hidden, level, collapsed.
|
1476
3284
|
*
|
3285
|
+
* @return A #lxw_error code.
|
3286
|
+
*
|
1477
3287
|
* The `%worksheet_set_row_opt()` function is the same as
|
1478
3288
|
* `worksheet_set_row()` with an additional `options` parameter.
|
1479
3289
|
*
|
@@ -1530,6 +3340,52 @@ lxw_error worksheet_set_row_opt(lxw_worksheet *worksheet,
|
|
1530
3340
|
lxw_format *format,
|
1531
3341
|
lxw_row_col_options *options);
|
1532
3342
|
|
3343
|
+
/**
|
3344
|
+
* @brief Set the properties for a row of cells, with the height in pixels.
|
3345
|
+
*
|
3346
|
+
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
3347
|
+
* @param row The zero indexed row number.
|
3348
|
+
* @param pixels The row height in pixels.
|
3349
|
+
* @param format A pointer to a Format instance or NULL.
|
3350
|
+
*
|
3351
|
+
* @return A #lxw_error code.
|
3352
|
+
*
|
3353
|
+
* The `%worksheet_set_row_pixels()` function is the same as the
|
3354
|
+
* `worksheet_set_row()` function except that the height can be set in pixels
|
3355
|
+
*
|
3356
|
+
* @code
|
3357
|
+
* // Set the height of Row 1 to 20 pixels.
|
3358
|
+
* worksheet_set_row_pixels(worksheet, 0, 20, NULL);
|
3359
|
+
* @endcode
|
3360
|
+
*
|
3361
|
+
* If you wish to set the format of a row without changing the height you can
|
3362
|
+
* pass the default row height in pixels: #LXW_DEF_ROW_HEIGHT_PIXELS.
|
3363
|
+
*/
|
3364
|
+
lxw_error worksheet_set_row_pixels(lxw_worksheet *worksheet,
|
3365
|
+
lxw_row_t row, uint32_t pixels,
|
3366
|
+
lxw_format *format);
|
3367
|
+
/**
|
3368
|
+
* @brief Set the properties for a row of cells, with the height in pixels.
|
3369
|
+
*
|
3370
|
+
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
3371
|
+
* @param row The zero indexed row number.
|
3372
|
+
* @param pixels The row height in pixels.
|
3373
|
+
* @param format A pointer to a Format instance or NULL.
|
3374
|
+
* @param options Optional row parameters: hidden, level, collapsed.
|
3375
|
+
*
|
3376
|
+
* @return A #lxw_error code.
|
3377
|
+
*
|
3378
|
+
* The `%worksheet_set_row_pixels_opt()` function is the same as the
|
3379
|
+
* `worksheet_set_row_opt()` function except that the height can be set in
|
3380
|
+
* pixels.
|
3381
|
+
*
|
3382
|
+
*/
|
3383
|
+
lxw_error worksheet_set_row_pixels_opt(lxw_worksheet *worksheet,
|
3384
|
+
lxw_row_t row,
|
3385
|
+
uint32_t pixels,
|
3386
|
+
lxw_format *format,
|
3387
|
+
lxw_row_col_options *options);
|
3388
|
+
|
1533
3389
|
/**
|
1534
3390
|
* @brief Set the properties for one or more columns of cells.
|
1535
3391
|
*
|
@@ -1539,6 +3395,8 @@ lxw_error worksheet_set_row_opt(lxw_worksheet *worksheet,
|
|
1539
3395
|
* @param width The width of the column(s).
|
1540
3396
|
* @param format A pointer to a Format instance or NULL.
|
1541
3397
|
*
|
3398
|
+
* @return A #lxw_error code.
|
3399
|
+
*
|
1542
3400
|
* The `%worksheet_set_column()` function can be used to change the default
|
1543
3401
|
* properties of a single column or a range of columns:
|
1544
3402
|
*
|
@@ -1575,7 +3433,8 @@ lxw_error worksheet_set_row_opt(lxw_worksheet *worksheet,
|
|
1575
3433
|
* is 8.43 in the default font of Calibri 11. The actual relationship between
|
1576
3434
|
* a string width and a column width in Excel is complex. See the
|
1577
3435
|
* [following explanation of column widths](https://support.microsoft.com/en-us/kb/214123)
|
1578
|
-
* from the Microsoft support documentation for more details.
|
3436
|
+
* from the Microsoft support documentation for more details. To set the width
|
3437
|
+
* in pixels use the `worksheet_set_column_pixels()` function.
|
1579
3438
|
*
|
1580
3439
|
* There is no way to specify "AutoFit" for a column in the Excel file
|
1581
3440
|
* format. This feature is only available at runtime from within Excel. It is
|
@@ -1640,6 +3499,8 @@ lxw_error worksheet_set_column(lxw_worksheet *worksheet,
|
|
1640
3499
|
* @param format A pointer to a Format instance or NULL.
|
1641
3500
|
* @param options Optional row parameters: hidden, level, collapsed.
|
1642
3501
|
*
|
3502
|
+
* @return A #lxw_error code.
|
3503
|
+
*
|
1643
3504
|
* The `%worksheet_set_column_opt()` function is the same as
|
1644
3505
|
* `worksheet_set_column()` with an additional `options` parameter.
|
1645
3506
|
*
|
@@ -1679,6 +3540,62 @@ lxw_error worksheet_set_column_opt(lxw_worksheet *worksheet,
|
|
1679
3540
|
lxw_format *format,
|
1680
3541
|
lxw_row_col_options *options);
|
1681
3542
|
|
3543
|
+
/**
|
3544
|
+
* @brief Set the properties for one or more columns of cells, with the width
|
3545
|
+
* in pixels.
|
3546
|
+
*
|
3547
|
+
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
3548
|
+
* @param first_col The zero indexed first column.
|
3549
|
+
* @param last_col The zero indexed last column.
|
3550
|
+
* @param pixels The width of the column(s) in pixels.
|
3551
|
+
* @param format A pointer to a Format instance or NULL.
|
3552
|
+
*
|
3553
|
+
* @return A #lxw_error code.
|
3554
|
+
*
|
3555
|
+
* The `%worksheet_set_column_pixels()` function is the same as
|
3556
|
+
* `worksheet_set_column()` function except that the width can be set in
|
3557
|
+
* pixels:
|
3558
|
+
*
|
3559
|
+
* @code
|
3560
|
+
* // Column width set to 75 pixels, the same as 10 character units.
|
3561
|
+
* worksheet_set_column(worksheet, 5, 5, 75, NULL);
|
3562
|
+
* @endcode
|
3563
|
+
*
|
3564
|
+
* @image html set_column_pixels.png
|
3565
|
+
*
|
3566
|
+
* If you wish to set the format of a column without changing the width you can
|
3567
|
+
* pass the default column width in pixels: #LXW_DEF_COL_WIDTH_PIXELS.
|
3568
|
+
*/
|
3569
|
+
lxw_error worksheet_set_column_pixels(lxw_worksheet *worksheet,
|
3570
|
+
lxw_col_t first_col,
|
3571
|
+
lxw_col_t last_col,
|
3572
|
+
uint32_t pixels, lxw_format *format);
|
3573
|
+
|
3574
|
+
/**
|
3575
|
+
* @brief Set the properties for one or more columns of cells with options,
|
3576
|
+
* with the width in pixels.
|
3577
|
+
*
|
3578
|
+
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
3579
|
+
* @param first_col The zero indexed first column.
|
3580
|
+
* @param last_col The zero indexed last column.
|
3581
|
+
* @param pixels The width of the column(s) in pixels.
|
3582
|
+
* @param format A pointer to a Format instance or NULL.
|
3583
|
+
* @param options Optional row parameters: hidden, level, collapsed.
|
3584
|
+
*
|
3585
|
+
* @return A #lxw_error code.
|
3586
|
+
*
|
3587
|
+
* The `%worksheet_set_column_pixels_opt()` function is the same as the
|
3588
|
+
* `worksheet_set_column_opt()` function except that the width can be set in
|
3589
|
+
* pixels.
|
3590
|
+
*
|
3591
|
+
*/
|
3592
|
+
lxw_error worksheet_set_column_pixels_opt(lxw_worksheet *worksheet,
|
3593
|
+
lxw_col_t first_col,
|
3594
|
+
lxw_col_t last_col,
|
3595
|
+
uint32_t pixels,
|
3596
|
+
lxw_format *format,
|
3597
|
+
lxw_row_col_options *options);
|
3598
|
+
|
1682
3599
|
/**
|
1683
3600
|
* @brief Insert an image in a worksheet cell.
|
1684
3601
|
*
|
@@ -1690,7 +3607,7 @@ lxw_error worksheet_set_column_opt(lxw_worksheet *worksheet,
|
|
1690
3607
|
* @return A #lxw_error code.
|
1691
3608
|
*
|
1692
3609
|
* This function can be used to insert a image into a worksheet. The image can
|
1693
|
-
* be in PNG, JPEG or BMP format:
|
3610
|
+
* be in PNG, JPEG, GIF or BMP format:
|
1694
3611
|
*
|
1695
3612
|
* @code
|
1696
3613
|
* worksheet_insert_image(worksheet, 2, 1, "logo.png");
|
@@ -1706,7 +3623,7 @@ lxw_error worksheet_set_column_opt(lxw_worksheet *worksheet,
|
|
1706
3623
|
* default height changed due to a font that is larger than the default font
|
1707
3624
|
* size or that has text wrapping turned on. To avoid this you should
|
1708
3625
|
* explicitly set the height of the row using `worksheet_set_row()` if it
|
1709
|
-
* crosses an inserted image.
|
3626
|
+
* crosses an inserted image. See @ref working_with_object_positioning.
|
1710
3627
|
*
|
1711
3628
|
* BMP images are only supported for backward compatibility. In general it is
|
1712
3629
|
* best to avoid BMP images since they aren't compressed. If used, BMP images
|
@@ -1729,18 +3646,52 @@ lxw_error worksheet_insert_image(lxw_worksheet *worksheet,
|
|
1729
3646
|
*
|
1730
3647
|
* The `%worksheet_insert_image_opt()` function is like
|
1731
3648
|
* `worksheet_insert_image()` function except that it takes an optional
|
1732
|
-
* #lxw_image_options struct
|
3649
|
+
* #lxw_image_options struct with the following members/options:
|
3650
|
+
*
|
3651
|
+
* - `x_offset`: Offset from the left of the cell in pixels.
|
3652
|
+
* - `y_offset`: Offset from the top of the cell in pixels.
|
3653
|
+
* - `x_scale`: X scale of the image as a decimal.
|
3654
|
+
* - `y_scale`: Y scale of the image as a decimal.
|
3655
|
+
* - `object_position`: See @ref working_with_object_positioning.
|
3656
|
+
* - `description`: Optional description or "Alt text" for the image.
|
3657
|
+
* - `decorative`: Optional parameter to mark image as decorative.
|
3658
|
+
* - `url`: Add an optional hyperlink to the image.
|
3659
|
+
* - `tip`: Add an optional mouseover tip for a hyperlink to the image.
|
3660
|
+
*
|
3661
|
+
* For example, to scale and position the image:
|
1733
3662
|
*
|
1734
3663
|
* @code
|
1735
|
-
*
|
3664
|
+
* lxw_image_options options = {.x_offset = 30, .y_offset = 10,
|
1736
3665
|
* .x_scale = 0.5, .y_scale = 0.5};
|
1737
3666
|
*
|
1738
|
-
*
|
3667
|
+
* worksheet_insert_image_opt(worksheet, 2, 1, "logo.png", &options);
|
1739
3668
|
*
|
1740
3669
|
* @endcode
|
1741
3670
|
*
|
1742
3671
|
* @image html insert_image_opt.png
|
1743
3672
|
*
|
3673
|
+
* The `url` field of lxw_image_options can be use to used to add a hyperlink
|
3674
|
+
* to an image:
|
3675
|
+
*
|
3676
|
+
* @code
|
3677
|
+
* lxw_image_options options = {.url = "https://github.com/jmcnamara"};
|
3678
|
+
*
|
3679
|
+
* worksheet_insert_image_opt(worksheet, 3, 1, "logo.png", &options);
|
3680
|
+
* @endcode
|
3681
|
+
*
|
3682
|
+
* The supported URL formats are the same as those supported by the
|
3683
|
+
* `worksheet_write_url()` method and the same rules/limits apply.
|
3684
|
+
*
|
3685
|
+
* The `tip` field of lxw_image_options can be use to used to add a mouseover
|
3686
|
+
* tip to the hyperlink:
|
3687
|
+
*
|
3688
|
+
* @code
|
3689
|
+
* lxw_image_options options = {.url = "https://github.com/jmcnamara",
|
3690
|
+
.tip = "GitHub"};
|
3691
|
+
*
|
3692
|
+
* worksheet_insert_image_opt(worksheet, 4, 1, "logo.png", &options);
|
3693
|
+
* @endcode
|
3694
|
+
*
|
1744
3695
|
* @note See the notes about row scaling and BMP images in
|
1745
3696
|
* `worksheet_insert_image()` above.
|
1746
3697
|
*/
|
@@ -1782,42 +3733,118 @@ lxw_error worksheet_insert_image_buffer(lxw_worksheet *worksheet,
|
|
1782
3733
|
size_t image_size);
|
1783
3734
|
|
1784
3735
|
/**
|
1785
|
-
* @brief Insert an image in a worksheet cell, from a memory buffer.
|
3736
|
+
* @brief Insert an image in a worksheet cell, from a memory buffer.
|
3737
|
+
*
|
3738
|
+
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
3739
|
+
* @param row The zero indexed row number.
|
3740
|
+
* @param col The zero indexed column number.
|
3741
|
+
* @param image_buffer Pointer to an array of bytes that holds the image data.
|
3742
|
+
* @param image_size The size of the array of bytes.
|
3743
|
+
* @param options Optional image parameters.
|
3744
|
+
*
|
3745
|
+
* @return A #lxw_error code.
|
3746
|
+
*
|
3747
|
+
* The `%worksheet_insert_image_buffer_opt()` function is like
|
3748
|
+
* `worksheet_insert_image_buffer()` function except that it takes an optional
|
3749
|
+
* #lxw_image_options struct * #lxw_image_options struct with the following members/options:
|
3750
|
+
*
|
3751
|
+
* - `x_offset`: Offset from the left of the cell in pixels.
|
3752
|
+
* - `y_offset`: Offset from the top of the cell in pixels.
|
3753
|
+
* - `x_scale`: X scale of the image as a decimal.
|
3754
|
+
* - `y_scale`: Y scale of the image as a decimal.
|
3755
|
+
* - `object_position`: See @ref working_with_object_positioning.
|
3756
|
+
* - `description`: Optional description or "Alt text" for the image.
|
3757
|
+
* - `decorative`: Optional parameter to mark image as decorative.
|
3758
|
+
* - `url`: Add an optional hyperlink to the image.
|
3759
|
+
* - `tip`: Add an optional mouseover tip for a hyperlink to the image.
|
3760
|
+
*
|
3761
|
+
* For example, to scale and position the image:
|
3762
|
+
*
|
3763
|
+
* @code
|
3764
|
+
* lxw_image_options options = {.x_offset = 32, .y_offset = 4,
|
3765
|
+
* .x_scale = 2, .y_scale = 1};
|
3766
|
+
*
|
3767
|
+
* worksheet_insert_image_buffer_opt(worksheet, CELL("B3"), image_buffer, image_size, &options);
|
3768
|
+
* @endcode
|
3769
|
+
*
|
3770
|
+
* @image html image_buffer_opt.png
|
3771
|
+
*
|
3772
|
+
* The buffer should be a pointer to an array of unsigned char data with a
|
3773
|
+
* specified size.
|
3774
|
+
*
|
3775
|
+
* See `worksheet_insert_image_buffer_opt()` for details about the supported
|
3776
|
+
* image formats, and other image options.
|
3777
|
+
*/
|
3778
|
+
lxw_error worksheet_insert_image_buffer_opt(lxw_worksheet *worksheet,
|
3779
|
+
lxw_row_t row,
|
3780
|
+
lxw_col_t col,
|
3781
|
+
const unsigned char *image_buffer,
|
3782
|
+
size_t image_size,
|
3783
|
+
lxw_image_options *options);
|
3784
|
+
|
3785
|
+
/**
|
3786
|
+
* @brief Set the background image for a worksheet.
|
3787
|
+
*
|
3788
|
+
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
3789
|
+
* @param filename The image filename, with path if required.
|
3790
|
+
*
|
3791
|
+
* @return A #lxw_error code.
|
3792
|
+
*
|
3793
|
+
* The `%worksheet_set_background()` function can be used to set the
|
3794
|
+
* background image for a worksheet:
|
3795
|
+
*
|
3796
|
+
* @code
|
3797
|
+
* worksheet_set_background(worksheet, "logo.png");
|
3798
|
+
* @endcode
|
3799
|
+
*
|
3800
|
+
* @image html background.png
|
3801
|
+
*
|
3802
|
+
* The ``set_background()`` method supports all the image formats supported by
|
3803
|
+
* `worksheet_insert_image()`.
|
3804
|
+
*
|
3805
|
+
* Some people use this method to add a watermark background to their
|
3806
|
+
* document. However, Microsoft recommends using a header image [to set a
|
3807
|
+
* watermark][watermark]. The choice of method depends on whether you want the
|
3808
|
+
* watermark to be visible in normal viewing mode or just when the file is
|
3809
|
+
* printed. In libxlsxwriter you can get the header watermark effect using
|
3810
|
+
* `worksheet_set_header()`:
|
3811
|
+
*
|
3812
|
+
* @code
|
3813
|
+
* lxw_header_footer_options header_options = {.image_center = "watermark.png"};
|
3814
|
+
* worksheet_set_header_opt(worksheet, "&C&G", &header_options);
|
3815
|
+
* @endcode
|
3816
|
+
*
|
3817
|
+
* [watermark]:https://support.microsoft.com/en-us/office/add-a-watermark-in-excel-a372182a-d733-484e-825c-18ddf3edf009
|
3818
|
+
*
|
3819
|
+
*/
|
3820
|
+
lxw_error worksheet_set_background(lxw_worksheet *worksheet,
|
3821
|
+
const char *filename);
|
3822
|
+
|
3823
|
+
/**
|
3824
|
+
* @brief Set the background image for a worksheet, from a buffer.
|
1786
3825
|
*
|
1787
3826
|
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
1788
|
-
* @param row The zero indexed row number.
|
1789
|
-
* @param col The zero indexed column number.
|
1790
3827
|
* @param image_buffer Pointer to an array of bytes that holds the image data.
|
1791
3828
|
* @param image_size The size of the array of bytes.
|
1792
|
-
* @param options Optional image parameters.
|
1793
3829
|
*
|
1794
3830
|
* @return A #lxw_error code.
|
1795
3831
|
*
|
1796
|
-
*
|
1797
|
-
*
|
1798
|
-
* #lxw_image_options struct to scale and position the image:
|
3832
|
+
* This function can be used to insert a background image into a worksheet
|
3833
|
+
* from a memory buffer:
|
1799
3834
|
*
|
1800
3835
|
* @code
|
1801
|
-
*
|
1802
|
-
* .x_scale = 2, .y_scale = 1};
|
1803
|
-
*
|
1804
|
-
* worksheet_insert_image_buffer_opt(worksheet, CELL("B3"), image_buffer, image_size, &options);
|
3836
|
+
* worksheet_set_background_buffer(worksheet, image_buffer, image_size);
|
1805
3837
|
* @endcode
|
1806
3838
|
*
|
1807
|
-
* @image html image_buffer_opt.png
|
1808
|
-
*
|
1809
3839
|
* The buffer should be a pointer to an array of unsigned char data with a
|
1810
3840
|
* specified size.
|
1811
3841
|
*
|
1812
|
-
* See `
|
1813
|
-
*
|
3842
|
+
* See `worksheet_set_background()` for more details.
|
3843
|
+
*
|
1814
3844
|
*/
|
1815
|
-
lxw_error
|
1816
|
-
|
1817
|
-
|
1818
|
-
const unsigned char *image_buffer,
|
1819
|
-
size_t image_size,
|
1820
|
-
lxw_image_options *options);
|
3845
|
+
lxw_error worksheet_set_background_buffer(lxw_worksheet *worksheet,
|
3846
|
+
const unsigned char *image_buffer,
|
3847
|
+
size_t image_size);
|
1821
3848
|
|
1822
3849
|
/**
|
1823
3850
|
* @brief Insert a chart object into a worksheet.
|
@@ -1871,10 +3898,10 @@ lxw_error worksheet_insert_chart(lxw_worksheet *worksheet,
|
|
1871
3898
|
*
|
1872
3899
|
* The `%worksheet_insert_chart_opt()` function is like
|
1873
3900
|
* `worksheet_insert_chart()` function except that it takes an optional
|
1874
|
-
* #
|
3901
|
+
* #lxw_chart_options struct to scale and position the chart:
|
1875
3902
|
*
|
1876
3903
|
* @code
|
1877
|
-
*
|
3904
|
+
* lxw_chart_options options = {.x_offset = 30, .y_offset = 10,
|
1878
3905
|
* .x_scale = 0.5, .y_scale = 0.75};
|
1879
3906
|
*
|
1880
3907
|
* worksheet_insert_chart_opt(worksheet, 0, 2, chart, &options);
|
@@ -1883,14 +3910,11 @@ lxw_error worksheet_insert_chart(lxw_worksheet *worksheet,
|
|
1883
3910
|
*
|
1884
3911
|
* @image html chart_line_opt.png
|
1885
3912
|
*
|
1886
|
-
* The #lxw_image_options struct is the same struct used in
|
1887
|
-
* `worksheet_insert_image_opt()` to position and scale images.
|
1888
|
-
*
|
1889
3913
|
*/
|
1890
3914
|
lxw_error worksheet_insert_chart_opt(lxw_worksheet *worksheet,
|
1891
3915
|
lxw_row_t row, lxw_col_t col,
|
1892
3916
|
lxw_chart *chart,
|
1893
|
-
|
3917
|
+
lxw_chart_options *user_options);
|
1894
3918
|
|
1895
3919
|
/**
|
1896
3920
|
* @brief Merge a range of cells.
|
@@ -1949,7 +3973,7 @@ lxw_error worksheet_insert_chart_opt(lxw_worksheet *worksheet,
|
|
1949
3973
|
* worksheet_write_number(worksheet, 1, 1, 123, format);
|
1950
3974
|
* @endcode
|
1951
3975
|
*
|
1952
|
-
* @note Merged ranges generally don
|
3976
|
+
* @note Merged ranges generally don't work in libxlsxwriter when the Workbook
|
1953
3977
|
* #lxw_workbook_options `constant_memory` mode is enabled.
|
1954
3978
|
*/
|
1955
3979
|
lxw_error worksheet_merge_range(lxw_worksheet *worksheet, lxw_row_t first_row,
|
@@ -1975,7 +3999,7 @@ lxw_error worksheet_merge_range(lxw_worksheet *worksheet, lxw_row_t first_row,
|
|
1975
3999
|
* range of worksheet data. This allows users to filter the data based on
|
1976
4000
|
* simple criteria so that some data is shown and some is hidden.
|
1977
4001
|
*
|
1978
|
-
* @image html
|
4002
|
+
* @image html autofilter3.png
|
1979
4003
|
*
|
1980
4004
|
* To add an autofilter to a worksheet:
|
1981
4005
|
*
|
@@ -1986,13 +4010,147 @@ lxw_error worksheet_merge_range(lxw_worksheet *worksheet, lxw_row_t first_row,
|
|
1986
4010
|
* worksheet_autofilter(worksheet, RANGE("A1:D51"));
|
1987
4011
|
* @endcode
|
1988
4012
|
*
|
1989
|
-
*
|
1990
|
-
*
|
4013
|
+
* In order to apply a filter condition it is necessary to add filter rules to
|
4014
|
+
* the columns using either the `%worksheet_filter_column()`,
|
4015
|
+
* `%worksheet_filter_column2()` or `%worksheet_filter_list()` functions:
|
4016
|
+
*
|
4017
|
+
* - `worksheet_filter_column()`: filter on a single criterion such as "Column ==
|
4018
|
+
* East". More complex conditions such as "<=" or ">=" can also be use.
|
4019
|
+
*
|
4020
|
+
* - `worksheet_filter_column2()`: filter on two criteria such as "Column == East
|
4021
|
+
* or Column == West". Complex conditions can also be used.
|
4022
|
+
*
|
4023
|
+
* - `worksheet_filter_list()`: filter on a list of values such as "Column in (East, West,
|
4024
|
+
* North)".
|
4025
|
+
*
|
4026
|
+
* These functions are explained below. It isn't sufficient to just specify
|
4027
|
+
* the filter condition. You must also hide any rows that don't match the
|
4028
|
+
* filter condition. See @ref ww_autofilters_data for more details.
|
4029
|
+
*
|
1991
4030
|
*/
|
1992
4031
|
lxw_error worksheet_autofilter(lxw_worksheet *worksheet, lxw_row_t first_row,
|
1993
4032
|
lxw_col_t first_col, lxw_row_t last_row,
|
1994
4033
|
lxw_col_t last_col);
|
1995
4034
|
|
4035
|
+
/**
|
4036
|
+
* @brief Write a filter rule to an autofilter column.
|
4037
|
+
*
|
4038
|
+
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
4039
|
+
* @param col The column in the autofilter that the rule applies to.
|
4040
|
+
* @param rule The lxw_filter_rule autofilter rule.
|
4041
|
+
*
|
4042
|
+
* @return A #lxw_error code.
|
4043
|
+
*
|
4044
|
+
* The `worksheet_filter_column` function can be used to filter columns in a
|
4045
|
+
* autofilter range based on single rule conditions:
|
4046
|
+
*
|
4047
|
+
* @code
|
4048
|
+
* lxw_filter_rule filter_rule = {.criteria = LXW_FILTER_CRITERIA_EQUAL_TO,
|
4049
|
+
* .value_string = "East"};
|
4050
|
+
*
|
4051
|
+
* worksheet_filter_column(worksheet, 0, &filter_rule);
|
4052
|
+
*@endcode
|
4053
|
+
*
|
4054
|
+
* @image html autofilter4.png
|
4055
|
+
*
|
4056
|
+
* The rules and criteria are explained in more detail in @ref
|
4057
|
+
* ww_autofilters_criteria in @ref working_with_autofilters.
|
4058
|
+
*
|
4059
|
+
* The `col` parameter is a zero indexed column number and must refer to a
|
4060
|
+
* column in an existing autofilter created with `worksheet_autofilter()`.
|
4061
|
+
*
|
4062
|
+
* It isn't sufficient to just specify the filter condition. You must also
|
4063
|
+
* hide any rows that don't match the filter condition. See @ref
|
4064
|
+
* ww_autofilters_data for more details.
|
4065
|
+
*/
|
4066
|
+
lxw_error worksheet_filter_column(lxw_worksheet *worksheet, lxw_col_t col,
|
4067
|
+
lxw_filter_rule *rule);
|
4068
|
+
|
4069
|
+
/**
|
4070
|
+
* @brief Write two filter rules to an autofilter column.
|
4071
|
+
*
|
4072
|
+
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
4073
|
+
* @param col The column in the autofilter that the rules applies to.
|
4074
|
+
* @param rule1 First lxw_filter_rule autofilter rule.
|
4075
|
+
* @param rule2 Second lxw_filter_rule autofilter rule.
|
4076
|
+
* @param and_or A #lxw_filter_operator and/or operator.
|
4077
|
+
*
|
4078
|
+
* @return A #lxw_error code.
|
4079
|
+
*
|
4080
|
+
* The `worksheet_filter_column2` function can be used to filter columns in a autofilter
|
4081
|
+
* range based on two rule conditions:
|
4082
|
+
*
|
4083
|
+
* @code
|
4084
|
+
* lxw_filter_rule filter_rule1 = {.criteria = LXW_FILTER_CRITERIA_EQUAL_TO,
|
4085
|
+
* .value_string = "East"};
|
4086
|
+
*
|
4087
|
+
* lxw_filter_rule filter_rule2 = {.criteria = LXW_FILTER_CRITERIA_EQUAL_TO,
|
4088
|
+
* .value_string = "South"};
|
4089
|
+
*
|
4090
|
+
* worksheet_filter_column2(worksheet, 0, &filter_rule1, &filter_rule2, LXW_FILTER_OR);
|
4091
|
+
* @endcode
|
4092
|
+
*
|
4093
|
+
* @image html autofilter5.png
|
4094
|
+
*
|
4095
|
+
* The rules and criteria are explained in more detail in @ref
|
4096
|
+
* ww_autofilters_criteria in @ref working_with_autofilters.
|
4097
|
+
*
|
4098
|
+
* The `col` parameter is a zero indexed column number and must refer to a
|
4099
|
+
* column in an existing autofilter created with `worksheet_autofilter()`.
|
4100
|
+
*
|
4101
|
+
* The `and_or` parameter is either "and (LXW_FILTER_AND)" or "or (LXW_FILTER_OR)".
|
4102
|
+
*
|
4103
|
+
* It isn't sufficient to just specify the filter condition. You must also
|
4104
|
+
* hide any rows that don't match the filter condition. See @ref
|
4105
|
+
* ww_autofilters_data for more details.
|
4106
|
+
*/
|
4107
|
+
lxw_error worksheet_filter_column2(lxw_worksheet *worksheet, lxw_col_t col,
|
4108
|
+
lxw_filter_rule *rule1,
|
4109
|
+
lxw_filter_rule *rule2, uint8_t and_or);
|
4110
|
+
/**
|
4111
|
+
* @brief Write multiple string filters to an autofilter column.
|
4112
|
+
*
|
4113
|
+
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
4114
|
+
* @param col The column in the autofilter that the rules applies to.
|
4115
|
+
* @param list A NULL terminated array of strings to filter on.
|
4116
|
+
*
|
4117
|
+
* @return A #lxw_error code.
|
4118
|
+
*
|
4119
|
+
* The `worksheet_filter_column_list()` function can be used specify multiple
|
4120
|
+
* string matching criteria. This is a newer type of filter introduced in
|
4121
|
+
* Excel 2007. Prior to that it was only possible to have either 1 or 2 filter
|
4122
|
+
* conditions, such as the ones used by `worksheet_filter_column()` and
|
4123
|
+
* `worksheet_filter_column2()`.
|
4124
|
+
*
|
4125
|
+
* As an example, consider a column that contains data for the months of the
|
4126
|
+
* year. The `%worksheet_filter_list()` function can be used to filter out
|
4127
|
+
* data rows for different months:
|
4128
|
+
*
|
4129
|
+
* @code
|
4130
|
+
* char* list[] = {"March", "April", "May", NULL};
|
4131
|
+
*
|
4132
|
+
* worksheet_filter_list(worksheet, 0, list);
|
4133
|
+
* @endcode
|
4134
|
+
*
|
4135
|
+
* @image html autofilter2.png
|
4136
|
+
*
|
4137
|
+
*
|
4138
|
+
* Note, the array must be NULL terminated to indicate the end of the array of
|
4139
|
+
* strings. To filter blanks as part of the list use `Blanks` as a list item:
|
4140
|
+
*
|
4141
|
+
* @code
|
4142
|
+
* char* list[] = {"March", "April", "May", "Blanks", NULL};
|
4143
|
+
*
|
4144
|
+
* worksheet_filter_list(worksheet, 0, list);
|
4145
|
+
* @endcode
|
4146
|
+
*
|
4147
|
+
* It isn't sufficient to just specify the filter condition. You must also
|
4148
|
+
* hide any rows that don't match the filter condition. See @ref
|
4149
|
+
* ww_autofilters_data for more details.
|
4150
|
+
*/
|
4151
|
+
lxw_error worksheet_filter_list(lxw_worksheet *worksheet, lxw_col_t col,
|
4152
|
+
const char **list);
|
4153
|
+
|
1996
4154
|
/**
|
1997
4155
|
* @brief Add a data validation to a cell.
|
1998
4156
|
*
|
@@ -2033,7 +4191,7 @@ lxw_error worksheet_data_validation_cell(lxw_worksheet *worksheet,
|
|
2033
4191
|
lxw_data_validation *validation);
|
2034
4192
|
|
2035
4193
|
/**
|
2036
|
-
* @brief Add a data validation to a range
|
4194
|
+
* @brief Add a data validation to a range.
|
2037
4195
|
*
|
2038
4196
|
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
2039
4197
|
* @param first_row The first row of the range. (All zero indexed.)
|
@@ -2074,6 +4232,149 @@ lxw_error worksheet_data_validation_range(lxw_worksheet *worksheet,
|
|
2074
4232
|
lxw_col_t last_col,
|
2075
4233
|
lxw_data_validation *validation);
|
2076
4234
|
|
4235
|
+
/**
|
4236
|
+
* @brief Add a conditional format to a worksheet cell.
|
4237
|
+
*
|
4238
|
+
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
4239
|
+
* @param row The zero indexed row number.
|
4240
|
+
* @param col The zero indexed column number.
|
4241
|
+
* @param conditional_format A #lxw_conditional_format object to control the
|
4242
|
+
* conditional format.
|
4243
|
+
*
|
4244
|
+
* @return A #lxw_error code.
|
4245
|
+
*
|
4246
|
+
* The `%worksheet_conditional_format_cell()` function is used to set a
|
4247
|
+
* conditional format for a cell in a worksheet:
|
4248
|
+
*
|
4249
|
+
* @code
|
4250
|
+
* conditional_format->type = LXW_CONDITIONAL_TYPE_CELL;
|
4251
|
+
* conditional_format->criteria = LXW_CONDITIONAL_CRITERIA_GREATER_THAN_OR_EQUAL_TO;
|
4252
|
+
* conditional_format->value = 50;
|
4253
|
+
* conditional_format->format = format1;
|
4254
|
+
* worksheet_conditional_format_cell(worksheet, CELL("A1"), conditional_format);
|
4255
|
+
* @endcode
|
4256
|
+
*
|
4257
|
+
* The conditional format parameters is specified in #lxw_conditional_format.
|
4258
|
+
*
|
4259
|
+
* See @ref working_with_conditional_formatting for full details.
|
4260
|
+
*/
|
4261
|
+
lxw_error worksheet_conditional_format_cell(lxw_worksheet *worksheet,
|
4262
|
+
lxw_row_t row,
|
4263
|
+
lxw_col_t col,
|
4264
|
+
lxw_conditional_format
|
4265
|
+
*conditional_format);
|
4266
|
+
|
4267
|
+
/**
|
4268
|
+
* @brief Add a conditional format to a worksheet range.
|
4269
|
+
*
|
4270
|
+
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
4271
|
+
* @param first_row The first row of the range. (All zero indexed.)
|
4272
|
+
* @param first_col The first column of the range.
|
4273
|
+
* @param last_row The last row of the range.
|
4274
|
+
* @param last_col The last col of the range.
|
4275
|
+
* @param conditional_format A #lxw_conditional_format object to control the
|
4276
|
+
* conditional format.
|
4277
|
+
*
|
4278
|
+
* @return A #lxw_error code.
|
4279
|
+
*
|
4280
|
+
* The `%worksheet_conditional_format_cell()` function is used to set a
|
4281
|
+
* conditional format for a range of cells in a worksheet:
|
4282
|
+
*
|
4283
|
+
* @code
|
4284
|
+
* conditional_format->type = LXW_CONDITIONAL_TYPE_CELL;
|
4285
|
+
* conditional_format->criteria = LXW_CONDITIONAL_CRITERIA_GREATER_THAN_OR_EQUAL_TO;
|
4286
|
+
* conditional_format->value = 50;
|
4287
|
+
* conditional_format->format = format1;
|
4288
|
+
* worksheet_conditional_format_range(worksheet1, RANGE("B3:K12"), conditional_format);
|
4289
|
+
*
|
4290
|
+
* conditional_format->type = LXW_CONDITIONAL_TYPE_CELL;
|
4291
|
+
* conditional_format->criteria = LXW_CONDITIONAL_CRITERIA_LESS_THAN;
|
4292
|
+
* conditional_format->value = 50;
|
4293
|
+
* conditional_format->format = format2;
|
4294
|
+
* worksheet_conditional_format_range(worksheet1, RANGE("B3:K12"), conditional_format);
|
4295
|
+
* @endcode
|
4296
|
+
*
|
4297
|
+
* Output:
|
4298
|
+
*
|
4299
|
+
* @image html conditional_format1.png
|
4300
|
+
*
|
4301
|
+
*
|
4302
|
+
* The conditional format parameters is specified in #lxw_conditional_format.
|
4303
|
+
*
|
4304
|
+
* See @ref working_with_conditional_formatting for full details.
|
4305
|
+
*/
|
4306
|
+
lxw_error worksheet_conditional_format_range(lxw_worksheet *worksheet,
|
4307
|
+
lxw_row_t first_row,
|
4308
|
+
lxw_col_t first_col,
|
4309
|
+
lxw_row_t last_row,
|
4310
|
+
lxw_col_t last_col,
|
4311
|
+
lxw_conditional_format
|
4312
|
+
*conditional_format);
|
4313
|
+
/**
|
4314
|
+
* @brief Insert a button object into a worksheet.
|
4315
|
+
*
|
4316
|
+
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
4317
|
+
* @param row The zero indexed row number.
|
4318
|
+
* @param col The zero indexed column number.
|
4319
|
+
* @param options A #lxw_button_options object to set the button properties.
|
4320
|
+
*
|
4321
|
+
* @return A #lxw_error code.
|
4322
|
+
*
|
4323
|
+
* The `%worksheet_insert_button()` function can be used to insert an Excel
|
4324
|
+
* form button into a worksheet. This function is generally only useful when
|
4325
|
+
* used in conjunction with the `workbook_add_vba_project()` function to tie
|
4326
|
+
* the button to a macro from an embedded VBA project:
|
4327
|
+
*
|
4328
|
+
* @code
|
4329
|
+
* lxw_button_options options = {.caption = "Press Me",
|
4330
|
+
* .macro = "say_hello"};
|
4331
|
+
*
|
4332
|
+
* worksheet_insert_button(worksheet, 2, 1, &options);
|
4333
|
+
* @endcode
|
4334
|
+
*
|
4335
|
+
* @image html macros.png
|
4336
|
+
*
|
4337
|
+
* The button properties are set using the lxw_button_options struct.
|
4338
|
+
*
|
4339
|
+
* See also @ref working_with_macros
|
4340
|
+
*/
|
4341
|
+
lxw_error worksheet_insert_button(lxw_worksheet *worksheet, lxw_row_t row,
|
4342
|
+
lxw_col_t col, lxw_button_options *options);
|
4343
|
+
|
4344
|
+
/**
|
4345
|
+
* @brief Add an Excel table to a worksheet.
|
4346
|
+
*
|
4347
|
+
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
4348
|
+
* @param first_row The first row of the range. (All zero indexed.)
|
4349
|
+
* @param first_col The first column of the range.
|
4350
|
+
* @param last_row The last row of the range.
|
4351
|
+
* @param last_col The last col of the range.
|
4352
|
+
* @param options A #lxw_table_options struct to define the table options.
|
4353
|
+
*
|
4354
|
+
* @return A #lxw_error code.
|
4355
|
+
*
|
4356
|
+
* The `%worksheet_add_table()` function is used to add a table to a
|
4357
|
+
* worksheet. Tables in Excel are a way of grouping a range of cells into a
|
4358
|
+
* single entity that has common formatting or that can be referenced from
|
4359
|
+
* formulas. Tables can have column headers, autofilters, total rows, column
|
4360
|
+
* formulas and default formatting.
|
4361
|
+
*
|
4362
|
+
* @code
|
4363
|
+
* worksheet_add_table(worksheet, 2, 1, 6, 5, NULL);
|
4364
|
+
* @endcode
|
4365
|
+
*
|
4366
|
+
* Output:
|
4367
|
+
*
|
4368
|
+
* @image html tables1.png
|
4369
|
+
*
|
4370
|
+
* See @ref working_with_tables for more detailed usage information and also
|
4371
|
+
* @ref tables.c.
|
4372
|
+
*
|
4373
|
+
*/
|
4374
|
+
lxw_error worksheet_add_table(lxw_worksheet *worksheet, lxw_row_t first_row,
|
4375
|
+
lxw_col_t first_col, lxw_row_t last_row,
|
4376
|
+
lxw_col_t last_col, lxw_table_options *options);
|
4377
|
+
|
2077
4378
|
/**
|
2078
4379
|
* @brief Make a worksheet the active, i.e., visible worksheet.
|
2079
4380
|
*
|
@@ -2251,7 +4552,7 @@ void worksheet_split_panes_opt(lxw_worksheet *worksheet,
|
|
2251
4552
|
/**
|
2252
4553
|
* @brief Set the selected cell or cells in a worksheet:
|
2253
4554
|
*
|
2254
|
-
* @param worksheet
|
4555
|
+
* @param worksheet A pointer to a lxw_worksheet instance to be updated.
|
2255
4556
|
* @param first_row The first row of the range. (All zero indexed.)
|
2256
4557
|
* @param first_col The first column of the range.
|
2257
4558
|
* @param last_row The last row of the range.
|
@@ -2281,6 +4582,27 @@ void worksheet_set_selection(lxw_worksheet *worksheet,
|
|
2281
4582
|
lxw_row_t first_row, lxw_col_t first_col,
|
2282
4583
|
lxw_row_t last_row, lxw_col_t last_col);
|
2283
4584
|
|
4585
|
+
/**
|
4586
|
+
* @brief Set the first visible cell at the top left of a worksheet.
|
4587
|
+
*
|
4588
|
+
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
4589
|
+
* @param row The cell row (zero indexed).
|
4590
|
+
* @param col The cell column (zero indexed).
|
4591
|
+
*
|
4592
|
+
* The `%worksheet_set_top_left_cell()` function can be used to set the
|
4593
|
+
* top leftmost visible cell in the worksheet:
|
4594
|
+
*
|
4595
|
+
* @code
|
4596
|
+
* worksheet_set_top_left_cell(worksheet, 31, 26);
|
4597
|
+
* worksheet_set_top_left_cell(worksheet, CELL("AA32")); // Same as above.
|
4598
|
+
* @endcode
|
4599
|
+
*
|
4600
|
+
* @image html top_left_cell.png
|
4601
|
+
*
|
4602
|
+
*/
|
4603
|
+
void worksheet_set_top_left_cell(lxw_worksheet *worksheet, lxw_row_t row,
|
4604
|
+
lxw_col_t col);
|
4605
|
+
|
2284
4606
|
/**
|
2285
4607
|
* @brief Set the page orientation as landscape.
|
2286
4608
|
*
|
@@ -2446,7 +4768,11 @@ void worksheet_set_margins(lxw_worksheet *worksheet, double left,
|
|
2446
4768
|
* | `&S` | | Strikethrough |
|
2447
4769
|
* | `&X` | | Superscript |
|
2448
4770
|
* | `&Y` | | Subscript |
|
4771
|
+
* | `&[Picture]` | Images | Image placeholder |
|
4772
|
+
* | `&G` | | Same as `&[Picture]` |
|
4773
|
+
* | `&&` | Miscellaneous | Literal ampersand & |
|
2449
4774
|
*
|
4775
|
+
* Note: inserting images requires the `worksheet_set_header_opt()` function.
|
2450
4776
|
*
|
2451
4777
|
* Text in headers and footers can be justified (aligned) to the left, center
|
2452
4778
|
* and right by prefixing the text with the control characters `&L`, `&C` and
|
@@ -2570,17 +4896,14 @@ void worksheet_set_margins(lxw_worksheet *worksheet, double left,
|
|
2570
4896
|
* @code
|
2571
4897
|
*
|
2572
4898
|
* $ unzip myfile.xlsm -d myfile
|
2573
|
-
* $ xmllint --format `find myfile -name "*.xml" | xargs` | egrep "Header|Footer"
|
4899
|
+
* $ xmllint --format `find myfile -name "*.xml" | xargs` | egrep "Header|Footer" | sed 's/&/\&/g'
|
2574
4900
|
*
|
2575
4901
|
* <headerFooter scaleWithDoc="0">
|
2576
|
-
* <oddHeader>&
|
4902
|
+
* <oddHeader>&L&P</oddHeader>
|
2577
4903
|
* </headerFooter>
|
2578
4904
|
*
|
2579
4905
|
* @endcode
|
2580
4906
|
*
|
2581
|
-
* Note that in this case you need to unescape the Html. In the above example
|
2582
|
-
* the header string would be `&L&P`.
|
2583
|
-
*
|
2584
4907
|
* To include a single literal ampersand `&` in a header or footer you should
|
2585
4908
|
* use a double ampersand `&&`:
|
2586
4909
|
*
|
@@ -2588,8 +4911,10 @@ void worksheet_set_margins(lxw_worksheet *worksheet, double left,
|
|
2588
4911
|
* worksheet_set_header(worksheet, "&CCuriouser && Curiouser - Attorneys at Law");
|
2589
4912
|
* @endcode
|
2590
4913
|
*
|
2591
|
-
*
|
2592
|
-
*
|
4914
|
+
* @note
|
4915
|
+
* Excel requires that the header or footer string cannot be longer than 255
|
4916
|
+
* characters, including the control characters. Strings longer than this will
|
4917
|
+
* not be written.
|
2593
4918
|
*
|
2594
4919
|
*/
|
2595
4920
|
lxw_error worksheet_set_header(lxw_worksheet *worksheet, const char *string);
|
@@ -2616,19 +4941,43 @@ lxw_error worksheet_set_footer(lxw_worksheet *worksheet, const char *string);
|
|
2616
4941
|
*
|
2617
4942
|
* @return A #lxw_error code.
|
2618
4943
|
*
|
2619
|
-
* The syntax of this function is the same as worksheet_set_header() with an
|
4944
|
+
* The syntax of this function is the same as `worksheet_set_header()` with an
|
2620
4945
|
* additional parameter to specify options for the header.
|
2621
4946
|
*
|
2622
|
-
*
|
4947
|
+
* The #lxw_header_footer_options options are:
|
4948
|
+
*
|
4949
|
+
* - `margin`: Header or footer margin in inches. The value must by larger
|
4950
|
+
* than 0.0. The Excel default is 0.3.
|
4951
|
+
*
|
4952
|
+
* - `image_left`: The left header image filename, with path if required. This
|
4953
|
+
* should have a corresponding `&G/&[Picture]` placeholder in the `&L`
|
4954
|
+
* section of the header/footer string.
|
4955
|
+
*
|
4956
|
+
* - `image_center`: The center header image filename, with path if
|
4957
|
+
* required. This should have a corresponding `&G/&[Picture]` placeholder in
|
4958
|
+
* the `&C` section of the header/footer string.
|
4959
|
+
*
|
4960
|
+
* - `image_right`: The right header image filename, with path if
|
4961
|
+
* required. This should have a corresponding `&G/&[Picture]` placeholder in
|
4962
|
+
* the `&R` section of the header/footer string.
|
2623
4963
|
*
|
2624
4964
|
* @code
|
4965
|
+
* lxw_header_footer_options header_options = { .margin = 0.2 };
|
4966
|
+
*
|
4967
|
+
* worksheet_set_header_opt(worksheet, "Some text", &header_options);
|
4968
|
+
* @endcode
|
2625
4969
|
*
|
2626
|
-
*
|
4970
|
+
* Images can be inserted in the header by specifying the `&[Picture]`
|
4971
|
+
* placeholder and a filename/path to the image:
|
2627
4972
|
*
|
2628
|
-
*
|
4973
|
+
* @code
|
4974
|
+
* lxw_header_footer_options header_options = {.image_left = "logo.png"};
|
2629
4975
|
*
|
4976
|
+
* worksheet_set_header_opt(worksheet, "&L&[Picture]", &header_options);
|
2630
4977
|
* @endcode
|
2631
4978
|
*
|
4979
|
+
* @image html headers_footers.png
|
4980
|
+
*
|
2632
4981
|
*/
|
2633
4982
|
lxw_error worksheet_set_header_opt(lxw_worksheet *worksheet,
|
2634
4983
|
const char *string,
|
@@ -2643,7 +4992,7 @@ lxw_error worksheet_set_header_opt(lxw_worksheet *worksheet,
|
|
2643
4992
|
*
|
2644
4993
|
* @return A #lxw_error code.
|
2645
4994
|
*
|
2646
|
-
* The syntax of this function is the same as worksheet_set_header_opt()
|
4995
|
+
* The syntax of this function is the same as `worksheet_set_header_opt()`.
|
2647
4996
|
*
|
2648
4997
|
*/
|
2649
4998
|
lxw_error worksheet_set_footer_opt(lxw_worksheet *worksheet,
|
@@ -2984,13 +5333,14 @@ void worksheet_fit_to_pages(lxw_worksheet *worksheet, uint16_t width,
|
|
2984
5333
|
uint16_t height);
|
2985
5334
|
|
2986
5335
|
/**
|
2987
|
-
* @brief Set the start page number when printing.
|
5336
|
+
* @brief Set the start/first page number when printing.
|
2988
5337
|
*
|
2989
5338
|
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
2990
|
-
* @param start_page
|
5339
|
+
* @param start_page Page number of the starting page when printing.
|
2991
5340
|
*
|
2992
|
-
* The `%worksheet_set_start_page()` function is used to set the number
|
2993
|
-
* the
|
5341
|
+
* The `%worksheet_set_start_page()` function is used to set the number number
|
5342
|
+
* of the first page when the worksheet is printed out. It is the same as the
|
5343
|
+
* "First Page Number" option in Excel:
|
2994
5344
|
*
|
2995
5345
|
* @code
|
2996
5346
|
* // Start print from page 2.
|
@@ -3025,6 +5375,18 @@ void worksheet_set_start_page(lxw_worksheet *worksheet, uint16_t start_page);
|
|
3025
5375
|
*/
|
3026
5376
|
void worksheet_set_print_scale(lxw_worksheet *worksheet, uint16_t scale);
|
3027
5377
|
|
5378
|
+
/**
|
5379
|
+
* @brief Set the worksheet to print in black and white
|
5380
|
+
*
|
5381
|
+
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
|
5382
|
+
*
|
5383
|
+
* Set the option to print the worksheet in black and white:
|
5384
|
+
* @code
|
5385
|
+
* worksheet_print_black_and_white(worksheet);
|
5386
|
+
* @endcode
|
5387
|
+
*/
|
5388
|
+
void worksheet_print_black_and_white(lxw_worksheet *worksheet);
|
5389
|
+
|
3028
5390
|
/**
|
3029
5391
|
* @brief Display the worksheet cells from right to left for some versions of
|
3030
5392
|
* Excel.
|
@@ -3241,9 +5603,12 @@ void worksheet_set_default_row(lxw_worksheet *worksheet, double height,
|
|
3241
5603
|
* @param worksheet Pointer to a lxw_worksheet instance.
|
3242
5604
|
* @param name Name of the worksheet used by VBA.
|
3243
5605
|
*
|
5606
|
+
* @return A #lxw_error.
|
5607
|
+
*
|
3244
5608
|
* The `worksheet_set_vba_name()` function can be used to set the VBA name for
|
3245
5609
|
* the worksheet. This is sometimes required when a vbaProject macro included
|
3246
|
-
* via `workbook_add_vba_project()` refers to the worksheet
|
5610
|
+
* via `workbook_add_vba_project()` refers to the worksheet by a name other
|
5611
|
+
* than the worksheet name:
|
3247
5612
|
*
|
3248
5613
|
* @code
|
3249
5614
|
* workbook_set_vba_name (workbook, "MyWorkbook");
|
@@ -3254,10 +5619,149 @@ void worksheet_set_default_row(lxw_worksheet *worksheet, double height,
|
|
3254
5619
|
* However, this can be changed in the VBA environment or if the the macro was
|
3255
5620
|
* extracted from a foreign language version of Excel.
|
3256
5621
|
*
|
3257
|
-
* @
|
5622
|
+
* See also @ref working_with_macros
|
3258
5623
|
*/
|
3259
5624
|
lxw_error worksheet_set_vba_name(lxw_worksheet *worksheet, const char *name);
|
3260
5625
|
|
5626
|
+
/**
|
5627
|
+
* @brief Make all comments in the worksheet visible.
|
5628
|
+
*
|
5629
|
+
* @param worksheet Pointer to a lxw_worksheet instance.
|
5630
|
+
*
|
5631
|
+
* This `%worksheet_show_comments()` function is used to make all cell
|
5632
|
+
* comments visible when a worksheet is opened:
|
5633
|
+
*
|
5634
|
+
* @code
|
5635
|
+
* worksheet_show_comments(worksheet);
|
5636
|
+
* @endcode
|
5637
|
+
*
|
5638
|
+
* Individual comments can be made visible or hidden using the `visible`
|
5639
|
+
* option of the #lxw_comment_options struct and the `worksheet_write_comment_opt()`
|
5640
|
+
* function (see above and @ref ww_comments_visible).
|
5641
|
+
*/
|
5642
|
+
void worksheet_show_comments(lxw_worksheet *worksheet);
|
5643
|
+
|
5644
|
+
/**
|
5645
|
+
* @brief Set the default author of the cell comments.
|
5646
|
+
*
|
5647
|
+
* @param worksheet Pointer to a lxw_worksheet instance.
|
5648
|
+
* @param author The name of the comment author.
|
5649
|
+
*
|
5650
|
+
* This `%worksheet_set_comments_author()` function is used to set the
|
5651
|
+
* default author of all cell comments:
|
5652
|
+
*
|
5653
|
+
* @code
|
5654
|
+
* worksheet_set_comments_author(worksheet, "Jane Gloriana Villanueva")
|
5655
|
+
* @endcode
|
5656
|
+
*
|
5657
|
+
* Individual authors can be set using the `author` option of the
|
5658
|
+
* #lxw_comment_options struct and the `worksheet_write_comment_opt()`
|
5659
|
+
* function (see above and @ref ww_comments_author).
|
5660
|
+
*/
|
5661
|
+
void worksheet_set_comments_author(lxw_worksheet *worksheet,
|
5662
|
+
const char *author);
|
5663
|
+
|
5664
|
+
/**
|
5665
|
+
* @brief Ignore various Excel errors/warnings in a worksheet for user
|
5666
|
+
* defined ranges.
|
5667
|
+
*
|
5668
|
+
* @param worksheet Pointer to a lxw_worksheet instance.
|
5669
|
+
* @param type The type of error/warning to ignore. See #lxw_ignore_errors.
|
5670
|
+
* @param range The range(s) for which the error/warning should be ignored.
|
5671
|
+
*
|
5672
|
+
* @return A #lxw_error.
|
5673
|
+
*
|
5674
|
+
*
|
5675
|
+
* The `%worksheet_ignore_errors()` function can be used to ignore various
|
5676
|
+
* worksheet cell errors/warnings. For example the following code writes a string
|
5677
|
+
* that looks like a number:
|
5678
|
+
*
|
5679
|
+
* @code
|
5680
|
+
* worksheet_write_string(worksheet, CELL("D2"), "123", NULL);
|
5681
|
+
* @endcode
|
5682
|
+
*
|
5683
|
+
* This causes Excel to display a small green triangle in the top left hand
|
5684
|
+
* corner of the cell to indicate an error/warning:
|
5685
|
+
*
|
5686
|
+
* @image html ignore_errors1.png
|
5687
|
+
*
|
5688
|
+
* Sometimes these warnings are useful indicators that there is an issue in
|
5689
|
+
* the spreadsheet but sometimes it is preferable to turn them off. Warnings
|
5690
|
+
* can be turned off at the Excel level for all workbooks and worksheets by
|
5691
|
+
* using the using "Excel options -> Formulas -> Error checking
|
5692
|
+
* rules". Alternatively you can turn them off for individual cells in a
|
5693
|
+
* worksheet, or ranges of cells, using the `%worksheet_ignore_errors()`
|
5694
|
+
* function with different #lxw_ignore_errors options and ranges like this:
|
5695
|
+
*
|
5696
|
+
* @code
|
5697
|
+
* worksheet_ignore_errors(worksheet, LXW_IGNORE_NUMBER_STORED_AS_TEXT, "C3");
|
5698
|
+
* worksheet_ignore_errors(worksheet, LXW_IGNORE_EVAL_ERROR, "C6");
|
5699
|
+
* @endcode
|
5700
|
+
*
|
5701
|
+
* The range can be a single cell, a range of cells, or multiple cells and ranges
|
5702
|
+
* separated by spaces:
|
5703
|
+
*
|
5704
|
+
* @code
|
5705
|
+
* // Single cell.
|
5706
|
+
* worksheet_ignore_errors(worksheet, LXW_IGNORE_NUMBER_STORED_AS_TEXT, "C6");
|
5707
|
+
*
|
5708
|
+
* // Or a single range:
|
5709
|
+
* worksheet_ignore_errors(worksheet, LXW_IGNORE_NUMBER_STORED_AS_TEXT, "C6:G8");
|
5710
|
+
*
|
5711
|
+
* // Or multiple cells and ranges:
|
5712
|
+
* worksheet_ignore_errors(worksheet, LXW_IGNORE_NUMBER_STORED_AS_TEXT, "C6 E6 G1:G20 J2:J6");
|
5713
|
+
* @endcode
|
5714
|
+
*
|
5715
|
+
* @note Calling `%worksheet_ignore_errors()` more than once for the same
|
5716
|
+
* #lxw_ignore_errors type will overwrite the previous range.
|
5717
|
+
*
|
5718
|
+
* You can turn off warnings for an entire column by specifying the range from
|
5719
|
+
* the first cell in the column to the last cell in the column:
|
5720
|
+
*
|
5721
|
+
* @code
|
5722
|
+
* worksheet_ignore_errors(worksheet, LXW_IGNORE_NUMBER_STORED_AS_TEXT, "A1:A1048576");
|
5723
|
+
* @endcode
|
5724
|
+
*
|
5725
|
+
* Or for the entire worksheet by specifying the range from the first cell in
|
5726
|
+
* the worksheet to the last cell in the worksheet:
|
5727
|
+
*
|
5728
|
+
* @code
|
5729
|
+
* worksheet_ignore_errors(worksheet, LXW_IGNORE_NUMBER_STORED_AS_TEXT, "A1:XFD1048576");
|
5730
|
+
* @endcode
|
5731
|
+
*
|
5732
|
+
* The worksheet errors/warnings that can be ignored are:
|
5733
|
+
*
|
5734
|
+
* - #LXW_IGNORE_NUMBER_STORED_AS_TEXT: Turn off errors/warnings for numbers
|
5735
|
+
* stores as text.
|
5736
|
+
*
|
5737
|
+
* - #LXW_IGNORE_EVAL_ERROR: Turn off errors/warnings for formula errors (such
|
5738
|
+
* as divide by zero).
|
5739
|
+
*
|
5740
|
+
* - #LXW_IGNORE_FORMULA_DIFFERS: Turn off errors/warnings for formulas that
|
5741
|
+
* differ from surrounding formulas.
|
5742
|
+
*
|
5743
|
+
* - #LXW_IGNORE_FORMULA_RANGE: Turn off errors/warnings for formulas that
|
5744
|
+
* omit cells in a range.
|
5745
|
+
*
|
5746
|
+
* - #LXW_IGNORE_FORMULA_UNLOCKED: Turn off errors/warnings for unlocked cells
|
5747
|
+
* that contain formulas.
|
5748
|
+
*
|
5749
|
+
* - #LXW_IGNORE_EMPTY_CELL_REFERENCE: Turn off errors/warnings for formulas
|
5750
|
+
* that refer to empty cells.
|
5751
|
+
*
|
5752
|
+
* - #LXW_IGNORE_LIST_DATA_VALIDATION: Turn off errors/warnings for cells in a
|
5753
|
+
* table that do not comply with applicable data validation rules.
|
5754
|
+
*
|
5755
|
+
* - #LXW_IGNORE_CALCULATED_COLUMN: Turn off errors/warnings for cell formulas
|
5756
|
+
* that differ from the column formula.
|
5757
|
+
*
|
5758
|
+
* - #LXW_IGNORE_TWO_DIGIT_TEXT_YEAR: Turn off errors/warnings for formulas
|
5759
|
+
* that contain a two digit text representation of a year.
|
5760
|
+
*
|
5761
|
+
*/
|
5762
|
+
lxw_error worksheet_ignore_errors(lxw_worksheet *worksheet, uint8_t type,
|
5763
|
+
const char *range);
|
5764
|
+
|
3261
5765
|
lxw_worksheet *lxw_worksheet_new(lxw_worksheet_init_data *init_data);
|
3262
5766
|
void lxw_worksheet_free(lxw_worksheet *worksheet);
|
3263
5767
|
void lxw_worksheet_assemble_xml_file(lxw_worksheet *worksheet);
|
@@ -3265,24 +5769,44 @@ void lxw_worksheet_write_single_row(lxw_worksheet *worksheet);
|
|
3265
5769
|
|
3266
5770
|
void lxw_worksheet_prepare_image(lxw_worksheet *worksheet,
|
3267
5771
|
uint32_t image_ref_id, uint32_t drawing_id,
|
3268
|
-
|
5772
|
+
lxw_object_properties *object_props);
|
5773
|
+
|
5774
|
+
void lxw_worksheet_prepare_header_image(lxw_worksheet *worksheet,
|
5775
|
+
uint32_t image_ref_id,
|
5776
|
+
lxw_object_properties *object_props);
|
5777
|
+
|
5778
|
+
void lxw_worksheet_prepare_background(lxw_worksheet *worksheet,
|
5779
|
+
uint32_t image_ref_id,
|
5780
|
+
lxw_object_properties *object_props);
|
3269
5781
|
|
3270
5782
|
void lxw_worksheet_prepare_chart(lxw_worksheet *worksheet,
|
3271
5783
|
uint32_t chart_ref_id, uint32_t drawing_id,
|
3272
|
-
|
5784
|
+
lxw_object_properties *object_props,
|
3273
5785
|
uint8_t is_chartsheet);
|
3274
5786
|
|
3275
|
-
|
3276
|
-
|
5787
|
+
uint32_t lxw_worksheet_prepare_vml_objects(lxw_worksheet *worksheet,
|
5788
|
+
uint32_t vml_data_id,
|
5789
|
+
uint32_t vml_shape_id,
|
5790
|
+
uint32_t vml_drawing_id,
|
5791
|
+
uint32_t comment_id);
|
5792
|
+
|
5793
|
+
void lxw_worksheet_prepare_header_vml_objects(lxw_worksheet *worksheet,
|
5794
|
+
uint32_t vml_header_id,
|
5795
|
+
uint32_t vml_drawing_id);
|
3277
5796
|
|
5797
|
+
void lxw_worksheet_prepare_tables(lxw_worksheet *worksheet,
|
5798
|
+
uint32_t table_id);
|
5799
|
+
|
5800
|
+
lxw_row *lxw_worksheet_find_row(lxw_worksheet *worksheet, lxw_row_t row_num);
|
5801
|
+
lxw_cell *lxw_worksheet_find_cell_in_row(lxw_row *row, lxw_col_t col_num);
|
3278
5802
|
/*
|
3279
|
-
* External functions to call intern XML
|
5803
|
+
* External functions to call intern XML functions shared with chartsheet.
|
3280
5804
|
*/
|
3281
5805
|
void lxw_worksheet_write_sheet_views(lxw_worksheet *worksheet);
|
3282
5806
|
void lxw_worksheet_write_page_margins(lxw_worksheet *worksheet);
|
3283
5807
|
void lxw_worksheet_write_drawings(lxw_worksheet *worksheet);
|
3284
5808
|
void lxw_worksheet_write_sheet_protection(lxw_worksheet *worksheet,
|
3285
|
-
|
5809
|
+
lxw_protection_obj *protect);
|
3286
5810
|
void lxw_worksheet_write_sheet_pr(lxw_worksheet *worksheet);
|
3287
5811
|
void lxw_worksheet_write_page_setup(lxw_worksheet *worksheet);
|
3288
5812
|
void lxw_worksheet_write_header_footer(lxw_worksheet *worksheet);
|
@@ -3317,8 +5841,13 @@ STATIC void _worksheet_write_print_options(lxw_worksheet *worksheet);
|
|
3317
5841
|
STATIC void _worksheet_write_sheet_pr(lxw_worksheet *worksheet);
|
3318
5842
|
STATIC void _worksheet_write_tab_color(lxw_worksheet *worksheet);
|
3319
5843
|
STATIC void _worksheet_write_sheet_protection(lxw_worksheet *worksheet,
|
3320
|
-
|
5844
|
+
lxw_protection_obj *protect);
|
3321
5845
|
STATIC void _worksheet_write_data_validations(lxw_worksheet *self);
|
5846
|
+
|
5847
|
+
STATIC double _pixels_to_height(double pixels);
|
5848
|
+
STATIC double _pixels_to_width(double pixels);
|
5849
|
+
|
5850
|
+
STATIC void _worksheet_write_auto_filter(lxw_worksheet *worksheet);
|
3322
5851
|
#endif /* TESTING */
|
3323
5852
|
|
3324
5853
|
/* *INDENT-OFF* */
|