xlsxwriter 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +40 -0
  3. data/ext/xlsxwriter/chart.c +105 -0
  4. data/ext/xlsxwriter/chart.h +27 -0
  5. data/ext/xlsxwriter/extconf.rb +14 -0
  6. data/ext/xlsxwriter/format.c +67 -0
  7. data/ext/xlsxwriter/format.h +9 -0
  8. data/ext/xlsxwriter/libxlsxwriter/LICENSE.txt +89 -0
  9. data/ext/xlsxwriter/libxlsxwriter/Makefile +141 -0
  10. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter.h +23 -0
  11. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/app.h +79 -0
  12. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/chart.h +1093 -0
  13. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/common.h +336 -0
  14. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/content_types.h +74 -0
  15. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/core.h +51 -0
  16. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/custom.h +52 -0
  17. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/drawing.h +111 -0
  18. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/format.h +1214 -0
  19. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/hash_table.h +76 -0
  20. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/packager.h +80 -0
  21. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/relationships.h +77 -0
  22. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/shared_strings.h +83 -0
  23. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/styles.h +77 -0
  24. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/theme.h +47 -0
  25. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/third_party/ioapi.h +215 -0
  26. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/third_party/queue.h +694 -0
  27. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/third_party/tmpfileplus.h +53 -0
  28. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/third_party/tree.h +801 -0
  29. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/third_party/zip.h +375 -0
  30. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/utility.h +166 -0
  31. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/workbook.h +751 -0
  32. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/worksheet.h +2641 -0
  33. data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/xmlwriter.h +178 -0
  34. data/ext/xlsxwriter/libxlsxwriter/lib/.gitignore +0 -0
  35. data/ext/xlsxwriter/libxlsxwriter/src/Makefile +125 -0
  36. data/ext/xlsxwriter/libxlsxwriter/src/app.c +439 -0
  37. data/ext/xlsxwriter/libxlsxwriter/src/chart.c +3420 -0
  38. data/ext/xlsxwriter/libxlsxwriter/src/content_types.c +341 -0
  39. data/ext/xlsxwriter/libxlsxwriter/src/core.c +293 -0
  40. data/ext/xlsxwriter/libxlsxwriter/src/custom.c +224 -0
  41. data/ext/xlsxwriter/libxlsxwriter/src/drawing.c +746 -0
  42. data/ext/xlsxwriter/libxlsxwriter/src/format.c +728 -0
  43. data/ext/xlsxwriter/libxlsxwriter/src/hash_table.c +223 -0
  44. data/ext/xlsxwriter/libxlsxwriter/src/packager.c +877 -0
  45. data/ext/xlsxwriter/libxlsxwriter/src/relationships.c +242 -0
  46. data/ext/xlsxwriter/libxlsxwriter/src/shared_strings.c +264 -0
  47. data/ext/xlsxwriter/libxlsxwriter/src/styles.c +1086 -0
  48. data/ext/xlsxwriter/libxlsxwriter/src/theme.c +348 -0
  49. data/ext/xlsxwriter/libxlsxwriter/src/utility.c +512 -0
  50. data/ext/xlsxwriter/libxlsxwriter/src/workbook.c +1895 -0
  51. data/ext/xlsxwriter/libxlsxwriter/src/worksheet.c +4992 -0
  52. data/ext/xlsxwriter/libxlsxwriter/src/xmlwriter.c +355 -0
  53. data/ext/xlsxwriter/libxlsxwriter/third_party/minizip/Makefile +44 -0
  54. data/ext/xlsxwriter/libxlsxwriter/third_party/minizip/crypt.h +131 -0
  55. data/ext/xlsxwriter/libxlsxwriter/third_party/minizip/ioapi.c +247 -0
  56. data/ext/xlsxwriter/libxlsxwriter/third_party/minizip/ioapi.h +209 -0
  57. data/ext/xlsxwriter/libxlsxwriter/third_party/minizip/iowin32.c +456 -0
  58. data/ext/xlsxwriter/libxlsxwriter/third_party/minizip/iowin32.h +28 -0
  59. data/ext/xlsxwriter/libxlsxwriter/third_party/minizip/miniunz.c +660 -0
  60. data/ext/xlsxwriter/libxlsxwriter/third_party/minizip/minizip.c +520 -0
  61. data/ext/xlsxwriter/libxlsxwriter/third_party/minizip/mztools.c +291 -0
  62. data/ext/xlsxwriter/libxlsxwriter/third_party/minizip/mztools.h +37 -0
  63. data/ext/xlsxwriter/libxlsxwriter/third_party/minizip/unzip.c +2125 -0
  64. data/ext/xlsxwriter/libxlsxwriter/third_party/minizip/unzip.h +437 -0
  65. data/ext/xlsxwriter/libxlsxwriter/third_party/minizip/zip.c +2007 -0
  66. data/ext/xlsxwriter/libxlsxwriter/third_party/minizip/zip.h +367 -0
  67. data/ext/xlsxwriter/libxlsxwriter/third_party/tmpfileplus/Makefile +42 -0
  68. data/ext/xlsxwriter/libxlsxwriter/third_party/tmpfileplus/tmpfileplus.c +342 -0
  69. data/ext/xlsxwriter/libxlsxwriter/third_party/tmpfileplus/tmpfileplus.h +53 -0
  70. data/ext/xlsxwriter/workbook.c +257 -0
  71. data/ext/xlsxwriter/workbook.h +42 -0
  72. data/ext/xlsxwriter/workbook_properties.c +103 -0
  73. data/ext/xlsxwriter/workbook_properties.h +10 -0
  74. data/ext/xlsxwriter/worksheet.c +1064 -0
  75. data/ext/xlsxwriter/worksheet.h +74 -0
  76. data/ext/xlsxwriter/xlsxwriter.c +239 -0
  77. data/lib/xlsxwriter.rb +6 -0
  78. data/lib/xlsxwriter/version.rb +3 -0
  79. data/lib/xlsxwriter/worksheet.rb +72 -0
  80. data/test/run-test.rb +11 -0
  81. data/test/support/xlsx_comparable.rb +109 -0
  82. data/test/test-array-formula.rb +33 -0
  83. data/test/test-autofilter.rb +70 -0
  84. data/test/test-chart-area.rb +25 -0
  85. data/test/test-data.rb +65 -0
  86. data/test/test-default-row.rb +25 -0
  87. data/test/test-defined-name.rb +46 -0
  88. data/test/test-escapes.rb +33 -0
  89. data/test/test-fit-to-pages.rb +21 -0
  90. data/test/test-formatting.rb +137 -0
  91. data/test/test-gridlines.rb +15 -0
  92. data/test/test-hyperlink.rb +67 -0
  93. data/test/test-image.rb +84 -0
  94. data/test/test-merge-range.rb +18 -0
  95. data/test/test-misc.rb +29 -0
  96. data/test/test-optimize.rb +32 -0
  97. data/test/test-page-breaks.rb +13 -0
  98. data/test/test-page-setup.rb +28 -0
  99. data/test/test-panes.rb +45 -0
  100. data/test/test-print-area.rb +19 -0
  101. data/test/test-print-options.rb +61 -0
  102. data/test/test-print-scale.rb +12 -0
  103. data/test/test-properties.rb +51 -0
  104. data/test/test-protect.rb +27 -0
  105. data/test/test-repeat.rb +23 -0
  106. data/test/test-row-col-format.rb +35 -0
  107. data/test/test-set-selection.rb +13 -0
  108. data/test/test-set-start-page.rb +13 -0
  109. data/test/test-simple.rb +62 -0
  110. data/test/test-types.rb +17 -0
  111. data/test/xlsx-func-testcase.rb +36 -0
  112. metadata +228 -0
