xlsxwriter 0.1.2.pre → 0.2.0.pre

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2fb20c025afb481308dc6787fa972d8e5675c20b6de467ade855dc051b1b48f2
4
- data.tar.gz: 04535f83606938834b2eca512d68a38c4b3e056c4ee660a06e86f8a20ea1454e
3
+ metadata.gz: 408b3a45c34215b79898280c419cf2adafbde2bf0a4037f11a0432972c7861cf
4
+ data.tar.gz: d162bd3b0043aa39114baa98a28665fe8931c22e8252f5a0e9040c2a10c62319
5
5
  SHA512:
6
- metadata.gz: a3e97984e91290594bf91c438de8ad68f271de79b0dd7bbdef36539f1fe47db589269a956e00b69e75a41ad7fbd627dd143e37abe7e8d6c1cdc1341fab42dbd2
7
- data.tar.gz: 1a7d898c096afef2e230d04db7e0180c8dca48bfc72c7cbca6819a300fc8259ad70d6cf55a85368e9df37d717522760725c7d4e878732973ccaf410ce8ba3490
6
+ metadata.gz: 566117022982bb38edc6b2048567a10a5174fae628fa6b47c85324d721ea4e4448360d82c9b8656af85bd0b28639ef9efc3a0c1d625f8b4d1a1dc19c141ac306
7
+ data.tar.gz: 54c7504e4bcafd1f982a45dbf98ebec925c9880ae8797022920c24c00af5926e51d55ca70d822a1298aa4a3fa13390c4030d17fbe14b7754f3e6aee6a252448d
@@ -593,8 +593,15 @@ void init_xlsxwriter_chart() {
593
593
  MAP_CHART_CONST(LEGEND_LEFT);
594
594
  MAP_CHART_CONST(LEGEND_TOP);
595
595
  MAP_CHART_CONST(LEGEND_BOTTOM);
596
+ MAP_CHART_CONST(LEGEND_TOP_RIGHT);
596
597
  MAP_CHART_CONST(LEGEND_OVERLAY_RIGHT);
597
598
  MAP_CHART_CONST(LEGEND_OVERLAY_LEFT);
599
+ MAP_CHART_CONST(LEGEND_OVERLAY_TOP_RIGHT);
600
+
601
+ MAP_CHART_CONST(AXIS_LABEL_ALIGN_CENTER);
602
+ MAP_CHART_CONST(AXIS_LABEL_ALIGN_LEFT);
603
+ MAP_CHART_CONST(AXIS_LABEL_ALIGN_RIGHT);
604
+
598
605
 
599
606
  #undef MAP_CHART_CONST
600
607
  }
