write_xlsx 1.02.0 → 1.08.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +0 -1
  3. data/Changes +72 -0
  4. data/README.md +1 -1
  5. data/examples/chart_data_labels.rb +320 -0
  6. data/examples/chart_line.rb +85 -10
  7. data/examples/tables.rb +77 -42
  8. data/lib/write_xlsx/chart/line.rb +15 -1
  9. data/lib/write_xlsx/chart/series.rb +100 -0
  10. data/lib/write_xlsx/chart.rb +155 -33
  11. data/lib/write_xlsx/drawing.rb +80 -17
  12. data/lib/write_xlsx/format.rb +5 -5
  13. data/lib/write_xlsx/package/app.rb +3 -3
  14. data/lib/write_xlsx/package/comments.rb +4 -4
  15. data/lib/write_xlsx/package/conditional_format.rb +2 -8
  16. data/lib/write_xlsx/package/packager.rb +1 -0
  17. data/lib/write_xlsx/package/relationships.rb +2 -2
  18. data/lib/write_xlsx/package/styles.rb +42 -11
  19. data/lib/write_xlsx/package/table.rb +16 -7
  20. data/lib/write_xlsx/package/vml.rb +20 -19
  21. data/lib/write_xlsx/sheets.rb +12 -20
  22. data/lib/write_xlsx/utility.rb +9 -3
  23. data/lib/write_xlsx/version.rb +1 -1
  24. data/lib/write_xlsx/workbook.rb +76 -35
  25. data/lib/write_xlsx/worksheet/data_validation.rb +1 -6
  26. data/lib/write_xlsx/worksheet.rb +197 -57
  27. data/test/drawing/{test_write_ext.rb → test_write_xdr_ext.rb} +2 -2
  28. data/test/perl_output/chart_data_labels.xlsx +0 -0
  29. data/test/perl_output/chart_line.xlsx +0 -0
  30. data/test/perl_output/comments2.xlsx +0 -0
  31. data/test/perl_output/tables.xlsx +0 -0
  32. data/test/regression/images/red2.png +0 -0
  33. data/test/regression/test_array_formula04.rb +31 -0
  34. data/test/regression/test_chart_crossing01.rb +1 -1
  35. data/test/regression/test_chart_crossing05.rb +46 -0
  36. data/test/regression/test_chart_crossing06.rb +46 -0
  37. data/test/regression/test_chart_data_labels26.rb +44 -0
  38. data/test/regression/test_chart_data_labels27.rb +44 -0
  39. data/test/regression/test_chart_data_labels28.rb +52 -0
  40. data/test/regression/test_chart_data_labels29.rb +43 -0
  41. data/test/regression/test_chart_data_labels30.rb +46 -0
  42. data/test/regression/test_chart_data_labels31.rb +49 -0
  43. data/test/regression/test_chart_data_labels32.rb +54 -0
  44. data/test/regression/test_chart_data_labels33.rb +52 -0
  45. data/test/regression/test_chart_data_labels34.rb +54 -0
  46. data/test/regression/test_chart_data_labels35.rb +46 -0
  47. data/test/regression/test_chart_data_labels36.rb +54 -0
  48. data/test/regression/test_chart_data_labels37.rb +51 -0
  49. data/test/regression/test_chart_data_labels38.rb +54 -0
  50. data/test/regression/test_chart_data_labels39.rb +53 -0
  51. data/test/regression/test_chart_data_labels40.rb +53 -0
  52. data/test/regression/test_chart_data_labels41.rb +54 -0
  53. data/test/regression/test_chart_data_labels42.rb +58 -0
  54. data/test/regression/test_chart_data_labels43.rb +58 -0
  55. data/test/regression/test_chart_data_labels44.rb +56 -0
  56. data/test/regression/test_chart_data_labels45.rb +57 -0
  57. data/test/regression/test_chart_data_labels46.rb +61 -0
  58. data/test/regression/test_chart_data_labels47.rb +61 -0
  59. data/test/regression/test_chart_data_labels48.rb +55 -0
  60. data/test/regression/test_chart_data_labels49.rb +55 -0
  61. data/test/regression/test_chart_data_labels50.rb +57 -0
  62. data/test/regression/test_chart_line05.rb +43 -0
  63. data/test/regression/test_chart_line06.rb +43 -0
  64. data/test/regression/test_comment15.rb +28 -0
  65. data/test/regression/test_comment16.rb +34 -0
  66. data/test/regression/test_format16.rb +24 -0
  67. data/test/regression/test_format17.rb +24 -0
  68. data/test/regression/test_header04.rb +30 -0
  69. data/test/regression/test_header_image15.rb +36 -0
  70. data/test/regression/test_header_image16.rb +42 -0
  71. data/test/regression/test_header_image17.rb +46 -0
  72. data/test/regression/test_header_image18.rb +48 -0
  73. data/test/regression/test_header_image19.rb +36 -0
  74. data/test/regression/test_hyperlink48.rb +31 -0
  75. data/test/regression/test_hyperlink49.rb +29 -0
  76. data/test/regression/test_hyperlink50.rb +27 -0
  77. data/test/regression/test_hyperlink51.rb +27 -0
  78. data/test/regression/test_ignore_error01.rb +23 -0
  79. data/test/regression/test_ignore_error02.rb +24 -0
  80. data/test/regression/test_ignore_error03.rb +26 -0
  81. data/test/regression/test_ignore_error04.rb +26 -0
  82. data/test/regression/test_ignore_error05.rb +32 -0
  83. data/test/regression/test_ignore_error06.rb +32 -0
  84. data/test/regression/test_image45.rb +2 -1
  85. data/test/regression/test_image46.rb +1 -1
  86. data/test/regression/test_image48.rb +32 -0
  87. data/test/regression/test_image49.rb +38 -0
  88. data/test/regression/test_image50.rb +24 -0
  89. data/test/regression/test_image51.rb +30 -0
  90. data/test/regression/test_image52.rb +26 -0
  91. data/test/regression/test_image53.rb +26 -0
  92. data/test/regression/test_image54.rb +26 -0
  93. data/test/regression/test_image55.rb +27 -0
  94. data/test/regression/test_object_position12.rb +25 -0
  95. data/test/regression/test_object_position13.rb +25 -0
  96. data/test/regression/test_object_position14.rb +25 -0
  97. data/test/regression/test_object_position15.rb +29 -0
  98. data/test/regression/test_object_position16.rb +29 -0
  99. data/test/regression/test_object_position17.rb +29 -0
  100. data/test/regression/test_object_position18.rb +29 -0
  101. data/test/regression/test_object_position19.rb +29 -0
  102. data/test/regression/test_object_position20.rb +29 -0
  103. data/test/regression/test_protect04.rb +32 -0
  104. data/test/regression/test_protect05.rb +35 -0
  105. data/test/regression/test_protect06.rb +35 -0
  106. data/test/regression/test_protect07.rb +23 -0
  107. data/test/regression/test_table24.rb +27 -0
  108. data/test/regression/test_table25.rb +27 -0
  109. data/test/regression/test_table26.rb +38 -0
  110. data/test/regression/xlsx_files/array_formula04.xlsx +0 -0
  111. data/test/regression/xlsx_files/chart_crossing05.xlsx +0 -0
  112. data/test/regression/xlsx_files/chart_crossing06.xlsx +0 -0
  113. data/test/regression/xlsx_files/chart_data_labels26.xlsx +0 -0
  114. data/test/regression/xlsx_files/chart_data_labels27.xlsx +0 -0
  115. data/test/regression/xlsx_files/chart_data_labels28.xlsx +0 -0
  116. data/test/regression/xlsx_files/chart_data_labels29.xlsx +0 -0
  117. data/test/regression/xlsx_files/chart_data_labels30.xlsx +0 -0
  118. data/test/regression/xlsx_files/chart_data_labels31.xlsx +0 -0
  119. data/test/regression/xlsx_files/chart_data_labels32.xlsx +0 -0
  120. data/test/regression/xlsx_files/chart_data_labels33.xlsx +0 -0
  121. data/test/regression/xlsx_files/chart_data_labels34.xlsx +0 -0
  122. data/test/regression/xlsx_files/chart_data_labels35.xlsx +0 -0
  123. data/test/regression/xlsx_files/chart_data_labels36.xlsx +0 -0
  124. data/test/regression/xlsx_files/chart_data_labels37.xlsx +0 -0
  125. data/test/regression/xlsx_files/chart_data_labels38.xlsx +0 -0
  126. data/test/regression/xlsx_files/chart_data_labels39.xlsx +0 -0
  127. data/test/regression/xlsx_files/chart_data_labels40.xlsx +0 -0
  128. data/test/regression/xlsx_files/chart_data_labels41.xlsx +0 -0
  129. data/test/regression/xlsx_files/chart_data_labels42.xlsx +0 -0
  130. data/test/regression/xlsx_files/chart_data_labels43.xlsx +0 -0
  131. data/test/regression/xlsx_files/chart_data_labels44.xlsx +0 -0
  132. data/test/regression/xlsx_files/chart_data_labels45.xlsx +0 -0
  133. data/test/regression/xlsx_files/chart_data_labels46.xlsx +0 -0
  134. data/test/regression/xlsx_files/chart_data_labels47.xlsx +0 -0
  135. data/test/regression/xlsx_files/chart_data_labels48.xlsx +0 -0
  136. data/test/regression/xlsx_files/chart_data_labels49.xlsx +0 -0
  137. data/test/regression/xlsx_files/chart_data_labels50.xlsx +0 -0
  138. data/test/regression/xlsx_files/chart_line05.xlsx +0 -0
  139. data/test/regression/xlsx_files/chart_line06.xlsx +0 -0
  140. data/test/regression/xlsx_files/comment15.xlsx +0 -0
  141. data/test/regression/xlsx_files/comment16.xlsx +0 -0
  142. data/test/regression/xlsx_files/format16.xlsx +0 -0
  143. data/test/regression/xlsx_files/format17.xlsx +0 -0
  144. data/test/regression/xlsx_files/header04.xlsx +0 -0
  145. data/test/regression/xlsx_files/header_image15.xlsx +0 -0
  146. data/test/regression/xlsx_files/header_image16.xlsx +0 -0
  147. data/test/regression/xlsx_files/header_image17.xlsx +0 -0
  148. data/test/regression/xlsx_files/header_image18.xlsx +0 -0
  149. data/test/regression/xlsx_files/header_image19.xlsx +0 -0
  150. data/test/regression/xlsx_files/hyperlink46.xlsx +0 -0
  151. data/test/regression/xlsx_files/hyperlink50.xlsx +0 -0
  152. data/test/regression/xlsx_files/hyperlink51.xlsx +0 -0
  153. data/test/regression/xlsx_files/ignore_error01.xlsx +0 -0
  154. data/test/regression/xlsx_files/ignore_error02.xlsx +0 -0
  155. data/test/regression/xlsx_files/ignore_error03.xlsx +0 -0
  156. data/test/regression/xlsx_files/ignore_error04.xlsx +0 -0
  157. data/test/regression/xlsx_files/ignore_error05.xlsx +0 -0
  158. data/test/regression/xlsx_files/ignore_error06.xlsx +0 -0
  159. data/test/regression/xlsx_files/image45.xlsx +0 -0
  160. data/test/regression/xlsx_files/image46.xlsx +0 -0
  161. data/test/regression/xlsx_files/image48.xlsx +0 -0
  162. data/test/regression/xlsx_files/image49.xlsx +0 -0
  163. data/test/regression/xlsx_files/image50.xlsx +0 -0
  164. data/test/regression/xlsx_files/image51.xlsx +0 -0
  165. data/test/regression/xlsx_files/image52.xlsx +0 -0
  166. data/test/regression/xlsx_files/image53.xlsx +0 -0
  167. data/test/regression/xlsx_files/image54.xlsx +0 -0
  168. data/test/regression/xlsx_files/image55.xlsx +0 -0
  169. data/test/regression/xlsx_files/object_position12.xlsx +0 -0
  170. data/test/regression/xlsx_files/object_position13.xlsx +0 -0
  171. data/test/regression/xlsx_files/object_position14.xlsx +0 -0
  172. data/test/regression/xlsx_files/object_position15.xlsx +0 -0
  173. data/test/regression/xlsx_files/object_position16.xlsx +0 -0
  174. data/test/regression/xlsx_files/object_position17.xlsx +0 -0
  175. data/test/regression/xlsx_files/object_position18.xlsx +0 -0
  176. data/test/regression/xlsx_files/object_position19.xlsx +0 -0
  177. data/test/regression/xlsx_files/object_position20.xlsx +0 -0
  178. data/test/regression/xlsx_files/protect04.xlsx +0 -0
  179. data/test/regression/xlsx_files/protect05.xlsx +0 -0
  180. data/test/regression/xlsx_files/protect06.xlsx +0 -0
  181. data/test/regression/xlsx_files/protect07.xlsx +0 -0
  182. data/test/regression/xlsx_files/table24.xlsx +0 -0
  183. data/test/regression/xlsx_files/table25.xlsx +0 -0
  184. data/test/regression/xlsx_files/table26.xlsx +0 -0
  185. data/test/test_example_match.rb +433 -10
  186. data/test/utility/test_range.rb +20 -0
  187. data/test/workbook/test_check_sheetname.rb +0 -10
  188. data/write_xlsx.gemspec +1 -0
  189. metadata +323 -8
