xlsxwriter 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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
+ }