write_xlsx 0.88.0 → 1.00.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (207) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +43 -0
  3. data/Changes +88 -0
  4. data/LICENSE.txt +1 -1
  5. data/README.md +2 -2
  6. data/examples/a_simple.rb +1 -6
  7. data/examples/conditional_format.rb +73 -46
  8. data/examples/demo.rb +1 -7
  9. data/examples/hyperlink1.rb +4 -11
  10. data/lib/write_xlsx/chart.rb +106 -227
  11. data/lib/write_xlsx/chart/axis.rb +4 -4
  12. data/lib/write_xlsx/chart/caption.rb +3 -1
  13. data/lib/write_xlsx/chart/legend.rb +14 -0
  14. data/lib/write_xlsx/chart/pie.rb +11 -7
  15. data/lib/write_xlsx/chart/series.rb +11 -7
  16. data/lib/write_xlsx/chartsheet.rb +30 -2
  17. data/lib/write_xlsx/format.rb +19 -15
  18. data/lib/write_xlsx/package/comments.rb +50 -47
  19. data/lib/write_xlsx/package/conditional_format.rb +360 -39
  20. data/lib/write_xlsx/package/content_types.rb +10 -0
  21. data/lib/write_xlsx/package/core.rb +8 -6
  22. data/lib/write_xlsx/package/custom.rb +125 -0
  23. data/lib/write_xlsx/package/packager.rb +26 -0
  24. data/lib/write_xlsx/package/styles.rb +53 -21
  25. data/lib/write_xlsx/package/table.rb +16 -4
  26. data/lib/write_xlsx/utility.rb +293 -35
  27. data/lib/write_xlsx/version.rb +1 -1
  28. data/lib/write_xlsx/workbook.rb +127 -7
  29. data/lib/write_xlsx/worksheet.rb +312 -46
  30. data/lib/write_xlsx/worksheet/cell_data.rb +21 -0
  31. data/lib/write_xlsx/worksheet/data_validation.rb +10 -14
  32. data/lib/write_xlsx/worksheet/hyperlink.rb +4 -8
  33. data/test/chart/test_write_legend_pos.rb +9 -1
  34. data/test/chartsheet/test_write_sheet_protection.rb +91 -0
  35. data/test/helper.rb +6 -1
  36. data/test/package/comments/test_comments_01.rb +54 -0
  37. data/test/package/comments/test_comments_02.rb +54 -0
  38. data/test/perl_output/formats.xlsx +0 -0
  39. data/test/regression/_test_hyperlink31.rb +26 -0
  40. data/test/regression/images/happy.jpg +0 -0
  41. data/test/regression/images/zero_dpi.jpg +0 -0
  42. data/test/regression/test_array_formula03.rb +36 -0
  43. data/test/regression/test_autofilter08.rb +110 -0
  44. data/test/regression/test_autofilter09.rb +110 -0
  45. data/test/regression/test_autofilter10.rb +110 -0
  46. data/test/regression/test_chart_axis42.rb +44 -0
  47. data/test/regression/test_chart_axis43.rb +44 -0
  48. data/test/regression/test_chart_bar08.rb +3 -0
  49. data/test/regression/test_chart_bar11.rb +3 -0
  50. data/test/regression/test_chart_bar14.rb +3 -0
  51. data/test/regression/test_chart_chartarea05.rb +16 -17
  52. data/test/regression/test_chart_chartarea06.rb +49 -0
  53. data/test/regression/test_chart_data_labels25.rb +61 -0
  54. data/test/regression/test_chart_format26.rb +48 -0
  55. data/test/regression/test_chart_format27.rb +58 -0
  56. data/test/regression/test_chart_format28.rb +52 -0
  57. data/test/regression/test_chart_format29.rb +59 -0
  58. data/test/regression/test_chart_format30.rb +53 -0
  59. data/test/regression/test_chart_format31.rb +60 -0
  60. data/test/regression/test_chart_legend03.rb +41 -0
  61. data/test/regression/test_chart_legend04.rb +41 -0
  62. data/test/regression/test_chart_legend05.rb +41 -0
  63. data/test/regression/test_chart_legend06.rb +41 -0
  64. data/test/regression/test_chart_legend07.rb +38 -0
  65. data/test/regression/test_chart_table03.rb +56 -0
  66. data/test/regression/test_comment13.rb +36 -0
  67. data/test/regression/test_cond_format14.rb +42 -0
  68. data/test/regression/test_cond_format15.rb +53 -0
  69. data/test/regression/test_cond_format16.rb +53 -0
  70. data/test/regression/test_cond_format17.rb +37 -0
  71. data/test/regression/test_cond_format18.rb +136 -0
  72. data/test/regression/test_cond_format19.rb +64 -0
  73. data/test/regression/test_cond_format20.rb +43 -0
  74. data/test/regression/test_date_1904_01.rb +1 -1
  75. data/test/regression/test_escapes04.rb +3 -0
  76. data/test/regression/test_escapes05.rb +3 -0
  77. data/test/regression/test_escapes07.rb +3 -0
  78. data/test/regression/test_escapes08.rb +3 -0
  79. data/test/regression/test_format14.rb +26 -0
  80. data/test/regression/test_format15.rb +26 -0
  81. data/test/regression/test_hyperlink01.rb +3 -0
  82. data/test/regression/test_hyperlink02.rb +3 -0
  83. data/test/regression/test_hyperlink03.rb +4 -0
  84. data/test/regression/test_hyperlink04.rb +3 -0
  85. data/test/regression/test_hyperlink05.rb +3 -0
  86. data/test/regression/test_hyperlink06.rb +3 -0
  87. data/test/regression/test_hyperlink07.rb +3 -0
  88. data/test/regression/test_hyperlink08.rb +3 -0
  89. data/test/regression/test_hyperlink09.rb +3 -0
  90. data/test/regression/test_hyperlink10.rb +3 -0
  91. data/test/regression/test_hyperlink11.rb +3 -0
  92. data/test/regression/test_hyperlink12.rb +3 -0
  93. data/test/regression/test_hyperlink13.rb +3 -0
  94. data/test/regression/test_hyperlink14.rb +3 -0
  95. data/test/regression/test_hyperlink15.rb +3 -0
  96. data/test/regression/test_hyperlink16.rb +3 -0
  97. data/test/regression/test_hyperlink17.rb +3 -0
  98. data/test/regression/test_hyperlink18.rb +3 -0
  99. data/test/regression/test_hyperlink20.rb +3 -0
  100. data/test/regression/test_hyperlink21.rb +3 -0
  101. data/test/regression/test_hyperlink22.rb +3 -0
  102. data/test/regression/test_hyperlink23.rb +3 -0
  103. data/test/regression/test_hyperlink24.rb +3 -0
  104. data/test/regression/test_hyperlink25.rb +30 -0
  105. data/test/regression/test_hyperlink26.rb +30 -0
  106. data/test/regression/test_hyperlink27.rb +27 -0
  107. data/test/regression/test_hyperlink28.rb +50 -0
  108. data/test/regression/test_hyperlink29.rb +27 -0
  109. data/test/regression/test_hyperlink30.rb +36 -0
  110. data/test/regression/test_image35.rb +26 -0
  111. data/test/regression/test_image36.rb +26 -0
  112. data/test/regression/test_image44.rb +28 -0
  113. data/test/regression/test_image45.rb +28 -0
  114. data/test/regression/test_image46.rb +29 -0
  115. data/test/regression/test_image47.rb +28 -0
  116. data/test/regression/test_properties01.rb +1 -4
  117. data/test/regression/test_properties02.rb +1 -4
  118. data/test/regression/test_properties03.rb +26 -0
  119. data/test/regression/test_properties04.rb +61 -0
  120. data/test/regression/test_properties05.rb +30 -0
  121. data/test/regression/test_table03.rb +3 -0
  122. data/test/regression/test_table04.rb +3 -0
  123. data/test/regression/test_table05.rb +3 -0
  124. data/test/regression/test_table06.rb +3 -0
  125. data/test/regression/test_table20.rb +34 -0
  126. data/test/regression/test_table21.rb +36 -0
  127. data/test/regression/test_table22.rb +32 -0
  128. data/test/regression/test_table23.rb +56 -0
  129. data/test/regression/test_types02.rb +25 -0
  130. data/test/regression/test_types08.rb +31 -0
  131. data/test/regression/test_utf8_11.rb +23 -0
  132. data/test/regression/xlsx_files/array_formula03.xlsx +0 -0
  133. data/test/regression/xlsx_files/autofilter08.xlsx +0 -0
  134. data/test/regression/xlsx_files/autofilter09.xlsx +0 -0
  135. data/test/regression/xlsx_files/autofilter10.xlsx +0 -0
  136. data/test/regression/xlsx_files/chart_axis42.xlsx +0 -0
  137. data/test/regression/xlsx_files/chart_axis43.xlsx +0 -0
  138. data/test/regression/xlsx_files/chart_chartarea05.xlsx +0 -0
  139. data/test/regression/xlsx_files/chart_chartarea06.xlsx +0 -0
  140. data/test/regression/xlsx_files/chart_data_labels25.xlsx +0 -0
  141. data/test/regression/xlsx_files/chart_format26.xlsx +0 -0
  142. data/test/regression/xlsx_files/chart_format27.xlsx +0 -0
  143. data/test/regression/xlsx_files/chart_format28.xlsx +0 -0
  144. data/test/regression/xlsx_files/chart_format29.xlsx +0 -0
  145. data/test/regression/xlsx_files/chart_format30.xlsx +0 -0
  146. data/test/regression/xlsx_files/chart_format31.xlsx +0 -0
  147. data/test/regression/xlsx_files/chart_legend03.xlsx +0 -0
  148. data/test/regression/xlsx_files/chart_legend04.xlsx +0 -0
  149. data/test/regression/xlsx_files/chart_legend05.xlsx +0 -0
  150. data/test/regression/xlsx_files/chart_legend06.xlsx +0 -0
  151. data/test/regression/xlsx_files/chart_legend07.xlsx +0 -0
  152. data/test/regression/xlsx_files/chart_table03.xlsx +0 -0
  153. data/test/regression/xlsx_files/comment13.xlsx +0 -0
  154. data/test/regression/xlsx_files/cond_format14.xlsx +0 -0
  155. data/test/regression/xlsx_files/cond_format15.xlsx +0 -0
  156. data/test/regression/xlsx_files/cond_format16.xlsx +0 -0
  157. data/test/regression/xlsx_files/cond_format17.xlsx +0 -0
  158. data/test/regression/xlsx_files/cond_format18.xlsx +0 -0
  159. data/test/regression/xlsx_files/cond_format19.xlsx +0 -0
  160. data/test/regression/xlsx_files/cond_format20.xlsx +0 -0
  161. data/test/regression/xlsx_files/date_1904_01.xlsx +0 -0
  162. data/test/regression/xlsx_files/format14.xlsx +0 -0
  163. data/test/regression/xlsx_files/format15.xlsx +0 -0
  164. data/test/regression/xlsx_files/hyperlink25.xlsx +0 -0
  165. data/test/regression/xlsx_files/hyperlink26.xlsx +0 -0
  166. data/test/regression/xlsx_files/hyperlink27.xlsx +0 -0
  167. data/test/regression/xlsx_files/hyperlink28.xlsx +0 -0
  168. data/test/regression/xlsx_files/hyperlink29.xlsx +0 -0
  169. data/test/regression/xlsx_files/hyperlink30.xlsx +0 -0
  170. data/test/regression/xlsx_files/hyperlink31.xlsx +0 -0
  171. data/test/regression/xlsx_files/image35.xlsx +0 -0
  172. data/test/regression/xlsx_files/image36.xlsx +0 -0
  173. data/test/regression/xlsx_files/image44.xlsx +0 -0
  174. data/test/regression/xlsx_files/image45.xlsx +0 -0
  175. data/test/regression/xlsx_files/image46.xlsx +0 -0
  176. data/test/regression/xlsx_files/image47.xlsx +0 -0
  177. data/test/regression/xlsx_files/properties03.xlsx +0 -0
  178. data/test/regression/xlsx_files/properties04.xlsx +0 -0
  179. data/test/regression/xlsx_files/properties05.xlsx +0 -0
  180. data/test/regression/xlsx_files/table21.xlsx +0 -0
  181. data/test/regression/xlsx_files/table22.xlsx +0 -0
  182. data/test/regression/xlsx_files/table23.xlsx +0 -0
  183. data/test/regression/xlsx_files/types02.xlsx +0 -0
  184. data/test/regression/xlsx_files/types08.xlsx +0 -0
  185. data/test/regression/xlsx_files/utf8_11.xlsx +0 -0
  186. data/test/workbook/test_worksheet_by_name.rb +35 -0
  187. data/test/workbook/test_write_workbook_view.rb +117 -0
  188. data/test/worksheet/test_cond_format_22.rb +266 -0
  189. data/test/worksheet/test_cond_format_23.rb +242 -0
  190. data/test/worksheet/test_cond_format_24.rb +303 -0
  191. data/test/worksheet/test_data_bar_01.rb +53 -0
  192. data/test/worksheet/test_data_bar_02.rb +79 -0
  193. data/test/worksheet/test_data_bar_03.rb +147 -0
  194. data/test/worksheet/test_data_bar_04.rb +145 -0
  195. data/test/worksheet/test_data_bar_05.rb +147 -0
  196. data/test/worksheet/test_data_bar_06.rb +145 -0
  197. data/test/worksheet/test_data_bar_07.rb +146 -0
  198. data/test/worksheet/test_data_bar_08.rb +54 -0
  199. data/test/worksheet/test_data_bar_09.rb +80 -0
  200. data/test/worksheet/test_data_bar_10.rb +165 -0
  201. data/test/worksheet/test_data_bar_11.rb +167 -0
  202. data/test/worksheet/test_data_bar_12.rb +104 -0
  203. data/test/worksheet/test_write_data_validation_02.rb +44 -0
  204. data/test/worksheet/test_write_hyperlink.rb +0 -7
  205. data/test/worksheet/test_write_sheet_view.rb +19 -1
  206. metadata +262 -8
  207. data/test/package/comments/test_write_text_t.rb +0 -44
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 994776679641b1907ecab841ff3f708bdf82e7db2347b12a7b3e06c3cf3de218
4
- data.tar.gz: 47fefd5324ac9fc71d40b4fcdcd59c2679098c04ff793d4a96c0e9988e7170cb
3
+ metadata.gz: bde6d7de8885eab3b8b2ccd4c1ec5b682b55b9893a730c3475d5c0e0b6aca459
4
+ data.tar.gz: c6f347da459b3a80bb699632d5aee762fb80de9ebde962463406618a2ed62c1f
5
5
  SHA512:
6
- metadata.gz: 845c34594fea0e22e12663a4bc2912e48eef99de5685573d53c9ba74a89709d5a2ab25efd6eb76f799e1fd4b9913f1fe766d2010352058725389ef119e823c4e
7
- data.tar.gz: e98541a0595e76f391a4dcd38f36b6f754cec385d6310fc169e088bd2f08b38cd4d0d10eebe1f44fd7bed2458bafc2f56fa7994d5bbe8982dc740f0b2ed7be0d
6
+ metadata.gz: 9c562aa8183d3d5bfa800aa961883620ae645107e5de36f7559efdbd2624384cc810d6b1c5098f36bd8508f72c7f6177803fd4f54713c068c59cc4d983da2091
7
+ data.tar.gz: 6af5a9bb53da31ad5e1eca9de975fe5ee68233be6712cecc939d3fc77496d38a23639f43be66bc8a520895e43de6dadb5f3278893711e23397151967912d07b5
@@ -1,7 +1,50 @@
1
1
  language: ruby
2
2
  rvm:
3
+ - 3.0.0
4
+ - 2.7.2
5
+ - 2.7.1
6
+ - 2.7.0
7
+ - 2.6.6
8
+ - 2.6.5
9
+ - 2.6.4
10
+ - 2.6.3
11
+ - 2.6.2
12
+ - 2.6.1
13
+ - 2.6.0
14
+ - 2.5.8
15
+ - 2.5.7
16
+ - 2.5.6
17
+ - 2.5.5
18
+ - 2.5.4
19
+ - 2.5.3
20
+ - 2.5.2
21
+ - 2.5.1
22
+ - 2.5.0
23
+ - 2.4.10
24
+ - 2.4.9
25
+ - 2.4.8
26
+ - 2.4.7
27
+ - 2.4.6
28
+ - 2.4.5
29
+ - 2.4.4
30
+ - 2.4.3
31
+ - 2.4.2
32
+ - 2.4.1
33
+ - 2.4.0
34
+ - 2.3.8
35
+ - 2.3.7
36
+ - 2.3.6
37
+ - 2.3.5
38
+ - 2.3.4
39
+ - 2.3.3
40
+ - 2.3.2
3
41
  - 2.3.1
