xlsxwriter 0.0.2 → 0.0.3
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.
- checksums.yaml +4 -4
- data/Rakefile +4 -16
- data/ext/xlsxwriter/chart.c +499 -4
- data/ext/xlsxwriter/chart.h +11 -9
- data/ext/xlsxwriter/format.c +89 -1
- data/ext/xlsxwriter/format.h +4 -0
- data/ext/xlsxwriter/workbook.c +145 -6
- data/ext/xlsxwriter/workbook.h +2 -22
- data/ext/xlsxwriter/workbook_properties.c +61 -14
- data/ext/xlsxwriter/workbook_properties.h +4 -3
- data/ext/xlsxwriter/worksheet.c +406 -55
- data/ext/xlsxwriter/worksheet.h +5 -58
- data/ext/xlsxwriter/xlsxwriter.c +26 -227
- data/lib/xlsxwriter/version.rb +2 -1
- data/lib/xlsxwriter/worksheet.rb +18 -6
- data/test/test-chart-axis.rb +102 -0
- data/test/test-chart-bar.rb +34 -0
- data/test/test-chart-column.rb +30 -0
- data/test/test-chart-doughnut.rb +31 -0
- data/test/test-chart-pie.rb +44 -0
- data/test/test-chart-scatter.rb +29 -0
- data/test/test-chart-size.rb +45 -0
- data/test/test-chart-title.rb +44 -0
- data/test/test-panes.rb +18 -18
- metadata +18 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a6f5f03efc612b8ffe35f2ef05469e2866793dd4
|
4
|
+
data.tar.gz: 62d0c4d63bc61a782fd481ef906b13fb28e9ac74
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7536f8487db5f37a3b1cce3f2b74eeba1f00f64db1c6ee55ad5ee58f4ca65c78a12fc3e5f4d939cbb4cd85f333b3a525a0ce2b36bb7a53ead4e7a22d0652d424
|
7
|
+
data.tar.gz: 0e718cd11773b8774cdc86dae2ecbe5c4a82bcabb43387b8ebd70db3bee983a7e7307398d9fa1e910c2898efab8dd067e4d88b17fc7873ffac887e0f4b67e2d7
|
data/Rakefile
CHANGED
@@ -6,7 +6,7 @@ spec = Gem::Specification.load('xlsxwriter.gemspec')
|
|
6
6
|
Rake::ExtensionTask.new('xlsxwriter', spec) do |ext|
|
7
7
|
ext.lib_dir = 'lib/xlsxwriter'
|
8
8
|
end
|
9
|
-
task compile: :
|
9
|
+
task compile: :patch_dep
|
10
10
|
|
11
11
|
Gem::PackageTask.new(spec) do |pkg|
|
12
12
|
end
|
@@ -14,23 +14,11 @@ end
|
|
14
14
|
DEP_DIR='ext/xlsxwriter/libxlsxwriter'
|
15
15
|
|
16
16
|
desc "Checkout xlsxwriter C library"
|
17
|
-
task :
|
18
|
-
|
19
|
-
|
20
|
-
unless File.exist?('./ext/xlsxwriter/libxlsxwriter')
|
21
|
-
`git clone https://github.com/jmcnamara/libxlsxwriter.git #{DEP_DIR}`
|
22
|
-
else
|
23
|
-
`cd #{DEP_DIR} && git fetch`
|
24
|
-
end
|
25
|
-
|
26
|
-
if rev
|
27
|
-
`cd #{DEP_DIR} && git reset --hard #{rev}`
|
28
|
-
else
|
29
|
-
`(cd #{DEP_DIR} && git rev-parse HEAD) > .dep_revision`
|
30
|
-
end
|
17
|
+
task :patch_dep do
|
18
|
+
`cd #{DEP_DIR} && git reset --hard`
|
31
19
|
|
32
20
|
Dir['./dep_patches/*.patch'].each do |patch|
|
33
|
-
`(cd #{DEP_DIR} && patch -p1) <#{patch}`
|
21
|
+
`(cd #{DEP_DIR} && patch -N -p1) <#{patch}`
|
34
22
|
end
|
35
23
|
end
|
36
24
|
|
data/ext/xlsxwriter/chart.c
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
#include "chart.h"
|
2
|
+
#include <ruby/encoding.h>
|
2
3
|
#include "workbook.h"
|
4
|
+
#include "worksheet.h"
|
5
|
+
|
6
|
+
VALUE cChart;
|
7
|
+
VALUE cChartSeries;
|
8
|
+
VALUE cChartAxis;
|
9
|
+
|
3
10
|
|
4
11
|
VALUE
|
5
12
|
chart_alloc(VALUE klass) {
|
@@ -13,6 +20,7 @@ chart_alloc(VALUE klass) {
|
|
13
20
|
return obj;
|
14
21
|
}
|
15
22
|
|
23
|
+
/* :nodoc: */
|
16
24
|
VALUE
|
17
25
|
chart_init(VALUE self, VALUE workbook, VALUE type) {
|
18
26
|
struct chart *ptr;
|
@@ -29,6 +37,46 @@ chart_init(VALUE self, VALUE workbook, VALUE type) {
|
|
29
37
|
return self;
|
30
38
|
}
|
31
39
|
|
40
|
+
VALUE
|
41
|
+
chart_axis_alloc(VALUE klass) {
|
42
|
+
VALUE obj;
|
43
|
+
struct chart_axis *ptr;
|
44
|
+
|
45
|
+
obj = Data_Make_Struct(klass, struct chart_axis, NULL, NULL, ptr);
|
46
|
+
|
47
|
+
return obj;
|
48
|
+
}
|
49
|
+
|
50
|
+
/* :nodoc: */
|
51
|
+
VALUE
|
52
|
+
chart_axis_init(VALUE self, VALUE chart, VALUE type) {
|
53
|
+
struct chart_axis *ptr;
|
54
|
+
struct chart *c_ptr;
|
55
|
+
|
56
|
+
Data_Get_Struct(chart, struct chart, c_ptr);
|
57
|
+
Data_Get_Struct(self, struct chart_axis, ptr);
|
58
|
+
rb_iv_set(self, "@chart", chart);
|
59
|
+
if (c_ptr && c_ptr->chart) {
|
60
|
+
ID axis = rb_check_id_cstr("x", 1, NULL);
|
61
|
+
if (axis && axis == rb_check_id(&type)) {
|
62
|
+
ptr->axis = c_ptr->chart->x_axis;
|
63
|
+
return self;
|
64
|
+
}
|
65
|
+
|
66
|
+
axis = rb_check_id_cstr("y", 1, NULL);
|
67
|
+
if (axis && axis == rb_check_id(&type)) {
|
68
|
+
ptr->axis = c_ptr->chart->y_axis;
|
69
|
+
return self;
|
70
|
+
}
|
71
|
+
|
72
|
+
rb_raise(rb_eArgError, "Unexpected axis type %"PRIsVALUE, rb_inspect(type));
|
73
|
+
} else {
|
74
|
+
rb_raise(rb_eRuntimeError, "Chart seems to be already closed.");
|
75
|
+
}
|
76
|
+
|
77
|
+
return self;
|
78
|
+
}
|
79
|
+
|
32
80
|
VALUE
|
33
81
|
chart_series_alloc(VALUE klass) {
|
34
82
|
VALUE obj;
|
@@ -41,12 +89,13 @@ chart_series_alloc(VALUE klass) {
|
|
41
89
|
return obj;
|
42
90
|
}
|
43
91
|
|
92
|
+
/* :nodoc: */
|
44
93
|
VALUE
|
45
94
|
chart_series_init(int argc, VALUE *argv, VALUE self) {
|
46
95
|
struct chart_series *ptr;
|
47
96
|
struct chart *c_ptr;
|
48
97
|
char *cats = NULL, *vals = NULL;
|
49
|
-
rb_check_arity(argc,
|
98
|
+
rb_check_arity(argc, 1, 3);
|
50
99
|
|
51
100
|
Data_Get_Struct(argv[0], struct chart, c_ptr);
|
52
101
|
Data_Get_Struct(self, struct chart_series, ptr);
|
@@ -54,7 +103,7 @@ chart_series_init(int argc, VALUE *argv, VALUE self) {
|
|
54
103
|
if (argc > 2) {
|
55
104
|
cats = StringValueCStr(argv[1]);
|
56
105
|
vals = StringValueCStr(argv[2]);
|
57
|
-
} else {
|
106
|
+
} else if (argc > 1) {
|
58
107
|
vals = StringValueCStr(argv[1]);
|
59
108
|
}
|
60
109
|
if (c_ptr && c_ptr->chart) {
|
@@ -64,16 +113,160 @@ chart_series_init(int argc, VALUE *argv, VALUE self) {
|
|
64
113
|
return self;
|
65
114
|
}
|
66
115
|
|
67
|
-
|
116
|
+
/* call-seq: chart.add_series([categories,] values) -> self
|
117
|
+
*
|
118
|
+
* Adds data series to the chart.
|
119
|
+
*/
|
68
120
|
VALUE
|
69
121
|
chart_add_series_(int argc, VALUE *argv, VALUE self) {
|
70
|
-
rb_check_arity(argc,
|
122
|
+
rb_check_arity(argc, 0, 2);
|
71
123
|
|
72
124
|
VALUE series = rb_funcall(cChartSeries, rb_intern("new"), argc+1, self, argv[0], argv[1]);
|
73
125
|
return series;
|
74
126
|
}
|
75
127
|
|
128
|
+
/* call-seq: chart.x_axis -> Chart::Axis
|
129
|
+
*
|
130
|
+
* Returns x axis as Chart::Axis
|
131
|
+
*/
|
132
|
+
VALUE
|
133
|
+
chart_x_axis_(VALUE self) {
|
134
|
+
return rb_funcall(cChartAxis, rb_intern("new"), 2, self, ID2SYM(rb_intern("x")));
|
135
|
+
}
|
136
|
+
|
137
|
+
/* call-seq: chart.y_axis -> Chart::Axis
|
138
|
+
*
|
139
|
+
* Returns y axis as Chart::Axis
|
140
|
+
*/
|
141
|
+
VALUE
|
142
|
+
chart_y_axis_(VALUE self) {
|
143
|
+
return rb_funcall(cChartAxis, rb_intern("new"), 2, self, ID2SYM(rb_intern("y")));
|
144
|
+
}
|
145
|
+
|
146
|
+
/* call-seq: chart.title=(title) -> title
|
147
|
+
*
|
148
|
+
* Sets the chart title.
|
149
|
+
*/
|
150
|
+
VALUE
|
151
|
+
chart_title_set_name_(VALUE self, VALUE name) {
|
152
|
+
struct chart *ptr;
|
153
|
+
Data_Get_Struct(self, struct chart, ptr);
|
154
|
+
|
155
|
+
if (RTEST(name)) {
|
156
|
+
chart_title_set_name(ptr->chart, StringValueCStr(name));
|
157
|
+
} else {
|
158
|
+
chart_title_off(ptr->chart);
|
159
|
+
}
|
160
|
+
|
161
|
+
return name;
|
162
|
+
}
|
163
|
+
|
164
|
+
/* call-seq:
|
165
|
+
* chart.set_name_range(name, cell) -> self
|
166
|
+
* chart.set_name_range(name, row, col) -> self
|
167
|
+
*
|
168
|
+
* Sets the chart title range (+cell+) and +name+.
|
169
|
+
*/
|
170
|
+
VALUE
|
171
|
+
chart_title_set_name_range_(int argc, VALUE *argv, VALUE self) {
|
172
|
+
rb_check_arity(argc, 2, 3);
|
173
|
+
const char *str = StringValueCStr(argv[0]);
|
174
|
+
lxw_row_t row;
|
175
|
+
lxw_col_t col;
|
176
|
+
extract_cell(argc - 1, argv + 1, &row, &col);
|
177
|
+
struct chart *ptr;
|
178
|
+
Data_Get_Struct(self, struct chart, ptr);
|
179
|
+
chart_title_set_name_range(ptr->chart, str, row, col);
|
180
|
+
return self;
|
181
|
+
}
|
182
|
+
|
183
|
+
/* call-seq: chart.legend_position=(position) -> position
|
184
|
+
*
|
185
|
+
* Sets the chart legend position, one of <code>Chart::{LEGEND_NONE, LEGEND_RIGHT,
|
186
|
+
* LEGEND_LEFT, LEGEND_TOP, LEGEND_BOTTOM, LEGEND_OVERLAY_RIGHT,
|
187
|
+
* LEGEND_OVERLAY_LEFT}</code>.
|
188
|
+
*/
|
189
|
+
VALUE
|
190
|
+
chart_legend_set_position_(VALUE self, VALUE pos) {
|
191
|
+
struct chart *ptr;
|
192
|
+
Data_Get_Struct(self, struct chart, ptr);
|
193
|
+
|
194
|
+
chart_legend_set_position(ptr->chart, NUM2UINT(rb_check_to_int(pos)));
|
195
|
+
return pos;
|
196
|
+
}
|
197
|
+
|
198
|
+
/* call-seq: chart.legend_set_font(options) -> self
|
199
|
+
*
|
200
|
+
* Sets legend font from options (name, size, bold, italic, underline, rotation,
|
201
|
+
* color, baseline).
|
202
|
+
*/
|
203
|
+
VALUE
|
204
|
+
chart_legend_set_font_(VALUE self, VALUE opts) {
|
205
|
+
struct chart *ptr;
|
206
|
+
lxw_chart_font font = val_to_lxw_chart_font(opts);
|
207
|
+
Data_Get_Struct(self, struct chart, ptr);
|
208
|
+
|
209
|
+
chart_legend_set_font(ptr->chart, &font);
|
210
|
+
return self;
|
211
|
+
}
|
76
212
|
|
213
|
+
/* call-seq: chart.legend_delete_series(series) -> self
|
214
|
+
*
|
215
|
+
* Deletes series by 0-based indexes from the chart legend.
|
216
|
+
*
|
217
|
+
* chart.legend_delete_series([0, 2])
|
218
|
+
*/
|
219
|
+
VALUE
|
220
|
+
chart_legend_delete_series_(VALUE self, VALUE series) {
|
221
|
+
series = rb_check_array_type(series);
|
222
|
+
const size_t len = RARRAY_LEN(series);
|
223
|
+
int16_t series_arr[len+1];
|
224
|
+
for (size_t i = 0; i < len; ++i) {
|
225
|
+
series_arr[i] = NUM2INT(rb_check_to_int(rb_ary_entry(series, i)));
|
226
|
+
}
|
227
|
+
series_arr[len] = -1;
|
228
|
+
|
229
|
+
struct chart *ptr;
|
230
|
+
Data_Get_Struct(self, struct chart, ptr);
|
231
|
+
chart_legend_delete_series(ptr->chart, series_arr);
|
232
|
+
return self;
|
233
|
+
}
|
234
|
+
|
235
|
+
/* call-seq: chart.style=(style) -> style
|
236
|
+
*
|
237
|
+
* Sets the chart +style+ (integer from 1 to 48, default is 2).
|
238
|
+
*/
|
239
|
+
VALUE
|
240
|
+
chart_set_style_(VALUE self, VALUE style) {
|
241
|
+
struct chart *ptr;
|
242
|
+
Data_Get_Struct(self, struct chart, ptr);
|
243
|
+
|
244
|
+
chart_set_style(ptr->chart, NUM2INT(rb_check_to_int(style)));
|
245
|
+
return style;
|
246
|
+
}
|
247
|
+
|
248
|
+
/* :nodoc: */
|
249
|
+
VALUE
|
250
|
+
chart_set_rotation_(VALUE self, VALUE rotation) {
|
251
|
+
struct chart *ptr;
|
252
|
+
Data_Get_Struct(self, struct chart, ptr);
|
253
|
+
|
254
|
+
chart_set_rotation(ptr->chart, NUM2UINT(rb_check_to_int(rotation)));
|
255
|
+
return rotation;
|
256
|
+
}
|
257
|
+
|
258
|
+
/* :nodoc: */
|
259
|
+
VALUE
|
260
|
+
chart_set_hole_size_(VALUE self, VALUE size) {
|
261
|
+
struct chart *ptr;
|
262
|
+
Data_Get_Struct(self, struct chart, ptr);
|
263
|
+
|
264
|
+
chart_set_hole_size(ptr->chart, NUM2UINT(rb_check_to_int(size)));
|
265
|
+
return size;
|
266
|
+
}
|
267
|
+
|
268
|
+
|
269
|
+
/* :nodoc: */
|
77
270
|
VALUE
|
78
271
|
chart_get_axis_id_1_(VALUE self) {
|
79
272
|
struct chart *ptr;
|
@@ -81,6 +274,7 @@ chart_get_axis_id_1_(VALUE self) {
|
|
81
274
|
return UINT2NUM(ptr->chart->axis_id_1);
|
82
275
|
}
|
83
276
|
|
277
|
+
/* :nodoc: */
|
84
278
|
VALUE
|
85
279
|
chart_set_axis_id_1_(VALUE self, VALUE val) {
|
86
280
|
struct chart *ptr;
|
@@ -89,6 +283,7 @@ chart_set_axis_id_1_(VALUE self, VALUE val) {
|
|
89
283
|
return val;
|
90
284
|
}
|
91
285
|
|
286
|
+
/* :nodoc: */
|
92
287
|
VALUE
|
93
288
|
chart_get_axis_id_2_(VALUE self) {
|
94
289
|
struct chart *ptr;
|
@@ -96,6 +291,7 @@ chart_get_axis_id_2_(VALUE self) {
|
|
96
291
|
return UINT2NUM(ptr->chart->axis_id_2);
|
97
292
|
}
|
98
293
|
|
294
|
+
/* :nodoc: */
|
99
295
|
VALUE
|
100
296
|
chart_set_axis_id_2_(VALUE self, VALUE val) {
|
101
297
|
struct chart *ptr;
|
@@ -103,3 +299,302 @@ chart_set_axis_id_2_(VALUE self, VALUE val) {
|
|
103
299
|
ptr->chart->axis_id_2 = NUM2UINT(val);
|
104
300
|
return val;
|
105
301
|
}
|
302
|
+
|
303
|
+
|
304
|
+
/* call-seq: axis.name=(name) -> name
|
305
|
+
*
|
306
|
+
* Sets the chart axis +name+.
|
307
|
+
*/
|
308
|
+
VALUE
|
309
|
+
chart_axis_set_name_(VALUE self, VALUE val) {
|
310
|
+
struct chart_axis *ptr;
|
311
|
+
Data_Get_Struct(self, struct chart_axis, ptr);
|
312
|
+
|
313
|
+
chart_axis_set_name(ptr->axis, StringValueCStr(val));
|
314
|
+
return val;
|
315
|
+
}
|
316
|
+
|
317
|
+
/* call-seq:
|
318
|
+
* axis.set_name_range(name, cell) -> self
|
319
|
+
* axis.set_name_range(name, row, col) -> self
|
320
|
+
*
|
321
|
+
* Sets the chart axis name range from +cell+, with value +name+.
|
322
|
+
*/
|
323
|
+
VALUE
|
324
|
+
chart_axis_set_name_range_(int argc, VALUE *argv, VALUE self) {
|
325
|
+
rb_check_arity(argc, 2, 3);
|
326
|
+
const char *str = StringValueCStr(argv[0]);
|
327
|
+
lxw_row_t row;
|
328
|
+
lxw_col_t col;
|
329
|
+
extract_cell(argc - 1, argv + 1, &row, &col);
|
330
|
+
struct chart_axis *ptr;
|
331
|
+
Data_Get_Struct(self, struct chart_axis, ptr);
|
332
|
+
chart_axis_set_name_range(ptr->axis, str, row, col);
|
333
|
+
return self;
|
334
|
+
}
|
335
|
+
|
336
|
+
/* call-seq: axis.set_name_font(options) -> self
|
337
|
+
*
|
338
|
+
* Same as Chart#set_font, but for axis name.
|
339
|
+
*/
|
340
|
+
VALUE
|
341
|
+
chart_axis_set_name_font_(VALUE self, VALUE value) {
|
342
|
+
struct chart_axis *ptr;
|
343
|
+
lxw_chart_font font = val_to_lxw_chart_font(value);
|
344
|
+
Data_Get_Struct(self, struct chart_axis, ptr);
|
345
|
+
|
346
|
+
chart_axis_set_name_font(ptr->axis, &font);
|
347
|
+
return self;
|
348
|
+
}
|
349
|
+
|
350
|
+
/* call-seq: axis.set_num_font(options) -> self
|
351
|
+
*
|
352
|
+
* Same as Chart#set_font, but for axis numbers.
|
353
|
+
*/
|
354
|
+
VALUE
|
355
|
+
chart_axis_set_num_font_(VALUE self, VALUE value) {
|
356
|
+
struct chart_axis *ptr;
|
357
|
+
lxw_chart_font font = val_to_lxw_chart_font(value);
|
358
|
+
Data_Get_Struct(self, struct chart_axis, ptr);
|
359
|
+
|
360
|
+
chart_axis_set_num_font(ptr->axis, &font);
|
361
|
+
return self;
|
362
|
+
}
|
363
|
+
|
364
|
+
/* call-seq: axis.set_line(options)
|
365
|
+
*
|
366
|
+
* Sets axis line options. See {libxlsxwriter doc}[https://libxlsxwriter.github.io/structlxw__chart__line.html] for details.
|
367
|
+
*/
|
368
|
+
VALUE
|
369
|
+
chart_axis_set_line_(VALUE self, VALUE opts) {
|
370
|
+
struct chart_axis *ptr;
|
371
|
+
lxw_chart_line line = val_to_lxw_chart_line(opts);
|
372
|
+
|
373
|
+
Data_Get_Struct(self, struct chart_axis, ptr);
|
374
|
+
|
375
|
+
chart_axis_set_line(ptr->axis, &line);
|
376
|
+
return self;
|
377
|
+
}
|
378
|
+
|
379
|
+
/* call-seq: axis.set_fill(options)
|
380
|
+
*
|
381
|
+
* Sets axis fill options. See {libxlsxwriter doc}[https://libxlsxwriter.github.io/structlxw__chart__fill.html] for details.
|
382
|
+
*/
|
383
|
+
VALUE
|
384
|
+
chart_axis_set_fill_(VALUE self, VALUE opts) {
|
385
|
+
struct chart_axis *ptr;
|
386
|
+
lxw_chart_fill fill = val_to_lxw_chart_fill(opts);
|
387
|
+
|
388
|
+
Data_Get_Struct(self, struct chart_axis, ptr);
|
389
|
+
|
390
|
+
chart_axis_set_fill(ptr->axis, &fill);
|
391
|
+
return self;
|
392
|
+
}
|
393
|
+
|
394
|
+
/* call-seq:
|
395
|
+
* series.set_categories(sheetname, range)
|
396
|
+
* series.set_categories(sheetname, cell_from, cell_to)
|
397
|
+
* series.set_categories(sheetname, row_from, col_from, row_to, col_to)
|
398
|
+
*
|
399
|
+
* Sets chart series categories (alternative to first argument of
|
400
|
+
* Chart#add_series).
|
401
|
+
*/
|
402
|
+
VALUE
|
403
|
+
chart_series_set_categories_(int argc, VALUE *argv, VALUE self) {
|
404
|
+
rb_check_arity(argc, 2, 5);
|
405
|
+
const char *str = StringValueCStr(argv[0]);
|
406
|
+
lxw_row_t row_from, row_to;
|
407
|
+
lxw_col_t col_from, col_to;
|
408
|
+
extract_range(argc - 1, argv + 1, &row_from, &col_from, &row_to, &col_to);
|
409
|
+
struct chart_series *ptr;
|
410
|
+
Data_Get_Struct(self, struct chart_series, ptr);
|
411
|
+
chart_series_set_categories(ptr->series, str, row_from, col_from, row_to, col_to);
|
412
|
+
return self;
|
413
|
+
}
|
414
|
+
|
415
|
+
/* call-seq:
|
416
|
+
* series.set_values(sheetname, range)
|
417
|
+
* series.set_values(sheetname, cell_from, cell_to)
|
418
|
+
* series.set_values(sheetname, row_from, col_from, row_to, col_to)
|
419
|
+
*
|
420
|
+
* Sets chart series values (alternative to second argument of Chart#add_series).
|
421
|
+
*/
|
422
|
+
VALUE
|
423
|
+
chart_series_set_values_(int argc, VALUE *argv, VALUE self) {
|
424
|
+
rb_check_arity(argc, 2, 5);
|
425
|
+
const char *str = StringValueCStr(argv[0]);
|
426
|
+
lxw_row_t row_from, row_to;
|
427
|
+
lxw_col_t col_from, col_to;
|
428
|
+
extract_range(argc - 1, argv + 1, &row_from, &col_from, &row_to, &col_to);
|
429
|
+
struct chart_series *ptr;
|
430
|
+
Data_Get_Struct(self, struct chart_series, ptr);
|
431
|
+
chart_series_set_values(ptr->series, str, row_from, col_from, row_to, col_to);
|
432
|
+
return self;
|
433
|
+
}
|
434
|
+
|
435
|
+
/* call-seq: series.name=(name) -> name
|
436
|
+
*
|
437
|
+
* Set chart series name.
|
438
|
+
*/
|
439
|
+
VALUE
|
440
|
+
chart_series_set_name_(VALUE self, VALUE name) {
|
441
|
+
struct chart_series *ptr;
|
442
|
+
Data_Get_Struct(self, struct chart_series, ptr);
|
443
|
+
|
444
|
+
chart_series_set_name(ptr->series, StringValueCStr(name));
|
445
|
+
return name;
|
446
|
+
}
|
447
|
+
|
448
|
+
/* call-seq:
|
449
|
+
* series.set_name_range(name, cell) -> self
|
450
|
+
* series.set_name_range(name, row, col) -> self
|
451
|
+
*
|
452
|
+
* Sets the chart series name range from +cell+, with value +name+.
|
453
|
+
*/
|
454
|
+
VALUE
|
455
|
+
chart_series_set_name_range_(int argc, VALUE *argv, VALUE self) {
|
456
|
+
rb_check_arity(argc, 2, 3);
|
457
|
+
const char *str = StringValueCStr(argv[0]);
|
458
|
+
lxw_row_t row;
|
459
|
+
lxw_col_t col;
|
460
|
+
extract_cell(argc - 1, argv + 1, &row, &col);
|
461
|
+
struct chart_series *ptr;
|
462
|
+
Data_Get_Struct(self, struct chart_series, ptr);
|
463
|
+
chart_series_set_name_range(ptr->series, str, row, col);
|
464
|
+
return self;
|
465
|
+
}
|
466
|
+
|
467
|
+
|
468
|
+
#define SET_PROP(prop, vres) { \
|
469
|
+
val = rb_hash_aref(opts, ID2SYM(rb_intern(#prop))); \
|
470
|
+
if (RTEST(val)) res.prop = vres; \
|
471
|
+
}
|
472
|
+
|
473
|
+
lxw_chart_fill
|
474
|
+
val_to_lxw_chart_fill(VALUE opts) {
|
475
|
+
lxw_chart_fill res = {}; // All zeros
|
476
|
+
VALUE val;
|
477
|
+
|
478
|
+
SET_PROP(color, NUM2UINT(val));
|
479
|
+
SET_PROP(none, 1);
|
480
|
+
SET_PROP(transparency, NUM2UINT(val));
|
481
|
+
|
482
|
+
return res;
|
483
|
+
}
|
484
|
+
|
485
|
+
lxw_chart_font
|
486
|
+
val_to_lxw_chart_font(VALUE opts) {
|
487
|
+
lxw_chart_font res = {}; // Zero-initialized
|
488
|
+
VALUE val;
|
489
|
+
|
490
|
+
SET_PROP(name, StringValueCStr(val));
|
491
|
+
SET_PROP(size, NUM2UINT(val));
|
492
|
+
SET_PROP(bold, 1);
|
493
|
+
SET_PROP(italic, 1);
|
494
|
+
SET_PROP(underline, 1);
|
495
|
+
SET_PROP(rotation, NUM2INT(val));
|
496
|
+
SET_PROP(color, NUM2ULONG(val));
|
497
|
+
SET_PROP(baseline, NUM2INT(val));
|
498
|
+
|
499
|
+
return res;
|
500
|
+
}
|
501
|
+
|
502
|
+
lxw_chart_line
|
503
|
+
val_to_lxw_chart_line(VALUE opts) {
|
504
|
+
lxw_chart_line res = {}; // All zeros
|
505
|
+
VALUE val;
|
506
|
+
|
507
|
+
SET_PROP(color, NUM2UINT(val));
|
508
|
+
SET_PROP(none, 1);
|
509
|
+
SET_PROP(width, NUM2DBL(val));
|
510
|
+
SET_PROP(dash_type, NUM2UINT(val));
|
511
|
+
|
512
|
+
return res;
|
513
|
+
}
|
514
|
+
|
515
|
+
#undef SET_PROP
|
516
|
+
|
517
|
+
|
518
|
+
void init_xlsxwriter_chart() {
|
519
|
+
#if 0
|
520
|
+
// Making RDoc happy.
|
521
|
+
mXlsxWriter = rb_define_module("XlsxWriter");
|
522
|
+
cWorkbook = rb_define_class_under(mXlsxWriter, "Workbook", rb_cObject);
|
523
|
+
#endif
|
524
|
+
/* Workbook chart */
|
525
|
+
cChart = rb_define_class_under(cWorkbook, "Chart", rb_cObject);
|
526
|
+
/* Chart data series */
|
527
|
+
cChartSeries = rb_define_class_under(cChart, "Series", rb_cObject);
|
528
|
+
/* Chart axis */
|
529
|
+
cChartAxis = rb_define_class_under(cChart, "Axis", rb_cObject);
|
530
|
+
|
531
|
+
|
532
|
+
rb_define_alloc_func(cChart, chart_alloc);
|
533
|
+
rb_define_method(cChart, "initialize", chart_init, 2);
|
534
|
+
rb_define_method(cChart, "add_series", chart_add_series_, -1);
|
535
|
+
rb_define_method(cChart, "x_axis", chart_x_axis_, 0);
|
536
|
+
rb_define_method(cChart, "y_axis", chart_y_axis_, 0);
|
537
|
+
rb_define_method(cChart, "title=", chart_title_set_name_, 1);
|
538
|
+
rb_define_method(cChart, "legend_position=", chart_legend_set_position_, 1);
|
539
|
+
rb_define_method(cChart, "legend_set_font", chart_legend_set_font_, 1);
|
540
|
+
rb_define_method(cChart, "legend_delete_series", chart_legend_delete_series_, 1);
|
541
|
+
rb_define_method(cChart, "style=", chart_set_style_, 1);
|
542
|
+
rb_define_method(cChart, "rotation=", chart_set_rotation_, 1);
|
543
|
+
rb_define_method(cChart, "hole_size=", chart_set_hole_size_, 1);
|
544
|
+
|
545
|
+
rb_define_method(cChart, "axis_id_1", chart_get_axis_id_1_, 0);
|
546
|
+
rb_define_method(cChart, "axis_id_1=", chart_set_axis_id_1_, 1);
|
547
|
+
rb_define_method(cChart, "axis_id_2", chart_get_axis_id_2_, 0);
|
548
|
+
rb_define_method(cChart, "axis_id_2=", chart_set_axis_id_2_, 1);
|
549
|
+
|
550
|
+
rb_define_alloc_func(cChartAxis, chart_axis_alloc);
|
551
|
+
rb_define_method(cChartAxis, "initialize", chart_axis_init, 2);
|
552
|
+
|
553
|
+
rb_define_method(cChartAxis, "name=", chart_axis_set_name_, 1);
|
554
|
+
rb_define_method(cChartAxis, "set_name_range", chart_axis_set_name_range_, -1);
|
555
|
+
rb_define_method(cChartAxis, "set_name_font", chart_axis_set_name_font_, 1);
|
556
|
+
rb_define_method(cChartAxis, "set_num_font", chart_axis_set_num_font_, 1);
|
557
|
+
rb_define_method(cChartAxis, "set_line", chart_axis_set_line_, 1);
|
558
|
+
rb_define_method(cChartAxis, "set_fill", chart_axis_set_fill_, 1);
|
559
|
+
|
560
|
+
rb_define_alloc_func(cChartSeries, chart_series_alloc);
|
561
|
+
rb_define_method(cChartSeries, "initialize", chart_series_init, -1);
|
562
|
+
|
563
|
+
rb_define_method(cChartSeries, "set_categories", chart_series_set_categories_, -1);
|
564
|
+
rb_define_method(cChartSeries, "set_values", chart_series_set_values_, -1);
|
565
|
+
rb_define_method(cChartSeries, "name=", chart_series_set_name_, 1);
|
566
|
+
rb_define_method(cChartSeries, "set_name_range", chart_series_set_name_range_, -1);
|
567
|
+
|
568
|
+
#define MAP_CHART_CONST(name) rb_define_const(cChart, #name, INT2NUM(LXW_CHART_##name))
|
569
|
+
MAP_CHART_CONST(NONE);
|
570
|
+
MAP_CHART_CONST(AREA);
|
571
|
+
MAP_CHART_CONST(AREA_STACKED);
|
572
|
+
MAP_CHART_CONST(AREA_STACKED_PERCENT);
|
573
|
+
MAP_CHART_CONST(BAR);
|
574
|
+
MAP_CHART_CONST(BAR_STACKED);
|
575
|
+
MAP_CHART_CONST(BAR_STACKED_PERCENT);
|
576
|
+
MAP_CHART_CONST(COLUMN);
|
577
|
+
MAP_CHART_CONST(COLUMN_STACKED);
|
578
|
+
MAP_CHART_CONST(COLUMN_STACKED_PERCENT);
|
579
|
+
MAP_CHART_CONST(DOUGHNUT);
|
580
|
+
MAP_CHART_CONST(LINE);
|
581
|
+
MAP_CHART_CONST(PIE);
|
582
|
+
MAP_CHART_CONST(SCATTER);
|
583
|
+
MAP_CHART_CONST(SCATTER_STRAIGHT);
|
584
|
+
MAP_CHART_CONST(SCATTER_STRAIGHT_WITH_MARKERS);
|
585
|
+
MAP_CHART_CONST(SCATTER_SMOOTH);
|
586
|
+
MAP_CHART_CONST(SCATTER_SMOOTH_WITH_MARKERS);
|
587
|
+
MAP_CHART_CONST(RADAR);
|
588
|
+
MAP_CHART_CONST(RADAR_WITH_MARKERS);
|
589
|
+
MAP_CHART_CONST(RADAR_FILLED);
|
590
|
+
|
591
|
+
MAP_CHART_CONST(LEGEND_NONE);
|
592
|
+
MAP_CHART_CONST(LEGEND_RIGHT);
|
593
|
+
MAP_CHART_CONST(LEGEND_LEFT);
|
594
|
+
MAP_CHART_CONST(LEGEND_TOP);
|
595
|
+
MAP_CHART_CONST(LEGEND_BOTTOM);
|
596
|
+
MAP_CHART_CONST(LEGEND_OVERLAY_RIGHT);
|
597
|
+
MAP_CHART_CONST(LEGEND_OVERLAY_LEFT);
|
598
|
+
|
599
|
+
#undef MAP_CHART_CONST
|
600
|
+
}
|