@@ -242,6 +242,319 @@ class TestExampleMatch < Minitest::Test
242
242
  compare_xlsx(File.join(@perl_output, @xlsx), @tempfile.path)
243
243
  end
244
244
 
245
+ def test_chart_data_labels
246
+ @xlsx = 'chart_data_labels.xlsx'
247
+ workbook = WriteXLSX.new(@io)
248
+
249
+ worksheet = workbook.add_worksheet
250
+ bold = workbook.add_format(:bold => 1)
251
+
252
+ # Add the worksheet data that the charts will refer to.
253
+ headings = ['Number', 'Data', 'Text']
254
+ data = [
255
+ [ 2, 3, 4, 5, 6, 7 ],
256
+ [20, 10, 20, 30, 40, 30 ],
257
+ ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun']
258
+ ]
259
+
260
+ worksheet.write('A1', headings, bold)
261
+ worksheet.write('A2', data)
262
+
263
+
264
+ #######################################################################
265
+ #
266
+ # Example with standard data labels.
267
+ #
268
+
269
+ # Create a Column chart.
270
+ chart1 = workbook.add_chart(:type => 'column', :embedded => 1)
271
+
272
+ # Configure the data series and add the data labels.
273
+ chart1.add_series(
274
+ :categories => '=Sheet1!$A$2:$A$7',
275
+ :values => '=Sheet1!$B$2:$B$7',
276
+ :data_labels => { :value => 1 }
277
+ )
278
+
279
+ # Add a chart title.
280
+ chart1.set_title(:name => 'Chart with standard data labels')
281
+
282
+ # Turn off the chart legend.
283
+ chart1.set_legend(:none => 1)
284
+
285
+ # Insert the chart into the worksheet (with an offset).
286
+ worksheet.insert_chart('D2', chart1, { :x_offset => 25, :y_offset => 10 })
287
+
288
+
289
+ #######################################################################
290
+ #
291
+ # Example with value and category data labels.
292
+ #
293
+
294
+ # Create a Column chart.
295
+ chart2 = workbook.add_chart(:type => 'column', :embedded => 1)
296
+
297
+ # Configure the data series and add the data labels.
298
+ chart2.add_series(
299
+ :categories => '=Sheet1!$A$2:$A$7',
300
+ :values => '=Sheet1!$B$2:$B$7',
301
+ :data_labels => { :value => 1, :category => 1 }
302
+ )
303
+
304
+ # Add a chart title.
305
+ chart2.set_title(:name => 'Category and Value data labels')
306
+
307
+ # Turn off the chart legend.
308
+ chart2.set_legend(:none => 1)
309
+
310
+ # Insert the chart into the worksheet (with an offset).
311
+ worksheet.insert_chart('D18', chart2, { :x_offset => 25, :y_offset => 10 })
312
+
313
+
314
+ #######################################################################
315
+ #
316
+ # Example with standard data labels with different font.
317
+ #
318
+
319
+ # Create a Column chart.
320
+ chart3 = workbook.add_chart(:type => 'column', :embedded => 1)
321
+
322
+ # Configure the data series and add the data labels.
323
+ chart3.add_series(
324
+ :categories => '=Sheet1!$A$2:$A$7',
325
+ :values => '=Sheet1!$B$2:$B$7',
326
+ :data_labels => { :value => 1,
327
+ :font => {:bold => 1,
328
+ :color => 'red',
329
+ :rotation => -30}
330
+ }
331
+ )
332
+
333
+ # Add a chart title.
334
+ chart3.set_title(:name => 'Data labels with user defined font')
335
+
336
+ # Turn off the chart legend.
337
+ chart3.set_legend(:none => 1)
338
+
339
+ # Insert the chart into the worksheet (with an offset).
340
+ worksheet.insert_chart('D34', chart3, { :x_offset => 25, :y_offset => 10 })
341
+
342
+
343
+ #######################################################################
344
+ #
345
+ # Example with custom string data labels.
346
+ #
347
+
348
+ # Create a Column chart.
349
+ chart4 = workbook.add_chart(:type => 'column', :embedded => 1)
350
+
351
+ # Configure the data series and add the data labels.
352
+ chart4.add_series(
353
+ :categories => '=Sheet1!$A$2:$A$7',
354
+ :values => '=Sheet1!$B$2:$B$7',
355
+ :data_labels => {
356
+ :value => 1,
357
+ :border => {:color => 'red'},
358
+ :fill => {:color => 'yellow'}
359
+ }
360
+ )
361
+
362
+ # Add a chart title.
363
+ chart4.set_title(:name => 'Data labels with formatting')
364
+
365
+ # Turn off the chart legend.
366
+ chart4.set_legend(:none => 1)
367
+
368
+ # Insert the chart into the worksheet (with an offset).
369
+ worksheet.insert_chart('D50', chart4, { :x_offset => 25, :y_offset => 10 })
370
+
371
+
372
+ #######################################################################
373
+ #
374
+ # Example with custom string data labels.
375
+ #
376
+
377
+ # Create a Column chart.
378
+ chart5 = workbook.add_chart( :type => 'column', :embedded => 1 )
379
+
380
+ # Some custom labels.
381
+ custom_labels = [
382
+ { :value => 'Amy' },
383
+ { :value => 'Bea' },
384
+ { :value => 'Eva' },
385
+ { :value => 'Fay' },
386
+ { :value => 'Liv' },
387
+ { :value => 'Una' }
388
+ ]
389
+
390
+ # Configure the data series and add the data labels.
391
+ chart5.add_series(
392
+ :categories => '=Sheet1!$A$2:$A$7',
393
+ :values => '=Sheet1!$B$2:$B$7',
394
+ :data_labels => { :value => 1, :custom => custom_labels }
395
+ )
396
+
397
+ # Add a chart title.
398
+ chart5.set_title(:name => 'Chart with custom string data labels')
399
+
400
+ # Turn off the chart legend.
401
+ chart5.set_legend(:none => 1)
402
+
403
+ # Insert the chart into the worksheet (with an offset).
404
+ worksheet.insert_chart('D66', chart5, { :x_offset => 25, :y_offset => 10 })
405
+
406
+
407
+ #######################################################################
408
+ #
409
+ # Example with custom data labels from cells.
410
+ #
411
+
412
+ # Create a Column chart.
413
+ chart6 = workbook.add_chart(:type => 'column', :embedded => 1)
414
+
415
+ # Some custom labels.
416
+ custom_labels = [
417
+ { :value => '=Sheet1!$C$2' },
418
+ { :value => '=Sheet1!$C$3' },
419
+ { :value => '=Sheet1!$C$4' },
420
+ { :value => '=Sheet1!$C$5' },
421
+ { :value => '=Sheet1!$C$6' },
422
+ { :value => '=Sheet1!$C$7' }
423
+ ]
424
+
425
+
426
+ # Configure the data series and add the data labels.
427
+ chart6.add_series(
428
+ :categories => '=Sheet1!$A$2:$A$7',
429
+ :values => '=Sheet1!$B$2:$B$7',
430
+ :data_labels => { :value => 1, :custom => custom_labels }
431
+ )
432
+
433
+ # Add a chart title.
434
+ chart6.set_title(:name => 'Chart with custom data labels from cells')
435
+
436
+ # Turn off the chart legend.
437
+ chart6.set_legend(:none => 1)
438
+
439
+ # Insert the chart into the worksheet (with an offset).
440
+ worksheet.insert_chart('D82', chart6, { :x_offset => 25, :y_offset => 10 })
441
+
442
+
443
+ #######################################################################
444
+ #
445
+ # Example with custom and default data labels.
446
+ #
447
+
448
+ # Create a Column chart.
449
+ chart7 = workbook.add_chart(:type => 'column', :embedded => 1)
450
+
451
+ # Some custom labels. The nil items will get the default value.
452
+ # We also set a font for the custom items as an extra example.
453
+ custom_labels = [
454
+ { :value => '=Sheet1!$C$2', :font => { :color => 'red' } },
455
+ nil,
456
+ { :value => '=Sheet1!$C$4', :font => { :color => 'red' } },
457
+ { :value => '=Sheet1!$C$5', :font => { :color => 'red' } }
458
+ ]
459
+
460
+
461
+ # Configure the data series and add the data labels.
462
+ chart7.add_series(
463
+ :categories => '=Sheet1!$A$2:$A$7',
464
+ :values => '=Sheet1!$B$2:$B$7',
465
+ :data_labels => { :value => 1, :custom => custom_labels }
466
+ )
467
+
468
+ # Add a chart title.
469
+ chart7.set_title(:name => 'Mixed custom and default data labels')
470
+
471
+ # Turn off the chart legend.
472
+ chart7.set_legend(:none => 1)
473
+
474
+ # Insert the chart into the worksheet (with an offset).
475
+ worksheet.insert_chart('D98', chart7, { :x_offset => 25, :y_offset => 10 })
476
+
477
+
478
+ #######################################################################
479
+ #
480
+ # Example with deleted custom data labels.
481
+ #
482
+
483
+ # Create a Column chart.
484
+ chart8 = workbook.add_chart(:type => 'column', :embedded => 1)
485
+
486
+ # Some deleted custom labels and defaults (nil). This allows us to
487
+ # highlight certain values such as the minimum and maximum.
488
+ custom_labels = [
489
+ { :delete => 1 },
490
+ nil,
491
+ { :delete => 1 },
492
+ { :delete => 1 },
493
+ nil,
494
+ { :delete => 1 }
495
+ ]
496
+
497
+ # Configure the data series and add the data labels.
498
+ chart8.add_series(
499
+ :categories => '=Sheet1!$A$2:$A$7',
500
+ :values => '=Sheet1!$B$2:$B$7',
501
+ :data_labels => { :value => 1, :custom => custom_labels }
502
+ )
503
+
504
+ # Add a chart title.
505
+ chart8.set_title(:name => 'Chart with deleted data labels')
506
+
507
+ # Turn off the chart legend.
508
+ chart8.set_legend(:none => 1)
509
+
510
+ # Insert the chart into the worksheet (with an offset).
511
+ worksheet.insert_chart('D114', chart8, { :x_offset => 25, :y_offset => 10 })
512
+
513
+ #######################################################################
514
+ #
515
+ # Example with custom string data labels and formatting.
516
+ #
517
+
518
+ # Create a Column chart.
519
+ chart9 = workbook.add_chart( :type => 'column', :embedded => 1 )
520
+
521
+ # Some custom labels.
522
+ custom_labels = [
523
+ { :value => 'Amy', :border => {:color => 'blue'} },
524
+ { :value => 'Bea' },
525
+ { :value => 'Eva' },
526
+ { :value => 'Fay' },
527
+ { :value => 'Liv' },
528
+ { :value => 'Una', :fill => {:color => 'green'} }
529
+ ]
530
+
531
+
532
+ # Configure the data series and add the data labels.
533
+ chart9.add_series(
534
+ :categories => '=Sheet1!$A$2:$A$7',
535
+ :values => '=Sheet1!$B$2:$B$7',
536
+ :data_labels => {
537
+ :value => 1,
538
+ :custom => custom_labels,
539
+ :border => {:color => 'red'},
540
+ :fill => {:color => 'yellow'}
541
+ }
542
+ )
543
+
544
+ # Add a chart title.
545
+ chart9.set_title( :name => 'Chart with custom labels and formatting' )
546
+
547
+ # Turn off the chart legend.
548
+ chart9.set_legend( :none => 1 )
549
+
550
+ # Insert the chart into the worksheet (with an offset).
551
+ worksheet.insert_chart( 'D130', chart9, { :x_offset => 25, :y_offset => 10 } )
552
+
553
+ workbook.close
554
+ store_to_tempfile
555
+ compare_xlsx(File.join(@perl_output, @xlsx), @tempfile.path)
556
+ end
557
+
245
558
  def test_chart_gauge