4
42
  - 2.3.0
43
+ - 2.2.10
44
+ - 2.2.9
45
+ - 2.2.8
46
+ - 2.2.7
47
+ - 2.2.6
5
48
  - 2.2.5
6
49
  - 2.2.4
7
50
  - 2.2.3
data/Changes CHANGED
@@ -1,5 +1,93 @@
1
1
  Change history of write_xlsx rubygem.
2
2
 
3
+ 2021-01-23 v1.00.0
4
+
5
+ Fixed issue where images that started in hidden rows/columns weren't placed
6
+ correctly in the worksheet.
7
+
8
+
9
+ 2021-01-08 v0.99.0
10
+
11
+ Added font and font_size parameters to write_comment().
12
+
13
+ Allow formulas in date field of data_validation().
14
+
15
+ Added top_left chart legend position.
16
+
17
+ Added legend formatting options.
18
+
19
+ Added set_tab_ratio() method to set the ratio between the worksheet tabs
20
+ and the horizontal slider.
21
+
22
+ Added worksheet hide_row_col_headers() method to turn off worksheet row
23
+ and column headings.
24
+
25
+ Add functionality to align chart category axis labels.
26
+
27
+ Fix for issue with special characters in worksheet table functions.
28
+
29
+ Fix handling of 'num_format': '0' in duplicate formats.
30
+
31
+
32
+ 2021-01-03 v0.98.0
33
+
34
+ fixed for autofilter rule with blanks plus another filter.
35
+
36
+ 2021-01-02 v0.97.0
37
+
38
+ Added Excel 2010 data bar features such as solid fills and control over
39
+ the display of negative values.
40
+
41
+ Added default formatting for hyperlinks if none is specified. The format
42
+ is the Excel hyperlink style so links change colour after they are
43
+ clicked.
44
+
45
+ Fixed missing plotarea formatting in pie/doughnut charts.
46
+
47
+ 2020-12-31 v0.96.0
48
+
49
+ Added icon sets to conditional formatting.
50
+
51
+ 2020-12-30 v0.95.0
52
+
53
+ Added workbook set_size() method.
54
+
55
+ 2020-12-30 v0.94.0
56
+
57
+ Added font support to chart tables.
58
+
59
+ 2020-12-30 v0.93.0
60
+
61
+ Added trendline properties: intercept, display_equation and
62
+ display_r_squared.
63
+
64
+ 2020-12-30 v0.92.0
65
+
66
+ Fix for insert_image issue when handling images with zero dpi.
67
+
68
+ 2020-12-30 v0.91.0
69
+
70
+ Add set_custom_property() workbook method to set custom document
71
+ properties.
72
+
73
+ 2020-12-28 v0.90.0
74
+
75
+ Added worksheet_by_name() workbook method to retrieve a worksheet
76
+ in a workbook by name.
77
+
78
+ Fixed issue where internal file creation and modification dates where
79
+ in the local timezone instead of UTC.
80
+
81
+ Fixed issue with "external:" urls with space in sheetname.
82
+
83
+ Fixed issue where Unicode full-width number strings were treated as
84
+ numbers in write().
85
+
86
+ 2020-12-27 v0.89.0
87
+
88
+ Added write_boolean() worksheet method to write Excel boolean values.
89
+
90
+
3
91
  2020-12-26 v0.88.0