@@ -219,6 +219,8 @@ enum lxw_custom_property_types {
219
219
  if (error) \
220
220
  return error;
221
221
 
222
+ #if 0
223
+
222
224
  #define LXW_WARN(message) \
223
225
  fprintf(stderr, "[WARNING]: " message "\n")
224
226
 
@@ -268,6 +270,20 @@ enum lxw_custom_property_types {
268
270
  return; \
269
271
  }
270
272
 
273
+ #else
274
+
275
+ #define LXW_WARN(message) {}
276
+ #define LXW_WARN_FORMAT(message) {}
277
+ #define LXW_WARN_FORMAT1(message, var) {}
278
+ #define LXW_WARN_FORMAT2(message, var1, var2) {}
279
+ #define LXW_WARN_CAT_AXIS_ONLY(function) {}
280
+ #define LXW_WARN_VALUE_AXIS_ONLY(function) {}
281
+ #define LXW_WARN_DATE_AXIS_ONLY(function) {}
282
+ #define LXW_WARN_CAT_AND_DATE_AXIS_ONLY(function) {}
283
+ #define LXW_WARN_VALUE_AND_DATE_AXIS_ONLY(function) {}
284
+
285
+ #endif
286
+
271
287
  #ifndef LXW_BIG_ENDIAN
272
288
  #define LXW_UINT32_NETWORK(n) ((((n) & 0xFF) << 24) | \
273
289
  (((n) & 0xFF00) << 8) | \
@@ -1,6 +1,7 @@
1
1
  #include "chart.h"
2
2
  #include "worksheet.h"
3
3
  #include "workbook.h"
4
+ #include "xlsxwriter_ext.h"
4
5
 
5
6
  VALUE cWorksheet;
6
7
 
@@ -461,9 +462,17 @@ worksheet_set_row_(VALUE self, VALUE row, VALUE opts) {
461
462
  if (val != Qnil && val)
462
463
  options.hidden = 1;
463
464
 
465
+ val = rb_hash_aref(opts, ID2SYM(rb_intern("collapse")));
466
+ if (val != Qnil && val)
467
+ options.collapsed = 1;
468
+
469
+ val = rb_hash_aref(opts, ID2SYM(rb_intern("level")));
470
+ if (val != Qnil)
471
+ options.level = NUM2INT(val);
472
+
464
473
  struct worksheet *ptr;
465
474
  Data_Get_Struct(self, struct worksheet, ptr);
466
- if (options.hidden) {
475
+ if (options.hidden || options.collapsed || options.level) {
467
476
  worksheet_set_row_opt(ptr->worksheet, NUM2INT(row), height, format, &options);
468
477
  } else {
469
478
  worksheet_set_row(ptr->worksheet, NUM2INT(row), height, format);
@@ -500,9 +509,17 @@ worksheet_set_column_(VALUE self, VALUE col_from, VALUE col_to, VALUE opts) {
500
509
  if (val != Qnil && val)
501
510
  options.hidden = 1;
502
511
 
512
+ val = rb_hash_aref(opts, ID2SYM(rb_intern("collapse")));
513
+ if (val != Qnil && val)
514
+ options.collapsed = 1;
515
+
516
+ val = rb_hash_aref(opts, ID2SYM(rb_intern("level")));
517
+ if (val != Qnil)
518
+ options.level = NUM2INT(val);
519
+
503
520
  struct worksheet *ptr;
504
521
  Data_Get_Struct(self, struct worksheet, ptr);
505
- if (options.hidden) {
522
+ if (options.hidden || options.collapsed || options.level) {
506
523
  worksheet_set_column_opt(ptr->worksheet, col1, col2, width, format, &options);
507
524
  } else {
508
525
  worksheet_set_column(ptr->worksheet, col1, col2, width, format);
@@ -1195,6 +1212,27 @@ worksheet_protect_(int argc, VALUE *argv, VALUE self) {
1195
1212
  return self;
1196
1213
  }
1197
1214
 
1215
+ /* call-seq: ws.outline_settings = { visible: true, symbols_below: true, symbols_right: true, auto_style: false }
1216
+ *
1217
+ * Sets the Outline and Grouping display properties.
1218
+ */
1219
+ VALUE
1220
+ worksheet_outline_settings_(VALUE self, VALUE opts) {
1221
+ struct worksheet *ptr;
1222
+ Data_Get_Struct(self, struct worksheet, ptr);
1223
+ VALUE value;
1224
+ #define parse_param(name, default) \
1225
+ value = rb_hash_aref(opts, ID2SYM(rb_intern(#name))); \
1226
+ uint8_t name = NIL_P(value) ? default : (value ? LXW_TRUE : LXW_FALSE)
1227
+ parse_param(visible, LXW_TRUE);
1228
+ parse_param(symbols_below, LXW_TRUE);
1229
+ parse_param(symbols_right, LXW_TRUE);
1230
+ parse_param(auto_style, LXW_FALSE);
1231
+ #undef parse_param
1232
+ worksheet_outline_settings(ptr->worksheet, visible, symbols_below, symbols_right, auto_style);
1233
+ return self;
1234
+ }
1235
+
1198
1236
  /* call-seq: ws.set_default_row(height, hide_unuser_rows) -> self
1199
1237
  *
1200
1238
  * Sets the default row properties for the worksheet.
@@ -1231,6 +1269,167 @@ worksheet_set_vertical_dpi_(VALUE self, VALUE val) {
1231
1269
  return val;
1232
1270
  }
1233
1271
 
1272
+ /* call-seq:
1273
+ * ws.add_data_validation(cell, options) -> self
1274
+ * ws.add_data_validation(range, options) -> self
1275
+ * ws.add_data_validation(row, col, options) -> self
1276
+ * ws.add_data_validation(row_from, col_from, row_to, col_to, options) -> self
1277
+ *
1278
+ * Adds data validation or limits user input to a list of values.
1279
+ */
1280
+ VALUE
1281
+ worksheet_data_validation_(int argc, VALUE *argv, VALUE self) {
1282
+ lxw_data_validation data_validation = {0};
1283
+ rb_check_arity(argc, 2, 5);
1284
+ char range = 0;
1285
+ if (argc > 3) {
1286
+ range = 1;
1287
+ } else if (TYPE(argv[0]) == T_STRING) {
1288
+ char *str = RSTRING_PTR(argv[0]);
1289
+ if (strstr(str, ":")) {
1290
+ range = 1;
1291
+ } else if ((str[0] >= 'A' && str[0] <= 'Z') ||
1292
+ (str[0] >= 'a' && str[0] <= 'z'))
1293
+ range = argc > 2;
1294
+ }
1295
+
1296
+ lxw_row_t row, row2;
1297
+ lxw_col_t col, col2;
1298
+ int larg;
1299
+ if (range) {
1300
+ larg = extract_range(argc, argv, &row, &col, &row2, &col2);
1301
+ } else {
1302
+ larg = extract_cell(argc, argv, &row, &col);
1303
+ }
1304
+
1305
+ if (larg != argc - 1) {
1306
+ rb_raise(rb_eArgError, "Wrong number of arguments");
1307
+ }
1308
+ VALUE opts = argv[larg];
1309
+ if (TYPE(opts) != T_HASH) {
1310
+ rb_raise(rb_eTypeError, "Wrong type for options %"PRIsVALUE", Hash expected", rb_obj_class(opts));
1311
+ }
1312
+
1313
+ VALUE val;
1314
+ val = rb_hash_aref(opts, ID2SYM(rb_intern("validate")));
1315
+ if (!NIL_P(val)) {
1316
+ data_validation.validate = NUM2INT(val);
1317
+ }
1318
+
1319
+ val = rb_hash_aref(opts, ID2SYM(rb_intern("criteria")));
1320
+ if (!NIL_P(val)) {
1321
+ data_validation.criteria = NUM2INT(val);
1322
+ }
1323
+
1324
+ val = rb_hash_aref(opts, ID2SYM(rb_intern("ignore_blank")));
1325
+ if (!NIL_P(val) && val) {
1326
+ data_validation.ignore_blank = LXW_VALIDATION_ON;
1327
+ }
1328
+
1329
+ val = rb_hash_aref(opts, ID2SYM(rb_intern("show_input")));
1330
+ if (!NIL_P(val) && val) {
1331
+ data_validation.show_input = LXW_VALIDATION_ON;
1332
+ }
1333
+
1334
+ val = rb_hash_aref(opts, ID2SYM(rb_intern("show_error")));
1335
+ if (!NIL_P(val) && val) {
1336
+ data_validation.show_error = LXW_VALIDATION_ON;
1337
+ }
1338
+
1339
+ val = rb_hash_aref(opts, ID2SYM(rb_intern("error_type")));
1340
+ if (!NIL_P(val)) {
1341
+ data_validation.error_type = NUM2INT(val);
1342
+ }
1343
+
1344
+ val = rb_hash_aref(opts, ID2SYM(rb_intern("dropdown")));
1345
+ if (!NIL_P(val) && val) {
1346
+ data_validation.dropdown = LXW_VALIDATION_ON;
1347
+ }
1348
+
1349
+ val = rb_hash_aref(opts, ID2SYM(rb_intern("input_title")));
1350
+ if (!NIL_P(val)) {
1351
+ data_validation.input_title = RSTRING_PTR(val);
1352
+ }
1353
+
1354
+ val = rb_hash_aref(opts, ID2SYM(rb_intern("input_message")));
1355
+ if (!NIL_P(val)) {
1356
+ data_validation.input_message = RSTRING_PTR(val);
1357
+ }
1358
+
1359
+ val = rb_hash_aref(opts, ID2SYM(rb_intern("error_title")));
1360
+ if (!NIL_P(val)) {
1361
+ data_validation.error_title = RSTRING_PTR(val);
1362
+ }
1363
+
1364
+ val = rb_hash_aref(opts, ID2SYM(rb_intern("error_message")));
1365
+ if (!NIL_P(val)) {
1366
+ data_validation.error_message = RSTRING_PTR(val);
1367
+ }
1368
+
1369
+ VALUE is_datetime;
1370
+ #define parse_array_0(x)
1371
+ #define parse_array_1(prefix) \
1372
+ if (TYPE(val) == T_ARRAY) { \
1373
+ int len = RARRAY_LEN(val); \
1374
+ data_validation.prefix##_list = malloc(sizeof(char *) * (len + 1)); \
1375
+ data_validation.prefix##_list[len] = NULL; \
1376
+ for (int i = 0; i < len; ++i) { \
1377
+ data_validation.prefix##_list[i] = RSTRING_PTR(rb_ary_entry(val, i)); \
1378
+ } \
1379
+ } else
1380
+
1381
+ #define parse_value(prefix, key, handle_array) \
1382
+ val = rb_hash_aref(opts, ID2SYM(rb_intern(key))); \
1383
+ if (!NIL_P(val)) { \
1384
+ switch(TYPE(val)) { \
1385
+ case T_FLOAT: case T_FIXNUM: case T_BIGNUM: \
1386
+ data_validation.prefix##_number = NUM2DBL(val); \
1387
+ break; \
1388
+ case T_STRING: \
1389
+ data_validation.prefix##_formula = RSTRING_PTR(val); \
1390
+ if (data_validation.prefix##_formula[0] != '=') { \
1391
+ data_validation.prefix##_formula = 0; \
1392
+ rb_raise(rb_eArgError, "Is not a formula: %"PRIsVALUE, val); \
1393
+ } \
1394
+ break; \
1395
+ default: \
1396
+ is_datetime = rb_funcall(val, rb_intern("is_a?"), 1, rb_cTime); \
1397
+ parse_array_##handle_array(prefix) \
1398
+ if (is_datetime || rb_respond_to(val, rb_intern("to_time"))) { \
1399
+ if (!is_datetime) \
1400
+ val = rb_funcall(val, rb_intern("to_time"), 0); \
1401
+ data_validation.prefix##_datetime = value_to_lxw_datetime(val); \
1402
+ } else { \
1403
+ rb_raise(rb_eTypeError, "Cannot handle " key " type %"PRIsVALUE, rb_class_of(val)); \
1404
+ } \
1405
+ } \
1406
+ }
1407
+
1408
+ parse_value(minimum, "min", 0);
1409
+ parse_value(maximum, "max", 0);
1410
+ parse_value(value, "value", 1);
1411
+
1412
+ #undef parse_array_0
1413
+ #undef parse_array_1
1414
+ #undef parse_value
1415
+
1416
+ struct worksheet *ptr;
1417
+ Data_Get_Struct(self, struct worksheet, ptr);
1418
+ lxw_error err;
1419
+ if (range) {
1420
+ err = worksheet_data_validation_range(ptr->worksheet, row, col, row2, col2, &data_validation);
1421
+ } else {
1422
+ err = worksheet_data_validation_cell(ptr->worksheet, row, col, &data_validation);
1423
+ }
1424
+
1425
+ if (data_validation.value_list) {
1426
+ free(data_validation.value_list);
1427
+ }
1428
+
1429
+ handle_xlsxwriter_error(err);
1430
+
1431
+ return self;
1432
+ }
1234
1433
 
1235
1434
  lxw_col_t
1236
1435
  value_to_col(VALUE value) {
@@ -1402,12 +1601,16 @@ init_xlsxwriter_worksheet() {
1402
1601
  rb_define_method(cWorksheet, "hide_zero", worksheet_hide_zero_, 0);
1403
1602
  rb_define_method(cWorksheet, "tab_color=", worksheet_set_tab_color_, 1);
1404
1603
  rb_define_method(cWorksheet, "protect", worksheet_protect_, -1);
1604
+ rb_define_method(cWorksheet, "outline_settings=", worksheet_outline_settings_, 1);
1405
1605
  rb_define_method(cWorksheet, "set_default_row", worksheet_set_default_row_, 2);
1406
1606
 
1407
1607
  rb_define_method(cWorksheet, "vertical_dpi", worksheet_get_vertical_dpi_, 0);
1408
1608
  rb_define_method(cWorksheet, "vertical_dpi=", worksheet_set_vertical_dpi_, 1);
1409
1609
 
1610
+ rb_define_method(cWorksheet, "add_data_validation", worksheet_data_validation_, -1);
1611
+
1410
1612
  #define MAP_LXW_WH_CONST(name, val_name) rb_define_const(cWorksheet, #name, INT2NUM(LXW_##val_name))
1613
+ #define MAP_LXW_WH_CONST1(name) MAP_LXW_WH_CONST(name, name)
1411
1614
  MAP_LXW_WH_CONST(DEF_COL_WIDTH, DEF_COL_WIDTH);
1412
1615
  MAP_LXW_WH_CONST(DEF_ROW_HEIGHT, DEF_ROW_HEIGHT);
1413
1616
 
@@ -1415,5 +1618,30 @@ init_xlsxwriter_worksheet() {
1415
1618
  MAP_LXW_WH_CONST(GRIDLINES_SHOW_SCREEN, SHOW_SCREEN_GRIDLINES);
1416
1619
  MAP_LXW_WH_CONST(GRIDLINES_SHOW_PRINT, SHOW_PRINT_GRIDLINES);
1417
1620
  MAP_LXW_WH_CONST(GRIDLINES_SHOW_ALL, SHOW_ALL_GRIDLINES);
1621
+
1622
+ MAP_LXW_WH_CONST1(VALIDATION_TYPE_INTEGER);
1623
+ MAP_LXW_WH_CONST1(VALIDATION_TYPE_INTEGER_FORMULA);
1624
+ MAP_LXW_WH_CONST1(VALIDATION_TYPE_DECIMAL);
1625
+ MAP_LXW_WH_CONST1(VALIDATION_TYPE_DECIMAL_FORMULA);
1626
+ MAP_LXW_WH_CONST1(VALIDATION_TYPE_LIST);
1627
+ MAP_LXW_WH_CONST1(VALIDATION_TYPE_LIST_FORMULA);
1628
+ MAP_LXW_WH_CONST1(VALIDATION_TYPE_DATE);
1629
+ MAP_LXW_WH_CONST1(VALIDATION_TYPE_DATE_FORMULA);
1630
+ MAP_LXW_WH_CONST1(VALIDATION_TYPE_TIME);
1631
+ MAP_LXW_WH_CONST1(VALIDATION_TYPE_TIME_FORMULA);
1632
+ MAP_LXW_WH_CONST1(VALIDATION_TYPE_LENGTH);
1633
+ MAP_LXW_WH_CONST1(VALIDATION_TYPE_LENGTH_FORMULA);
1634
+ MAP_LXW_WH_CONST1(VALIDATION_TYPE_CUSTOM_FORMULA);
1635
+ MAP_LXW_WH_CONST1(VALIDATION_TYPE_ANY);
1636
+
1637
+ MAP_LXW_WH_CONST1(VALIDATION_CRITERIA_BETWEEN);
1638
+ MAP_LXW_WH_CONST1(VALIDATION_CRITERIA_NOT_BETWEEN);
1639
+ MAP_LXW_WH_CONST1(VALIDATION_CRITERIA_EQUAL_TO);
1640
+ MAP_LXW_WH_CONST1(VALIDATION_CRITERIA_NOT_EQUAL_TO);
1641
+ MAP_LXW_WH_CONST1(VALIDATION_CRITERIA_GREATER_THAN);
1642
+ MAP_LXW_WH_CONST1(VALIDATION_CRITERIA_LESS_THAN);
1643
+ MAP_LXW_WH_CONST1(VALIDATION_CRITERIA_GREATER_THAN_OR_EQUAL_TO);
1644
+ MAP_LXW_WH_CONST1(VALIDATION_CRITERIA_LESS_THAN_OR_EQUAL_TO);
1645
+ #undef MAP_LXW_WH_CONST1
1418
1646
  #undef MAP_LXW_WH_CONST
1419
1647
  }
@@ -8,6 +8,7 @@
8
8
 
9
9
  VALUE mXlsxWriter;
10
10
  VALUE rbLibVersion;
11
+ VALUE eXlsxWriterError;
11
12
 
12
13
  /* Document-module: XlsxWriter
13
14
  *
@@ -32,6 +33,7 @@ void Init_xlsxwriter() {
32
33
  mXlsxWriter = rb_define_module("XlsxWriter");
33
34
  rbLibVersion = rb_str_new_cstr(lxw_version());
34
35
  rb_define_const(mXlsxWriter, "LIBRARY_VERSION", rbLibVersion);
36
+ eXlsxWriterError = rb_define_class_id_under(mXlsxWriter, rb_intern("Error"), rb_eStandardError);
35
37
 
36
38
  init_xlsxwriter_workbook();
37
39
  init_xlsxwriter_workbook_properties();
@@ -0,0 +1,15 @@
1
+ #include <ruby.h>
2
+
3
+ #ifndef XLSXWRITER_H
4
+ #define XLSXWRITER_H
5
+
6
+ extern VALUE mXlsxWriter;
7
+ extern VALUE eXlsxWriterError;
8
+
9
+ inline void handle_xlsxwriter_error(lxw_error err) {
10
+ if (err) {
11
+ rb_raise(eXlsxWriterError, lxw_strerror(err));
12
+ }
13
+ }
14
+
15
+ #endif /* XLSXWRITER_H */
@@ -2,5 +2,5 @@
2
2
 
3
3
  module XlsxWriter
4
4
  # :nodoc:
5
- VERSION='0.1.2.pre'.freeze
5
+ VERSION='0.2.0.pre'.freeze
6
6
  end
@@ -18,7 +18,7 @@ module XlsxComparable
18
18
 
19
19
  if %w(.png .jpeg .bmp .bin).include?(File.extname(exp_entry.name))
20
20
  exp_xml_str.force_encoding('BINARY')
21
- assert_equal(got_xml_str, exp_xml_str)
21
+ assert_equal(exp_xml_str, got_xml_str)
22
22
  next
23
23
  end
24
24
 
@@ -60,7 +60,7 @@ module XlsxComparable
60
60
  exp_xml = _sort_rel_file_data(exp_xml)
61
61
  end
62
62
 
63
- assert_equal got_xml, exp_xml
63
+ assert_equal exp_xml, got_xml
64
64
  end
65
65
  end
66
66
  end
@@ -0,0 +1,107 @@
1
+ # -*- coding: utf-8 -*-
2
+ # frozen_string_literal: true
3
+
4
+ require_relative './xlsx-func-testcase'
5
+
6
+ class TestDataValidation < XlsxWriterTestCase
7
+ test 'data_validation01' do |wb|
8
+ wb.add_worksheet
9
+ .add_data_validation 'C2', validate: XlsxWriter::Worksheet::VALIDATION_TYPE_LIST,
10
+ value: %w(Foo Bar Baz)
11
+ end
12
+
13
+ test 'data_validation02' do |wb|
14
+ wb.add_worksheet
15
+ .add_data_validation 1, 2, validate: XlsxWriter::Worksheet::VALIDATION_TYPE_LIST,
16
+ value: %w(Foo Bar Baz),
17
+ input_title: 'This is the input title',
18
+ input_message: 'This is the input message'
19
+ end
20
+
21
+ test 'data_validation03' do |wb|
22
+ wb.add_worksheet
23
+ .add_data_validation('C2', validate: XlsxWriter::Worksheet::VALIDATION_TYPE_LIST,
24
+ value: %w(Foo Bar Baz),
25
+ input_title: 'This is the input title',
26
+ input_message: 'This is the input message')
27
+ .add_data_validation('D6', validate: XlsxWriter::Worksheet::VALIDATION_TYPE_LIST,
28
+ value: %w(Foobar Foobas Foobat Foobau Foobav Foobaw Foobax
29
+ Foobay Foobaz Foobba Foobbb Foobbc Foobbd Foobbe
30
+ Foobbf Foobbg Foobbh Foobbi Foobbj Foobbk Foobbl
31
+ Foobbm Foobbn Foobbo Foobbp Foobbq Foobbr Foobbs
32
+ Foobbt Foobbu Foobbv Foobbw Foobbx Foobby Foobbz
33
+ Foobca End),
34
+ input_title: 'This is the longest input title1',
35
+ input_message: 'This is the longest input message ' + 'a' * 221)
36
+ end
37
+
38
+ test 'data_validation04', ref_file_name: 'data_validation02' do |wb|
39
+ ws = wb.add_worksheet
40
+ .add_data_validation('C2', validate: XlsxWriter::Worksheet::VALIDATION_TYPE_LIST,
41
+ value: %w(Foo Bar Baz),
42
+ input_title: 'This is the input title',
43
+ input_message: 'This is the input message')
44
+ assert_raise(XlsxWriter::Error.new('Parameter exceeds Excel\'s limit of 32 characters.')) do
45
+ ws.add_data_validation('D6', validate: XlsxWriter::Worksheet::VALIDATION_TYPE_LIST,
46
+ value: %w(Foobar Foobas Foobat Foobau Foobav Foobaw Foobax
47
+ Foobay Foobaz Foobba Foobbb Foobbc Foobbd Foobbe
48
+ Foobbf Foobbg Foobbh Foobbi Foobbj Foobbk Foobbl
49
+ Foobbm Foobbn Foobbo Foobbp Foobbq Foobbr Foobbs
50
+ Foobbt Foobbu Foobbv Foobbw Foobbx Foobby Foobbz
51
+ Foobca End),
52
+ input_title: 'This is the longest input title12',
53
+ input_message: 'This is the longest input message ' + 'a' * 221)
54
+ end
55
+ end
56
+
57
+ test 'data_validation05', ref_file_name: 'data_validation02' do |wb|
58
+ ws = wb.add_worksheet
59
+ .add_data_validation('C2', validate: XlsxWriter::Worksheet::VALIDATION_TYPE_LIST,
60
+ value: %w(Foo Bar Baz),
61
+ input_title: 'This is the input title',
62
+ input_message: 'This is the input message')
63
+ assert_raise(XlsxWriter::Error.new('Parameter exceeds Excel\'s limit of 255 characters.')) do
64
+ ws.add_data_validation('D6', validate: XlsxWriter::Worksheet::VALIDATION_TYPE_LIST,
65
+ value: %w(Foobar Foobas Foobat Foobau Foobav Foobaw Foobax
66
+ Foobay Foobaz Foobba Foobbb Foobbc Foobbd Foobbe
67
+ Foobbf Foobbg Foobbh Foobbi Foobbj Foobbk Foobbl
68
+ Foobbm Foobbn Foobbo Foobbp Foobbq Foobbr Foobbs
69
+ Foobbt Foobbu Foobbv Foobbw Foobbx Foobby Foobbz
70
+ Foobca End),
71
+ input_title: 'This is the longest input title1',
72
+ input_message: 'This is the longest input message ' + 'a' * 222)
73
+ end
74
+ end
75
+
76
+ test 'data_validation06', ref_file_name: 'data_validation02' do |wb|
77
+ ws = wb.add_worksheet
78
+ .add_data_validation('C2', validate: XlsxWriter::Worksheet::VALIDATION_TYPE_LIST,
79
+ value: %w(Foo Bar Baz),
80
+ input_title: 'This is the input title',
81
+ input_message: 'This is the input message')
82
+ assert_raise(XlsxWriter::Error.new('Parameter exceeds Excel\'s limit of 255 characters.')) do
83
+ ws.add_data_validation('D6', validate: XlsxWriter::Worksheet::VALIDATION_TYPE_LIST,
84
+ value: %w(Foobar Foobas Foobat Foobau Foobav Foobaw Foobax
85
+ Foobay Foobaz Foobba Foobbb Foobbc Foobbd Foobbe
86
+ Foobbf Foobbg Foobbh Foobbi Foobbj Foobbk Foobbl
87
+ Foobbm Foobbn Foobbo Foobbp Foobbq Foobbr Foobbs
88
+ Foobbt Foobbu Foobbv Foobbw Foobbx Foobby Foobbz
89
+ Foobca End1),
90
+ input_title: 'This is the longest input title1',
91
+ input_message: 'This is the longest input message ' + 'a' * 221)
92
+ end
93
+ end
94
+
95
+ test 'data_validation07' do |wb|
96
+ wb.add_worksheet
97
+ .add_data_validation 'C2', validate: XlsxWriter::Worksheet::VALIDATION_TYPE_LIST,
98
+ value: %w(coffee café)
99
+ end
100
+
101
+ test 'data_validation08' do |wb|
102
+ wb.add_worksheet
103
+ .add_data_validation 'C2:C2', validate: XlsxWriter::Worksheet::VALIDATION_TYPE_ANY,
104
+ input_title: 'This is the input title',
105
+ input_message: 'This is the input message'
106
+ end
107
+ end
@@ -12,6 +12,28 @@ class TestDefaultRow < XlsxWriterTestCase
12
12
  ws.write_string(9, 'A', 'Bar', nil)
13
13
  end
14
14
 
15
+ test 'default_row02' do |wb|
16
+ ws = wb.add_worksheet
17
+
18
+ ws.set_default_row(15, true)
19
+
20
+ ws.write_string('A1', 'Foo', nil)
21
+ ws.write_string('A10', 'Bar', nil)
22
+
23
+ (1..8).each { |i| ws.set_row i, height: 15 }
24
+ end
25
+
26
+ test 'default_row03' do |wb|
27
+ ws = wb.add_worksheet
28
+
29
+ ws.set_default_row(24, true)
30
+
31
+ ws.write_string('A1', 'Foo', nil)
32
+ ws.write_string('A10', 'Bar', nil)
33
+
34
+ (1..8).each { |i| ws.set_row i, height: 24 }
35
+ end
36
+
15
37
  test 'default_row05' do |wb|
16
38
  ws = wb.add_worksheet
17
39
 
@@ -29,6 +29,11 @@ class TestDefinedName < XlsxWriterTestCase
29
29
  wb.define_name "_Fog", "=Sheet1!$A$1"
30
30
  end
31
31
 
32
+ test 'defined_name02' do |wb|
33
+ wb.add_worksheet 'sheet One'
34
+ wb.define_name "Sales", "='sheet One'!$G$1:$H$10"
35
+ end
36
+
32
37
  test 'defined_name03' do |wb, t|
33
38
  t.ignore_elements = { 'xl/worksheets/sheet1.xml' => [ '<pageMargins' ] }
34
39
  wb.add_worksheet('sheet One')
@@ -3,21 +3,53 @@
3
3
  require_relative './xlsx-func-testcase'
4
4
 
5
5
  class TestFitToPages < XlsxWriterTestCase
6
+ test 'fit_to_pages01' do |wb, t|
7
+ t.ignore_elements = { 'xl/worksheets/sheet1.xml' => [ '<pageMargins' ] }
8
+
9
+ ws = wb.add_worksheet
10
+ ws.fit_to_pages 1, 1
11
+ ws.paper = 9
12
+ ws.vertical_dpi = 200
13
+ ws.write_string 'A1', 'Foo'
14
+ end
15
+
16
+ test 'fit_to_pages02' do |wb, t|
17
+ t.ignore_elements = { 'xl/worksheets/sheet1.xml' => [ '<pageMargins' ] }
18
+
19
+ ws = wb.add_worksheet
20
+ ws.fit_to_pages 2, 1
21
+ ws.paper = 9
22
+ ws.vertical_dpi = 200
23
+ ws.write_string 'A1', 'Foo'
24
+ end
25
+
26
+ test 'fit_to_pages03' do |wb, t|
27
+ t.ignore_elements = { 'xl/worksheets/sheet1.xml' => [ '<pageMargins' ] }
28
+
29
+ ws = wb.add_worksheet
30
+ ws.fit_to_pages 1, 2
31
+ ws.paper = 9
32
+ ws.vertical_dpi = 200
33
+ ws.write_string 'A1', 'Foo'
34
+ end
35
+
6
36
  test 'fit_to_pages04' do |wb, t|
7
37
  t.ignore_elements = { 'xl/worksheets/sheet1.xml' => [ '<pageMargins' ] }
38
+
8
39
  ws = wb.add_worksheet
9
40
  ws.fit_to_pages(3, 2)
10
41
  ws.paper = 9
11
42
  ws.vertical_dpi = 200
12
- ws.write_string 0, 'A', 'Foo', nil
43
+ ws.write_string 0, 'A', 'Foo'
13
44
  end
14
45
 
15
46
  test 'fit_to_pages05' do |wb, t|
16
47
  t.ignore_elements = { 'xl/worksheets/sheet1.xml' => [ '<pageMargins' ] }
48
+
17
49
  ws = wb.add_worksheet
18
50
  ws.fit_to_pages(1, 0)
19
51
  ws.paper = 9
20
52
  ws.vertical_dpi = 200
21
- ws.write_string 0, 'A', 'Foo', nil
53
+ ws.write_string 0, 'A', 'Foo'
22
54
  end
23
55
  end
@@ -136,4 +136,57 @@ class TestFormatting < XlsxWriterTestCase
136
136
  ws.write_string(1, 'D', 'test', :top_left)
137
137
  ws.write_string(1, 'F', 'test', :top_bottom)
138
138
  end
139
+
140
+ test 'format15' do |wb|
141
+ wb
142
+ .add_format(:format1, bold: true)
143
+ .add_format(:format2, bold: true, num_format_index: 1)
144
+ .add_worksheet
145
+ .write_number('A1', 1, :format1)
146
+ .write_number('A2', 2, :format2)
147
+ end
148
+
149
+ test 'format50' do |wb|
150
+ wb
151
+ .add_format(:format1, num_format: '#,##0.00000')
152
+ .add_format(:format2, num_format: '#,##0.0')
153
+ .add_worksheet
154
+ .set_column('A', 'A', width: 12)
155
+ .write_number('A1', 1234.5, :format1)
156
+ .write_number('A2', 1234.5, :format2)
157
+ end
158
+
159
+ test 'format51' do |wb|
160
+ wb.add_format(:numf1, num_format: '0.0')
161
+ .add_format(:numf3, num_format: '0.000')
162
+ .add_format(:numf4, num_format: '0.0000')
163
+ .add_format(:numf5, num_format: '0.00000')
164
+ .add_worksheet
165
+ .set_column(0, 0, width: 12)
166
+ .write_number(0, 0, 123.456, :numf1)
167
+ .write_number(1, 0, 123.456, :numf3)
168
+ .write_number(2, 0, 123.456, :numf4)
169
+ .write_number(3, 0, 123.456, :numf5)
170
+ end
171
+
172
+ test 'format52' do |wb|
173
+ wb.add_format(:numf1, num_format: '0.0')
174
+ .add_format(:numf3, num_format: '0.000')
175
+ .add_format(:numf4, num_format: '0.0000')
176
+ .add_format(:numf5, num_format: '0.00000')
177
+ .add_format(:numf1_bold, num_format: '0.0', bold: true)
178
+ .add_format(:numf3_bold, num_format: '0.000', bold: true)
179
+ .add_format(:numf4_bold, num_format: '0.0000', bold: true)
180
+ .add_format(:numf5_bold, num_format: '0.00000', bold: true)
181
+ .add_worksheet
182
+ .set_column(0, 0, width: 12)
183
+ .write_number(0, 0, 123.456, :numf1)
184
+ .write_number(1, 0, 123.456, :numf3)
185
+ .write_number(2, 0, 123.456, :numf4)
186
+ .write_number(3, 0, 123.456, :numf5)
187
+ .write_number(4, 0, 123.456, :numf1_bold)
188
+ .write_number(5, 0, 123.456, :numf3_bold)
189
+ .write_number(6, 0, 123.456, :numf4_bold)
190
+ .write_number(7, 0, 123.456, :numf5_bold)
191
+ end
139
192
  end
data/test/test-image.rb CHANGED
@@ -83,4 +83,32 @@ class TestImage < XlsxWriterTestCase
83
83
  test 'image29' do |wb|
84
84
  wb.add_worksheet.insert_image(0, 10, image_path('red_208.png'), x_offset: -210, y_offset: 1)
85
85
  end
86
+
87
+ test 'image36' do |wb|
88
+ wb.add_worksheet.insert_image('E9', image_path('happy.jpg'))
89
+ end
90
+
91
+ test 'image44' do |wb|
92
+ wb.add_worksheet
93
+ .insert_image('E9', image_path('red.png'))
94
+ .set_row(8, height: 30)
95
+ end
96
+
97
+ test 'image45' do |wb|
98
+ wb.add_worksheet
99
+ .insert_image('E9', image_path('red.png'))
100
+ .set_row(8, height: 30, hide: true)
101
+ end
102
+
103
+ test 'image46' do |wb|
104
+ wb.add_worksheet
105
+ .insert_image('E9', image_path('red.png'), x_offset: 0, y_offset: 4)
106
+ .set_row(8, height: 30, hide: true)
107
+ end
108
+
109
+ test 'image47' do |wb|
110
+ wb.add_worksheet
111
+ .insert_image('E9', image_path('red.png'))
112
+ .set_row(9, hide: true)
113
+ end
86
114
  end
data/test/test-misc.rb CHANGED
@@ -21,6 +21,15 @@ class TestMisc < XlsxWriterTestCase
21
21
  wb.add_worksheet
22
22
  end
23
23
 
24
+ test 'shared_strings01' do |wb|
25
+ ws = wb.add_worksheet
26
+ ws.write_string(0, 0, '_x0000_')
27
+ (1...127).each_with_object(String.new("")) do |i, s|
28
+ s[0] = i.chr
29
+ ws.write_string(i, 0, s) unless i == 34
30
+ end
31
+ end
32
+
24
33
  test 'gh42_01' do |wb|
25
34
  wb.add_worksheet.write_string(0, 0, "\xe5\x9b\xbe\x14\xe5\x9b\xbe", nil)
26
35
  end
@@ -31,4 +31,38 @@ class TestOptimize < XlsxWriterTestCase
31
31
  .write_string(4, 'E', 'Foo ', nil)
32
32
  .write_string(6, 'A', "\tFoo\t", nil)
33
33
  end
34
+
35
+ test('optimize22', constant_memory: true) do |wb|
36
+ wb
37
+ .add_format(:bold, bold: true)
38
+ .add_worksheet
39
+ .set_column(0, 0, width: 36, format: :bold)
40
+ end
41
+
42
+ test('optimize23', constant_memory: true) do |wb|
43
+ wb
44
+ .add_format(:bold, bold: true)
45
+ .add_worksheet
46
+ .set_row(0, height: 20, format: :bold)
47
+ end
48
+
49
+ test('optimize24', constant_memory: true) do |wb|
50
+ wb
51
+ .add_format(:bold, bold: true)
52
+ .add_worksheet
53
+ .set_row(0, height: 20, format: :bold)
54
+ .write_string(0, 0, 'Foo')
55
+ end
56
+
57
+ test('optimize25', constant_memory: true) do |wb|
58
+ wb
59
+ .add_format(:bold, bold: true)
60
+ .add_worksheet
61
+ .set_row(0, height: 20, format: :bold)
62
+ .write_string(2, 0, 'Foo')
63
+ end
64
+
65
+ test('optimize26', constant_memory: true) do |wb|
66
+ wb.add_worksheet.write_string(2, 2, 'café')
67
+ end
34
68
  end
@@ -0,0 +1,125 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './xlsx-func-testcase'
4
+
5
+ class TestOutline < XlsxWriterTestCase
6
+ test 'outline01' do |wb, t|
7
+ t.ignore_files << 'xl/calcChain.xml' << '[Content_Types].xml' << 'xl/_rels/workbook.xml.rels'
8
+
9
+ wb.add_format(:bold, bold: true)
10
+ ws = wb.add_worksheet 'Outlined Rows'
11
+ ws.set_column('A', 'A', width: 20)
12
+ (1..10).each do |i|
13
+ ws.set_row i, level: (i % 5 == 0 ? 1 : 2)
14
+ end
15
+
16
+ write_common_data(ws)
17
+ end
18
+
19
+ test 'outline02' do |wb, t|
20
+ t.ignore_files << 'xl/calcChain.xml' << '[Content_Types].xml' << 'xl/_rels/workbook.xml.rels'
21
+
22
+ wb.add_format(:bold, bold: true)
23
+ ws = wb.add_worksheet 'Collapsed Rows'
24
+ (1..10).each do |i|
25
+ ws.set_row i, level: (i % 5 == 0 ? 1 : 2), hide: true
26
+ end
27
+ ws.set_row 11, collapse: true
28
+
29
+ ws.set_column('A', 'A', width: 20)
30
+ ws.set_selection('A14:A14')
31
+
32
+ write_common_data(ws)
33
+ end
34
+
35
+ test 'outline03' do |wb, t|
36
+ t.ignore_files << 'xl/calcChain.xml' << '[Content_Types].xml' << 'xl/_rels/workbook.xml.rels'
37
+
38
+ wb.add_format(:bold, bold: true)
39
+ ws = wb.add_worksheet 'Outline Columns'
40
+
41
+ %w(Month Jan Feb Mar Apr May Jun Total).each_with_index { |s, i| ws.write_string 0, i, s }
42
+ [
43
+ ['North', [50, 20, 15, 25, 65, 80]],
44
+ ['South', [10, 20, 30, 50, 50, 50]],
45
+ ['East', [45, 75, 50, 15, 75, 100]],
46
+ ['West', [15, 15, 55, 35, 20, 50]],
47
+ ].each_with_index do |(d, vals), i|
48
+ ws.write_string(i+1, 0, d)
49
+ vals.each_with_index { |v, j| ws.write_number(i+1, j+1, v) }
50
+ ws.write_formula_num(i+1, vals.size + 1, "=SUM(B#{i+2}:G#{i+2})", vals.reduce(:+))
51
+ end
52
+ ws.write_formula_num('H6', "=SUM(H2:H5)", 1015, :bold)
53
+ ws.set_row 0, format: :bold
54
+ ws.set_column 'A', 'A', width: 10, format: :bold
55
+ ws.set_column 'H', 'H', width: 10
56
+ ws.set_column 'B', 'G', width: 6, level: 1
57
+ end
58
+
59
+ test 'outline04' do |wb, t|
60
+ t.ignore_files << 'xl/calcChain.xml' << '[Content_Types].xml' << 'xl/_rels/workbook.xml.rels'
61
+
62
+ ws = wb.add_worksheet 'Outline levels'
63
+ 13.times { |i| ws.write_string i, 0, "Level #{(i > 6 ? 13 - i : i + 1)}" }
64
+ 13.times { |i| ws.set_row i, level: (i > 6 ? 13 - i : i + 1) }
65
+ end
66
+
67
+ test 'outline05' do |wb, t|
68
+ t.ignore_files << 'xl/calcChain.xml' << '[Content_Types].xml' << 'xl/_rels/workbook.xml.rels'
69
+
70
+ wb.add_format(:bold, bold: true)
71
+ ws = wb.add_worksheet 'Collapsed Rows'
72
+ ws.set_column('A', 'A', width: 20)
73
+ ws.set_selection 'A14:A14'
74
+ (1..10).each do |i|
75
+ ws.set_row i, level: (i % 5 == 0 ? 1 : 2), hide: true, collapse: (i % 5 == 0)
76
+ end
77
+ ws.set_row 11, collapse: true
78
+
79
+ write_common_data(ws)
80
+ end
81
+
82
+ test 'outline06' do |wb, t|
83
+ t.ignore_files << 'xl/calcChain.xml' << '[Content_Types].xml' << 'xl/_rels/workbook.xml.rels'
84
+
85
+ wb.add_format(:bold, bold: true)
86
+ ws = wb.add_worksheet 'Outlined Rows'
87
+ ws.outline_settings = { visible: false, symbols_below: false, symbols_right: false, auto_style: true }
88
+ ws.set_column('A', 'A', width: 20)
89
+ (1..10).each do |i|
90
+ ws.set_row i, level: (i % 5 == 0 ? 1 : 2)
91
+ end
92
+
93
+ write_common_data(ws)
94
+ end
95
+
96
+ private
97
+
98
+ def write_common_data(ws)
99
+ ws
100
+ .write_string('A1', 'Region', :bold)
101
+ .write_string('A2', 'North')
102
+ .write_string('A3', 'North')
103
+ .write_string('A4', 'North')
104
+ .write_string('A5', 'North')
105
+ .write_string('A6', 'North Total', :bold)
106
+ .write_string('B1', 'Sales', :bold)
107
+ .write_number('B2', 1000)
108
+ .write_number('B3', 1200)
109
+ .write_number('B4', 900)
110
+ .write_number('B5', 1200)
111
+ .write_formula_num('B6', '=SUBTOTAL(9,B2:B5)', 4300, :bold)
112
+ .write_string('A7', 'South')
113
+ .write_string('A8', 'South')
114
+ .write_string('A9', 'South')
115
+ .write_string('A10', 'South')
116
+ .write_string('A11', 'South Total', :bold)
117
+ .write_number('B7', 400)
118
+ .write_number('B8', 600)
119
+ .write_number('B9', 500)
120
+ .write_number('B10', 600)
121
+ .write_formula_num('B11', '=SUBTOTAL(9,B7:B10)', 2100, :bold)
122
+ .write_string('A12', 'Grand Total', :bold)
123
+ .write_formula_num('B12', '=SUBTOTAL(9,B2:B10)', 6400, :bold)
124
+ end
125
+ end
@@ -17,12 +17,13 @@ class XlsxWriterTestCase < Test::Unit::TestCase
17
17
  def self.test(name, opts=nil, &block)
18
18
  define_method(:"test_#{name}") do
19
19
  file_path = "tmp/#{name}.xlsx"
20
- ref_file_path = "ext/xlsxwriter/libxlsxwriter/test/functional/xlsx_files/#{name}.xlsx"
20
+ ref_name = opts && opts.delete(:ref_file_name) || name
21
+ ref_file_path = "ext/xlsxwriter/libxlsxwriter/test/functional/xlsx_files/#{ref_name}.xlsx"
21
22
  begin
22
23
  tc = XlsxWriterTestCaseConfig.new
23
24
  args = [file_path, opts].compact
24
25
  XlsxWriter::Workbook.open(*args) do |wb|
25
- yield wb, tc
26
+ instance_exec(wb, tc, &block)
26
27
  end
27
28
 
28
29
  assert_xlsx_equal file_path, ref_file_path, tc.ignore_files, tc.ignore_elements
@@ -32,7 +33,7 @@ class XlsxWriterTestCase < Test::Unit::TestCase
32
33
  end
33
34
  end
34
35
 
35
- def self.image_path(path)
36
+ def image_path(path)
36
37
  File.expand_path(File.join('../../ext/xlsxwriter/libxlsxwriter/test/functional/src/images', path), __FILE__)
37
38
  end
38
39
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xlsxwriter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2.pre
4
+ version: 0.2.0.pre
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick H
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-04-15 00:00:00.000000000 Z
11
+ date: 2019-04-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake-compiler
@@ -136,6 +136,7 @@ files:
136
136
  - ext/xlsxwriter/worksheet.c
137
137
  - ext/xlsxwriter/worksheet.h
138
138
  - ext/xlsxwriter/xlsxwriter.c
139
+ - ext/xlsxwriter/xlsxwriter_ext.h
139
140
  - lib/xlsxwriter.rb
140
141
  - lib/xlsxwriter/version.rb
141
142
  - lib/xlsxwriter/worksheet.rb
@@ -152,6 +153,7 @@ files:
152
153
  - test/test-chart-scatter.rb
153
154
  - test/test-chart-size.rb
154
155
  - test/test-chart-title.rb
156
+ - test/test-data-validation.rb
155
157
  - test/test-data.rb
156
158
  - test/test-default-row.rb
157
159
  - test/test-defined-name.rb
@@ -165,6 +167,7 @@ files:
165
167
  - test/test-merge-range.rb
166
168
  - test/test-misc.rb
167
169
  - test/test-optimize.rb
170
+ - test/test-outline.rb
168
171
  - test/test-page-breaks.rb
169
172
  - test/test-page-setup.rb
170
173
  - test/test-panes.rb
@@ -234,6 +237,7 @@ test_files:
234
237
  - test/test-chart-size.rb
235
238
  - test/test-hyperlink.rb
236
239
  - test/test-array-formula.rb
240
+ - test/test-outline.rb
237
241
  - test/test-print-options.rb
238
242
  - test/test-optimize.rb
239
243
  - test/test-print-scale.rb
@@ -244,4 +248,5 @@ test_files:
244
248
  - test/test-chart-title.rb
245
249
  - test/test-fit-to-pages.rb
246
250
  - test/test-properties.rb
251
+ - test/test-data-validation.rb
247
252
  - test/test-data.rb