fast_excel 0.2.3 → 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.travis.yml +4 -0
  4. data/CHANGELOG.md +9 -0
  5. data/Gemfile.lock +16 -16
  6. data/README.md +1 -1
  7. data/Rakefile +1 -1
  8. data/fast_excel.gemspec +1 -1
  9. data/lib/fast_excel.rb +21 -5
  10. data/lib/fast_excel/binding/format.rb +3 -3
  11. data/libxlsxwriter/.drone.yml +27 -0
  12. data/libxlsxwriter/.indent.pro +3 -0
  13. data/libxlsxwriter/.travis.yml +12 -0
  14. data/libxlsxwriter/CMakeLists.txt +348 -0
  15. data/libxlsxwriter/Changes.txt +78 -0
  16. data/libxlsxwriter/LICENSE.txt +65 -4
  17. data/libxlsxwriter/Makefile +27 -7
  18. data/libxlsxwriter/Readme.md +2 -0
  19. data/libxlsxwriter/appveyor.yml +65 -0
  20. data/libxlsxwriter/cmake/FindMINIZIP.cmake +121 -0
  21. data/libxlsxwriter/cmake/FindPackage.cmake +183 -0
  22. data/libxlsxwriter/cmake/FindZLIB.cmake +123 -0
  23. data/libxlsxwriter/cmake/i686-toolchain.cmake +7 -0
  24. data/libxlsxwriter/cocoapods/libxlsxwriter-umbrella.h +1 -1
  25. data/libxlsxwriter/cocoapods/libxlsxwriter.modulemap +2 -2
  26. data/libxlsxwriter/include/xlsxwriter.h +2 -2
  27. data/libxlsxwriter/include/xlsxwriter/app.h +1 -1
  28. data/libxlsxwriter/include/xlsxwriter/chart.h +109 -8
  29. data/libxlsxwriter/include/xlsxwriter/common.h +10 -2
  30. data/libxlsxwriter/include/xlsxwriter/content_types.h +1 -1
  31. data/libxlsxwriter/include/xlsxwriter/core.h +1 -1
  32. data/libxlsxwriter/include/xlsxwriter/custom.h +1 -1
  33. data/libxlsxwriter/include/xlsxwriter/drawing.h +1 -1
  34. data/libxlsxwriter/include/xlsxwriter/format.h +6 -6
  35. data/libxlsxwriter/include/xlsxwriter/hash_table.h +1 -1
  36. data/libxlsxwriter/include/xlsxwriter/packager.h +6 -1
  37. data/libxlsxwriter/include/xlsxwriter/relationships.h +1 -1
  38. data/libxlsxwriter/include/xlsxwriter/shared_strings.h +1 -1
  39. data/libxlsxwriter/include/xlsxwriter/styles.h +2 -2
  40. data/libxlsxwriter/include/xlsxwriter/theme.h +1 -1
  41. data/libxlsxwriter/include/xlsxwriter/utility.h +11 -5
  42. data/libxlsxwriter/include/xlsxwriter/workbook.h +3 -3
  43. data/libxlsxwriter/include/xlsxwriter/worksheet.h +517 -39
  44. data/libxlsxwriter/include/xlsxwriter/xmlwriter.h +2 -2
  45. data/libxlsxwriter/libxlsxwriter.podspec +4 -2
  46. data/libxlsxwriter/src/Makefile +30 -5
  47. data/libxlsxwriter/src/app.c +1 -1
  48. data/libxlsxwriter/src/chart.c +76 -19
  49. data/libxlsxwriter/src/content_types.c +1 -1
  50. data/libxlsxwriter/src/core.c +10 -10
  51. data/libxlsxwriter/src/custom.c +2 -2
  52. data/libxlsxwriter/src/drawing.c +1 -1
  53. data/libxlsxwriter/src/format.c +3 -3
  54. data/libxlsxwriter/src/hash_table.c +1 -1
  55. data/libxlsxwriter/src/packager.c +20 -7
  56. data/libxlsxwriter/src/relationships.c +1 -1
  57. data/libxlsxwriter/src/shared_strings.c +1 -1
  58. data/libxlsxwriter/src/styles.c +4 -4
  59. data/libxlsxwriter/src/theme.c +1 -1
  60. data/libxlsxwriter/src/utility.c +41 -1
  61. data/libxlsxwriter/src/workbook.c +8 -6
  62. data/libxlsxwriter/src/worksheet.c +748 -31
  63. data/libxlsxwriter/src/xmlwriter.c +2 -2
  64. data/libxlsxwriter/third_party/minizip/Makefile +6 -1
  65. data/libxlsxwriter/version.txt +1 -1
  66. data/test/reopen_test.rb +22 -0
  67. data/test/test_helper.rb +8 -5
  68. data/test/validations_test.rb +27 -0
  69. metadata +11 -2
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * libxlsxwriter
3
3
  *