246
559
  @xlsx = 'chart_gauge.xlsx'
247
560
  workbook = WriteXLSX.new(@io)
@@ -577,7 +890,7 @@ EOS
577
890
  :name => 'Doughnut sales data',
578
891
  :categories => [ 'Sheet1', 1, 3, 0, 0 ],
579
892
  :values => [ 'Sheet1', 1, 3, 1, 1 ]
580
- );
893
+ )
581
894
 
582
895
  # Add a title.
583
896
  chart1.set_title(:name => 'Popular Doughnut Types')
@@ -714,6 +1027,81 @@ EOS
714
1027
  # Insert the chart into the worksheet (with an offset).
715
1028
  worksheet.insert_chart('D2', chart, 25, 10)
716
1029
 
1030
+ #
1031
+ # Create a stacked chart sub-type
1032
+ #
1033
+ chart2 = workbook.add_chart(
1034
+ :type => 'line',
1035
+ :embedded => 1,
1036
+ :subtype => 'stacked'
1037
+ )
1038
+
1039
+ # Configure the first series.
1040
+ chart2.add_series(
1041
+ :name => '=Sheet1!$B$1',
1042
+ :categories => '=Sheet1!$A$2:$A$7',
1043
+ :values => '=Sheet1!$B$2:$B$7'
1044
+ )
1045
+
1046
+ # Configure second series.
1047
+ chart2.add_series(
1048
+ :name => '=Sheet1!$C$1',
1049
+ :categories => [ 'Sheet1', 1, 6, 0, 0 ],
1050
+ :values => [ 'Sheet1', 1, 6, 2, 2 ]
1051
+ )
1052
+
1053
+ # Add a chart title and some axis labels.
1054
+ chart2.set_title( :name => 'Stacked Chart' )
1055
+ chart2.set_x_axis( :name => 'Test number' )
1056
+ chart2.set_y_axis( :name => 'Sample length (mm)' )
1057
+
1058
+ # Set an Excel chart style. Blue colors with white outline and shadow.
1059
+ chart2.set_style( 12 )
1060
+
1061
+ # Insert the chart into the worksheet (with an offset).
1062
+ worksheet.insert_chart(
1063
+ 'D18', chart2,
1064
+ { :x_offset => 25, :y_offset => 10 }
1065
+ )
1066
+
1067
+
1068
+ #
1069
+ # Create a percent stacked chart sub-type
1070
+ #
1071
+ chart3 = workbook.add_chart(
1072
+ :type => 'line',
1073
+ :embedded => 1,
1074
+ :subtype => 'percent_stacked'
1075
+ )
1076
+
1077
+ # Configure the first series.
1078
+ chart3.add_series(
1079
+ :name => '=Sheet1!$B$1',
1080
+ :categories => '=Sheet1!$A$2:$A$7',
1081
+ :values => '=Sheet1!$B$2:$B$7'
1082
+ )
1083
+
1084
+ # Configure second series.
1085
+ chart3.add_series(
1086
+ :name => '=Sheet1!$C$1',
1087
+ :categories => [ 'Sheet1', 1, 6, 0, 0 ],
1088
+ :values => [ 'Sheet1', 1, 6, 2, 2 ]
1089
+ )
1090
+
1091
+ # Add a chart title and some axis labels.
1092
+ chart3.set_title( :name => 'Percent Stacked Chart' )
1093
+ chart3.set_x_axis( :name => 'Test number' )
1094
+ chart3.set_y_axis( :name => 'Sample length (mm)' )
1095
+
1096
+ # Set an Excel chart style. Blue colors with white outline and shadow.
1097
+ chart3.set_style( 13 )
1098
+
1099
+ # Insert the chart into the worksheet (with an offset).
1100
+ worksheet.insert_chart(
1101
+ 'D34', chart3,
1102
+ { :x_offset => 25, :y_offset => 10 }
1103
+ )
1104
+
717
1105
  workbook.close