4
92
 
5
93
  Added transparency option to solid fills in chart areas.
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012-2020 Hideo NAKAMURA
1
+ Copyright (c) 2012-2021 Hideo NAKAMURA
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  gem to create a new file in the Excel 2007+ XLSX format, and you can use the
7
7
  same interface as writeexcel gem. write_xlsx is converted from Perl's module
8
- [Excel::Writer::XLSX-0.88](https://github.com/jmcnamara/excel-writer-xlsx) .
8
+ [Excel::Writer::XLSX-0.99](https://github.com/jmcnamara/excel-writer-xlsx) .
9
9
 
10
10
  ## Description
11
11
 
@@ -85,7 +85,7 @@ the first worksheet in an Excel XML spreadsheet called ruby.xlsx:
85
85
  Original Perl module was written by John McNamara(jmcnamara@cpan.org).
86
86
 
87
87
  Converted to ruby by Hideo NAKAMURA(nakamrua.hideo@gmail.com)
88
- Copyright (c) 2012-2020 Hideo NAKAMURA.
88
+ Copyright (c) 2012-2021 Hideo NAKAMURA.
89
89
 
90
90
  See LICENSE.txt for further details.
91
91
 
@@ -34,11 +34,6 @@
34
34
  worksheet.write(8, 0, '=IF(A5>3,"Yes", "No")')
35
35
 
36
36
  # Write a hyperlink
37
- hyperlink_format = workbook.add_format(
38
- :color => 'blue',
39
- :underline => 1
40
- )
41
-
42
- worksheet.write(10, 0, 'http://www.ruby-lang.org/', hyperlink_format)
37
+ worksheet.write(10, 0, 'http://www.ruby-lang.org/')
43
38
 
44
39
  workbook.close
@@ -26,12 +26,6 @@
26
26
  :color => '#006100'
27
27
  )
28
28
 
29
- # Blue fill with dark blue text.
30
- format3 = workbook.add_format(
31
- :bg_color => '#C6CEFF',
32
- :color => '#0000FF'
33
- )
34
-
35
29
  # Some sample data to run the conditional formatting against.
36
30
  data = [
37
31
  [ 34, 72, 38, 30, 75, 48, 75, 66, 84, 86 ],
@@ -226,19 +220,18 @@
226
220
  #
227
221
  caption = 'Examples of color scales and data bars. Default colors.'
228
222
 
229
- # Use different sample data for examples 7 and 8
230
- data7 = 1 .. 12
223
+ data = 1 .. 12
231
224
 
232
225
  worksheet7.write('A1', caption)
233
226
 
234
227
  worksheet7.write('B2', "2 Color Scale")
235
- worksheet7.write_col('B3', data7)
228
+ worksheet7.write_col('B3', data)
236
229
 
237
230
  worksheet7.write('D2', "3 Color Scale")
238
- worksheet7.write_col('D3', data7)
231
+ worksheet7.write_col('D3', data)
239
232
 
240
233
  worksheet7.write('F2', "Data Bars")
241
- worksheet7.write_col('F3', data7)
234
+ worksheet7.write_col('F3', data)
242
235
 
243
236
 
244
237
  worksheet7.conditional_formatting('B3:B14',
@@ -266,16 +259,18 @@
266
259
  #
267
260
  caption = 'Examples of color scales and data bars. Modified colors.'
268
261
 
262
+ data = 1..12
263
+
269
264
  worksheet8.write('A1', caption)
270
265
 
271
266
  worksheet8.write('B2', "2 Color Scale")
272
- worksheet8.write_col('B3', data7)
267
+ worksheet8.write_col('B3', data)
273
268
 
274
269
  worksheet8.write('D2', "3 Color Scale")
275
- worksheet8.write_col('D3', data7)
270
+ worksheet8.write_col('D3', data)
276
271
 
277
272
  worksheet8.write('F2', "Data Bars")
278
- worksheet8.write_col('F3', data7)
273
+ worksheet8.write_col('F3', data)
279
274
 
280
275
 
281
276
  worksheet8.conditional_formatting('B3:B14',
@@ -304,47 +299,79 @@
304
299
 
305
300
  ###############################################################################
306
301
  #
307
- # Example 9
302
+ # Example 9.
308
303
  #
309
- caption = 'Cells with values >= 100 are always in blue. ' +
310
- 'Otherwise, cells with values >= 50 are in light red ' +
311
- 'and values < 50 are in light green.'
304
+ caption = 'Examples of conditional formats with icon sets.'
305
+
306
+ data = [
307
+ [1, 2, 3],
308
+ [1, 2, 3],
309
+ [1, 2, 3],
310
+ [1, 2, 3],
311
+ [1, 2, 3, 4],
312
+ [1, 2, 3, 4, 5],
313
+ [1, 2, 3, 4, 5]
314
+ ]
312
315
 
313
- # Write the data.
314
316
  worksheet9.write('A1', caption)
315
317
  worksheet9.write_col('B3', data)
316
318
 
317
- # Write a conditional format over a range.
318
- # Use stopIfTrue to prevent previous formats from being used
319
- # if the conditions of this format are met.
320
- worksheet9.conditional_formatting('B3:K12',
321
- {
322
- :type => 'cell',
323
- :criteria => '>=',
324
- :value => 100,
325
- :format => format3,
326
- :stop_if_true => 1
327
- }
319
+ worksheet9.conditional_formatting(
320
+ 'B3:D3',
321
+ {
322
+ :type => 'icon_set',
323
+ :icon_style => '3_traffic_lights'
324
+ }
328
325
  )
329
326
 
330
- # Write another conditional format over the same range.
331
- worksheet9.conditional_formatting('B3:K12',
332
- {
333
- :type => 'cell',
334
- :criteria => '>=',
335
- :value => 50,
336
- :format => format1
337
- }
327
+ worksheet9.conditional_formatting(
328
+ 'B4:D4',
329
+ {
330
+ :type => 'icon_set',
331
+ :icon_style => '3_traffic_lights',
332
+ :reverse_icons => 1
333
+ }
338
334
  )
339
335
 
340
- # Write another conditional format over the same range.
341
- worksheet9.conditional_formatting('B3:K12',
342
- {
343
- :type => 'cell',
344
- :criteria => '<',
345
- :value => 50,
346
- :format => format2
347
- }
336
+ worksheet9.conditional_formatting(
337
+ 'B5:D5',
338
+ {
339
+ :type => 'icon_set',
340
+ :icon_style => '3_traffic_lights',
341
+ :icons_only => 1
342
+ }
343
+ )
344
+
345
+ worksheet9.conditional_formatting(
346
+ 'B6:D6',
347
+ {
348
+ :type => 'icon_set',
349
+ :icon_style => '3_arrows'
350
+ }
351
+ )
352
+
353
+ worksheet9.conditional_formatting(
354
+ 'B7:E8',
355
+ {
356
+ :type => 'icon_set',
357
+ :icon_style => '4_arrows'
358
+ }
359
+ )
360
+
361
+ worksheet9.conditional_formatting(
362
+ 'B8:F8',
363
+ {
364
+ :type => 'icon_set',
365
+ :icon_style => '5_arrows'
366
+ }
367
+ )
368
+
369
+ worksheet9.conditional_formatting(
370
+ 'B9:F9',
371
+ {
372
+ :type => 'icon_set',
373
+ :icon_style => '5_ratings'
374
+ }
348
375
  )
349
376
 
350
377
  workbook.close
@@ -27,11 +27,6 @@
27
27
  :align => 'vcenter'
28
28
  )
29
29
 
30
- hyperlink_format = workbook.add_format(
31
- :color => 'blue',
32
- :underline => 1
33
- )
34
-
35
30
  headings = ['Features of WriteXLSX', '']
36
31
  worksheet.write_row('A1', headings, heading)
37
32
 
@@ -81,7 +76,7 @@
81
76
  # Hyperlinks
82
77
  #
83
78
  worksheet.write('A9', "Hyperlinks")
84
- worksheet.write('B9', 'http://www.ruby-lang.org/', hyperlink_format)
79
+ worksheet.write('B9', 'http://www.ruby-lang.org/')
85
80
 
86
81
  #######################################################################
87
82
  #
@@ -99,4 +94,3 @@
99
94
  worksheet.write('A19', "Multiple worksheets")
100
95
 
101
96
  workbook.close
102
-
@@ -22,13 +22,6 @@
22
22
  worksheet.set_column('A:A', 30)
23
23
  worksheet.set_selection('B1')
24
24
 
25
-
26
- # Add the standard url link format.
27
- url_format = workbook.add_format(
28
- :color => 'blue',
29
- :underline => 1
30
- )
31
-
32
25
  # Add a sample format.
33
26
  red_format = workbook.add_format(
34
27
  :color => 'red',
@@ -45,11 +38,11 @@
45
38
 
46
39
 
47
40
  # Write some hyperlinks
48
- worksheet.write('A1', 'http://www.perl.com/', url_format)
49
- worksheet.write('A3', 'http://www.perl.com/', url_format, str)
50
- worksheet.write('A5', 'http://www.perl.com/', url_format, str, tip)
41
+ worksheet.write('A1', 'http://www.perl.com/')
42
+ worksheet.write('A3', 'http://www.perl.com/', nil, str)
43
+ worksheet.write('A5', 'http://www.perl.com/', nil, str, tip)
51
44
  worksheet.write('A7', 'http://www.perl.com/', red_format)
52
- worksheet.write('A9', 'mailto:jmcnamara@cpan.org', url_format, 'Mail me')
45
+ worksheet.write('A9', 'mailto:jmcnamara@cpan.org', nil, 'Mail me')
53
46
 
54
47
  # Write a URL that isn't a hyperlink
55
48
  worksheet.write_string('A11', 'http://www.perl.com/')
@@ -1,6 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  require 'write_xlsx/package/xml_writer_simple'
3
3
  require 'write_xlsx/gradient'
4
+ require 'write_xlsx/chart/legend'
4
5
  require 'write_xlsx/utility'
5
6
  require 'write_xlsx/chart/axis'
6
7
  require 'write_xlsx/chart/caption'
@@ -10,7 +11,7 @@ module Writexlsx
10
11
  class Table
11
12
  include Writexlsx::Utility
12
13
 
13
- attr_reader :horizontal, :vertical, :outline, :show_keys
14
+ attr_reader :horizontal, :vertical, :outline, :show_keys, :font
14
15
 
15
16
  def initialize(params = {})
16
17
  @horizontal, @vertical, @outline, @show_keys = true, true, true, false
@@ -18,14 +19,22 @@ def initialize(params = {})
18
19
  @vertical = params[:vertical] if params.has_key?(:vertical)
19
20
  @outline = params[:outline] if params.has_key?(:outline)
20
21
  @show_keys = params[:show_keys] if params.has_key?(:show_keys)
22
+ @font = convert_font_args(params[:font])
23
+ end
24
+
25
+ def palette=(palette)
26
+ @palette = palette
21
27
  end
22
28
 
23
29
  def write_d_table(writer)
24
- writer.tag_elements('c:dTable') do
25
- writer.empty_tag('c:showHorzBorder', attributes) if ptrue?(horizontal)
26
- writer.empty_tag('c:showVertBorder', attributes) if ptrue?(vertical)
27
- writer.empty_tag('c:showOutline', attributes) if ptrue?(outline)
28
- writer.empty_tag('c:showKeys', attributes) if ptrue?(show_keys)
30
+ @writer = writer
31
+ @writer.tag_elements('c:dTable') do
32
+ @writer.empty_tag('c:showHorzBorder', attributes) if ptrue?(horizontal)
33
+ @writer.empty_tag('c:showVertBorder', attributes) if ptrue?(vertical)
34
+ @writer.empty_tag('c:showOutline', attributes) if ptrue?(outline)
35
+ @writer.empty_tag('c:showKeys', attributes) if ptrue?(show_keys)
36
+ # Write the table font.
37
+ write_tx_pr(nil, font) if ptrue?(font)
29
38
  end
30
39
  end
31
40
 
@@ -154,6 +163,7 @@ def numeric_or_downcase(val)
154
163
 
155
164
  class Chart
156
165
  include Writexlsx::Utility
166
+ include Writexlsx::Gradient
157
167
 
158
168
  attr_accessor :id, :name # :nodoc:
159
169
  attr_writer :index, :palette, :protection # :nodoc:
@@ -264,6 +274,10 @@ def add_series(params)
264
274
  raise "Must specify ':categories' in add_series for this chart type"
265
275
  end
266
276
 
277
+ if @series.size == 255
278
+ raise "The maximum number of series that can be added to an Excel Chart is 255."
279
+ end
280
+
267
281
  @series << Series.new(self, params)
268
282
 
269
283
  # Set the secondary axis properties.
@@ -340,16 +354,8 @@ def set_title(params)
340
354
  # Set the properties of the chart legend.
341
355
  #
342
356
  def set_legend(params)
343
- if params[:none]
344
- @legend_position = 'none'
345
- else
346
- @legend_position = params[:position] || 'right'
347
- end
348
- @legend_delete_series = params[:delete_series]
349
- @legend_font = convert_font_args(params[:font])
350
-
351
- # Set the legend layout.
352
- @legend_layout = layout_properties(params[:layout])
357
+ # Convert the user default properties to internal properties.
358
+ legend_properties(params)
353
359
  end
354
360
 
355
361
  #
@@ -417,6 +423,7 @@ def set_size(params = {})
417
423
  #
418
424
  def set_table(params = {})
419
425
  @table = Table.new(params)
426
+ @table.palette = @palette
420
427
  end
421
428
 
422
429
  #
@@ -517,39 +524,6 @@ def write_bar_chart(params) # :nodoc:
517
524
  end
518
525
  end
519
526
 
520
- #
521
- # Convert user defined font values into private hash values.
522
- #
523
- def convert_font_args(params)
524
- return unless params
525
- font = params_to_font(params)
526
-
527
- # Convert font size units.
528
- font[:_size] *= 100 if font[:_size] && font[:_size] != 0
529
-
530
- # Convert rotation into 60,000ths of a degree.
531
- if ptrue?(font[:_rotation])
532
- font[:_rotation] = 60_000 * font[:_rotation].to_i
533
- end
534
-
535
- font
536
- end
537
-
538
- def params_to_font(params)
539
- {
540
- :_name => params[:name],
541
- :_color => params[:color],
542
- :_size => params[:size],
543
- :_bold => params[:bold],
544
- :_italic => params[:italic],
545
- :_underline => params[:underline],
546
- :_pitch_family => params[:pitch_family],
547
- :_charset => params[:charset],
548
- :_baseline => params[:baseline] || 0,
549
- :_rotation => params[:rotation]
550
- }
551
- end
552
-
553
527
  #
554
528
  # Switch name and name_formula parameters if required.
555
529
  #
@@ -631,7 +605,7 @@ def display_setup
631
605
  @y_scale = 1
632
606
  @x_offset = 0
633
607
  @y_offset = 0
634
- @legend_position = 'right'
608
+ @legend = Legend.new
635
609
  @smooth_allowed = 0
636
610
  @cross_between = 'between'
637
611
  @date_category = false
@@ -672,20 +646,6 @@ def get_data_type(data) # :nodoc:
672
646
  'num'
673
647
  end
674
648
 
675
- #
676
- # Convert the user specified colour index or string to a rgb colour.
677
- #
678
- def color(color_code) # :nodoc:
679
- if color_code and color_code =~ /^#[0-9a-fA-F]{6}$/
680
- # Convert a HTML style #RRGGBB color.
681
- color_code.sub(/^#/, '').upcase
682
- else
683
- index = Format.color(color_code)
684
- raise "Unknown color '#{color_code}' used in chart formatting." unless index
685
- palette_color(index)
686
- end
687
- end
688
-
689
649
  #
690
650
  # Returns series which use the primary axes.
691
651
  #
@@ -723,38 +683,6 @@ def ids
723
683
  [id1, id2]
724
684
  end
725
685
 
726
- #
727
- # Get the font style attributes from a font hash.
728
- #
729
- def get_font_style_attributes(font)
730
- return [] unless font
731
-
732
- attributes = []
733
- attributes << ['sz', font[:_size]] if ptrue?(font[:_size])
734
- attributes << ['b', font[:_bold]] if font[:_bold]
735
- attributes << ['i', font[:_italic]] if font[:_italic]
736
- attributes << ['u', 'sng'] if font[:_underline]
737
-
738
- # Turn off baseline when testing fonts that don't have it.
739
- if font[:_baseline] != -1
740
- attributes << ['baseline', font[:_baseline]]
741
- end
742
- attributes
743
- end
744
-
745
- #
746
- # Get the font latin attributes from a font hash.
747
- #
748
- def get_font_latin_attributes(font)
749
- return [] unless font
750
-
751
- attributes = []
752
- attributes << ['typeface', font[:_name]] if ptrue?(font[:_name])
753
- attributes << ['pitchFamily', font[:_pitch_family]] if font[:_pitch_family]
754
- attributes << ['charset', font[:_charset]] if font[:_charset]
755
-
756
- attributes
757
- end
758
686
  #
759
687
  # Setup the default properties for a chart.
760
688
  #
@@ -1306,7 +1234,7 @@ def write_cat_axis(params) # :nodoc:
1306
1234
  # Write the c:auto element.
1307
1235
  write_auto(1) unless x_axis.text_axis
1308
1236
  # Write the c:labelAlign element.
1309
- write_label_align('ctr')
1237
+ write_label_align(x_axis.label_align)
1310
1238
  # Write the c:labelOffset element.
1311
1239
  write_label_offset(100)
1312
1240
  # Write the c:tickLblSkip element.
@@ -1640,6 +1568,12 @@ def write_auto(val) # :nodoc:
1640
1568
  # Write the <c:labelAlign> element.
1641
1569
  #
1642
1570
  def write_label_align(val) # :nodoc:
1571
+ val ||= 'ctr'
1572
+ if val == 'right'
1573
+ val = 'r'
1574
+ elsif val == 'left'
1575
+ val = 'l'
1576
+ end
1643
1577
  @writer.empty_tag('c:lblAlgn', [ ['val', val] ])
1644
1578
  end
1645
1579
 
@@ -1742,10 +1676,10 @@ def write_c_minor_time_unit(val) # :nodoc:
1742
1676
  # Write the <c:legend> element.
1743
1677
  #
1744
1678
  def write_legend # :nodoc:
1745
- position = @legend_position.sub(/^overlay_/, '')
1679
+ position = @legend.position.sub(/^overlay_/, '')
1746
1680
  return if position == 'none' || (not position_allowed.has_key?(position))
1747
1681
 
1748
- @delete_series = @legend_delete_series if @legend_delete_series.kind_of?(Array)
1682
+ @delete_series = @legend.delete_series if @legend.delete_series.kind_of?(Array)
1749
1683
  @writer.tag_elements('c:legend') do
1750
1684
  # Write the c:legendPos element.
1751
1685
  write_legend_pos(position_allowed[position])
@@ -1753,20 +1687,23 @@ def write_legend # :nodoc:
1753
1687
  # Write the c:legendEntry element.
1754
1688
  @delete_series.each { |i| write_legend_entry(i) } if @delete_series
1755
1689
  # Write the c:layout element.
1756
- write_layout(@legend_layout, 'legend')
1757
- # Write the c:txPr element.
1758
- write_tx_pr(nil, @legend_font) if ptrue?(@legend_font)
1690
+ write_layout(@legend.layout, 'legend')
1759
1691
  # Write the c:overlay element.
1760
- write_overlay if @legend_position =~ /^overlay_/
1692
+ write_overlay if @legend.position =~ /^overlay_/
1693
+ # Write the c:spPr element.
1694
+ write_sp_pr(@legend)
1695
+ # Write the c:txPr element.
1696
+ write_tx_pr(nil, @legend.font) if ptrue?(@legend.font)
1761
1697
  end
1762
1698
  end
1763
1699
 
1764
1700
  def position_allowed
1765
1701
  {
1766
- 'right' => 'r',
1767
- 'left' => 'l',
1768
- 'top' => 't',
1769
- 'bottom' => 'b'
1702
+ 'right' => 'r',
1703
+ 'left' => 'l',
1704
+ 'top' => 't',
1705
+ 'bottom' => 'b',
1706
+ 'top_right' => 'tr'
1770
1707
  }
1771
1708
  end
1772
1709
 
@@ -1938,26 +1875,6 @@ def write_rich(title, horiz) # :nodoc:
1938
1875
  write_a_p_rich(title)
1939
1876
  end
1940
1877
  end
1941
-
1942
- #
1943
- # Write the <a:bodyPr> element.
1944
- #
1945
- def write_a_body_pr(rot, horiz = nil) # :nodoc:
1946
- rot = -5400000 if !rot && ptrue?(horiz)
1947
- attributes = []
1948
- attributes << ['rot', rot] if rot
1949
- attributes << ['vert', 'horz'] if ptrue?(horiz)
1950
-
1951
- @writer.empty_tag('a:bodyPr', attributes)
1952
- end
1953
-
1954
- #
1955
- # Write the <a:lstStyle> element.
1956
- #
1957
- def write_a_lst_style # :nodoc:
1958
- @writer.empty_tag('a:lstStyle')
1959
- end
1960
-
1961
1878
  #
1962
1879
  # Write the <a:p> element for rich string titles.
1963
1880
  #
@@ -1970,18 +1887,6 @@ def write_a_p_rich(title) # :nodoc:
1970
1887
  end
1971
1888
  end
1972
1889
 
1973
- #
1974
- # Write the <a:p> element for formula titles.
1975
- #
1976
- def write_a_p_formula(font = nil) # :nodoc:
1977
- @writer.tag_elements('a:p') do
1978
- # Write the a:pPr element.
1979
- write_a_p_pr_formula(font)
1980
- # Write the a:endParaRPr element.
1981
- write_a_end_para_rpr
1982
- end
1983
- end
1984
-
1985
1890
  #
1986
1891
  # Write the <a:pPr> element for rich string titles.
1987
1892
  #
@@ -1989,30 +1894,6 @@ def write_a_p_pr_rich(font) # :nodoc:
1989
1894
  @writer.tag_elements('a:pPr') { write_a_def_rpr(font) }
1990
1895
  end
1991
1896
 
1992
- #
1993
- # Write the <a:pPr> element for formula titles.
1994
- #
1995
- def write_a_p_pr_formula(font) # :nodoc:
1996
- @writer.tag_elements('a:pPr') { write_a_def_rpr(font) }
1997
- end
1998
-
1999
- #
2000
- # Write the <a:defRPr> element.
2001
- #
2002
- def write_a_def_rpr(font = nil) # :nodoc:
2003
- write_def_rpr_r_pr_common(
2004
- font,
2005
- get_font_style_attributes(font),
2006
- 'a:defRPr')
2007
- end
2008
-
2009
- #
2010
- # Write the <a:endParaRPr> element.
2011
- #
2012
- def write_a_end_para_rpr # :nodoc:
2013
- @writer.empty_tag('a:endParaRPr', [ ['lang', 'en-US'] ])
2014
- end
2015
-
2016
1897
  #
2017
1898
  # Write the <a:r> element.
2018
1899
  #
@@ -2036,24 +1917,6 @@ def write_a_r_pr(font) # :nodoc:
2036
1917
  write_def_rpr_r_pr_common(font, attributes, 'a:rPr')
2037
1918
  end
2038
1919
 
2039
- def write_def_rpr_r_pr_common(font, style_attributes, tag) # :nodoc:
2040
- latin_attributes = get_font_latin_attributes(font)
2041
- has_color = ptrue?(font) && ptrue?(font[:_color])
2042
-
2043
- if !latin_attributes.empty? || has_color
2044
- @writer.tag_elements(tag, style_attributes) do
2045
- if has_color
2046
- write_a_solid_fill(:color => font[:_color])
2047
- end
2048
- if !latin_attributes.empty?
2049
- write_a_latin(latin_attributes)
2050
- end
2051
- end
2052
- else
2053
- @writer.empty_tag(tag, style_attributes)
2054
- end
2055
- end
2056
-
2057
1920
  #
2058
1921
  # Write the <a:t> element.
2059
1922
  #
@@ -2061,24 +1924,6 @@ def write_a_t(title) # :nodoc:
2061
1924
  @writer.data_element('a:t', title)
2062
1925
  end
2063
1926
 
2064
- #
2065
- # Write the <c:txPr> element.
2066
- #
2067
- def write_tx_pr(horiz, font) # :nodoc:
2068
- rotation = nil
2069
- if font && font[:_rotation]
2070
- rotation = font[:_rotation]
2071
- end
2072
- @writer.tag_elements('c:txPr') do
2073
- # Write the a:bodyPr element.
2074
- write_a_body_pr(rotation, horiz)
2075
- # Write the a:lstStyle element.
2076
- write_a_lst_style
2077
- # Write the a:p element.
2078
- write_a_p_formula(font)
2079
- end
2080
- end
2081
-
2082
1927
  #
2083
1928
  # Write the <c:marker> element.
2084
1929
  #
@@ -2199,34 +2044,6 @@ def write_a_no_fill # :nodoc:
2199
2044
  @writer.empty_tag('a:noFill')
2200
2045
  end
2201
2046
 
2202
- #
2203
- # Write the <a:solidFill> element.
2204
- #
2205
- def write_a_solid_fill(fill) # :nodoc:
2206
- @writer.tag_elements('a:solidFill') do
2207
- if fill[:color]
2208
- # Write the a:srgbClr element.
2209
- write_a_srgb_clr(color(fill[:color]), fill[:transparency])
2210
- end
2211
- end
2212
- end
2213
-
2214
- #
2215
- # Write the <a:srgbClr> element.
2216
- #
2217
- def write_a_srgb_clr(color, transparency = nil) # :nodoc:
2218
- tag = 'a:srgbClr'
2219
- attributes = [ ['val', color] ]
2220
-
2221
- if ptrue?(transparency)
2222
- @writer.tag_elements(tag, attributes) do
2223
- write_a_alpha(transparency)
2224
- end
2225
- else
2226
- @writer.empty_tag(tag, attributes)
2227
- end
2228
- end
2229
-
2230
2047
  #
2231
2048
  # Write the <a:alpha> element.
2232
2049
  #
@@ -2264,6 +2081,20 @@ def write_trendline(trendline) # :nodoc:
2264
2081
  write_forward(trendline.forward)
2265
2082
  # Write the c:backward element.
2266
2083
  write_backward(trendline.backward)
2084
+ if trendline.intercept
2085
+ # Write the c:intercept element.
2086
+ write_intercept(trendline.intercept)
2087
+ end
2088
+ if trendline.display_r_squared
2089
+ # Write the c:dispRSqr element.
2090
+ write_disp_rsqr
2091
+ end
2092
+ if trendline.display_equation
2093
+ # Write the c:dispEq element.
2094
+ write_disp_eq
2095
+ # Write the c:trendlineLbl element.
2096
+ write_trendline_lbl
2097
+ end
2267
2098
  end
2268
2099
  end
2269
2100
 
@@ -2315,6 +2146,54 @@ def write_backward(val) # :nodoc:
2315
2146
  @writer.empty_tag('c:backward', [ ['val', val] ])
2316
2147
  end
2317
2148
 
2149
+ #
2150
+ # Write the <c:intercept> element.
2151
+ #
2152
+ def write_intercept(val)
2153
+ @writer.empty_tag('c:intercept', [ ['val', val] ])
2154
+ end
2155
+
2156
+ #
2157
+ # Write the <c:dispEq> element.
2158
+ #
2159
+ def write_disp_eq
2160
+ @writer.empty_tag('c:dispEq', [ ['val', 1] ])
2161
+ end
2162
+
2163
+ #
2164
+ # Write the <c:dispRSqr> element.
2165
+ #
2166
+ def write_disp_rsqr
2167
+ @writer.empty_tag('c:dispRSqr', [ ['val', 1] ])
2168
+ end
2169
+
2170
+ #
2171
+ # Write the <c:trendlineLbl> element.
2172
+ #
2173
+ def write_trendline_lbl
2174
+ @writer.tag_elements('c:trendlineLbl') do
2175
+ # Write the c:layout element.
2176
+ write_layout
2177
+ # Write the c:numFmt element.
2178
+ write_trendline_num_fmt
2179
+ end
2180
+ end
2181
+
2182
+ #
2183
+ # Write the <c:numFmt> element.
2184
+ #
2185
+ def write_trendline_num_fmt
2186
+ format_code = 'General'
2187
+ source_linked = 0
2188
+
2189
+ attributes = [
2190
+ ['formatCode', format_code],
2191
+ ['sourceLinked', source_linked]
2192
+ ]
2193
+
2194
+ @writer.empty_tag('c:numFmt', attributes)
2195
+ end
2196
+
2318
2197
  #
2319
2198
  # Write the <c:hiLowLines> element.
2320
2199
  #