4
- * Copyright 2014-2017, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
4
+ * Copyright 2014-2018, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
5
5
  */
6
6
 
7
7
  /**
@@ -9,7 +9,7 @@
9
9
  *
10
10
  * @brief Common functions and defines for the libxlsxwriter library.
11
11
  *
12
- * <!-- Copyright 2014-2017, John McNamara, jmcnamara@cpan.org -->
12
+ * <!-- Copyright 2014-2018, John McNamara, jmcnamara@cpan.org -->
13
13
  *
14
14
  */
15
15
  #ifndef __LXW_COMMON_H__
@@ -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
 
@@ -265,9 +268,14 @@ enum lxw_custom_property_types {
265
268
  (((n) & 0xFF0000) >> 8) | \
266
269
  (((n) & 0xFF000000) >> 24))
267
270
  #define LXW_UINT16_NETWORK(n) ((((n) & 0x00FF) << 8) | (((n) & 0xFF00) >> 8))
271
+ #define LXW_UINT32_HOST(n) (n)
268
272
  #else
269
273
  #define LXW_UINT32_NETWORK(n) (n)
270
274
  #define LXW_UINT16_NETWORK(n) (n)
275
+ #define LXW_UINT32_HOST(n) ((((n) & 0xFF) << 24) | \
276
+ (((n) & 0xFF00) << 8) | \
277
+ (((n) & 0xFF0000) >> 8) | \
278
+ (((n) & 0xFF000000) >> 24))
271
279
  #endif
272
280
 
273
281
  /* *INDENT-OFF* */
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * libxlsxwriter
3
3
  *
4
- * Copyright 2014-2017, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
4
+ * Copyright 2014-2018, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
5
5
  *
6
6
  * content_types - A libxlsxwriter library for creating Excel XLSX
7
7
  * content_types files.
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * libxlsxwriter
3
3
  *
4
- * Copyright 2014-2017, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
4
+ * Copyright 2014-2018, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
5
5
  *
6
6
  * core - A libxlsxwriter library for creating Excel XLSX core files.
7
7
  *
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * libxlsxwriter
3
3
  *
4
- * Copyright 2014-2017, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
4
+ * Copyright 2014-2018, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
5
5
  *
6
6
  * custom - A libxlsxwriter library for creating Excel custom property files.
7
7
  *
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * libxlsxwriter
3
3
  *
4
- * Copyright 2014-2017, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
4
+ * Copyright 2014-2018, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
5
5
  *
6
6
  * drawing - A libxlsxwriter library for creating Excel XLSX drawing files.
7
7
  *
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * libxlsxwriter
3
3
  *
4
- * Copyright 2014-2017, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
4
+ * Copyright 2014-2018, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
5
5
  */
6
6
 
7
7
  /**
@@ -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.
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * libxlsxwriter
3
3
  *
4
- * Copyright 2014-2017, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
4
+ * Copyright 2014-2018, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
5
5
  *
6
6
  * hash_table - Hash table functions for libxlsxwriter.
7
7
  *
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * libxlsxwriter
3
3
  *
4
- * Copyright 2014-2017, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
4
+ * Copyright 2014-2018, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
5
5
  *
6
6
  * packager - A libxlsxwriter library for creating Excel XLSX packager files.
7
7
  *
@@ -10,7 +10,12 @@
10
10
  #define __LXW_PACKAGER_H__
11
11
 
12
12
  #include <stdint.h>
13
+
14
+ #ifdef USE_SYSTEM_MINIZIP
15
+ #include "minizip/zip.h"
16
+ #else
13
17
  #include "third_party/zip.h"
18
+ #endif
14
19
 
15
20
  #include "common.h"
16
21
  #include "workbook.h"
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * libxlsxwriter
3
3
  *
4
- * Copyright 2014-2017, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
4
+ * Copyright 2014-2018, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
5
5
  *
6
6
  * relationships - A libxlsxwriter library for creating Excel XLSX
7
7
  * relationships files.
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * libxlsxwriter
3
3
  *
4
- * Copyright 2014-2017, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
4
+ * Copyright 2014-2018, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
5
5
  *
6
6
  * shared_strings - A libxlsxwriter library for creating Excel XLSX
7
7
  * sst files.
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * libxlsxwriter
3
3
  *
4
- * Copyright 2014-2017, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
4
+ * Copyright 2014-2018, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
5
5
  *
6
6
  * styles - A libxlsxwriter library for creating Excel XLSX styles files.
7
7
  *
@@ -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);
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * libxlsxwriter
3
3
  *
4
- * Copyright 2014-2017, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
4
+ * Copyright 2014-2018, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
5
5
  *
6
6
  * theme - A libxlsxwriter library for creating Excel XLSX theme files.
7
7
  *
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * libxlsxwriter
3
3
  *
4
- * Copyright 2014-2017, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
4
+ * Copyright 2014-2018, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
5
5
  */