718
1106
  store_to_tempfile
719
1107
  compare_xlsx(File.join(@perl_output, @xlsx), @tempfile.path)
@@ -1320,7 +1708,7 @@ EOS
1320
1708
  comment = 'Hello.'
1321
1709
 
1322
1710
  worksheet6.write( 'C9', cell_text, text_wrap )
1323
- worksheet6.write_comment( 'C9', comment, :color => 0x35 )
1711
+ worksheet6.write_comment( 'C9', comment, :color => '#FF6600' )
1324
1712
 
1325
1713
 
1326
1714
  ###############################################################################
@@ -4595,6 +4983,7 @@ EOS
4595
4983
  worksheet10 = workbook.add_worksheet
4596
4984
  worksheet11 = workbook.add_worksheet
4597
4985
  worksheet12 = workbook.add_worksheet
4986
+ worksheet13 = workbook.add_worksheet
4598
4987
 
4599
4988
  currency_format = workbook.add_format(:num_format => '$#,##0')
4600
4989
 
@@ -4626,7 +5015,7 @@ EOS
4626
5015
  #
4627
5016
  # Example 2.
4628
5017
  #
4629
- caption = 'Default table with data.';
5018
+ caption = 'Default table with data.'
4630
5019
 
4631
5020
  # Set the columns widths.
