xlsxwriter 0.0.3 → 0.0.4.pre.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/ext/xlsxwriter/libxlsxwriter/{LICENSE.txt → License.txt} +64 -3
  3. data/ext/xlsxwriter/libxlsxwriter/Makefile +42 -7
  4. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter.h +1 -1
  5. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/app.h +2 -2
  6. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/chart.h +2481 -97
  7. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/common.h +41 -2
  8. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/core.h +1 -1
  9. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/format.h +5 -5
  10. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/packager.h +8 -3
  11. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/styles.h +1 -1
  12. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/utility.h +1 -0
  13. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/workbook.h +2 -2
  14. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/worksheet.h +381 -1
  15. data/ext/xlsxwriter/libxlsxwriter/src/Makefile +25 -5
  16. data/ext/xlsxwriter/libxlsxwriter/src/app.c +17 -13
  17. data/ext/xlsxwriter/libxlsxwriter/src/chart.c +3903 -976
  18. data/ext/xlsxwriter/libxlsxwriter/src/content_types.c +18 -14
  19. data/ext/xlsxwriter/libxlsxwriter/src/core.c +9 -9
  20. data/ext/xlsxwriter/libxlsxwriter/src/format.c +2 -2
  21. data/ext/xlsxwriter/libxlsxwriter/src/packager.c +179 -95
  22. data/ext/xlsxwriter/libxlsxwriter/src/relationships.c +11 -8
  23. data/ext/xlsxwriter/libxlsxwriter/src/shared_strings.c +2 -0
  24. data/ext/xlsxwriter/libxlsxwriter/src/styles.c +10 -8
  25. data/ext/xlsxwriter/libxlsxwriter/src/utility.c +18 -1
  26. data/ext/xlsxwriter/libxlsxwriter/src/workbook.c +41 -25
  27. data/ext/xlsxwriter/libxlsxwriter/src/worksheet.c +672 -42
  28. data/ext/xlsxwriter/libxlsxwriter/third_party/minizip/Makefile +6 -1
  29. data/lib/xlsxwriter/version.rb +1 -1
  30. data/lib/xlsxwriter/worksheet.rb +11 -5
  31. metadata +6 -6
@@ -16,8 +16,8 @@
16
16
  #define __LXW_COMMON_H__
17
17
 
18
18
  #include <time.h>
19
- #include "xlsxwriter/third_party/queue.h"
20
- #include "xlsxwriter/third_party/tree.h"
19
+ #include "third_party/queue.h"
20
+ #include "third_party/tree.h"
21
21
 
22
22
  #ifndef TESTING
23
23
  #define STATIC static