6
6
 
7
7
  /**
@@ -9,7 +9,7 @@
9
9
  *
10
10
  * @brief Utility functions for libxlsxwriter.
11
11
  *
12
- * <!-- Copyright 2014-2017, John McNamara, jmcnamara@cpan.org -->
12
+ * <!-- Copyright 2014-2018, John McNamara, jmcnamara@cpan.org -->
13
13
  *
14
14
  */
15
15
 
@@ -18,6 +18,7 @@
18
18
 
19
19
  #include <stdint.h>
20
20
  #include "common.h"
21
+ #include "xmlwriter.h"
21
22
 
22
23
  /**
23
24
  * @brief Convert an Excel `A1` cell string into a `(row, col)` pair.
@@ -145,6 +146,7 @@ uint16_t lxw_name_to_col_2(const char *col_str);
145
146
  double lxw_datetime_to_excel_date(lxw_datetime *datetime, uint8_t date_1904);
146
147
 
147
148
  char *lxw_strdup(const char *str);
149
+ char *lxw_strdup_formula(const char *formula);
148
150
 
149
151
  size_t lxw_utf8_strlen(const char *str);
150
152
 
@@ -152,9 +154,13 @@ void lxw_str_tolower(char *str);
152
154
 
153
155
  FILE *lxw_tmpfile(char *tmpdir);
154
156
 
155
- /* Declarations required for unit testing. */
156
- #ifdef TESTING
157
-
157
+ /* Use a user defined function to format doubles in sprintf or else a simple
158
+ * macro (the default). */
159
+ #ifdef USE_DOUBLE_FUNCTION
160
+ int lxw_sprintf_dbl(char *data, double number);
161
+ #else
162
+ #define lxw_sprintf_dbl(data, number) \
163
+ lxw_snprintf(data, LXW_ATTR_32, "%.16g", number)
158
164
  #endif
159
165
 
160
166
  /* *INDENT-OFF* */
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * libxlsxwriter
3
3
  *
4
- * Copyright 2014-2017, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
4
+ * Copyright 2014-2018, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
5
5
  */
6
6
 
7
7
  /**
@@ -677,8 +677,8 @@ lxw_error workbook_define_name(lxw_workbook *workbook, const char *name,
677
677
  /**
678
678
  * @brief Get a worksheet object from its name.
679
679
  *
680
- * @param workbook
681
- * @param name
680
+ * @param workbook Pointer to a lxw_workbook instance.
681
+ * @param name Worksheet name.
682
682
  *
683
683
  * @return A lxw_worksheet object.
684
684
  *
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * libxlsxwriter
3
3
  *
4
- * Copyright 2014-2017, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
4
+ * Copyright 2014-2018, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
5
5
  */
6
6
 
7
7
  /**
@@ -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
 
@@ -149,12 +267,14 @@ STAILQ_HEAD(lxw_chart_data, lxw_image_options);
149
267
  * Options struct for the worksheet_set_column() and worksheet_set_row()
150
268
  * functions.
151
269
  *
152
- * It has the following members but currently only the `hidden` property is
153
- * supported:
270
+ * It has the following members:
154
271
  *
155
272
  * * `hidden`
156
273
  * * `level`
157
274
  * * `collapsed`
275
+ *
276
+ * The members of this struct are explained in @ref ww_outlines_grouping.
277
+ *
158
278
  */