4632
5021
  worksheet2.set_column('B:G', 12)
@@ -4695,7 +5084,7 @@ EOS
4695
5084
  #
4696
5085
  # Example 6.
4697
5086
  #
4698
- caption = 'Table with banded columns but without default banded rows.';
5087
+ caption = 'Table with banded columns but without default banded rows.'
4699
5088
 
4700
5089
  # Set the columns widths.
4701
5090
  worksheet6.set_column('B:G', 12)
@@ -4713,7 +5102,7 @@ EOS
4713
5102
  #
4714
5103
  # Example 7.
4715
5104
  #
4716
- caption = 'Table with user defined column headers';
5105
+ caption = 'Table with user defined column headers'
4717
5106
 
4718
5107
  # Set the columns widths.
4719
5108
  worksheet7.set_column('B:G', 12)
@@ -4740,7 +5129,7 @@ EOS
4740
5129
  #
4741
5130
  # Example 8.
4742
5131
  #
4743
- caption = 'Table with user defined column headers';
5132
+ caption = 'Table with user defined column headers'
4744
5133
 
4745
5134
  # Set the columns widths.
4746
5135
  worksheet8.set_column('B:G', 12)
@@ -4772,7 +5161,7 @@ EOS
4772
5161
  #
4773
5162
  # Example 9.
