fast_excel 0.2.3 → 0.2.5

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 (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* */