159
279
  typedef struct lxw_row_col_options {
160
280
  /** Hide the row/column */
@@ -229,6 +349,180 @@ typedef struct lxw_selection {
229
349
 
230
350
  } lxw_selection;
231
351
 
352
+ /**
353
+ * @brief Worksheet data validation options.
354
+ */
355
+ typedef struct lxw_data_validation {
356
+
357
+ /**
358
+ * Set the validation type. Should be a #lxw_validation_types value.
359
+ */
360
+ uint8_t validate;
361
+
362
+ /**
363
+ * Set the validation criteria type to select the data. Should be a
364
+ * #lxw_validation_criteria value.
365
+ */
366
+ uint8_t criteria;
367
+
368
+ /** Controls whether a data validation is not applied to blank data in the
369
+ * cell. Should be a #lxw_validation_boolean value. It is on by
370
+ * default.
371
+ */
372
+ uint8_t ignore_blank;
373
+
374
+ /**
375
+ * This parameter is used to toggle on and off the 'Show input message
376
+ * when cell is selected' option in the Excel data validation dialog. When
377
+ * the option is off an input message is not displayed even if it has been
378
+ * set using input_message. Should be a #lxw_validation_boolean value. It
379
+ * is on by default.
380
+ */
381
+ uint8_t show_input;
382
+
383
+ /**
384
+ * This parameter is used to toggle on and off the 'Show error alert
385
+ * after invalid data is entered' option in the Excel data validation
386
+ * dialog. When the option is off an error message is not displayed even
387
+ * if it has been set using error_message. Should be a
388
+ * #lxw_validation_boolean value. It is on by default.
389
+ */
390
+ uint8_t show_error;
391
+
392
+ /**
393
+ * This parameter is used to specify the type of error dialog that is
394
+ * displayed. Should be a #lxw_validation_error_types value.
395
+ */
396
+ uint8_t error_type;
397
+
398
+ /**
399
+ * This parameter is used to toggle on and off the 'In-cell dropdown'
400
+ * option in the Excel data validation dialog. When the option is on a
401
+ * dropdown list will be shown for list validations. Should be a
402
+ * #lxw_validation_boolean value. It is on by default.
403
+ */
404
+ uint8_t dropdown;
405
+
406
+ uint8_t is_between;
407
+
408
+ /**
409
+ * This parameter is used to set the limiting value to which the criteria
410
+ * is applied using a whole or decimal number.
411
+ */
412
+ double value_number;
413
+
414
+ /**
415
+ * This parameter is used to set the limiting value to which the criteria
416
+ * is applied using a cell reference. It is valid for any of the
417
+ * `_FORMULA` validation types.
418
+ */
419
+ char *value_formula;
420
+
421
+ /**
422
+ * This parameter is used to set a list of strings for a drop down list.
423
+ * The list should be a `NULL` terminated array of char* strings:
424
+ *
425
+ * @code
426
+ * char *list[] = {"open", "high", "close", NULL};
427
+ *
428
+ * data_validation->validate = LXW_VALIDATION_TYPE_LIST;
429
+ * data_validation->value_list = list;
430
+ * @endcode
431
+ *
432
+ * The `value_formula` parameter can also be used to specify a list from
433
+ * an Excel cell range.
434
+ *
435
+ * Note, the string list is restricted by Excel to 255 characters,
436
+ * including comma separators.
437
+ */
438
+ char **value_list;
439
+
440
+ /**
441
+ * This parameter is used to set the limiting value to which the date or
442
+ * time criteria is applied using a #lxw_datetime struct.
443
+ */
444
+ lxw_datetime value_datetime;
445
+
446
+ /**
447
+ * This parameter is the same as `value_number` but for the minimum value
448
+ * when a `BETWEEN` criteria is used.
449
+ */
450
+ double minimum_number;
451
+
452
+ /**
453
+ * This parameter is the same as `value_formula` but for the minimum value
454
+ * when a `BETWEEN` criteria is used.
455
+ */
456
+ char *minimum_formula;
457
+
458
+ /**
459
+ * This parameter is the same as `value_datetime` but for the minimum value
460
+ * when a `BETWEEN` criteria is used.
461
+ */
462
+ lxw_datetime minimum_datetime;
463
+
464
+ /**
465
+ * This parameter is the same as `value_number` but for the maximum value
466
+ * when a `BETWEEN` criteria is used.
467
+ */
468
+ double maximum_number;
469
+
470
+ /**
471
+ * This parameter is the same as `value_formula` but for the maximum value
472
+ * when a `BETWEEN` criteria is used.
473
+ */
474
+ char *maximum_formula;
475
+
476
+ /**
477
+ * This parameter is the same as `value_datetime` but for the maximum value
478
+ * when a `BETWEEN` criteria is used.
479
+ */
480
+ lxw_datetime maximum_datetime;
481
+
482
+ /**
483
+ * The input_title parameter is used to set the title of the input message
484
+ * that is displayed when a cell is entered. It has no default value and
485
+ * is only displayed if the input message is displayed. See the
486
+ * `input_message` parameter below.
487
+ *
488
+ * The maximum title length is 32 characters.
489
+ */
490
+ char *input_title;
491
+
492
+ /**
493
+ * The input_message parameter is used to set the input message that is
494
+ * displayed when a cell is entered. It has no default value.
495
+ *
496
+ * The message can be split over several lines using newlines. The maximum
497
+ * message length is 255 characters.
498
+ */
499
+ char *input_message;
500
+
501
+ /**
502
+ * The error_title parameter is used to set the title of the error message
503
+ * that is displayed when the data validation criteria is not met. The
504
+ * default error title is 'Microsoft Excel'. The maximum title length is
505
+ * 32 characters.
506
+ */
507
+ char *error_title;
508
+
509
+ /**
510
+ * The error_message parameter is used to set the error message that is
511
+ * displayed when a cell is entered. The default error message is "The
512
+ * value you entered is not valid. A user has restricted values that can
513
+ * be entered into the cell".
514
+ *
515
+ * The message can be split over several lines using newlines. The maximum
516
+ * message length is 255 characters.
517
+ */
518
+ char *error_message;
519
+
520
+ char sqref[LXW_MAX_CELL_RANGE_LENGTH];
521
+
522
+ STAILQ_ENTRY (lxw_data_validation) list_pointers;
523
+
524
+ } lxw_data_validation;
525
+
232
526
  /**
233
527
  * @brief Options for inserted images
234
528
  *
@@ -354,6 +648,7 @@ typedef struct lxw_worksheet {
354
648
  struct lxw_cell **array;
355
649
  struct lxw_merged_ranges *merged_ranges;
356
650
  struct lxw_selections *selections;
651
+ struct lxw_data_validations *data_validations;
357
652
  struct lxw_image_data *image_data;
358
653
  struct lxw_chart_data *chart_data;
359
654
 
@@ -403,6 +698,9 @@ typedef struct lxw_worksheet {
403
698
  uint8_t orientation;
404
699
  uint8_t outline_changed;
405
700
  uint8_t outline_on;
701
+ uint8_t outline_style;
702
+ uint8_t outline_below;
703
+ uint8_t outline_right;
406
704
  uint8_t page_order;
407
705
  uint8_t page_setup_changed;
408
706
  uint8_t page_view;
@@ -416,6 +714,7 @@ typedef struct lxw_worksheet {
416
714
  uint8_t vba_codename;
417
715
  uint8_t vcenter;
418
716
  uint8_t zoom_scale_normal;
717
+ uint8_t num_validations;
419
718
 
420
719
  lxw_color_t tab_color;
421
720
 
@@ -431,6 +730,8 @@ typedef struct lxw_worksheet {
431
730
  uint32_t default_col_pixels;
432
731
  uint8_t default_row_zeroed;
433
732
  uint8_t default_row_set;
733
+ uint8_t outline_row_level;
734
+ uint8_t outline_col_level;
434
735
 
435
736
  uint8_t header_footer_changed;
436
737
  char header[LXW_HEADER_FOOTER_MAX];
@@ -561,6 +862,10 @@ extern "C" {
561
862
  *
562
863
  * @image html write_number02.png
563
864
  *
865
+ * @note Excel doesn't support `NaN`, `Inf` or `-Inf` as a number value. If
866
+ * you are writing data that contains these values then your application
867
+ * should convert them to a string or handle them in some other way.
868
+ *
564
869
  */
565
870
  lxw_error worksheet_write_number(lxw_worksheet *worksheet,
566
871
  lxw_row_t row,
@@ -661,6 +966,7 @@ lxw_error worksheet_write_string(lxw_worksheet *worksheet,
661
966
  * worksheet_write_formula(worksheet, 1, 0, "=SUM(1; 2; 3)", NULL);
662
967
  * @endcode
663
968
  *
969
+ * See also @ref working_with_formulas.
664
970
  */
665
971
  lxw_error worksheet_write_formula(lxw_worksheet *worksheet,
666
972
  lxw_row_t row,
@@ -669,7 +975,7 @@ lxw_error worksheet_write_formula(lxw_worksheet *worksheet,
669
975
  /**
670
976
  * @brief Write an array formula to a worksheet cell.
671
977
  *
672
- * @param worksheet
978
+ * @param worksheet pointer to a lxw_worksheet instance to be updated.
673
979
  * @param first_row The first row of the range. (All zero indexed.)
674
980
  * @param first_col The first column of the range.
675
981
  * @param last_row The last row of the range.
@@ -874,7 +1180,7 @@ lxw_error worksheet_write_url_opt(lxw_worksheet *worksheet,
874
1180
  * @endcode
875
1181
  *
876
1182
  *
877
- * Alternatively, you can use Windows style forward slashes. These are
1183
+ * Alternatively, you can use Unix style forward slashes. These are
878
1184
  * translated internally to backslashes:
879
1185
  *
880
1186
  * @code
@@ -991,6 +1297,7 @@ lxw_error worksheet_write_blank(lxw_worksheet *worksheet,
991
1297
  * worksheet_write_formula() function is the recommended way of writing
992
1298
  * formulas.
993
1299
  *
1300
+ * See also @ref working_with_formulas.
994
1301
  */
995
1302
  lxw_error worksheet_write_formula_num(lxw_worksheet *worksheet,
996
1303
  lxw_row_t row,
@@ -1066,7 +1373,7 @@ lxw_error worksheet_set_row(lxw_worksheet *worksheet,
1066
1373
  * `worksheet_set_row()` with an additional `options` parameter.
1067
1374
  *
1068
1375
  * The `options` parameter is a #lxw_row_col_options struct. It has the
1069
- * following members but currently only the `hidden` property is supported:
1376
+ * following members:
1070
1377
  *
1071
1378
  * - `hidden`
1072
1379
  * - `level`
@@ -1076,12 +1383,41 @@ lxw_error worksheet_set_row(lxw_worksheet *worksheet,
1076
1383
  * example, to hide intermediary steps in a complicated calculation:
1077
1384
  *
1078
1385
  * @code
1079
- * lxw_row_col_options options = {.hidden = 1, .level = 0, .collapsed = 0};
1386
+ * lxw_row_col_options options1 = {.hidden = 1, .level = 0, .collapsed = 0};
1387
+ *
1388
+ * // Hide the fourth and fifth (zero indexed) rows.
1389
+ * worksheet_set_row_opt(worksheet, 3, LXW_DEF_ROW_HEIGHT, NULL, &options1);
1390
+ * worksheet_set_row_opt(worksheet, 4, LXW_DEF_ROW_HEIGHT, NULL, &options1);
1391
+ *
1392
+ * @endcode
1393
+ *
1394
+ * @image html hide_row_col2.png
1395
+ *
1396
+ * The `"hidden"`, `"level"`, and `"collapsed"`, options can also be used to
1397
+ * create Outlines and Grouping. See @ref working_with_outlines.
1398
+ *
1399
+ * @code
1400
+ * // The option structs with the outline level set.
1401
+ * lxw_row_col_options options1 = {.hidden = 0, .level = 2, .collapsed = 0};
1402
+ * lxw_row_col_options options2 = {.hidden = 0, .level = 1, .collapsed = 0};
1080
1403
  *
1081
- * // Hide the fourth row.
1082
- * worksheet_set_row(worksheet, 3, 20, NULL, &options);
1404
+ *
1405
+ * // Set the row options with the outline level.
1406
+ * worksheet_set_row_opt(worksheet, 1, LXW_DEF_ROW_HEIGHT, NULL, &options1);
1407
+ * worksheet_set_row_opt(worksheet, 2, LXW_DEF_ROW_HEIGHT, NULL, &options1);
1408
+ * worksheet_set_row_opt(worksheet, 3, LXW_DEF_ROW_HEIGHT, NULL, &options1);
1409
+ * worksheet_set_row_opt(worksheet, 4, LXW_DEF_ROW_HEIGHT, NULL, &options1);
1410
+ * worksheet_set_row_opt(worksheet, 5, LXW_DEF_ROW_HEIGHT, NULL, &options2);
1411
+ *
1412
+ * worksheet_set_row_opt(worksheet, 6, LXW_DEF_ROW_HEIGHT, NULL, &options1);
1413
+ * worksheet_set_row_opt(worksheet, 7, LXW_DEF_ROW_HEIGHT, NULL, &options1);
1414
+ * worksheet_set_row_opt(worksheet, 8, LXW_DEF_ROW_HEIGHT, NULL, &options1);
1415
+ * worksheet_set_row_opt(worksheet, 9, LXW_DEF_ROW_HEIGHT, NULL, &options1);
1416
+ * worksheet_set_row_opt(worksheet, 10, LXW_DEF_ROW_HEIGHT, NULL, &options2);
1083
1417
  * @endcode
1084
1418
  *
1419
+ * @image html outline1.png
1420
+ *
1085
1421
  */
1086
1422
  lxw_error worksheet_set_row_opt(lxw_worksheet *worksheet,
1087
1423
  lxw_row_t row,
@@ -1189,36 +1525,48 @@ lxw_error worksheet_set_column(lxw_worksheet *worksheet,
1189
1525
  lxw_col_t last_col,
1190
1526
  double width, lxw_format *format);
1191
1527
 
1192
- /**
1193
- * @brief Set the properties for one or more columns of cells with options.
1194
- *
1195
- * @param worksheet Pointer to a lxw_worksheet instance to be updated.
1196
- * @param first_col The zero indexed first column.
1197
- * @param last_col The zero indexed last column.
1198
- * @param width The width of the column(s).
1199
- * @param format A pointer to a Format instance or NULL.
1200
- * @param options Optional row parameters: hidden, level, collapsed.
1201
- *
1202
- * The `%worksheet_set_column_opt()` function is the same as
1203
- * `worksheet_set_column()` with an additional `options` parameter.
1204
- *
1205
- * The `options` parameter is a #lxw_row_col_options struct. It has the
1206
- * following members but currently only the `hidden` property is supported:
1207
- *
1208
- * - `hidden`
1209
- * - `level`
1210
- * - `collapsed`
1211
- *
1212
- * The `"hidden"` option is used to hide a column. This can be used, for
1213
- * example, to hide intermediary steps in a complicated calculation:
1214
- *
1215
- * @code
1216
- * lxw_row_col_options options = {.hidden = 1, .level = 0, .collapsed = 0};
1217
- *
1218
- * worksheet_set_column_opt(worksheet, COLS("A:A"), 8.43, NULL, &options);
1219
- * @endcode
1220
- *
1221
- */
1528
+ /**
1529
+ * @brief Set the properties for one or more columns of cells with options.
1530
+ *
1531
+ * @param worksheet Pointer to a lxw_worksheet instance to be updated.
1532
+ * @param first_col The zero indexed first column.
1533
+ * @param last_col The zero indexed last column.
1534
+ * @param width The width of the column(s).
1535
+ * @param format A pointer to a Format instance or NULL.
1536
+ * @param options Optional row parameters: hidden, level, collapsed.
1537
+ *
1538
+ * The `%worksheet_set_column_opt()` function is the same as
1539
+ * `worksheet_set_column()` with an additional `options` parameter.
1540
+ *
1541
+ * The `options` parameter is a #lxw_row_col_options struct. It has the
1542
+ * following members:
1543
+ *
1544
+ * - `hidden`
1545
+ * - `level`
1546
+ * - `collapsed`
1547
+ *
1548
+ * The `"hidden"` option is used to hide a column. This can be used, for
1549
+ * example, to hide intermediary steps in a complicated calculation:
1550
+ *
1551
+ * @code
1552
+ * lxw_row_col_options options1 = {.hidden = 1, .level = 0, .collapsed = 0};
1553
+ *
1554
+ * worksheet_set_column_opt(worksheet, COLS("D:E"), LXW_DEF_COL_WIDTH, NULL, &options1);
1555
+ * @endcode
1556
+ *
1557
+ * @image html hide_row_col3.png
1558
+ *
1559
+ * The `"hidden"`, `"level"`, and `"collapsed"`, options can also be used to
1560
+ * create Outlines and Grouping. See @ref working_with_outlines.
1561
+ *
1562
+ * @code
1563
+ * lxw_row_col_options options1 = {.hidden = 0, .level = 1, .collapsed = 0};
1564
+ *
1565
+ * worksheet_set_column_opt(worksheet, COLS("B:G"), 5, NULL, &options1);
1566
+ * @endcode
1567
+ *
1568
+ * @image html outline8.png
1569
+ */
1222
1570
  lxw_error worksheet_set_column_opt(lxw_worksheet *worksheet,
1223
1571
  lxw_col_t first_col,
1224
1572
  lxw_col_t last_col,
@@ -1470,6 +1818,87 @@ lxw_error worksheet_autofilter(lxw_worksheet *worksheet, lxw_row_t first_row,
1470
1818
  lxw_col_t first_col, lxw_row_t last_row,
1471
1819
  lxw_col_t last_col);
1472
1820
 
1821
+ /**
1822
+ * @brief Add a data validation to a cell.
1823
+ *
1824
+ * @param worksheet Pointer to a lxw_worksheet instance to be updated.
1825
+ * @param row The zero indexed row number.
1826
+ * @param col The zero indexed column number.
1827
+ * @param validation A #lxw_data_validation object to control the validation.
1828
+ *
1829
+ * @return A #lxw_error code.
1830
+ *
1831
+ * The `%worksheet_data_validation_cell()` function is used to construct an
1832
+ * Excel data validation or to limit the user input to a dropdown list of
1833
+ * values:
1834
+ *
1835
+ * @code
1836
+ *
1837
+ * lxw_data_validation *data_validation = calloc(1, sizeof(lxw_data_validation));
1838
+ *
1839
+ * data_validation->validate = LXW_VALIDATION_TYPE_INTEGER;
1840
+ * data_validation->criteria = LXW_VALIDATION_CRITERIA_BETWEEN;
1841
+ * data_validation->minimum_number = 1;
1842
+ * data_validation->maximum_number = 10;
1843
+ *
1844
+ * worksheet_data_validation_cell(worksheet, 2, 1, data_validation);
1845
+ *
1846
+ * // Same as above with the CELL() macro.
1847
+ * worksheet_data_validation_cell(worksheet, CELL("B3"), data_validation);
1848
+ *
1849
+ * @endcode
1850
+ *
1851
+ * @image html data_validate4.png
1852
+ *
1853
+ * Data validation and the various options of #lxw_data_validation are
1854
+ * described in more detail in @ref working_with_data_validation.
1855
+ */
1856
+ lxw_error worksheet_data_validation_cell(lxw_worksheet *worksheet,
1857
+ lxw_row_t row, lxw_col_t col,
1858
+ lxw_data_validation *validation);
1859
+
1860
+ /**
1861
+ * @brief Add a data validation to a range cell.
1862
+ *
1863
+ * @param worksheet Pointer to a lxw_worksheet instance to be updated.
1864
+ * @param first_row The first row of the range. (All zero indexed.)
1865
+ * @param first_col The first column of the range.
1866
+ * @param last_row The last row of the range.
1867
+ * @param last_col The last col of the range.
1868
+ * @param validation A #lxw_data_validation object to control the validation.
1869
+ *
1870
+ * @return A #lxw_error code.
1871
+ *
1872
+ * The `%worksheet_data_validation_range()` function is the same as the
1873
+ * `%worksheet_data_validation_cell()`, see above, except the data validation
1874
+ * is applied to a range of cells:
1875
+ *
1876
+ * @code
1877
+ *
1878
+ * lxw_data_validation *data_validation = calloc(1, sizeof(lxw_data_validation));
1879
+ *
1880
+ * data_validation->validate = LXW_VALIDATION_TYPE_INTEGER;
1881
+ * data_validation->criteria = LXW_VALIDATION_CRITERIA_BETWEEN;
1882
+ * data_validation->minimum_number = 1;
1883
+ * data_validation->maximum_number = 10;
1884
+ *
1885
+ * worksheet_data_validation_range(worksheet, 2, 1, 4, 1, data_validation);
1886
+ *
1887
+ * // Same as above with the RANGE() macro.
1888
+ * worksheet_data_validation_range(worksheet, RANGE("B3:B5"), data_validation);
1889
+ *
1890
+ * @endcode
1891
+ *
1892
+ * Data validation and the various options of #lxw_data_validation are
1893
+ * described in more detail in @ref working_with_data_validation.
1894
+ */
1895
+ lxw_error worksheet_data_validation_range(lxw_worksheet *worksheet,
1896
+ lxw_row_t first_row,
1897
+ lxw_col_t first_col,
1898
+ lxw_row_t last_row,
1899
+ lxw_col_t last_col,
1900
+ lxw_data_validation *validation);
1901
+
1473
1902
  /**
1474
1903
  * @brief Make a worksheet the active, i.e., visible worksheet.
1475
1904
  *
@@ -2553,6 +2982,54 @@ void worksheet_set_tab_color(lxw_worksheet *worksheet, lxw_color_t color);
2553
2982
  void worksheet_protect(lxw_worksheet *worksheet, const char *password,
2554
2983
  lxw_protection *options);
2555
2984
 
2985
+ /**
2986
+ * @brief Set the Outline and Grouping display properties.
2987
+ *
2988
+ * @param worksheet Pointer to a lxw_worksheet instance to be updated.
2989
+ * @param visible Outlines are visible. Optional, defaults to True.
2990
+ * @param symbols_below Show row outline symbols below the outline bar.
2991
+ * @param symbols_right Show column outline symbols to the right of outline.
2992
+ * @param auto_style Use Automatic outline style.
2993
+ *
2994
+ * The `%worksheet_outline_settings()` method is used to control the
2995
+ * appearance of outlines in Excel. Outlines are described the section on
2996
+ * @ref working_with_outlines.
2997
+ *
2998
+ * The `visible` parameter is used to control whether or not outlines are
2999
+ * visible. Setting this parameter to False will cause all outlines on the
3000
+ * worksheet to be hidden. They can be un-hidden in Excel by means of the
3001
+ * "Show Outline Symbols" command button. The default Excel setting is True
3002
+ * for visible outlines.
3003
+ *
3004
+ * The `symbols_below` parameter is used to control whether the row outline
3005
+ * symbol will appear above or below the outline level bar. The default Excel
3006
+ * setting is True for symbols to appear below the outline level bar.
3007
+ *
3008
+ * The `symbols_right` parameter is used to control whether the column outline
3009
+ * symbol will appear to the left or the right of the outline level bar. The
3010
+ * default Excel setting is True for symbols to appear to the right of the
3011
+ * outline level bar.
3012
+ *
3013
+ * The `auto_style` parameter is used to control whether the automatic outline
3014
+ * generator in Excel uses automatic styles when creating an outline. This has
3015
+ * no effect on a file generated by XlsxWriter but it does have an effect on
3016
+ * how the worksheet behaves after it is created. The default Excel setting is
3017
+ * False for "Automatic Styles" to be turned off.
3018
+ *
3019
+ * The default settings for all of these parameters in libxlsxwriter
3020
+ * correspond to Excel's default parameters and are shown below:
3021
+ *
3022
+ * @code
3023
+ * worksheet_outline_settings(worksheet1, LXW_TRUE, LXW_TRUE, LXW_TRUE, LXW_FALSE);
3024
+ * @endcode
3025
+ *
3026
+ * The worksheet parameters controlled by `worksheet_outline_settings()` are
3027
+ * rarely used.
3028
+ */
3029
+ void worksheet_outline_settings(lxw_worksheet *worksheet, uint8_t visible,
3030
+ uint8_t symbols_below, uint8_t symbols_right,
3031
+ uint8_t auto_style);
3032
+
2556
3033
  /**
2557
3034
  * @brief Set the default row properties.
2558
3035
  *
@@ -2630,6 +3107,7 @@ STATIC void _worksheet_write_print_options(lxw_worksheet *worksheet);
2630
3107
  STATIC void _worksheet_write_sheet_pr(lxw_worksheet *worksheet);
2631
3108
  STATIC void _worksheet_write_tab_color(lxw_worksheet *worksheet);
2632
3109
  STATIC void _worksheet_write_sheet_protection(lxw_worksheet *worksheet);
3110
+ STATIC void _worksheet_write_data_validations(lxw_worksheet *self);
2633
3111
  #endif /* TESTING */
2634
3112
 
2635
3113
  /* *INDENT-OFF* */