4774
5163
  #
4775
- caption = 'Table with totals row (but no caption or totals).';
5164
+ caption = 'Table with totals row (but no caption or totals).'
4776
5165
 
4777
5166
  # Set the columns widths.
4778
5167
  worksheet9.set_column('B:G', 12)
@@ -4804,7 +5193,7 @@ EOS
4804
5193
  #
4805
5194
  # Example 10.
4806
5195
  #
4807
- caption = 'Table with totals row with user captions and functions.';
5196
+ caption = 'Table with totals row with user captions and functions.'
4808
5197
 
4809
5198
  # Set the columns widths.
4810
5199
  worksheet10.set_column('B:G', 12)
@@ -4837,7 +5226,7 @@ EOS
4837
5226
  #
4838
5227
  # Example 11.
4839
5228
  #
4840
- caption = 'Table with alternative Excel style.';
5229
+ caption = 'Table with alternative Excel style.'
4841
5230
 
4842
5231
  # Set the columns widths.
4843
5232
  worksheet11.set_column('B:G', 12)
@@ -4871,7 +5260,7 @@ EOS
4871
5260
  #
4872
5261
  # Example 12.
4873
5262
  #
4874
- caption = 'Table with column formats.';
5263
+ caption = 'Table with no Excel style.'
4875
5264
 