@@ -89,6 +89,9 @@ typedef enum lxw_error {
89
89
  /** Worksheet name is already in use. */
90
90
  LXW_ERROR_SHEETNAME_ALREADY_USED,
91
91
 
92
+ /** Parameter exceeds Excel's limit of 32 characters. */
93
+ LXW_ERROR_32_STRING_LENGTH_EXCEEDED,
94
+
92
95
  /** Parameter exceeds Excel's limit of 128 characters. */
93
96
  LXW_ERROR_128_STRING_LENGTH_EXCEEDED,
94
97
 
@@ -223,6 +226,42 @@ enum lxw_custom_property_types {
223
226
  #define LXW_WARN_FORMAT2(message, var1, var2) \
224
227
  fprintf(stderr, "[WARNING]: " message "\n", var1, var2)
225
228
 
229
+ /* Chart axis type checks. */
230
+ #define LXW_WARN_CAT_AXIS_ONLY(function) \
231
+ if (!axis->is_category) { \
232
+ fprintf(stderr, "[WARNING]: " \
233
+ function "() is only valid for category axes\n"); \
234
+ return; \
235
+ }
236
+
237
+ #define LXW_WARN_VALUE_AXIS_ONLY(function) \
238
+ if (!axis->is_value) { \
239
+ fprintf(stderr, "[WARNING]: " \
240
+ function "() is only valid for value axes\n"); \
241
+ return; \
242
+ }
243
+
244
+ #define LXW_WARN_DATE_AXIS_ONLY(function) \
245
+ if (!axis->is_date) { \
246
+ fprintf(stderr, "[WARNING]: " \
247
+ function "() is only valid for date axes\n"); \
248
+ return; \
249
+ }
250
+
251
+ #define LXW_WARN_CAT_AND_DATE_AXIS_ONLY(function) \
252
+ if (!axis->is_category && !axis->is_date) { \
253
+ fprintf(stderr, "[WARNING]: " \
254
+ function "() is only valid for category and date axes\n"); \
255
+ return; \
256
+ }
257
+
258
+ #define LXW_WARN_VALUE_AND_DATE_AXIS_ONLY(function) \
259
+ if (!axis->is_value && !axis->is_date) { \
260
+ fprintf(stderr, "[WARNING]: " \
261
+ function "() is only valid for value and date axes\n"); \
262
+ return; \
263
+ }
264
+
226
265
  #ifndef LXW_BIG_ENDIAN
227
266
  #define LXW_UINT32_NETWORK(n) ((((n) & 0xFF) << 24) | \
228
267
  (((n) & 0xFF00) << 8) | \
@@ -11,7 +11,7 @@
11
11
 
12
12
  #include <stdint.h>
13
13
 
14
- #include "xlsxwriter/workbook.h"
14
+ #include "workbook.h"
15
15
  #include "common.h"
16
16
 
17
17
  /*
@@ -81,8 +81,8 @@ typedef int32_t lxw_color_t;
81
81
  #define LXW_PROPERTY_UNSET -1
82
82
  #define LXW_COLOR_UNSET -1
83
83
  #define LXW_COLOR_MASK 0xFFFFFF
84
- #define LXW_MIN_FONT_SIZE 1
85
- #define LXW_MAX_FONT_SIZE 409
84
+ #define LXW_MIN_FONT_SIZE 1.0
85
+ #define LXW_MAX_FONT_SIZE 409.0
86
86
 
87
87
  #define LXW_FORMAT_FIELD_COPY(dst, src) \
88
88
  do{ \
@@ -360,7 +360,7 @@ typedef struct lxw_format {
360
360
  uint16_t font_index;
361
361
  uint8_t has_font;
362
362
  uint8_t has_dxf_font;
363
- uint16_t font_size;
363
+ double font_size;
364
364
  uint8_t bold;
365
365
  uint8_t italic;
366
366
  lxw_color_t font_color;
@@ -427,7 +427,7 @@ typedef struct lxw_format {
427
427
  typedef struct lxw_font {
428
428
 
429
429
  char font_name[LXW_FORMAT_FIELD_LEN];
430
- uint16_t font_size;
430
+ double font_size;
431
431
  uint8_t bold;
432
432
  uint8_t italic;
433
433
  uint8_t underline;
@@ -529,7 +529,7 @@ void format_set_font_name(lxw_format *format, const char *font_name);
529
529
  * size in the row. You can also explicitly specify the height of a
530
530
  * row using the worksheet_set_row() function.
531
531
  */
532
- void format_set_font_size(lxw_format *format, uint16_t size);
532
+ void format_set_font_size(lxw_format *format, double size);
533
533
 
534
534
  /**
535
535
  * @brief Set the color of the font used in the cell.
@@ -10,7 +10,12 @@
10
10
  #define __LXW_PACKAGER_H__
11
11
 
12
12
  #include <stdint.h>
13
- #include "xlsxwriter/third_party/zip.h"
13
+
14
+ #ifdef USE_SYSTEM_MINIZIP
15
+ #include "minizip/zip.h"
16
+ #else
17
+ #include "third_party/zip.h"
18
+ #endif
14
19
 
15
20
  #include "common.h"
16
21
  #include "workbook.h"
@@ -27,7 +32,7 @@
27
32
 
28
33
  #define LXW_ZIP_BUFFER_SIZE (16384)
29
34
 
30
- /* * If zlib returns Z_ERRNO then errno is set and we can trap that. Otherwise
35
+ /* If zlib returns Z_ERRNO then errno is set and we can trap that. Otherwise
31
36
  * return a default libxlsxwriter error. */
32
37
  #define RETURN_ON_ZIP_ERROR(err, default_err) \
33
38
  if (err == Z_ERRNO) \
@@ -64,7 +69,7 @@ extern "C" {
64
69
 
65
70
  lxw_packager *lxw_packager_new(const char *filename, char *tmpdir);
66
71
  void lxw_packager_free(lxw_packager *packager);
67
- uint8_t lxw_create_package(lxw_packager *self);
72
+ lxw_error lxw_create_package(lxw_packager *self);
68
73
 
69
74
  /* Declarations required for unit testing. */
70
75
  #ifdef TESTING
@@ -46,7 +46,7 @@ void lxw_styles_assemble_xml_file(lxw_styles *self);
46
46
 
47
47
  STATIC void _styles_xml_declaration(lxw_styles *self);
48
48
  STATIC void _write_style_sheet(lxw_styles *self);
49
- STATIC void _write_font_size(lxw_styles *self, uint16_t font_size);
49
+ STATIC void _write_font_size(lxw_styles *self, double font_size);
50
50
  STATIC void _write_font_color_theme(lxw_styles *self, uint8_t theme);
51
51
  STATIC void _write_font_name(lxw_styles *self, const char *font_name);
52
52
  STATIC void _write_font_family(lxw_styles *self, uint8_t font_family);
@@ -145,6 +145,7 @@ uint16_t lxw_name_to_col_2(const char *col_str);
145
145
  double lxw_datetime_to_excel_date(lxw_datetime *datetime, uint8_t date_1904);
146
146
 
147
147
  char *lxw_strdup(const char *str);
148
+ char *lxw_strdup_formula(const char *formula);
148
149
 
149
150
  size_t lxw_utf8_strlen(const char *str);
150
151
 
@@ -671,8 +671,8 @@ lxw_error workbook_define_name(lxw_workbook *workbook, const char *name,
671
671
  /**
672
672
  * @brief Get a worksheet object from its name.
673
673
  *
674
- * @param workbook
675
- * @param name
674
+ * @param workbook Pointer to a lxw_workbook instance.
675
+ * @param name Worksheet name.
676
676
  *
677
677
  * @return A lxw_worksheet object.
678
678
  *
@@ -76,14 +76,131 @@
76
76
  enum lxw_gridlines {
77
77
  /** Hide screen and print gridlines. */
78
78
  LXW_HIDE_ALL_GRIDLINES = 0,
79
+
79
80
  /** Show screen gridlines. */
80
81
  LXW_SHOW_SCREEN_GRIDLINES,
82
+
81
83
  /** Show print gridlines. */
82
84
  LXW_SHOW_PRINT_GRIDLINES,
85
+
83
86
  /** Show screen and print gridlines. */
84
87
  LXW_SHOW_ALL_GRIDLINES
85
88
  };
86
89
 
90
+ /** Data validation property values. */
91
+ enum lxw_validation_boolean {
92
+ LXW_VALIDATION_DEFAULT,
93
+
94
+ /** Turn a data validation property off. */
95
+ LXW_VALIDATION_OFF,
96
+
97
+ /** Turn a data validation property on. Data validation properties are
98
+ * generally on by default. */
99
+ LXW_VALIDATION_ON
100
+ };
101
+
102
+ /** Data validation types. */
103
+ enum lxw_validation_types {
104
+ LXW_VALIDATION_TYPE_NONE,
105
+
106
+ /** Restrict cell input to whole/integer numbers only. */
107
+ LXW_VALIDATION_TYPE_INTEGER,
108
+
109
+ /** Restrict cell input to whole/integer numbers only, using a cell
110
+ * reference. */
111
+ LXW_VALIDATION_TYPE_INTEGER_FORMULA,
112
+
113
+ /** Restrict cell input to decimal numbers only. */
114
+ LXW_VALIDATION_TYPE_DECIMAL,
115
+
116
+ /** Restrict cell input to decimal numbers only, using a cell
117
+ * reference. */
118
+ LXW_VALIDATION_TYPE_DECIMAL_FORMULA,
119
+
120
+ /** Restrict cell input to a list of strings in a dropdown. */
121
+ LXW_VALIDATION_TYPE_LIST,
122
+
123
+ /** Restrict cell input to a list of strings in a dropdown, using a
124
+ * cell range. */
125
+ LXW_VALIDATION_TYPE_LIST_FORMULA,
126
+
127
+ /** Restrict cell input to date values only, using a lxw_datetime type. */
128
+ LXW_VALIDATION_TYPE_DATE,
129
+
130
+ /** Restrict cell input to date values only, using a cell reference. */
131
+ LXW_VALIDATION_TYPE_DATE_FORMULA,
132
+
133
+ /* Restrict cell input to date values only, as a serial number.
134
+ * Undocumented. */
135
+ LXW_VALIDATION_TYPE_DATE_NUMBER,
136
+
137
+ /** Restrict cell input to time values only, using a lxw_datetime type. */
138
+ LXW_VALIDATION_TYPE_TIME,
139
+
140
+ /** Restrict cell input to time values only, using a cell reference. */
141
+ LXW_VALIDATION_TYPE_TIME_FORMULA,
142
+
143
+ /* Restrict cell input to time values only, as a serial number.
144
+ * Undocumented. */
145
+ LXW_VALIDATION_TYPE_TIME_NUMBER,
146
+
147
+ /** Restrict cell input to strings of defined length, using a cell
148
+ * reference. */
149
+ LXW_VALIDATION_TYPE_LENGTH,
150
+
151
+ /** Restrict cell input to strings of defined length, using a cell
152
+ * reference. */
153
+ LXW_VALIDATION_TYPE_LENGTH_FORMULA,
154
+
155
+ /** Restrict cell to input controlled by a custom formula that returns
156
+ * `TRUE/FALSE`. */
157
+ LXW_VALIDATION_TYPE_CUSTOM_FORMULA,
158
+
159
+ /** Allow any type of input. Mainly only useful for pop-up messages. */
160
+ LXW_VALIDATION_TYPE_ANY
161
+ };
162
+
163
+ /** Data validation criteria uses to control the selection of data. */
164
+ enum lxw_validation_criteria {
165
+ LXW_VALIDATION_CRITERIA_NONE,
166
+
167
+ /** Select data between two values. */
168
+ LXW_VALIDATION_CRITERIA_BETWEEN,
169
+
170
+ /** Select data that is not between two values. */
171
+ LXW_VALIDATION_CRITERIA_NOT_BETWEEN,
172
+
173
+ /** Select data equal to a value. */
174
+ LXW_VALIDATION_CRITERIA_EQUAL_TO,
175
+
176
+ /** Select data not equal to a value. */
177
+ LXW_VALIDATION_CRITERIA_NOT_EQUAL_TO,
178
+
179
+ /** Select data greater than a value. */
180
+ LXW_VALIDATION_CRITERIA_GREATER_THAN,
181
+
182
+ /** Select data less than a value. */
183
+ LXW_VALIDATION_CRITERIA_LESS_THAN,
184
+
185
+ /** Select data greater than or equal to a value. */
186
+ LXW_VALIDATION_CRITERIA_GREATER_THAN_OR_EQUAL_TO,
187
+
188
+ /** Select data less than or equal to a value. */
189
+ LXW_VALIDATION_CRITERIA_LESS_THAN_OR_EQUAL_TO
190
+ };
191
+
192
+ /** Data validation error types for pop-up messages. */
193
+ enum lxw_validation_error_types {
194
+ /** Show a "Stop" data validation pop-up message. This is the default. */
195
+ LXW_VALIDATION_ERROR_TYPE_STOP,
196
+
197
+ /** Show an "Error" data validation pop-up message. */
198
+ LXW_VALIDATION_ERROR_TYPE_WARNING,
199
+
200
+ /** Show an "Information" data validation pop-up message. */
201
+ LXW_VALIDATION_ERROR_TYPE_INFORMATION
202
+ };
203
+
87
204
  enum cell_types {
88
205
  NUMBER_CELL = 1,
89
206
  STRING_CELL,
@@ -140,6 +257,7 @@ struct lxw_table_rows {
140
257
 
141
258
  STAILQ_HEAD(lxw_merged_ranges, lxw_merged_range);
142
259
  STAILQ_HEAD(lxw_selections, lxw_selection);
260
+ STAILQ_HEAD(lxw_data_validations, lxw_data_validation);
143
261
  STAILQ_HEAD(lxw_image_data, lxw_image_options);
144
262
  STAILQ_HEAD(lxw_chart_data, lxw_image_options);
145
263
 
@@ -229,6 +347,180 @@ typedef struct lxw_selection {
229
347
 
230
348
  } lxw_selection;
231
349
 
350
+ /**
351
+ * @brief Worksheet data validation options.
352
+ */
353
+ typedef struct lxw_data_validation {
354
+
355
+ /**
356
+ * Set the validation type. Should be a #lxw_validation_types value.
357
+ */
358
+ uint8_t validate;
359
+
360
+ /**
361
+ * Set the validation criteria type to select the data. Should be a
362
+ * #lxw_validation_criteria value.
363
+ */
364
+ uint8_t criteria;
365
+
366
+ /** Controls whether a data validation is not applied to blank data in the
367
+ * cell. Should be a #lxw_validation_boolean value. It is on by
368
+ * default.
369
+ */
370
+ uint8_t ignore_blank;
371
+
372
+ /**
373
+ * This parameter is used to toggle on and off the 'Show input message
374
+ * when cell is selected' option in the Excel data validation dialog. When
375
+ * the option is off an input message is not displayed even if it has been
376
+ * set using input_message. Should be a #lxw_validation_boolean value. It
377
+ * is on by default.
378
+ */
379
+ uint8_t show_input;
380
+
381
+ /**
382
+ * This parameter is used to toggle on and off the 'Show error alert
383
+ * after invalid data is entered' option in the Excel data validation
384
+ * dialog. When the option is off an error message is not displayed even
385
+ * if it has been set using error_message. Should be a
386
+ * #lxw_validation_boolean value. It is on by default.
387
+ */
388
+ uint8_t show_error;
389
+
390
+ /**
391
+ * This parameter is used to specify the type of error dialog that is
392
+ * displayed. Should be a #lxw_validation_error_types value.
393
+ */
394
+ uint8_t error_type;
395
+
396
+ /**
397
+ * This parameter is used to toggle on and off the 'In-cell dropdown'
398
+ * option in the Excel data validation dialog. When the option is on a
399
+ * dropdown list will be shown for list validations. Should be a
400
+ * #lxw_validation_boolean value. It is on by default.
401
+ */
402
+ uint8_t dropdown;
403
+
404
+ uint8_t is_between;
405
+
406
+ /**
407
+ * This parameter is used to set the limiting value to which the criteria
408
+ * is applied using a whole or decimal number.
409
+ */
410
+ double value_number;
411
+
412
+ /**
413
+ * This parameter is used to set the limiting value to which the criteria
414
+ * is applied using a cell reference. It is valid for any of the
415
+ * `_FORMULA` validation types.
416
+ */
417
+ char *value_formula;
418
+
419
+ /**
420
+ * This parameter is used to set a list of strings for a drop down list.
421
+ * The list should be a `NULL` terminated array of char* strings:
422
+ *
423
+ * @code
424
+ * char *list[] = {"open", "high", "close", NULL};
425
+ *
426
+ * data_validation->validate = LXW_VALIDATION_TYPE_LIST;
427
+ * data_validation->value_list = list;
428
+ * @endcode
429
+ *
430
+ * The `value_formula` parameter can also be used to specify a list from
431
+ * an Excel cell range.
432
+ *
433
+ * Note, the string list is restricted by Excel to 255 characters,
434
+ * including comma separators.
435
+ */
436
+ char **value_list;
437
+
438
+ /**
439
+ * This parameter is used to set the limiting value to which the date or
440
+ * time criteria is applied using a #lxw_datetime struct.
441
+ */
442
+ lxw_datetime value_datetime;
443
+
444
+ /**
445
+ * This parameter is the same as `value_number` but for the minimum value
446
+ * when a `BETWEEN` criteria is used.
447
+ */
448
+ double minimum_number;
449
+
450
+ /**
451
+ * This parameter is the same as `value_formula` but for the minimum value
452
+ * when a `BETWEEN` criteria is used.
453
+ */
454
+ char *minimum_formula;
455
+
456
+ /**
457
+ * This parameter is the same as `value_datetime` but for the minimum value
458
+ * when a `BETWEEN` criteria is used.
459
+ */
460
+ lxw_datetime minimum_datetime;
461
+
462
+ /**
463
+ * This parameter is the same as `value_number` but for the maximum value
464
+ * when a `BETWEEN` criteria is used.
465
+ */
466
+ double maximum_number;
467
+
468
+ /**
469
+ * This parameter is the same as `value_formula` but for the maximum value
470
+ * when a `BETWEEN` criteria is used.
471
+ */
472
+ char *maximum_formula;
473
+
474
+ /**
475
+ * This parameter is the same as `value_datetime` but for the maximum value
476
+ * when a `BETWEEN` criteria is used.
477
+ */
478
+ lxw_datetime maximum_datetime;
479
+
480
+ /**
481
+ * The input_title parameter is used to set the title of the input message
482
+ * that is displayed when a cell is entered. It has no default value and
483
+ * is only displayed if the input message is displayed. See the
484
+ * `input_message` parameter below.
485
+ *
486
+ * The maximum title length is 32 characters.
487
+ */
488
+ char *input_title;
489
+
490
+ /**
491
+ * The input_message parameter is used to set the input message that is
492
+ * displayed when a cell is entered. It has no default value.
493
+ *
494
+ * The message can be split over several lines using newlines. The maximum
495
+ * message length is 255 characters.
496
+ */
497
+ char *input_message;
498
+
499
+ /**
500
+ * The error_title parameter is used to set the title of the error message
501
+ * that is displayed when the data validation criteria is not met. The
502
+ * default error title is 'Microsoft Excel'. The maximum title length is
503
+ * 32 characters.
504
+ */
505
+ char *error_title;
506
+
507
+ /**
508
+ * The error_message parameter is used to set the error message that is
509
+ * displayed when a cell is entered. The default error message is "The
510
+ * value you entered is not valid. A user has restricted values that can
511
+ * be entered into the cell".
512
+ *
513
+ * The message can be split over several lines using newlines. The maximum
514
+ * message length is 255 characters.
515
+ */
516
+ char *error_message;
517
+
518
+ char sqref[LXW_MAX_CELL_RANGE_LENGTH];
519
+
520
+ STAILQ_ENTRY (lxw_data_validation) list_pointers;
521
+
522
+ } lxw_data_validation;
523
+
232
524
  /**
233
525
  * @brief Options for inserted images
234
526
  *
@@ -354,6 +646,7 @@ typedef struct lxw_worksheet {
354
646
  struct lxw_cell **array;
355
647
  struct lxw_merged_ranges *merged_ranges;
356
648
  struct lxw_selections *selections;
649
+ struct lxw_data_validations *data_validations;
357
650
  struct lxw_image_data *image_data;
358
651
  struct lxw_chart_data *chart_data;
359
652
 
@@ -416,6 +709,7 @@ typedef struct lxw_worksheet {
416
709
  uint8_t vba_codename;
417
710
  uint8_t vcenter;
418
711
  uint8_t zoom_scale_normal;
712
+ uint8_t num_validations;
419
713
 
420
714
  lxw_color_t tab_color;
421
715
 
@@ -561,6 +855,10 @@ extern "C" {
561
855
  *
562
856
  * @image html write_number02.png
563
857
  *
858
+ * @note Excel doesn't support `NaN`, `Inf` or `-Inf` as a number value. If
859
+ * you are writing data that contains these values then your application
860
+ * should convert them to a string or handle them in some other way.
861
+ *
564
862
  */
565
863
  lxw_error worksheet_write_number(lxw_worksheet *worksheet,
566
864
  lxw_row_t row,
@@ -669,7 +967,7 @@ lxw_error worksheet_write_formula(lxw_worksheet *worksheet,
669
967
  /**
670
968
  * @brief Write an array formula to a worksheet cell.
671
969
  *
672
- * @param worksheet
970
+ * @param worksheet pointer to a lxw_worksheet instance to be updated.
673
971
  * @param first_row The first row of the range. (All zero indexed.)
674
972
  * @param first_col The first column of the range.
675
973
  * @param last_row The last row of the range.
@@ -1470,6 +1768,87 @@ lxw_error worksheet_autofilter(lxw_worksheet *worksheet, lxw_row_t first_row,
1470
1768
  lxw_col_t first_col, lxw_row_t last_row,
1471
1769
  lxw_col_t last_col);
1472
1770
 
1771
+ /**
1772
+ * @brief Add a data validation to a cell.
1773
+ *
1774
+ * @param worksheet Pointer to a lxw_worksheet instance to be updated.
1775
+ * @param row The zero indexed row number.
1776
+ * @param col The zero indexed column number.
1777
+ * @param validation A #lxw_data_validation object to control the validation.
1778
+ *
1779
+ * @return A #lxw_error code.
1780
+ *
1781
+ * The `%worksheet_data_validation_cell()` function is used to construct an
1782
+ * Excel data validation or to limit the user input to a dropdown list of
1783
+ * values:
1784
+ *
1785
+ * @code
1786
+ *
1787
+ * lxw_data_validation *data_validation = calloc(1, sizeof(lxw_data_validation));
1788
+ *
1789
+ * data_validation->validate = LXW_VALIDATION_TYPE_INTEGER;
1790
+ * data_validation->criteria = LXW_VALIDATION_CRITERIA_BETWEEN;
1791
+ * data_validation->minimum_number = 1;
1792
+ * data_validation->maximum_number = 10;
1793
+ *
1794
+ * worksheet_data_validation_cell(worksheet, 2, 1, data_validation);
1795
+ *
1796
+ * // Same as above with the CELL() macro.
1797
+ * worksheet_data_validation_cell(worksheet, CELL("B3"), data_validation);
1798
+ *
1799
+ * @endcode
1800
+ *
1801
+ * @image html data_validate4.png
1802
+ *
1803
+ * Data validation and the various options of #lxw_data_validation are
1804
+ * described in more detail in @ref working_with_data_validation.
1805
+ */
1806
+ lxw_error worksheet_data_validation_cell(lxw_worksheet *worksheet,
1807
+ lxw_row_t row, lxw_col_t col,
1808
+ lxw_data_validation *validation);
1809
+
1810
+ /**
1811
+ * @brief Add a data validation to a range cell.
1812
+ *
1813
+ * @param worksheet Pointer to a lxw_worksheet instance to be updated.
1814
+ * @param first_row The first row of the range. (All zero indexed.)
1815
+ * @param first_col The first column of the range.
1816
+ * @param last_row The last row of the range.
1817
+ * @param last_col The last col of the range.
1818
+ * @param validation A #lxw_data_validation object to control the validation.
1819
+ *
1820
+ * @return A #lxw_error code.
1821
+ *
1822
+ * The `%worksheet_data_validation_range()` function is the same as the
1823
+ * `%worksheet_data_validation_cell()`, see above, except the data validation
1824
+ * is applied to a range of cells:
1825
+ *
1826
+ * @code
1827
+ *
1828
+ * lxw_data_validation *data_validation = calloc(1, sizeof(lxw_data_validation));
1829
+ *
1830
+ * data_validation->validate = LXW_VALIDATION_TYPE_INTEGER;
1831
+ * data_validation->criteria = LXW_VALIDATION_CRITERIA_BETWEEN;
1832
+ * data_validation->minimum_number = 1;
1833
+ * data_validation->maximum_number = 10;
1834
+ *
1835
+ * worksheet_data_validation_range(worksheet, 2, 1, 4, 1, data_validation);
1836
+ *
1837
+ * // Same as above with the RANGE() macro.
1838
+ * worksheet_data_validation_range(worksheet, RANGE("B3:B5"), data_validation);
1839
+ *
1840
+ * @endcode
1841
+ *
1842
+ * Data validation and the various options of #lxw_data_validation are
1843
+ * described in more detail in @ref working_with_data_validation.
1844
+ */
1845
+ lxw_error worksheet_data_validation_range(lxw_worksheet *worksheet,
1846
+ lxw_row_t first_row,
1847
+ lxw_col_t first_col,
1848
+ lxw_row_t last_row,
1849
+ lxw_col_t last_col,
1850
+ lxw_data_validation *validation);
1851
+
1473
1852
  /**
1474
1853
  * @brief Make a worksheet the active, i.e., visible worksheet.
1475
1854
  *
@@ -2630,6 +3009,7 @@ STATIC void _worksheet_write_print_options(lxw_worksheet *worksheet);
2630
3009
  STATIC void _worksheet_write_sheet_pr(lxw_worksheet *worksheet);
2631
3010
  STATIC void _worksheet_write_tab_color(lxw_worksheet *worksheet);
2632
3011
  STATIC void _worksheet_write_sheet_protection(lxw_worksheet *worksheet);
3012
+ STATIC void _worksheet_write_data_validations(lxw_worksheet *self);
2633
3013
  #endif /* TESTING */
2634
3014
 
2635
3015
  /* *INDENT-OFF* */