@@ -0,0 +1,10 @@
1
+ #include <ruby.h>
2
+
3
+ #ifndef __WORKBOOK_PROPERTIES__
4
+ #define __WORKBOOK_PROPIRTIES__
5
+
6
+ VALUE workbook_properties_init_(VALUE, VALUE);
7
+ VALUE workbook_properties_set_dir_(VALUE self, VALUE value);
8
+ VALUE workbook_properties_set_(VALUE self, VALUE key, VALUE value);
9
+
10
+ #endif // __WORKBOOK_PROPIRTIES__
@@ -0,0 +1,1064 @@
1
+ #include "chart.h"
2
+ #include "worksheet.h"
3
+ #include "workbook.h"
4
+
5
+ VALUE
6
+ worksheet_alloc(VALUE klass)
7
+ {
8
+ VALUE obj;
9
+ struct worksheet *ptr;
10
+
11
+ obj = Data_Make_Struct(klass, struct worksheet, NULL, worksheet_free, ptr);
12
+
13
+ ptr->worksheet = NULL;
14
+
15
+ return obj;
16
+ }
17
+
18
+ VALUE
19
+ worksheet_init(int argc, VALUE *argv, VALUE self) {
20
+ char *name = NULL;
21
+ VALUE opts = Qnil;
22
+ VALUE auto_width = Qtrue;
23
+ struct workbook *wb_ptr;
24
+ struct worksheet *ptr;
25
+
26
+ Data_Get_Struct(self, struct worksheet, ptr);
27
+
28
+ if (argc > 2 || argc < 1) {
29
+ rb_raise(rb_eArgError, "wrong number of arguments");
30
+ } else if (argc == 2) {
31
+ switch (TYPE(argv[1])) {
32
+ case T_HASH:
33
+ opts = argv[1];
34
+ break;
35
+ case T_STRING:
36
+ case T_SYMBOL:
37
+ name = StringValueCStr(argv[1]);
38
+ break;
39
+ case T_NIL:
40
+ break;
41
+ default:
42
+ rb_raise(rb_eArgError, "wrong type of name");
43
+ break;
44
+ }
45
+ }
46
+
47
+ if (!NIL_P(opts)) {
48
+ VALUE val = rb_hash_aref(opts, ID2SYM(rb_intern("auto_width")));
49
+ if (val == Qfalse) {
50
+ auto_width = Qfalse;
51
+ }
52
+ val = rb_hash_aref(opts, ID2SYM(rb_intern("name")));
53
+ if (!NIL_P(val) && !name) {
54
+ name = StringValueCStr(val);
55
+ }
56
+ }
57
+
58
+ rb_iv_set(self, "@workbook", argv[0]);
59
+ rb_iv_set(self, "@use_auto_width", auto_width);
60
+ rb_iv_set(self, "@col_auto_widths", rb_ary_new());
61
+
62
+ Data_Get_Struct(argv[0], struct workbook, wb_ptr);
63
+ ptr->worksheet = workbook_add_worksheet(wb_ptr->workbook, name);
64
+ return self;
65
+ }
66
+
67
+ VALUE
68
+ worksheet_release(VALUE self) {
69
+ struct worksheet *ptr;
70
+ Data_Get_Struct(self, struct worksheet, ptr);
71
+
72
+ worksheet_free(ptr);
73
+ return self;
74
+ }
75
+
76
+ void
77
+ worksheet_free(void *p) {
78
+ struct worksheet *ptr = p;
79
+
80
+ if (ptr->worksheet) {
81
+ ptr->worksheet = NULL;
82
+ }
83
+ }
84
+
85
+ VALUE
86
+ worksheet_write_string_(int argc, VALUE *argv, VALUE self) {
87
+ lxw_row_t row;
88
+ lxw_col_t col;
89
+ VALUE value = Qnil;
90
+ VALUE format_key = Qnil;
91
+
92
+ rb_check_arity(argc, 2, 4);
93
+ int larg = extract_cell(argc, argv, &row, &col);
94
+
95
+ if (larg < argc) {
96
+ value = argv[larg];
97
+ ++larg;
98
+ }
99
+
100
+ if (larg < argc) {
101
+ format_key = argv[larg];
102
+ ++larg;
103
+ }
104
+
105
+ const char *str = StringValueCStr(value);
106
+ struct worksheet *ptr;
107
+ VALUE workbook = rb_iv_get(self, "@workbook");
108
+ lxw_format *format = workbook_get_format(workbook, format_key);
109
+ Data_Get_Struct(self, struct worksheet, ptr);
110
+ worksheet_write_string(ptr->worksheet, row, col, str, format);
111
+ return self;
112
+ }
113
+
114
+ VALUE
115
+ worksheet_write_number_(int argc, VALUE *argv, VALUE self) {
116
+ lxw_row_t row;
117
+ lxw_col_t col;
118
+ VALUE value = Qnil;
119
+ VALUE format_key = Qnil;
120
+
121
+ rb_check_arity(argc, 2, 4);
122
+ int larg = extract_cell(argc, argv, &row, &col);
123
+
124
+ if (larg < argc) {
125
+ value = argv[larg];
126
+ ++larg;
127
+ }
128
+
129
+ if (larg < argc) {
130
+ format_key = argv[larg];
131
+ ++larg;
132
+ }
133
+
134
+ const double num = NUM2DBL(value);
135
+ struct worksheet *ptr;
136
+ VALUE workbook = rb_iv_get(self, "@workbook");
137
+ lxw_format *format = workbook_get_format(workbook, format_key);
138
+ Data_Get_Struct(self, struct worksheet, ptr);
139
+ worksheet_write_number(ptr->worksheet, row, col, num, format);
140
+ return self;
141
+ }
142
+
143
+ VALUE
144
+ worksheet_write_formula_(int argc, VALUE *argv, VALUE self) {
145
+ lxw_row_t row;
146
+ lxw_col_t col;
147
+ VALUE value = Qnil;
148
+ VALUE format_key = Qnil;
149
+
150
+ rb_check_arity(argc, 2, 4);
151
+ int larg = extract_cell(argc, argv, &row, &col);
152
+
153
+ if (larg < argc) {
154
+ value = argv[larg];
155
+ ++larg;
156
+ }
157
+
158
+ if (larg < argc) {
159
+ format_key = argv[larg];
160
+ ++larg;
161
+ }
162
+
163
+ const char *str = RSTRING_PTR(value);
164
+ struct worksheet *ptr;
165
+ VALUE workbook = rb_iv_get(self, "@workbook");
166
+ lxw_format *format = workbook_get_format(workbook, format_key);
167
+ Data_Get_Struct(self, struct worksheet, ptr);
168
+ worksheet_write_formula(ptr->worksheet, row, col, str, format);
169
+ return self;
170
+ }
171
+
172
+ VALUE worksheet_write_array_formula_(int argc, VALUE *argv, VALUE self) {
173
+ lxw_row_t row_from, row_to;
174
+ lxw_col_t col_from, col_to;
175
+ const char *str;
176
+ VALUE format_key = Qnil;
177
+
178
+ rb_check_arity(argc, 2, 6);
179
+ int larg = extract_range(argc, argv, &row_from, &col_from, &row_to, &col_to);
180
+
181
+ if (larg < argc) {
182
+ str = StringValueCStr(argv[larg]);
183
+ ++larg;
184
+ }
185
+
186
+ if (larg < argc) {
187
+ format_key = argv[larg];
188
+ ++larg;
189
+ }
190
+
191
+ struct worksheet *ptr;
192
+ VALUE workbook = rb_iv_get(self, "@workbook");
193
+ lxw_format *format = workbook_get_format(workbook, format_key);
194
+ Data_Get_Struct(self, struct worksheet, ptr);
195
+ worksheet_write_array_formula(ptr->worksheet, row_from, col_from, row_to, col_to, str, format);
196
+ return self;
197
+ }
198
+
199
+ VALUE
200
+ worksheet_write_datetime_(int argc, VALUE *argv, VALUE self) {
201
+ lxw_row_t row;
202
+ lxw_col_t col;
203
+ VALUE value = Qnil;
204
+ VALUE format_key = Qnil;
205
+
206
+ rb_check_arity(argc, 2, 4);
207
+ int larg = extract_cell(argc, argv, &row, &col);
208
+
209
+ if (larg < argc) {
210
+ value = argv[larg];
211
+ ++larg;
212
+ }
213
+
214
+ if (larg < argc) {
215
+ format_key = argv[larg];
216
+ ++larg;
217
+ }
218
+
219
+ struct lxw_datetime datetime = value_to_lxw_datetime(value);
220
+ struct worksheet *ptr;
221
+ VALUE workbook = rb_iv_get(self, "@workbook");
222
+ lxw_format *format = workbook_get_format(workbook, format_key);
223
+ Data_Get_Struct(self, struct worksheet, ptr);
224
+ worksheet_write_datetime(ptr->worksheet, row, col, &datetime, format);
225
+ return self;
226
+ }
227
+
228
+ VALUE
229
+ worksheet_write_url_(int argc, VALUE *argv, VALUE self) {
230
+ lxw_row_t row;
231
+ lxw_col_t col;
232
+ VALUE url = Qnil; //argv[2];
233
+ VALUE format_key = Qnil; // argv[3];
234
+ VALUE opts = Qnil;
235
+
236
+ rb_check_arity(argc, 2, 5);
237
+ int larg = extract_cell(argc, argv, &row, &col);
238
+
239
+ if (larg < argc) {
240
+ url = argv[larg];
241
+ ++larg;
242
+ }
243
+
244
+ const char *url_str = RSTRING_PTR(url);
245
+ char *string = NULL;
246
+ char *tooltip = NULL;
247
+ while (larg < argc) {
248
+ switch(TYPE(argv[larg])) {
249
+ case T_HASH:
250
+ opts = argv[larg];
251
+ break;
252
+ case T_SYMBOL: case T_STRING: case T_NIL:
253
+ format_key = argv[larg];
254
+ break;
255
+ default:
256
+ rb_raise(rb_eTypeError, "Expected Hash, symbol or string but got %"PRIsVALUE, rb_obj_class(argv[larg]));
257
+ }
258
+ ++larg;
259
+ }
260
+
261
+ if (!NIL_P(opts)) {
262
+ VALUE val;
263
+ val = rb_hash_aref(opts, ID2SYM(rb_intern("string")));
264
+ if (!NIL_P(val)) {
265
+ string = StringValueCStr(val);
266
+ }
267
+ val = rb_hash_aref(opts, ID2SYM(rb_intern("tooltip")));
268
+ if (!NIL_P(val)) {
269
+ tooltip = StringValueCStr(val);
270
+ }
271
+ if (NIL_P(format_key)) {
272
+ format_key = rb_hash_aref(opts, ID2SYM(rb_intern("format")));
273
+ }
274
+ }
275
+ struct worksheet *ptr;
276
+ VALUE workbook = rb_iv_get(self, "@workbook");
277
+ lxw_format *format = workbook_get_format(workbook, format_key);
278
+ Data_Get_Struct(self, struct worksheet, ptr);
279
+ if (string || tooltip) {
280
+ worksheet_write_url_opt(ptr->worksheet, row, col, url_str, format, string, tooltip);
281
+ } else {
282
+ worksheet_write_url(ptr->worksheet, row, col, url_str, format);
283
+ }
284
+ return self;
285
+ }
286
+
287
+ VALUE
288
+ worksheet_write_boolean_(int argc, VALUE *argv, VALUE self) {
289
+ lxw_row_t row;
290
+ lxw_col_t col;
291
+ int bool_value = 0;
292
+ VALUE format_key = Qnil;
293
+
294
+ rb_check_arity(argc, 2, 4);
295
+ int larg = extract_cell(argc, argv, &row, &col);
296
+
297
+ if (larg < argc) {
298
+ bool_value = argv[larg] && !NIL_P(argv[larg]);
299
+ ++larg;
300
+ }
301
+
302
+ if (larg < argc) {
303
+ format_key = argv[larg];
304
+ ++larg;
305
+ }
306
+
307
+ struct worksheet *ptr;
308
+ VALUE workbook = rb_iv_get(self, "@workbook");
309
+ lxw_format *format = workbook_get_format(workbook, format_key);
310
+ Data_Get_Struct(self, struct worksheet, ptr);
311
+ worksheet_write_boolean(ptr->worksheet, row, col, bool_value, format);
312
+ return self;
313
+ }
314
+
315
+ VALUE
316
+ worksheet_write_blank_(int argc, VALUE *argv, VALUE self) {
317
+ lxw_row_t row;
318
+ lxw_col_t col;
319
+ VALUE format_key = Qnil;
320
+
321
+ rb_check_arity(argc, 1, 3);
322
+ int larg = extract_cell(argc, argv, &row, &col);
323
+
324
+ if (larg < argc) {
325
+ format_key = argv[larg];
326
+ ++larg;
327
+ }
328
+
329
+ struct worksheet *ptr;
330
+ VALUE workbook = rb_iv_get(self, "@workbook");
331
+ lxw_format *format = workbook_get_format(workbook, format_key);
332
+ Data_Get_Struct(self, struct worksheet, ptr);
333
+ worksheet_write_blank(ptr->worksheet, row, col, format);
334
+ return self;
335
+ }
336
+
337
+ VALUE worksheet_write_formula_num_(int argc, VALUE *argv, VALUE self) {
338
+ lxw_row_t row;
339
+ lxw_col_t col;
340
+ VALUE formula = Qnil;
341
+ VALUE value = Qnil;
342
+ VALUE format_key = Qnil;
343
+
344
+ rb_check_arity(argc, 3, 5);
345
+ int larg = extract_cell(argc, argv, &row, &col);
346
+
347
+ if (larg < argc) {
348
+ formula = argv[larg];
349
+ ++larg;
350
+ }
351
+
352
+ if (larg + 1 < argc) {
353
+ format_key = argv[larg];
354
+ ++larg;
355
+ }
356
+
357
+ if (larg < argc) {
358
+ value = argv[larg];
359
+ ++larg;
360
+ }
361
+
362
+ const char *str = RSTRING_PTR(formula);
363
+ struct worksheet *ptr;
364
+ VALUE workbook = rb_iv_get(self, "@workbook");
365
+ lxw_format *format = workbook_get_format(workbook, format_key);
366
+ Data_Get_Struct(self, struct worksheet, ptr);
367
+ worksheet_write_formula_num(ptr->worksheet, row, col, str, format, NUM2DBL(value));
368
+ return self;
369
+ }
370
+
371
+ VALUE
372
+ worksheet_set_row_(VALUE self, VALUE row, VALUE opts) {
373
+ double height = LXW_DEF_ROW_HEIGHT;
374
+ lxw_format *format = NULL;
375
+ lxw_row_col_options options = {
376
+ .hidden = 0,
377
+ .collapsed = 0,
378
+ .level = 0
379
+ };
380
+ VALUE val;
381
+ VALUE workbook = rb_iv_get(self, "@workbook");
382
+
383
+ val = rb_hash_aref(opts, ID2SYM(rb_intern("height")));
384
+ if (val != Qnil)
385
+ height = NUM2DBL(val);
386
+
387
+ val = rb_hash_aref(opts, ID2SYM(rb_intern("format")));
388
+ format = workbook_get_format(workbook, val);
389
+
390
+ val = rb_hash_aref(opts, ID2SYM(rb_intern("hide")));
391
+ if (val != Qnil && val)
392
+ options.hidden = 1;
393
+
394
+ struct worksheet *ptr;
395
+ Data_Get_Struct(self, struct worksheet, ptr);
396
+ if (options.hidden) {
397
+ worksheet_set_row_opt(ptr->worksheet, NUM2INT(row), height, format, &options);
398
+ } else {
399
+ worksheet_set_row(ptr->worksheet, NUM2INT(row), height, format);
400
+ }
401
+ return self;
402
+ }
403
+
404
+ VALUE
405
+ worksheet_set_column_(VALUE self, VALUE col_from, VALUE col_to, VALUE opts) {
406
+ double width = LXW_DEF_COL_WIDTH;
407
+ lxw_format *format = NULL;
408
+ lxw_row_col_options options = {
409
+ .hidden = 0,
410
+ .collapsed = 0,
411
+ .level = 0
412
+ };
413
+ VALUE val;
414
+ lxw_col_t col1 = value_to_col(col_from);
415
+ lxw_col_t col2 = value_to_col(col_to);
416
+ VALUE workbook = rb_iv_get(self, "@workbook");
417
+
418
+ val = rb_hash_aref(opts, ID2SYM(rb_intern("width")));
419
+ if (val != Qnil)
420
+ width = NUM2DBL(val);
421
+
422
+ val = rb_hash_aref(opts, ID2SYM(rb_intern("format")));
423
+ format = workbook_get_format(workbook, val);
424
+
425
+ val = rb_hash_aref(opts, ID2SYM(rb_intern("hide")));
426
+ if (val != Qnil && val)
427
+ options.hidden = 1;
428
+
429
+ struct worksheet *ptr;
430
+ Data_Get_Struct(self, struct worksheet, ptr);
431
+ if (options.hidden) {
432
+ worksheet_set_column_opt(ptr->worksheet, col1, col2, width, format, &options);
433
+ } else {
434
+ worksheet_set_column(ptr->worksheet, col1, col2, width, format);
435
+ }
436
+ return self;
437
+ }
438
+
439
+ #define SET_IMG_OPT(key, setter) { \
440
+ val = rb_hash_aref(opts, ID2SYM(rb_intern(key))); \
441
+ if (!NIL_P(val)) { \
442
+ with_options = '\1'; \
443
+ setter; \
444
+ } \
445
+ }
446
+
447
+ VALUE
448
+ worksheet_insert_image_(int argc, VALUE *argv, VALUE self) {
449
+ lxw_row_t row;
450
+ lxw_col_t col;
451
+ VALUE fname = Qnil;
452
+ VALUE opts = Qnil;
453
+ VALUE val = Qnil;
454
+ lxw_image_options options = {
455
+ .x_offset = 0,
456
+ .y_offset = 0,
457
+ .x_scale = 1.0,
458
+ .y_scale = 1.0
459
+ };
460
+ char with_options = '\0';
461
+
462
+ rb_check_arity(argc, 2, 4);
463
+ int larg = extract_cell(argc, argv, &row, &col);
464
+
465
+ if (larg < argc) {
466
+ fname = argv[larg];
467
+ ++larg;
468
+ }
469
+
470
+ if (larg < argc) {
471
+ opts = argv[larg];
472
+ ++larg;
473
+ }
474
+
475
+ struct worksheet *ptr;
476
+ Data_Get_Struct(self, struct worksheet, ptr);
477
+
478
+ if (!NIL_P(opts)) {
479
+ SET_IMG_OPT("offset", options.x_offset = options.y_offset = NUM2INT(val));
480
+ SET_IMG_OPT("x_offset", options.x_offset = NUM2INT(val));
481
+ SET_IMG_OPT("y_offset", options.y_offset = NUM2INT(val));
482
+ SET_IMG_OPT("scale", options.x_scale = options.y_scale = NUM2DBL(val));
483
+ SET_IMG_OPT("x_scale", options.x_scale = NUM2DBL(val));
484
+ SET_IMG_OPT("y_scale", options.y_scale = NUM2DBL(val));
485
+ }
486
+
487
+ if (with_options) {
488
+ worksheet_insert_image_opt(ptr->worksheet, row, col, StringValueCStr(fname), &options);
489
+ } else {
490
+ worksheet_insert_image(ptr->worksheet, row, col, StringValueCStr(fname));
491
+ }
492
+
493
+ return self;
494
+ }
495
+
496
+ #undef SET_IMG_OPT
497
+
498
+ VALUE
499
+ worksheet_insert_chart_(int argc, VALUE *argv, VALUE self) {
500
+ lxw_row_t row;
501
+ lxw_col_t col;
502
+ VALUE chart;
503
+
504
+ rb_check_arity(argc, 2, 3);
505
+ int larg = extract_cell(argc, argv, &row, &col);
506
+
507
+ if (larg < argc) {
508
+ chart = argv[larg];
509
+ ++larg;
510
+ } else {
511
+ rb_raise(rb_eArgError, "No chart specified");
512
+ }
513
+
514
+ struct worksheet *ptr;
515
+ struct chart *chart_ptr;
516
+ Data_Get_Struct(self, struct worksheet, ptr);
517
+ Data_Get_Struct(chart, struct chart, chart_ptr);
518
+
519
+ worksheet_insert_chart(ptr->worksheet, row, col, chart_ptr->chart);
520
+
521
+ return self;
522
+ }
523
+
524
+ #undef SET_IMG_OPT
525
+
526
+ VALUE
527
+ worksheet_merge_range_(int argc, VALUE *argv, VALUE self) {
528
+ char *str;
529
+ lxw_format *format = NULL;
530
+ lxw_col_t col1, col2;
531
+ lxw_row_t row1, row2;
532
+ VALUE workbook = rb_iv_get(self, "@workbook");
533
+
534
+ rb_check_arity(argc, 2, 6);
535
+ int larg = extract_range(argc, argv, &row1, &col1, &row2, &col2);
536
+
537
+ if (larg < argc) {
538
+ str = StringValueCStr(argv[larg]);
539
+ ++larg;
540
+ }
541
+
542
+ if (larg < argc) {
543
+ format = workbook_get_format(workbook, argv[larg]);
544
+ ++larg;
545
+ }
546
+
547
+ struct worksheet *ptr;
548
+ Data_Get_Struct(self, struct worksheet, ptr);
549
+
550
+ worksheet_merge_range(ptr->worksheet, row1, col1, row2, col2, str, format);
551
+ return self;
552
+ }
553
+
554
+ VALUE
555
+ worksheet_autofilter_(int argc, VALUE *argv, VALUE self) {
556
+ lxw_row_t row_from, row_to;
557
+ lxw_col_t col_from, col_to;
558
+
559
+ rb_check_arity(argc, 1, 4);
560
+ extract_range(argc, argv, &row_from, &col_from, &row_to, &col_to);
561
+
562
+ struct worksheet *ptr;
563
+ Data_Get_Struct(self, struct worksheet, ptr);
564
+
565
+ worksheet_autofilter(ptr->worksheet, row_from, col_from, row_to, col_to);
566
+ return self;
567
+ }
568
+ VALUE worksheet_activate_(VALUE self) {
569
+ struct worksheet *ptr;
570
+ Data_Get_Struct(self, struct worksheet, ptr);
571
+ worksheet_activate(ptr->worksheet);
572
+ return self;
573
+ }
574
+ VALUE worksheet_select_(VALUE self) {
575
+ struct worksheet *ptr;
576
+ Data_Get_Struct(self, struct worksheet, ptr);
577
+ worksheet_select(ptr->worksheet);
578
+ return self;
579
+ }
580
+
581
+ VALUE
582
+ worksheet_hide_(VALUE self) {
583
+ struct worksheet *ptr;
584
+ Data_Get_Struct(self, struct worksheet, ptr);
585
+ worksheet_hide(ptr->worksheet);
586
+ return self;
587
+ }
588
+
589
+ VALUE
590
+ worksheet_set_first_sheet_(VALUE self) {
591
+ struct worksheet *ptr;
592
+ Data_Get_Struct(self, struct worksheet, ptr);
593
+ worksheet_set_first_sheet(ptr->worksheet);
594
+ return self;
595
+ }
596
+ VALUE
597
+ worksheet_freeze_panes_(int argc, VALUE *argv, VALUE self) {
598
+ rb_check_arity(argc, 2, 5);
599
+ VALUE row = argv[0];
600
+ VALUE col = argv[1];
601
+ struct worksheet *ptr;
602
+ Data_Get_Struct(self, struct worksheet, ptr);
603
+ if (argc == 2) {
604
+ worksheet_freeze_panes(ptr->worksheet, NUM2INT(row), value_to_col(col));
605
+ } else {
606
+ VALUE row2 = row;
607
+ VALUE col2 = col;
608
+ uint8_t type = 0;
609
+ if (argc > 2)
610
+ row2 = argv[2];
611
+ if (argc > 3)
612
+ col2 = argv[3];
613
+ if (argc > 4)
614
+ type = NUM2INT(argv[4]);
615
+ worksheet_freeze_panes_opt(ptr->worksheet, NUM2INT(row), value_to_col(col),
616
+ NUM2INT(row2), value_to_col(col2), type);
617
+ }
618
+ return self;
619
+ }
620
+
621
+ VALUE
622
+ worksheet_split_panes_(VALUE self, VALUE vertical, VALUE horizontal) {
623
+ struct worksheet *ptr;
624
+ Data_Get_Struct(self, struct worksheet, ptr);
625
+ worksheet_split_panes(ptr->worksheet, NUM2DBL(vertical), NUM2DBL(horizontal));
626
+ return self;
627
+ }
628
+
629
+ VALUE
630
+ worksheet_set_selection_(int argc, VALUE *argv, VALUE self) {
631
+ lxw_row_t row_from, row_to;
632
+ lxw_col_t col_from, col_to;
633
+
634
+ rb_check_arity(argc, 1, 4);
635
+ extract_range(argc, argv, &row_from, &col_from, &row_to, &col_to);
636
+
637
+ struct worksheet *ptr;
638
+ Data_Get_Struct(self, struct worksheet, ptr);
639
+
640
+ worksheet_set_selection(ptr->worksheet, row_from, col_from, row_to, col_to);
641
+ return self;
642
+ }
643
+
644
+ VALUE
645
+ worksheet_set_landscape_(VALUE self) {
646
+ struct worksheet *ptr;
647
+ Data_Get_Struct(self, struct worksheet, ptr);
648
+ worksheet_set_landscape(ptr->worksheet);
649
+ return self;
650
+ }
651
+
652
+ VALUE
653
+ worksheet_set_portrait_(VALUE self) {
654
+ struct worksheet *ptr;
655
+ Data_Get_Struct(self, struct worksheet, ptr);
656
+ worksheet_set_portrait(ptr->worksheet);
657
+ return self;
658
+ }
659
+
660
+ VALUE
661
+ worksheet_set_page_view_(VALUE self) {
662
+ struct worksheet *ptr;
663
+ Data_Get_Struct(self, struct worksheet, ptr);
664
+ worksheet_set_page_view(ptr->worksheet);
665
+ return self;
666
+ }
667
+
668
+ VALUE
669
+ worksheet_set_paper_(VALUE self, VALUE paper_type) {
670
+ struct worksheet *ptr;
671
+ Data_Get_Struct(self, struct worksheet, ptr);
672
+ worksheet_set_paper(ptr->worksheet, NUM2INT(paper_type));
673
+ return self;
674
+ }
675
+
676
+ VALUE
677
+ worksheet_set_margins_(VALUE self, VALUE left, VALUE right, VALUE top, VALUE bottom) {
678
+ struct worksheet *ptr;
679
+ Data_Get_Struct(self, struct worksheet, ptr);
680
+ worksheet_set_margins(ptr->worksheet, NUM2DBL(left), NUM2DBL(right), NUM2DBL(top), NUM2DBL(bottom));
681
+ return self;
682
+ }
683
+
684
+ VALUE
685
+ worksheet_set_header_(VALUE self, VALUE val, VALUE opts) {
686
+ const char *str = StringValueCStr(val);
687
+ lxw_header_footer_options options = { .margin = 0.0 };
688
+ char with_options = '\0';
689
+ if (!NIL_P(opts)) {
690
+ VALUE margin = rb_hash_aref(opts, ID2SYM(rb_intern("margin")));
691
+ if (!NIL_P(margin)) {
692
+ with_options = '\1';
693
+ options.margin = NUM2DBL(margin);
694
+ }
695
+ }
696
+ struct worksheet *ptr;
697
+ Data_Get_Struct(self, struct worksheet, ptr);
698
+ if (with_options) {
699
+ worksheet_set_header(ptr->worksheet, str);
700
+ } else {
701
+ worksheet_set_header_opt(ptr->worksheet, str, &options);
702
+ }
703
+ return self;
704
+ }
705
+
706
+ VALUE
707
+ worksheet_set_footer_(VALUE self, VALUE val, VALUE opts) {
708
+ const char *str = StringValueCStr(val);
709
+ lxw_header_footer_options options = { .margin = 0.0 };
710
+ char with_options = '\0';
711
+ if (!NIL_P(opts)) {
712
+ VALUE margin = rb_hash_aref(opts, ID2SYM(rb_intern("margin")));
713
+ if (!NIL_P(margin)) {
714
+ with_options = '\1';
715
+ options.margin = NUM2DBL(margin);
716
+ }
717
+ }
718
+ struct worksheet *ptr;
719
+ Data_Get_Struct(self, struct worksheet, ptr);
720
+ if (with_options) {
721
+ worksheet_set_footer(ptr->worksheet, str);
722
+ } else {
723
+ worksheet_set_footer_opt(ptr->worksheet, str, &options);
724
+ }
725
+ return self;
726
+ }
727
+
728
+ VALUE
729
+ worksheet_set_h_pagebreaks_(VALUE self, VALUE val) {
730
+ const size_t len = RARRAY_LEN(val);
731
+ lxw_row_t rows[len+1];
732
+ for (size_t i = 0; i<len; ++i) {
733
+ rows[i] = NUM2INT(rb_ary_entry(val, i));
734
+ }
735
+ rows[len] = 0;
736
+ struct worksheet *ptr;
737
+ Data_Get_Struct(self, struct worksheet, ptr);
738
+ worksheet_set_h_pagebreaks(ptr->worksheet, rows);
739
+ return val;
740
+ }
741
+
742
+ VALUE
743
+ worksheet_set_v_pagebreaks_(VALUE self, VALUE val) {
744
+ const size_t len = RARRAY_LEN(val);
745
+ lxw_col_t cols[len+1];
746
+ for (size_t i = 0; i<len; ++i) {
747
+ cols[i] = value_to_col(rb_ary_entry(val, i));
748
+ }
749
+ cols[len] = 0;
750
+ struct worksheet *ptr;
751
+ Data_Get_Struct(self, struct worksheet, ptr);
752
+ worksheet_set_v_pagebreaks(ptr->worksheet, cols);
753
+ return val;
754
+ }
755
+
756
+ VALUE
757
+ worksheet_print_across_(VALUE self) {
758
+ struct worksheet *ptr;
759
+ Data_Get_Struct(self, struct worksheet, ptr);
760
+ worksheet_print_across(ptr->worksheet);
761
+ return self;
762
+ }
763
+
764
+ VALUE
765
+ worksheet_set_zoom_(VALUE self, VALUE val) {
766
+ struct worksheet *ptr;
767
+ Data_Get_Struct(self, struct worksheet, ptr);
768
+ worksheet_set_zoom(ptr->worksheet, NUM2INT(val));
769
+ return self;
770
+ }
771
+
772
+ VALUE
773
+ worksheet_gridlines_(VALUE self, VALUE value) {
774
+ struct worksheet *ptr;
775
+ Data_Get_Struct(self, struct worksheet, ptr);
776
+
777
+ worksheet_gridlines(ptr->worksheet, NUM2INT(value));
778
+
779
+ return value;
780
+ }
781
+
782
+ VALUE
783
+ worksheet_center_horizontally_(VALUE self){
784
+ struct worksheet *ptr;
785
+ Data_Get_Struct(self, struct worksheet, ptr);
786
+ worksheet_center_horizontally(ptr->worksheet);
787
+ return self;
788
+ }
789
+
790
+ VALUE
791
+ worksheet_center_vertically_(VALUE self) {
792
+ struct worksheet *ptr;
793
+ Data_Get_Struct(self, struct worksheet, ptr);
794
+ worksheet_center_vertically(ptr->worksheet);
795
+ return self;
796
+ }
797
+
798
+ VALUE
799
+ worksheet_print_row_col_headers_(VALUE self) {
800
+ struct worksheet *ptr;
801
+ Data_Get_Struct(self, struct worksheet, ptr);
802
+ worksheet_print_row_col_headers(ptr->worksheet);
803
+ return self;
804
+ }
805
+
806
+ VALUE
807
+ worksheet_repeat_rows_(VALUE self, VALUE row_from, VALUE row_to) {
808
+ struct worksheet *ptr;
809
+ Data_Get_Struct(self, struct worksheet, ptr);
810
+ worksheet_repeat_rows(ptr->worksheet, NUM2INT(row_from), NUM2INT(row_to));
811
+ return self;
812
+ }
813
+
814
+ VALUE
815
+ worksheet_repeat_columns_(VALUE self, VALUE col_from, VALUE col_to) {
816
+ struct worksheet *ptr;
817
+ Data_Get_Struct(self, struct worksheet, ptr);
818
+ worksheet_repeat_columns(ptr->worksheet, value_to_col(col_from), value_to_col(col_to));
819
+ return self;
820
+ }
821
+
822
+ VALUE
823
+ worksheet_print_area_(int argc, VALUE *argv, VALUE self) {
824
+ lxw_row_t row_from, row_to;
825
+ lxw_col_t col_from, col_to;
826
+
827
+ rb_check_arity(argc, 1, 4);
828
+ extract_range(argc, argv, &row_from, &col_from, &row_to, &col_to);
829
+
830
+ struct worksheet *ptr;
831
+ Data_Get_Struct(self, struct worksheet, ptr);
832
+
833
+ worksheet_print_area(ptr->worksheet, row_from, col_from, row_to, col_to);
834
+ return self;
835
+ }
836
+
837
+ VALUE
838
+ worksheet_fit_to_pages_(VALUE self, VALUE width, VALUE height) {
839
+ struct worksheet *ptr;
840
+ Data_Get_Struct(self, struct worksheet, ptr);
841
+ worksheet_fit_to_pages(ptr->worksheet, NUM2INT(width), NUM2INT(height));
842
+ return self;
843
+ }
844
+
845
+ VALUE
846
+ worksheet_set_start_page_(VALUE self, VALUE start_page) {
847
+ struct worksheet *ptr;
848
+ Data_Get_Struct(self, struct worksheet, ptr);
849
+ worksheet_set_start_page(ptr->worksheet, NUM2INT(start_page));
850
+ return start_page;
851
+ }
852
+
853
+ VALUE
854
+ worksheet_set_print_scale_(VALUE self, VALUE scale) {
855
+ struct worksheet *ptr;
856
+ Data_Get_Struct(self, struct worksheet, ptr);
857
+ worksheet_set_print_scale(ptr->worksheet, NUM2INT(scale));
858
+ return scale;
859
+ }
860
+
861
+ VALUE
862
+ worksheet_right_to_left_(VALUE self) {
863
+ struct worksheet *ptr;
864
+ Data_Get_Struct(self, struct worksheet, ptr);
865
+ worksheet_right_to_left(ptr->worksheet);
866
+ return self;
867
+ }
868
+
869
+ VALUE
870
+ worksheet_hide_zero_(VALUE self) {
871
+ struct worksheet *ptr;
872
+ Data_Get_Struct(self, struct worksheet, ptr);
873
+ worksheet_hide_zero(ptr->worksheet);
874
+ return self;
875
+ }
876
+
877
+ VALUE
878
+ worksheet_set_tab_color_(VALUE self, VALUE color) {
879
+ struct worksheet *ptr;
880
+ Data_Get_Struct(self, struct worksheet, ptr);
881
+ worksheet_set_tab_color(ptr->worksheet, NUM2INT(color));
882
+ return color;
883
+ }
884
+
885
+ VALUE
886
+ worksheet_protect_(int argc, VALUE *argv, VALUE self) {
887
+ rb_check_arity(argc, 0, 2);
888
+ uint8_t with_options = '\0';
889
+ VALUE val;
890
+ VALUE opts = Qnil;
891
+ lxw_protection options;
892
+ const char *password = NULL;
893
+ if (argc > 0 && !NIL_P(argv[0])) {
894
+ switch (TYPE(argv[0])) {
895
+ case T_STRING:
896
+ password = StringValueCStr(argv[0]);
897
+ break;
898
+ case T_HASH:
899
+ opts = argv[0];
900
+ break;
901
+ default:
902
+ rb_raise(rb_eArgError, "Wrong argument %"PRIsVALUE", expected a String or Hash", rb_obj_class(argv[0]));
903
+ }
904
+ }
905
+
906
+ if (argc > 1) {
907
+ if (TYPE(argv[1]) == T_HASH) {
908
+ opts = argv[1];
909
+ } else {
910
+ rb_raise(rb_eArgError, "Expected a Hash, but got %"PRIsVALUE, rb_obj_class(argv[1]));
911
+ }
912
+ }
913
+
914
+ // All options are off by default
915
+ memset(&options, 0, sizeof options);
916
+
917
+ if (!NIL_P(opts)) {
918
+ #define PR_OPT(field) { \
919
+ val = rb_hash_aref(opts, ID2SYM(rb_intern(#field))); \
920
+ if (!NIL_P(val) && val) { \
921
+ options.field = 1; \
922
+ with_options = 1; \
923
+ } \
924
+ }
925
+ PR_OPT(no_select_locked_cells);
926
+ PR_OPT(no_select_unlocked_cells);
927
+ PR_OPT(format_cells);
928
+ PR_OPT(format_columns);
929
+ PR_OPT(format_rows);
930
+ PR_OPT(insert_columns);
931
+ PR_OPT(insert_rows);
932
+ PR_OPT(insert_hyperlinks);
933
+ PR_OPT(delete_columns);
934
+ PR_OPT(delete_rows);
935
+ PR_OPT(sort);
936
+ PR_OPT(autofilter);
937
+ PR_OPT(pivot_tables);
938
+ PR_OPT(scenarios);
939
+ PR_OPT(objects);
940
+ #undef PR_OPT
941
+ }
942
+ struct worksheet *ptr;
943
+ Data_Get_Struct(self, struct worksheet, ptr);
944
+ if (with_options) {
945
+ worksheet_protect(ptr->worksheet, password, &options);
946
+ } else {
947
+ worksheet_protect(ptr->worksheet, password, NULL);
948
+ }
949
+ return self;
950
+ }
951
+
952
+ VALUE
953
+ worksheet_set_default_row_(VALUE self, VALUE height, VALUE hide_unused_rows) {
954
+ struct worksheet *ptr;
955
+ uint8_t hide_ur = !NIL_P(hide_unused_rows) && hide_unused_rows != Qfalse ? 1 : 0;
956
+ Data_Get_Struct(self, struct worksheet, ptr);
957
+ worksheet_set_default_row(ptr->worksheet, NUM2DBL(height), hide_ur);
958
+ return self;
959
+ }
960
+
961
+
962
+ VALUE
963
+ worksheet_get_vertical_dpi_(VALUE self) {
964
+ struct worksheet *ptr;
965
+ Data_Get_Struct(self, struct worksheet, ptr);
966
+ return ptr->worksheet->vertical_dpi;
967
+ }
968
+
969
+ VALUE
970
+ worksheet_set_vertical_dpi_(VALUE self, VALUE val) {
971
+ struct worksheet *ptr;
972
+ Data_Get_Struct(self, struct worksheet, ptr);
973
+ ptr->worksheet->vertical_dpi = NUM2INT(val);
974
+ return val;
975
+ }
976
+
977
+
978
+ lxw_col_t
979
+ value_to_col(VALUE value) {
980
+ switch (TYPE(value)) {
981
+ case T_FIXNUM:
982
+ return NUM2INT(value);
983
+ case T_STRING:
984
+ return lxw_name_to_col(RSTRING_PTR(value));
985
+ default:
986
+ rb_raise(rb_eTypeError, "Wrong type for col %"PRIsVALUE, rb_obj_class(value));
987
+ return -1;
988
+ }
989
+ }
990
+
991
+ int
992
+ extract_cell(int argc, VALUE *argv, lxw_row_t *row, lxw_col_t *col) {
993
+ char *str;
994
+ switch (TYPE(argv[0])) {
995
+ case T_STRING:
996
+ str = RSTRING_PTR(argv[0]);
997
+ if ((str[0] >= 'A' && str[0] <= 'Z') ||
998
+ (str[0] >= 'a' && str[0] <= 'z')) {
999
+ // Column in also in argv[0]
1000
+ (*row) = lxw_name_to_row(str);
1001
+ (*col) = lxw_name_to_col(str);
1002
+ return 1;
1003
+ } else {
1004
+ if (argc > 1) {
1005
+ (*row) = atoi(str);
1006
+ switch(TYPE(argv[1])) {
1007
+ case T_STRING:
1008
+ str = RSTRING_PTR(argv[1]);
1009
+ if ((str[0] >= 'A' && str[0] <= 'Z') ||
1010
+ (str[0] >= 'a' && str[0] <= 'z')) {
1011
+ (*col) = lxw_name_to_col(str);
1012
+ } else {
1013
+ (*col) = atoi(str);
1014
+ }
1015
+ return 2;
1016
+ case T_FIXNUM:
1017
+ (*col) = NUM2INT(argv[1]);
1018
+ return 2;
1019
+ default:
1020
+ rb_raise(rb_eArgError, "Cannot extract column info from %"PRIsVALUE,
1021
+ rb_inspect(argv[1]));
1022
+ return 0;
1023
+ }
1024
+ } else {
1025
+ rb_raise(rb_eArgError, "Cannot extract column info from %"PRIsVALUE,
1026
+ rb_inspect(argv[0]));
1027
+ return 0;
1028
+ }
1029
+ }
1030
+ break;
1031
+ case T_FIXNUM:
1032
+ if (argc > 1) {
1033
+ (*row) = NUM2INT(argv[0]);
1034
+ (*col) = value_to_col(argv[1]);
1035
+ return 2;
1036
+ } else {
1037
+ rb_raise(rb_eArgError, "Cannot extract column, not enough arguments");
1038
+ return 0;
1039
+ }
1040
+ break;
1041
+ default:
1042
+ rb_raise(rb_eTypeError, "Expected string or number, got %"PRIsVALUE, rb_obj_class(argv[0]));
1043
+ return 0;
1044
+ }
1045
+ }
1046
+
1047
+ int extract_range(int argc, VALUE *argv, lxw_row_t *row_from, lxw_col_t *col_from,
1048
+ lxw_row_t *row_to, lxw_col_t *col_to) {
1049
+ char *str;
1050
+ if (TYPE(argv[0]) == T_STRING) {
1051
+ str = RSTRING_PTR(argv[0]);
1052
+ if (strstr(str, ":")) {
1053
+ (*row_from) = lxw_name_to_row(str);
1054
+ (*col_from) = lxw_name_to_col(str);
1055
+ (*row_to) = lxw_name_to_row_2(str);
1056
+ (*col_to) = lxw_name_to_col_2(str);
1057
+ return 1;
1058
+ }
1059
+ }
1060
+
1061
+ int larg = extract_cell(argc, argv, row_from, col_from);
1062
+ larg += extract_cell(argc - larg, argv + larg, row_to, col_to);
1063
+ return larg;
1064
+ }