fast_excel 0.4.1 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/test.yml +1 -7
- data/CHANGELOG.md +9 -0
- data/Gemfile +1 -1
- data/examples/example.rb +2 -0
- data/examples/example_date_time.rb +38 -0
- data/fast_excel.gemspec +2 -2
- data/lib/fast_excel/binding/format.rb +17 -0
- data/lib/fast_excel/binding/workbook.rb +39 -17
- data/lib/fast_excel/binding/worksheet.rb +57 -13
- data/lib/fast_excel/binding.rb +7 -7
- data/lib/fast_excel.rb +27 -20
- data/libxlsxwriter/.github/FUNDING.yml +1 -0
- data/libxlsxwriter/.github/ISSUE_TEMPLATE.md +85 -0
- data/libxlsxwriter/.github/PULL_REQUEST_TEMPLATE.md +130 -0
- data/libxlsxwriter/.github/workflows/cmake_actions.yml +48 -0
- data/libxlsxwriter/.github/workflows/code_style.yml +23 -0
- data/libxlsxwriter/.github/workflows/coverity.yml +22 -0
- data/libxlsxwriter/.github/workflows/make_actions.yml +52 -0
- data/libxlsxwriter/.github/workflows/valgrind.yml +23 -0
- data/libxlsxwriter/.github/workflows/windows_build.yml +54 -0
- data/libxlsxwriter/.github/workflows/zig_build.yml +22 -0
- data/libxlsxwriter/.gitignore +16 -1
- data/libxlsxwriter/.indent.pro +24 -0
- data/libxlsxwriter/CMakeLists.txt +156 -56
- data/libxlsxwriter/CONTRIBUTING.md +2 -2
- data/libxlsxwriter/Changes.txt +344 -2
- data/libxlsxwriter/LICENSE.txt +66 -8
- data/libxlsxwriter/Makefile +151 -54
- data/libxlsxwriter/Package.swift +42 -0
- data/libxlsxwriter/Readme.md +4 -2
- data/libxlsxwriter/build.zig +324 -0
- data/libxlsxwriter/build.zig.zon +11 -0
- data/libxlsxwriter/cmake/FindMINIZIP.cmake +3 -3
- data/libxlsxwriter/cocoapods/libxlsxwriter-umbrella.h +6 -0
- data/libxlsxwriter/include/xlsxwriter/app.h +2 -1
- data/libxlsxwriter/include/xlsxwriter/chart.h +236 -32
- data/libxlsxwriter/include/xlsxwriter/chartsheet.h +7 -7
- data/libxlsxwriter/include/xlsxwriter/comment.h +76 -0
- data/libxlsxwriter/include/xlsxwriter/common.h +111 -50
- data/libxlsxwriter/include/xlsxwriter/content_types.h +8 -1
- data/libxlsxwriter/include/xlsxwriter/core.h +1 -1
- data/libxlsxwriter/include/xlsxwriter/custom.h +1 -1
- data/libxlsxwriter/include/xlsxwriter/drawing.h +11 -20
- data/libxlsxwriter/include/xlsxwriter/format.h +121 -8
- data/libxlsxwriter/include/xlsxwriter/hash_table.h +1 -1
- data/libxlsxwriter/include/xlsxwriter/metadata.h +49 -0
- data/libxlsxwriter/include/xlsxwriter/packager.h +27 -16
- data/libxlsxwriter/include/xlsxwriter/relationships.h +1 -1
- data/libxlsxwriter/include/xlsxwriter/shared_strings.h +1 -1
- data/libxlsxwriter/include/xlsxwriter/styles.h +13 -7
- data/libxlsxwriter/include/xlsxwriter/table.h +51 -0
- data/libxlsxwriter/include/xlsxwriter/theme.h +1 -1
- data/libxlsxwriter/include/xlsxwriter/third_party/emyg_dtoa.h +26 -0
- data/libxlsxwriter/include/xlsxwriter/third_party/ioapi.h +27 -25
- data/libxlsxwriter/include/xlsxwriter/third_party/md5.h +45 -0
- data/libxlsxwriter/include/xlsxwriter/third_party/zip.h +155 -153
- data/libxlsxwriter/include/xlsxwriter/utility.h +70 -8
- data/libxlsxwriter/include/xlsxwriter/vml.h +55 -0
- data/libxlsxwriter/include/xlsxwriter/workbook.h +218 -47
- data/libxlsxwriter/include/xlsxwriter/worksheet.h +2770 -241
- data/libxlsxwriter/include/xlsxwriter/xmlwriter.h +12 -8
- data/libxlsxwriter/include/xlsxwriter.h +4 -2
- data/libxlsxwriter/libxlsxwriter.podspec +8 -5
- data/libxlsxwriter/src/Makefile +58 -21
- data/libxlsxwriter/src/app.c +5 -2
- data/libxlsxwriter/src/chart.c +396 -81
- data/libxlsxwriter/src/chartsheet.c +22 -22
- data/libxlsxwriter/src/comment.c +443 -0
- data/libxlsxwriter/src/content_types.c +40 -1
- data/libxlsxwriter/src/core.c +2 -2
- data/libxlsxwriter/src/custom.c +1 -1
- data/libxlsxwriter/src/drawing.c +160 -40
- data/libxlsxwriter/src/format.c +109 -25
- data/libxlsxwriter/src/hash_table.c +1 -1
- data/libxlsxwriter/src/metadata.c +283 -0
- data/libxlsxwriter/src/packager.c +794 -94
- data/libxlsxwriter/src/relationships.c +1 -1
- data/libxlsxwriter/src/shared_strings.c +2 -4
- data/libxlsxwriter/src/styles.c +353 -58
- data/libxlsxwriter/src/table.c +304 -0
- data/libxlsxwriter/src/theme.c +1 -1
- data/libxlsxwriter/src/utility.c +143 -43
- data/libxlsxwriter/src/vml.c +1062 -0
- data/libxlsxwriter/src/workbook.c +567 -77
- data/libxlsxwriter/src/worksheet.c +6668 -1462
- data/libxlsxwriter/src/xmlwriter.c +95 -5
- data/libxlsxwriter/third_party/dtoa/Makefile +42 -0
- data/libxlsxwriter/third_party/dtoa/emyg_dtoa.c +461 -0
- data/libxlsxwriter/third_party/dtoa/emyg_dtoa.h +26 -0
- data/libxlsxwriter/third_party/md5/Makefile +42 -0
- data/libxlsxwriter/third_party/md5/md5.c +291 -0
- data/libxlsxwriter/third_party/md5/md5.h +45 -0
- data/libxlsxwriter/third_party/minizip/Makefile +3 -8
- data/libxlsxwriter/third_party/minizip/Makefile.orig +8 -4
- data/libxlsxwriter/third_party/minizip/MiniZip64_Changes.txt +1 -1
- data/libxlsxwriter/third_party/minizip/configure.ac +1 -1
- data/libxlsxwriter/third_party/minizip/crypt.h +13 -16
- data/libxlsxwriter/third_party/minizip/ioapi.c +31 -57
- data/libxlsxwriter/third_party/minizip/ioapi.h +31 -23
- data/libxlsxwriter/third_party/minizip/iowin32.c +29 -45
- data/libxlsxwriter/third_party/minizip/iowin32.h +4 -4
- data/libxlsxwriter/third_party/minizip/miniunz.c +29 -56
- data/libxlsxwriter/third_party/minizip/minizip.c +38 -49
- data/libxlsxwriter/third_party/minizip/mztools.c +1 -7
- data/libxlsxwriter/third_party/minizip/unzip.c +202 -342
- data/libxlsxwriter/third_party/minizip/unzip.h +74 -74
- data/libxlsxwriter/third_party/minizip/zip.c +165 -218
- data/libxlsxwriter/third_party/minizip/zip.h +164 -154
- data/libxlsxwriter/third_party/tmpfileplus/Makefile +3 -3
- data/libxlsxwriter/version.txt +1 -1
- data/test/auto_width_test.rb +20 -0
- data/test/default_format_test.rb +1 -1
- data/test/validations_test.rb +3 -3
- data/test/worksheet_test.rb +6 -1
- metadata +33 -7
- data/libxlsxwriter/.travis.yml +0 -37
@@ -1,7 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
* libxlsxwriter
|
3
3
|
*
|
4
|
-
* Copyright 2014-
|
4
|
+
* Copyright 2014-2022, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
|
5
5
|
*/
|
6
6
|
|
7
7
|
/**
|
@@ -9,7 +9,7 @@
|
|
9
9
|
*
|
10
10
|
* @brief Common functions and defines for the libxlsxwriter library.
|
11
11
|
*
|
12
|
-
* <!-- Copyright 2014-
|
12
|
+
* <!-- Copyright 2014-2022, John McNamara, jmcnamara@cpan.org -->
|
13
13
|
*
|
14
14
|
*/
|
15
15
|
#ifndef __LXW_COMMON_H__
|
@@ -25,6 +25,14 @@
|
|
25
25
|
#define STATIC
|
26
26
|
#endif
|
27
27
|
|
28
|
+
#if __GNUC__ >= 5
|
29
|
+
#define DEPRECATED(func, msg) func __attribute__ ((deprecated(msg)))
|
30
|
+
#elif defined(_MSC_VER)
|
31
|
+
#define DEPRECATED(func, msg) __declspec(deprecated, msg) func
|
32
|
+
#else
|
33
|
+
#define DEPRECATED(func, msg) func
|
34
|
+
#endif
|
35
|
+
|
28
36
|
/** Integer data type to represent a row value. Equivalent to `uint32_t`.
|
29
37
|
*
|
30
38
|
* The maximum row in Excel is 1,048,576.
|
@@ -42,7 +50,10 @@ enum lxw_boolean {
|
|
42
50
|
/** False value. */
|
43
51
|
LXW_FALSE,
|
44
52
|
/** True value. */
|
45
|
-
LXW_TRUE
|
53
|
+
LXW_TRUE,
|
54
|
+
/** False value. Used to turn off a property that is default on, in order
|
55
|
+
* to distinguish it from an uninitialized value. */
|
56
|
+
LXW_EXPLICIT_FALSE
|
46
57
|
};
|
47
58
|
|
48
59
|
/**
|
@@ -86,6 +97,9 @@ typedef enum lxw_error {
|
|
86
97
|
/** Unknown zip error when closing xlsx file. */
|
87
98
|
LXW_ERROR_ZIP_CLOSE,
|
88
99
|
|
100
|
+
/** Feature is not currently supported in this configuration. */
|
101
|
+
LXW_ERROR_FEATURE_NOT_SUPPORTED,
|
102
|
+
|
89
103
|
/** NULL function parameter ignored. */
|
90
104
|
LXW_ERROR_NULL_PARAMETER_IGNORED,
|
91
105
|
|
@@ -104,9 +118,6 @@ typedef enum lxw_error {
|
|
104
118
|
/** Worksheet name is already in use. */
|
105
119
|
LXW_ERROR_SHEETNAME_ALREADY_USED,
|
106
120
|
|
107
|
-
/** Worksheet name 'History' is reserved by Excel. */
|
108
|
-
LXW_ERROR_SHEETNAME_RESERVED,
|
109
|
-
|
110
121
|
/** Parameter exceeds Excel's limit of 32 characters. */
|
111
122
|
LXW_ERROR_32_STRING_LENGTH_EXCEEDED,
|
112
123
|
|
@@ -125,6 +136,9 @@ typedef enum lxw_error {
|
|
125
136
|
/** Worksheet row or column index out of range. */
|
126
137
|
LXW_ERROR_WORKSHEET_INDEX_OUT_OF_RANGE,
|
127
138
|
|
139
|
+
/** Maximum hyperlink length (2079) exceeded. */
|
140
|
+
LXW_ERROR_WORKSHEET_MAX_URL_LENGTH_EXCEEDED,
|
141
|
+
|
128
142
|
/** Maximum number of worksheet URLs (65530) exceeded. */
|
129
143
|
LXW_ERROR_WORKSHEET_MAX_NUMBER_URLS_EXCEEDED,
|
130
144
|
|
@@ -164,6 +178,9 @@ enum lxw_custom_property_types {
|
|
164
178
|
LXW_CUSTOM_DATETIME
|
165
179
|
};
|
166
180
|
|
181
|
+
/* Size of MD5 byte arrays. */
|
182
|
+
#define LXW_MD5_SIZE 16
|
183
|
+
|
167
184
|
/* Excel sheetname max of 31 chars. */
|
168
185
|
#define LXW_SHEETNAME_MAX 31
|
169
186
|
|
@@ -188,6 +205,9 @@ enum lxw_custom_property_types {
|
|
188
205
|
/* Datetime string length. */
|
189
206
|
#define LXW_DATETIME_LENGTH sizeof("2016-12-12T23:00:00Z")
|
190
207
|
|
208
|
+
/* GUID string length. */
|
209
|
+
#define LXW_GUID_LENGTH sizeof("{12345678-1234-1234-1234-1234567890AB}\0")
|
210
|
+
|
191
211
|
#define LXW_EPOCH_1900 0
|
192
212
|
#define LXW_EPOCH_1904 1
|
193
213
|
|
@@ -206,93 +226,134 @@ enum lxw_custom_property_types {
|
|
206
226
|
#define LXW_SCHEMA_DOCUMENT LXW_SCHEMA_ROOT "/officeDocument/2006/relationships"
|
207
227
|
#define LXW_SCHEMA_CONTENT LXW_SCHEMA_ROOT "/package/2006/content-types"
|
208
228
|
|
229
|
+
/* Use REprintf() for error handling when compiled as an R library. */
|
230
|
+
#ifdef USE_R_LANG
|
231
|
+
#include <R.h>
|
232
|
+
#define LXW_PRINTF REprintf
|
233
|
+
#define LXW_STDERR
|
234
|
+
#else
|
235
|
+
#define LXW_PRINTF fprintf
|
236
|
+
#define LXW_STDERR stderr,
|
237
|
+
#endif
|
238
|
+
|
209
239
|
#define LXW_ERROR(message) \
|
210
|
-
|
240
|
+
LXW_PRINTF(LXW_STDERR "[ERROR][%s:%d]: " message "\n", __FILE__, __LINE__)
|
211
241
|
|
212
242
|
#define LXW_MEM_ERROR() \
|
213
243
|
LXW_ERROR("Memory allocation failed.")
|
214
244
|
|
215
245
|
#define GOTO_LABEL_ON_MEM_ERROR(pointer, label) \
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
246
|
+
do { \
|
247
|
+
if (!pointer) { \
|
248
|
+
LXW_MEM_ERROR(); \
|
249
|
+
goto label; \
|
250
|
+
} \
|
251
|
+
} while (0)
|
220
252
|
|
221
253
|
#define RETURN_ON_MEM_ERROR(pointer, error) \
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
254
|
+
do { \
|
255
|
+
if (!pointer) { \
|
256
|
+
LXW_MEM_ERROR(); \
|
257
|
+
return error; \
|
258
|
+
} \
|
259
|
+
} while (0)
|
226
260
|
|
227
261
|
#define RETURN_VOID_ON_MEM_ERROR(pointer) \
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
262
|
+
do { \
|
263
|
+
if (!pointer) { \
|
264
|
+
LXW_MEM_ERROR(); \
|
265
|
+
return; \
|
266
|
+
} \
|
267
|
+
} while (0)
|
232
268
|
|
233
269
|
#define RETURN_ON_ERROR(error) \
|
234
|
-
|
235
|
-
|
270
|
+
do { \
|
271
|
+
if (error) \
|
272
|
+
return error; \
|
273
|
+
} while (0)
|
274
|
+
|
275
|
+
#define RETURN_AND_ZIPCLOSE_ON_ERROR(error) \
|
276
|
+
do { \
|
277
|
+
if (error) { \
|
278
|
+
zipClose(self->zipfile, NULL); \
|
279
|
+
return error; \
|
280
|
+
} \
|
281
|
+
} while (0)
|
236
282
|
|
237
283
|
#define LXW_WARN(message) \
|
238
|
-
|
284
|
+
LXW_PRINTF(LXW_STDERR "[WARNING]: " message "\n")
|
239
285
|
|
240
286
|
/* We can't use variadic macros here since we support ANSI C. */
|
241
287
|
#define LXW_WARN_FORMAT(message) \
|
242
|
-
|
288
|
+
LXW_PRINTF(LXW_STDERR "[WARNING]: " message "\n")
|
243
289
|
|
244
290
|
#define LXW_WARN_FORMAT1(message, var) \
|
245
|
-
|
291
|
+
LXW_PRINTF(LXW_STDERR "[WARNING]: " message "\n", var)
|
246
292
|
|
247
293
|
#define LXW_WARN_FORMAT2(message, var1, var2) \
|
248
|
-
|
294
|
+
LXW_PRINTF(LXW_STDERR "[WARNING]: " message "\n", var1, var2)
|
295
|
+
|
296
|
+
#define LXW_WARN_FORMAT3(message, var1, var2, var3) \
|
297
|
+
LXW_PRINTF(LXW_STDERR "[WARNING]: " message "\n", var1, var2, var3)
|
249
298
|
|
250
299
|
/* Chart axis type checks. */
|
251
300
|
#define LXW_WARN_CAT_AXIS_ONLY(function) \
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
301
|
+
do { \
|
302
|
+
if (!axis->is_category) { \
|
303
|
+
LXW_PRINTF(LXW_STDERR "[WARNING]: " \
|
304
|
+
function "() is only valid for category axes\n"); \
|
305
|
+
return; \
|
306
|
+
} \
|
307
|
+
} while (0)
|
257
308
|
|
258
309
|
#define LXW_WARN_VALUE_AXIS_ONLY(function) \
|
259
|
-
|
260
|
-
|
310
|
+
do { \
|
311
|
+
if (!axis->is_value) { \
|
312
|
+
LXW_PRINTF(LXW_STDERR "[WARNING]: " \
|
261
313
|
function "() is only valid for value axes\n"); \
|
262
|
-
|
263
|
-
|
314
|
+
return; \
|
315
|
+
} \
|
316
|
+
} while (0)
|
264
317
|
|
265
318
|
#define LXW_WARN_DATE_AXIS_ONLY(function) \
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
319
|
+
do { \
|
320
|
+
if (!axis->is_date) { \
|
321
|
+
LXW_PRINTF(LXW_STDERR "[WARNING]: " \
|
322
|
+
function "() is only valid for date axes\n"); \
|
323
|
+
return; \
|
324
|
+
} \
|
325
|
+
} while (0)
|
271
326
|
|
272
327
|
#define LXW_WARN_CAT_AND_DATE_AXIS_ONLY(function) \
|
273
|
-
|
274
|
-
|
328
|
+
do { \
|
329
|
+
if (!axis->is_category && !axis->is_date) { \
|
330
|
+
LXW_PRINTF(LXW_STDERR "[WARNING]: " \
|
275
331
|
function "() is only valid for category and date axes\n"); \
|
276
|
-
|
277
|
-
|
332
|
+
return; \
|
333
|
+
} \
|
334
|
+
} while (0)
|
278
335
|
|
279
336
|
#define LXW_WARN_VALUE_AND_DATE_AXIS_ONLY(function) \
|
280
|
-
|
281
|
-
|
337
|
+
do { \
|
338
|
+
if (!axis->is_value && !axis->is_date) { \
|
339
|
+
LXW_PRINTF(LXW_STDERR "[WARNING]: " \
|
282
340
|
function "() is only valid for value and date axes\n"); \
|
283
|
-
|
284
|
-
|
341
|
+
return; \
|
342
|
+
} \
|
343
|
+
} while (0)
|
285
344
|
|
286
345
|
#ifndef LXW_BIG_ENDIAN
|
346
|
+
#define LXW_UINT16_HOST(n) (n)
|
347
|
+
#define LXW_UINT32_HOST(n) (n)
|
348
|
+
#define LXW_UINT16_NETWORK(n) ((((n) & 0x00FF) << 8) | (((n) & 0xFF00) >> 8))
|
287
349
|
#define LXW_UINT32_NETWORK(n) ((((n) & 0xFF) << 24) | \
|
288
350
|
(((n) & 0xFF00) << 8) | \
|
289
351
|
(((n) & 0xFF0000) >> 8) | \
|
290
352
|
(((n) & 0xFF000000) >> 24))
|
291
|
-
#define LXW_UINT16_NETWORK(n) ((((n) & 0x00FF) << 8) | (((n) & 0xFF00) >> 8))
|
292
|
-
#define LXW_UINT32_HOST(n) (n)
|
293
353
|
#else
|
294
|
-
#define LXW_UINT32_NETWORK(n) (n)
|
295
354
|
#define LXW_UINT16_NETWORK(n) (n)
|
355
|
+
#define LXW_UINT32_NETWORK(n) (n)
|
356
|
+
#define LXW_UINT16_HOST(n) ((((n) & 0x00FF) << 8) | (((n) & 0xFF00) >> 8))
|
296
357
|
#define LXW_UINT32_HOST(n) ((((n) & 0xFF) << 24) | \
|
297
358
|
(((n) & 0xFF00) << 8) | \
|
298
359
|
(((n) & 0xFF0000) >> 8) | \
|
@@ -1,7 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
* libxlsxwriter
|
3
3
|
*
|
4
|
-
* Copyright 2014-
|
4
|
+
* Copyright 2014-2022, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
|
5
5
|
*
|
6
6
|
* content_types - A libxlsxwriter library for creating Excel XLSX
|
7
7
|
* content_types files.
|
@@ -53,9 +53,16 @@ void lxw_ct_add_chart_name(lxw_content_types *content_types,
|
|
53
53
|
const char *name);
|
54
54
|
void lxw_ct_add_drawing_name(lxw_content_types *content_types,
|
55
55
|
const char *name);
|
56
|
+
void lxw_ct_add_table_name(lxw_content_types *content_types,
|
57
|
+
const char *name);
|
58
|
+
void lxw_ct_add_comment_name(lxw_content_types *content_types,
|
59
|
+
const char *name);
|
60
|
+
void lxw_ct_add_vml_name(lxw_content_types *content_types);
|
61
|
+
|
56
62
|
void lxw_ct_add_shared_strings(lxw_content_types *content_types);
|
57
63
|
void lxw_ct_add_calc_chain(lxw_content_types *content_types);
|
58
64
|
void lxw_ct_add_custom_properties(lxw_content_types *content_types);
|
65
|
+
void lxw_ct_add_metadata(lxw_content_types *content_types);
|
59
66
|
|
60
67
|
/* Declarations required for unit testing. */
|
61
68
|
#ifdef TESTING
|
@@ -1,7 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
* libxlsxwriter
|
3
3
|
*
|
4
|
-
* Copyright 2014-
|
4
|
+
* Copyright 2014-2022, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
|
5
5
|
*
|
6
6
|
* drawing - A libxlsxwriter library for creating Excel XLSX drawing files.
|
7
7
|
*
|
@@ -10,6 +10,7 @@
|
|
10
10
|
#define __LXW_DRAWING_H__
|
11
11
|
|
12
12
|
#include <stdint.h>
|
13
|
+
#include <string.h>
|
13
14
|
|
14
15
|
#include "common.h"
|
15
16
|
|
@@ -22,24 +23,12 @@ enum lxw_drawing_types {
|
|
22
23
|
LXW_DRAWING_SHAPE
|
23
24
|
};
|
24
25
|
|
25
|
-
enum lxw_anchor_types {
|
26
|
-
LXW_ANCHOR_TYPE_NONE = 0,
|
27
|
-
LXW_ANCHOR_TYPE_IMAGE,
|
28
|
-
LXW_ANCHOR_TYPE_CHART
|
29
|
-
};
|
30
|
-
|
31
|
-
enum lxw_anchor_edit_types {
|
32
|
-
LXW_ANCHOR_EDIT_AS_NONE = 0,
|
33
|
-
LXW_ANCHOR_EDIT_AS_RELATIVE,
|
34
|
-
LXW_ANCHOR_EDIT_AS_ONE_CELL,
|
35
|
-
LXW_ANCHOR_EDIT_AS_ABSOLUTE
|
36
|
-
};
|
37
|
-
|
38
26
|
enum image_types {
|
39
27
|
LXW_IMAGE_UNKNOWN = 0,
|
40
28
|
LXW_IMAGE_PNG,
|
41
29
|
LXW_IMAGE_JPEG,
|
42
|
-
LXW_IMAGE_BMP
|
30
|
+
LXW_IMAGE_BMP,
|
31
|
+
LXW_IMAGE_GIF
|
43
32
|
};
|
44
33
|
|
45
34
|
/* Coordinates used in a drawing object. */
|
@@ -52,18 +41,20 @@ typedef struct lxw_drawing_coords {
|
|
52
41
|
|
53
42
|
/* Object to represent the properties of a drawing. */
|
54
43
|
typedef struct lxw_drawing_object {
|
55
|
-
uint8_t
|
56
|
-
uint8_t
|
44
|
+
uint8_t type;
|
45
|
+
uint8_t anchor;
|
57
46
|
struct lxw_drawing_coords from;
|
58
47
|
struct lxw_drawing_coords to;
|
59
|
-
|
60
|
-
|
48
|
+
uint64_t col_absolute;
|
49
|
+
uint64_t row_absolute;
|
61
50
|
uint32_t width;
|
62
51
|
uint32_t height;
|
63
52
|
uint8_t shape;
|
53
|
+
uint32_t rel_index;
|
54
|
+
uint32_t url_rel_index;
|
64
55
|
char *description;
|
65
|
-
char *url;
|
66
56
|
char *tip;
|
57
|
+
uint8_t decorative;
|
67
58
|
|
68
59
|
STAILQ_ENTRY (lxw_drawing_object) list_pointers;
|
69
60
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
* libxlsxwriter
|
3
3
|
*
|
4
|
-
* Copyright 2014-
|
4
|
+
* Copyright 2014-2022, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
|
5
5
|
*/
|
6
6
|
|
7
7
|
/**
|
@@ -72,14 +72,14 @@
|
|
72
72
|
* The type for RGB colors in libxlsxwriter. The valid range is `0x000000`
|
73
73
|
* (black) to `0xFFFFFF` (white). See @ref working_with_colors.
|
74
74
|
*/
|
75
|
-
typedef
|
75
|
+
typedef uint32_t lxw_color_t;
|
76
76
|
|
77
77
|
#define LXW_FORMAT_FIELD_LEN 128
|
78
78
|
#define LXW_DEFAULT_FONT_NAME "Calibri"
|
79
79
|
#define LXW_DEFAULT_FONT_FAMILY 2
|
80
80
|
#define LXW_DEFAULT_FONT_THEME 1
|
81
81
|
#define LXW_PROPERTY_UNSET -1
|
82
|
-
#define LXW_COLOR_UNSET
|
82
|
+
#define LXW_COLOR_UNSET 0x000000
|
83
83
|
#define LXW_COLOR_MASK 0xFFFFFF
|
84
84
|
#define LXW_MIN_FONT_SIZE 1.0
|
85
85
|
#define LXW_MAX_FONT_SIZE 409.0
|
@@ -92,8 +92,10 @@ typedef int32_t lxw_color_t;
|
|
92
92
|
|
93
93
|
/** Format underline values for format_set_underline(). */
|
94
94
|
enum lxw_format_underlines {
|
95
|
+
LXW_UNDERLINE_NONE = 0,
|
96
|
+
|
95
97
|
/** Single underline */
|
96
|
-
LXW_UNDERLINE_SINGLE
|
98
|
+
LXW_UNDERLINE_SINGLE,
|
97
99
|
|
98
100
|
/** Double underline */
|
99
101
|
LXW_UNDERLINE_DOUBLE,
|
@@ -157,9 +159,19 @@ enum lxw_format_alignments {
|
|
157
159
|
LXW_ALIGN_VERTICAL_DISTRIBUTED
|
158
160
|
};
|
159
161
|
|
162
|
+
/**
|
163
|
+
* Diagonal border types.
|
164
|
+
*
|
165
|
+
*/
|
160
166
|
enum lxw_format_diagonal_types {
|
167
|
+
|
168
|
+
/** Cell diagonal border from bottom left to top right. */
|
161
169
|
LXW_DIAGONAL_BORDER_UP = 1,
|
170
|
+
|
171
|
+
/** Cell diagonal border from top left to bottom right. */
|
162
172
|
LXW_DIAGONAL_BORDER_DOWN,
|
173
|
+
|
174
|
+
/** Cell diagonal border in both directions. */
|
163
175
|
LXW_DIAGONAL_BORDER_UP_DOWN
|
164
176
|
};
|
165
177
|
|
@@ -348,10 +360,13 @@ typedef struct lxw_format {
|
|
348
360
|
FILE *file;
|
349
361
|
|
350
362
|
lxw_hash_table *xf_format_indices;
|
363
|
+
lxw_hash_table *dxf_format_indices;
|
351
364
|
uint16_t *num_xf_formats;
|
365
|
+
uint16_t *num_dxf_formats;
|
352
366
|
|
353
367
|
int32_t xf_index;
|
354
368
|
int32_t dxf_index;
|
369
|
+
int32_t xf_id;
|
355
370
|
|
356
371
|
char num_format[LXW_FORMAT_FIELD_LEN];
|
357
372
|
char font_name[LXW_FORMAT_FIELD_LEN];
|
@@ -387,6 +402,8 @@ typedef struct lxw_format {
|
|
387
402
|
|
388
403
|
lxw_color_t fg_color;
|
389
404
|
lxw_color_t bg_color;
|
405
|
+
lxw_color_t dxf_fg_color;
|
406
|
+
lxw_color_t dxf_bg_color;
|
390
407
|
uint8_t pattern;
|
391
408
|
uint8_t has_fill;
|
392
409
|
uint8_t has_dxf_fill;
|
@@ -418,6 +435,8 @@ typedef struct lxw_format {
|
|
418
435
|
uint8_t color_indexed;
|
419
436
|
uint8_t font_only;
|
420
437
|
|
438
|
+
uint8_t quote_prefix;
|
439
|
+
|
421
440
|
STAILQ_ENTRY (lxw_format) list_pointers;
|
422
441
|
} lxw_format;
|
423
442
|
|
@@ -431,6 +450,7 @@ typedef struct lxw_font {
|
|
431
450
|
uint8_t bold;
|
432
451
|
uint8_t italic;
|
433
452
|
uint8_t underline;
|
453
|
+
uint8_t theme;
|
434
454
|
uint8_t font_strikeout;
|
435
455
|
uint8_t font_outline;
|
436
456
|
uint8_t font_shadow;
|
@@ -483,12 +503,11 @@ extern "C" {
|
|
483
503
|
lxw_format *lxw_format_new(void);
|
484
504
|
void lxw_format_free(lxw_format *format);
|
485
505
|
int32_t lxw_format_get_xf_index(lxw_format *format);
|
506
|
+
int32_t lxw_format_get_dxf_index(lxw_format *format);
|
486
507
|
lxw_font *lxw_format_get_font_key(lxw_format *format);
|
487
508
|
lxw_border *lxw_format_get_border_key(lxw_format *format);
|
488
509
|
lxw_fill *lxw_format_get_fill_key(lxw_format *format);
|
489
510
|
|
490
|
-
lxw_color_t lxw_format_check_color(lxw_color_t color);
|
491
|
-
|
492
511
|
/**
|
493
512
|
* @brief Set the font used in the cell.
|
494
513
|
*
|
@@ -672,6 +691,9 @@ void format_set_font_script(lxw_format *format, uint8_t style);
|
|
672
691
|
*
|
673
692
|
* @image html format_set_num_format.png
|
674
693
|
*
|
694
|
+
* To set a number format that matches an Excel format category such as "Date"
|
695
|
+
* or "Currency" see @ref ww_formats_categories.
|
696
|
+
*
|
675
697
|
* The number system used for dates is described in @ref working_with_dates.
|
676
698
|
*
|
677
699
|
* For more information on number formats in Excel refer to the
|
@@ -749,6 +771,7 @@ void format_set_num_format(lxw_format *format, const char *num_format);
|
|
749
771
|
* - The dollar sign in the above format appears as the defined local currency
|
750
772
|
* symbol.
|
751
773
|
* - These formats can also be set via format_set_num_format().
|
774
|
+
* - See also @ref ww_formats_categories.
|
752
775
|
*/
|
753
776
|
void format_set_num_format_index(lxw_format *format, uint8_t index);
|
754
777
|
|
@@ -1187,9 +1210,96 @@ void format_set_left_color(lxw_format *format, lxw_color_t color);
|
|
1187
1210
|
*/
|
1188
1211
|
void format_set_right_color(lxw_format *format, lxw_color_t color);
|
1189
1212
|
|
1190
|
-
|
1213
|
+
/**
|
1214
|
+
* @brief Set the diagonal cell border type.
|
1215
|
+
*
|
1216
|
+
* @param format Pointer to a Format instance.
|
1217
|
+
* @param type The #lxw_format_diagonal_types diagonal border type.
|
1218
|
+
*
|
1219
|
+
* Set the diagonal cell border type:
|
1220
|
+
*
|
1221
|
+
* @code
|
1222
|
+
* lxw_format *format1 = workbook_add_format(workbook);
|
1223
|
+
* format_set_diag_type( format1, LXW_DIAGONAL_BORDER_UP);
|
1224
|
+
*
|
1225
|
+
* lxw_format *format2 = workbook_add_format(workbook);
|
1226
|
+
* format_set_diag_type( format2, LXW_DIAGONAL_BORDER_DOWN);
|
1227
|
+
*
|
1228
|
+
* lxw_format *format3 = workbook_add_format(workbook);
|
1229
|
+
* format_set_diag_type( format3, LXW_DIAGONAL_BORDER_UP_DOWN);
|
1230
|
+
*
|
1231
|
+
* lxw_format *format4 = workbook_add_format(workbook);
|
1232
|
+
* format_set_diag_type( format4, LXW_DIAGONAL_BORDER_UP_DOWN);
|
1233
|
+
* format_set_diag_border(format4, LXW_BORDER_HAIR);
|
1234
|
+
* format_set_diag_color( format4, LXW_COLOR_RED);
|
1235
|
+
*
|
1236
|
+
* worksheet_write_string(worksheet, CELL("B3"), "Text", format1);
|
1237
|
+
* worksheet_write_string(worksheet, CELL("B6"), "Text", format2);
|
1238
|
+
* worksheet_write_string(worksheet, CELL("B9"), "Text", format3);
|
1239
|
+
* worksheet_write_string(worksheet, CELL("B12"), "Text", format4);
|
1240
|
+
* @endcode
|
1241
|
+
*
|
1242
|
+
* @image html diagonal_border.png
|
1243
|
+
*
|
1244
|
+
* The allowable border types are defined in #lxw_format_diagonal_types:
|
1245
|
+
*
|
1246
|
+
* - #LXW_DIAGONAL_BORDER_UP: Cell diagonal border from bottom left to top
|
1247
|
+
* right.
|
1248
|
+
*
|
1249
|
+
* - #LXW_DIAGONAL_BORDER_DOWN: Cell diagonal border from top left to bottom
|
1250
|
+
* right.
|
1251
|
+
*
|
1252
|
+
* - #LXW_DIAGONAL_BORDER_UP_DOWN: Cell diagonal border from top left to
|
1253
|
+
* bottom right. A combination of the 2 previous types.
|
1254
|
+
*
|
1255
|
+
* If the border style isn't specified with `format_set_diag_border()` then it
|
1256
|
+
* will default to #LXW_BORDER_THIN.
|
1257
|
+
*/
|
1258
|
+
void format_set_diag_type(lxw_format *format, uint8_t type);
|
1259
|
+
|
1260
|
+
/**
|
1261
|
+
* @brief Set the diagonal cell border style.
|
1262
|
+
*
|
1263
|
+
* @param format Pointer to a Format instance.
|
1264
|
+
* @param style The #lxw_format_borders style.
|
1265
|
+
*
|
1266
|
+
* Set the diagonal border style. This should be a #lxw_format_borders value.
|
1267
|
+
* See the example above.
|
1268
|
+
*
|
1269
|
+
*/
|
1270
|
+
void format_set_diag_border(lxw_format *format, uint8_t style);
|
1271
|
+
|
1272
|
+
/**
|
1273
|
+
* @brief Set the diagonal cell border color.
|
1274
|
+
*
|
1275
|
+
* @param format Pointer to a Format instance.
|
1276
|
+
* @param color The cell diagonal border color.
|
1277
|
+
*
|
1278
|
+
* Set the diagonal border color. The color should be an RGB integer value,
|
1279
|
+
* see @ref working_with_colors and the above example.
|
1280
|
+
*/
|
1191
1281
|
void format_set_diag_color(lxw_format *format, lxw_color_t color);
|
1192
|
-
|
1282
|
+
|
1283
|
+
/**
|
1284
|
+
* @brief Turn on quote prefix for the format.
|
1285
|
+
*
|
1286
|
+
* @param format Pointer to a Format instance.
|
1287
|
+
*
|
1288
|
+
* Set the quote prefix property of a format to ensure a string is treated
|
1289
|
+
* as a string after editing. This is the same as prefixing the string with
|
1290
|
+
* a single quote in Excel. You don't need to add the quote to the
|
1291
|
+
* string but you do need to add the format.
|
1292
|
+
*
|
1293
|
+
* @code
|
1294
|
+
* format = workbook_add_format(workbook);
|
1295
|
+
* format_set_quote_prefix(format);
|
1296
|
+
*
|
1297
|
+
* worksheet_write_string(worksheet, 0, 0, "=Foo", format);
|
1298
|
+
* @endcode
|
1299
|
+
*
|
1300
|
+
*/
|
1301
|
+
void format_set_quote_prefix(lxw_format *format);
|
1302
|
+
|
1193
1303
|
void format_set_font_outline(lxw_format *format);
|
1194
1304
|
void format_set_font_shadow(lxw_format *format);
|
1195
1305
|
void format_set_font_family(lxw_format *format, uint8_t value);
|
@@ -1199,6 +1309,9 @@ void format_set_font_condense(lxw_format *format);
|
|
1199
1309
|
void format_set_font_extend(lxw_format *format);
|
1200
1310
|
void format_set_reading_order(lxw_format *format, uint8_t value);
|
1201
1311
|
void format_set_theme(lxw_format *format, uint8_t value);
|
1312
|
+
void format_set_hyperlink(lxw_format *format);
|
1313
|
+
void format_set_color_indexed(lxw_format *format, uint8_t value);
|
1314
|
+
void format_set_font_only(lxw_format *format);
|
1202
1315
|
|
1203
1316
|
/* Declarations required for unit testing. */
|
1204
1317
|
#ifdef TESTING
|
@@ -0,0 +1,49 @@
|
|
1
|
+
/*
|
2
|
+
* libxlsxwriter
|
3
|
+
*
|
4
|
+
* Copyright 2014-2022, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
|
5
|
+
*
|
6
|
+
* metadata - A libxlsxwriter library for creating Excel XLSX metadata files.
|
7
|
+
*
|
8
|
+
*/
|
9
|
+
#ifndef __LXW_METADATA_H__
|
10
|
+
#define __LXW_METADATA_H__
|
11
|
+
|
12
|
+
#include <stdint.h>
|
13
|
+
|
14
|
+
#include "common.h"
|
15
|
+
|
16
|
+
/*
|
17
|
+
* Struct to represent a metadata object.
|
18
|
+
*/
|
19
|
+
typedef struct lxw_metadata {
|
20
|
+
|
21
|
+
FILE *file;
|
22
|
+
|
23
|
+
} lxw_metadata;
|
24
|
+
|
25
|
+
|
26
|
+
/* *INDENT-OFF* */
|
27
|
+
#ifdef __cplusplus
|
28
|
+
extern "C" {
|
29
|
+
#endif
|
30
|
+
/* *INDENT-ON* */
|
31
|
+
|
32
|
+
lxw_metadata *lxw_metadata_new(void);
|
33
|
+
void lxw_metadata_free(lxw_metadata *metadata);
|
34
|
+
void lxw_metadata_assemble_xml_file(lxw_metadata *self);
|
35
|
+
|
36
|
+
/* Declarations required for unit testing. */
|
37
|
+
#ifdef TESTING
|
38
|
+
|
39
|
+
STATIC void _metadata_xml_declaration(lxw_metadata *self);
|
40
|
+
|
41
|
+
#endif /* TESTING */
|
42
|
+
|
43
|
+
/* *INDENT-OFF* */
|
44
|
+
#ifdef __cplusplus
|
45
|
+
}
|
46
|
+
#endif
|
47
|
+
/* *INDENT-ON* */
|
48
|
+
|
49
|
+
#endif /* __LXW_METADATA_H__ */
|