4876
5265
  # Set the columns widths.
4877
5266
  worksheet12.set_column('B:G', 12)
@@ -4881,6 +5270,40 @@ EOS
4881
5270
 
4882
5271
  # Add a table to the worksheet.
4883
5272
  worksheet12.add_table(
5273
+ 'B3:G8',
5274
+ {
5275
+ :data => data,
5276
+ :style => 'None',
5277
+ :total_row => 1,
5278
+ :columns => [
5279
+ { :header => 'Product', :total_string => 'Totals' },
5280
+ { :header => 'Quarter 1', :total_function => 'sum' },
5281
+ { :header => 'Quarter 2', :total_function => 'sum' },
5282
+ { :header => 'Quarter 3', :total_function => 'sum' },
5283
+ { :header => 'Quarter 4', :total_function => 'sum' },
5284
+ {
5285
+ :header => 'Year',
5286
+ :formula => '=SUM(Table12[@[Quarter 1]:[Quarter 4]])',
5287
+ :total_function => 'sum'
5288
+ }
5289
+ ]
5290
+ }
5291
+ )
5292
+
5293
+ ###############################################################################
5294
+ #
5295
+ # Example 13.
5296
+ #
5297
+ caption = 'Table with column formats.'
5298
+
5299
+ # Set the columns widths.
5300
+ worksheet13.set_column('B:G', 12)
5301
+
5302
+ # Write the caption.
5303
+ worksheet13.write('B1', caption)
5304
+
5305
+ # Add a table to the worksheet.
5306
+ worksheet13.add_table(
4884
5307
  'B3:G8',
4885
5308
  {
4886
5309
  :data => data,
@@ -0,0 +1,20 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'helper'
3
+
4
+ class TestRange < Minitest::Test
5
+ include Writexlsx::Utility
6
+
7
+ def test_range_0_0_1_1
8
+ assert_equal(
9
+ 'B1',
10
+ xl_range(0, 0, 1, 1)
11
+ )
12
+ end
13
+
14
+ def test_range_0_0_1_1_1_1_1_1
15
+ assert_equal(
16
+ '$B$1',
17
+ xl_range(0, 0, 1, 1, 1, 1, 1, 1)
18
+ )
19
+ end
20
+ end
@@ -48,14 +48,4 @@ class TestCheckSheetname < Minitest::Test
48
48
  end
49
49
  end
50
50
  end
51
-
52
- def test_check_sheetname_reserved_name
53
- reserved_names = ['History', 'history', 'HISTORY', 'HisTory']
54
-
55
- reserved_names.each do |sheetname|
56
- assert_raises RuntimeError, "'#{sheetname}' passed incorrectly" do
57
- @workbook.add_worksheet(sheetname)
58
- end
59
- end
60
- end
61
51
  end
data/write_xlsx.gemspec CHANGED
@@ -20,6 +20,7 @@ Gem::Specification.new do |gem|
20
20
  gem.add_runtime_dependency 'rubyzip', '>= 1.0.0'
21
21
  gem.add_runtime_dependency 'zip-zip'
22
22
  gem.add_development_dependency 'minitest'
23
+ gem.add_development_dependency 'byebug'
23
24
  gem.add_development_dependency 'rake'
24
25
  gem.extra_rdoc_files = [
25
26
  "LICENSE.txt",