write_xlsx 0.87.0 → 0.99.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (213) 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 +125 -211
  11. data/lib/write_xlsx/chart/axis.rb +33 -8
  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 +304 -42
  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_axis41.rb +48 -0
  47. data/test/regression/test_chart_axis42.rb +44 -0
  48. data/test/regression/test_chart_axis43.rb +44 -0
  49. data/test/regression/test_chart_bar08.rb +3 -0
  50. data/test/regression/test_chart_bar11.rb +3 -0
  51. data/test/regression/test_chart_bar14.rb +3 -0
  52. data/test/regression/test_chart_chartarea05.rb +16 -17
  53. data/test/regression/test_chart_chartarea06.rb +49 -0
  54. data/test/regression/test_chart_data_labels25.rb +61 -0
  55. data/test/regression/test_chart_format21.rb +47 -0
  56. data/test/regression/test_chart_format22.rb +47 -0
  57. data/test/regression/test_chart_format23.rb +47 -0
  58. data/test/regression/test_chart_format24.rb +52 -0
  59. data/test/regression/test_chart_format25.rb +46 -0
  60. data/test/regression/test_chart_format26.rb +48 -0
  61. data/test/regression/test_chart_format27.rb +58 -0
  62. data/test/regression/test_chart_format28.rb +52 -0
  63. data/test/regression/test_chart_format29.rb +59 -0
  64. data/test/regression/test_chart_format30.rb +53 -0
  65. data/test/regression/test_chart_format31.rb +60 -0
  66. data/test/regression/test_chart_gridlines04.rb +4 -3
  67. data/test/regression/test_chart_gridlines08.rb +8 -11
  68. data/test/regression/test_chart_legend03.rb +41 -0
  69. data/test/regression/test_chart_legend04.rb +41 -0
  70. data/test/regression/test_chart_legend05.rb +41 -0
  71. data/test/regression/test_chart_legend06.rb +41 -0
  72. data/test/regression/test_chart_legend07.rb +38 -0
  73. data/test/regression/test_chart_table03.rb +56 -0
  74. data/test/regression/test_comment13.rb +36 -0
  75. data/test/regression/test_cond_format14.rb +42 -0
  76. data/test/regression/test_cond_format15.rb +53 -0
  77. data/test/regression/test_cond_format16.rb +53 -0
  78. data/test/regression/test_cond_format17.rb +37 -0
  79. data/test/regression/test_cond_format18.rb +136 -0
  80. data/test/regression/test_cond_format19.rb +64 -0
  81. data/test/regression/test_cond_format20.rb +43 -0
  82. data/test/regression/test_date_1904_01.rb +1 -1
  83. data/test/regression/test_escapes04.rb +3 -0
  84. data/test/regression/test_escapes05.rb +3 -0
  85. data/test/regression/test_escapes07.rb +3 -0
  86. data/test/regression/test_escapes08.rb +3 -0
  87. data/test/regression/test_format14.rb +26 -0
  88. data/test/regression/test_format15.rb +26 -0
  89. data/test/regression/test_hyperlink01.rb +3 -0
  90. data/test/regression/test_hyperlink02.rb +3 -0
  91. data/test/regression/test_hyperlink03.rb +4 -0
  92. data/test/regression/test_hyperlink04.rb +3 -0
  93. data/test/regression/test_hyperlink05.rb +3 -0
  94. data/test/regression/test_hyperlink06.rb +3 -0
  95. data/test/regression/test_hyperlink07.rb +3 -0
  96. data/test/regression/test_hyperlink08.rb +3 -0
  97. data/test/regression/test_hyperlink09.rb +3 -0
  98. data/test/regression/test_hyperlink10.rb +3 -0
  99. data/test/regression/test_hyperlink11.rb +3 -0
  100. data/test/regression/test_hyperlink12.rb +3 -0
  101. data/test/regression/test_hyperlink13.rb +3 -0
  102. data/test/regression/test_hyperlink14.rb +3 -0
  103. data/test/regression/test_hyperlink15.rb +3 -0
  104. data/test/regression/test_hyperlink16.rb +3 -0
  105. data/test/regression/test_hyperlink17.rb +3 -0
  106. data/test/regression/test_hyperlink18.rb +3 -0
  107. data/test/regression/test_hyperlink20.rb +3 -0
  108. data/test/regression/test_hyperlink21.rb +3 -0
  109. data/test/regression/test_hyperlink22.rb +3 -0
  110. data/test/regression/test_hyperlink23.rb +3 -0
  111. data/test/regression/test_hyperlink24.rb +3 -0
  112. data/test/regression/test_hyperlink25.rb +30 -0
  113. data/test/regression/test_hyperlink26.rb +30 -0
  114. data/test/regression/test_hyperlink27.rb +27 -0
  115. data/test/regression/test_hyperlink28.rb +50 -0
  116. data/test/regression/test_hyperlink29.rb +27 -0
  117. data/test/regression/test_hyperlink30.rb +36 -0
  118. data/test/regression/test_image35.rb +26 -0
  119. data/test/regression/test_image36.rb +26 -0
  120. data/test/regression/test_properties01.rb +1 -4
  121. data/test/regression/test_properties02.rb +1 -4
  122. data/test/regression/test_properties03.rb +26 -0
  123. data/test/regression/test_properties04.rb +61 -0
  124. data/test/regression/test_properties05.rb +30 -0
  125. data/test/regression/test_table03.rb +3 -0
  126. data/test/regression/test_table04.rb +3 -0
  127. data/test/regression/test_table05.rb +3 -0
  128. data/test/regression/test_table06.rb +3 -0
  129. data/test/regression/test_table20.rb +34 -0
  130. data/test/regression/test_table21.rb +36 -0
  131. data/test/regression/test_table22.rb +32 -0
  132. data/test/regression/test_table23.rb +56 -0
  133. data/test/regression/test_types02.rb +25 -0
  134. data/test/regression/test_types08.rb +31 -0
  135. data/test/regression/test_utf8_11.rb +23 -0
  136. data/test/regression/xlsx_files/array_formula03.xlsx +0 -0
  137. data/test/regression/xlsx_files/autofilter08.xlsx +0 -0
  138. data/test/regression/xlsx_files/autofilter09.xlsx +0 -0
  139. data/test/regression/xlsx_files/autofilter10.xlsx +0 -0
  140. data/test/regression/xlsx_files/chart_axis41.xlsx +0 -0
  141. data/test/regression/xlsx_files/chart_axis42.xlsx +0 -0
  142. data/test/regression/xlsx_files/chart_axis43.xlsx +0 -0
  143. data/test/regression/xlsx_files/chart_chartarea05.xlsx +0 -0
  144. data/test/regression/xlsx_files/chart_chartarea06.xlsx +0 -0
  145. data/test/regression/xlsx_files/chart_data_labels25.xlsx +0 -0
  146. data/test/regression/xlsx_files/chart_format21.xlsx +0 -0
  147. data/test/regression/xlsx_files/chart_format22.xlsx +0 -0
  148. data/test/regression/xlsx_files/chart_format23.xlsx +0 -0
  149. data/test/regression/xlsx_files/chart_format24.xlsx +0 -0
  150. data/test/regression/xlsx_files/chart_format25.xlsx +0 -0
  151. data/test/regression/xlsx_files/chart_format26.xlsx +0 -0
  152. data/test/regression/xlsx_files/chart_format27.xlsx +0 -0
  153. data/test/regression/xlsx_files/chart_format28.xlsx +0 -0
  154. data/test/regression/xlsx_files/chart_format29.xlsx +0 -0
  155. data/test/regression/xlsx_files/chart_format30.xlsx +0 -0
  156. data/test/regression/xlsx_files/chart_format31.xlsx +0 -0
  157. data/test/regression/xlsx_files/chart_legend03.xlsx +0 -0
  158. data/test/regression/xlsx_files/chart_legend04.xlsx +0 -0
  159. data/test/regression/xlsx_files/chart_legend05.xlsx +0 -0
  160. data/test/regression/xlsx_files/chart_legend06.xlsx +0 -0
  161. data/test/regression/xlsx_files/chart_legend07.xlsx +0 -0
  162. data/test/regression/xlsx_files/chart_table03.xlsx +0 -0
  163. data/test/regression/xlsx_files/comment13.xlsx +0 -0
  164. data/test/regression/xlsx_files/cond_format14.xlsx +0 -0
  165. data/test/regression/xlsx_files/cond_format15.xlsx +0 -0
  166. data/test/regression/xlsx_files/cond_format16.xlsx +0 -0
  167. data/test/regression/xlsx_files/cond_format17.xlsx +0 -0
  168. data/test/regression/xlsx_files/cond_format18.xlsx +0 -0
  169. data/test/regression/xlsx_files/cond_format19.xlsx +0 -0
  170. data/test/regression/xlsx_files/cond_format20.xlsx +0 -0
  171. data/test/regression/xlsx_files/date_1904_01.xlsx +0 -0
  172. data/test/regression/xlsx_files/format14.xlsx +0 -0
  173. data/test/regression/xlsx_files/format15.xlsx +0 -0
  174. data/test/regression/xlsx_files/hyperlink25.xlsx +0 -0
  175. data/test/regression/xlsx_files/hyperlink26.xlsx +0 -0
  176. data/test/regression/xlsx_files/hyperlink27.xlsx +0 -0
  177. data/test/regression/xlsx_files/hyperlink28.xlsx +0 -0
  178. data/test/regression/xlsx_files/hyperlink29.xlsx +0 -0
  179. data/test/regression/xlsx_files/hyperlink30.xlsx +0 -0
  180. data/test/regression/xlsx_files/hyperlink31.xlsx +0 -0
  181. data/test/regression/xlsx_files/image35.xlsx +0 -0
  182. data/test/regression/xlsx_files/image36.xlsx +0 -0
  183. data/test/regression/xlsx_files/properties03.xlsx +0 -0
  184. data/test/regression/xlsx_files/properties04.xlsx +0 -0
  185. data/test/regression/xlsx_files/properties05.xlsx +0 -0
  186. data/test/regression/xlsx_files/table21.xlsx +0 -0
  187. data/test/regression/xlsx_files/table22.xlsx +0 -0
  188. data/test/regression/xlsx_files/table23.xlsx +0 -0
  189. data/test/regression/xlsx_files/types02.xlsx +0 -0
  190. data/test/regression/xlsx_files/types08.xlsx +0 -0
  191. data/test/regression/xlsx_files/utf8_11.xlsx +0 -0
  192. data/test/workbook/test_worksheet_by_name.rb +35 -0
  193. data/test/workbook/test_write_workbook_view.rb +117 -0
  194. data/test/worksheet/test_cond_format_22.rb +266 -0
  195. data/test/worksheet/test_cond_format_23.rb +242 -0
  196. data/test/worksheet/test_cond_format_24.rb +303 -0
  197. data/test/worksheet/test_data_bar_01.rb +53 -0
  198. data/test/worksheet/test_data_bar_02.rb +79 -0
  199. data/test/worksheet/test_data_bar_03.rb +147 -0
  200. data/test/worksheet/test_data_bar_04.rb +145 -0
  201. data/test/worksheet/test_data_bar_05.rb +147 -0
  202. data/test/worksheet/test_data_bar_06.rb +145 -0
  203. data/test/worksheet/test_data_bar_07.rb +146 -0
  204. data/test/worksheet/test_data_bar_08.rb +54 -0
  205. data/test/worksheet/test_data_bar_09.rb +80 -0
  206. data/test/worksheet/test_data_bar_10.rb +165 -0
  207. data/test/worksheet/test_data_bar_11.rb +167 -0
  208. data/test/worksheet/test_data_bar_12.rb +104 -0
  209. data/test/worksheet/test_write_data_validation_02.rb +44 -0
  210. data/test/worksheet/test_write_hyperlink.rb +0 -7
  211. data/test/worksheet/test_write_sheet_view.rb +19 -1
  212. metadata +267 -5
  213. 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: 6e7cdfffc65c56b8de477d41c1126ebd46a7d6e63aee6d6660bab0e9283be2c6
4
- data.tar.gz: c62748b94058a7021e796b88031b7d126b8508ce9ece50bdaa7455a620d8403b
3
+ metadata.gz: a8880984e96fe4a8788fe6642220163ff36932dea018a335d00165a7b2d2ae04
4
+ data.tar.gz: 99153b43aba51974cca58ed8c38d6308814820846b4617444fcd302752843bc5
5
5
  SHA512:
6
- metadata.gz: 0042aea94458add0013ceefed1e734593692c00f9dc32d8b02fef80093b2e62d3510ef62e84481c74acbf0436e8fe8223485a562a76ec8fd011724e2869c5b1e
7
- data.tar.gz: 0bb9fed1ec24707d52b7557c256579606c39eadb716bfdc4acb5e5e6b13f0792fb3627e75f16aef375675160d57556fff7f02af6fea8e4819bbdb244f96657e9
6
+ metadata.gz: 1b5c868f6e42846e925282b0eed02064b4541e852e72012e083009dbaa44e6bc419f1ad5b630cfe3ca149b12832732b972f340e6038502e1c8acbce9358702d2
7
+ data.tar.gz: 8bc6c84b0bb6c5901516441c7a5b1e45044ba5c26d30c92ac773f0de521e8e78785cd8aa4759a0d0db96d629aedd4aaf2a7453cb1f075b36dd1e61fc34cb217d
@@ -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-08 v0.99.0
4
+
5
+ Added font and font_size parameters to write_comment().
6
+
7
+ Allow formulas in date field of data_validation().
8
+
9
+ Added top_left chart legend position.
10
+
11
+ Added legend formatting options.
12
+
13
+ Added set_tab_ratio() method to set the ratio between the worksheet tabs
14
+ and the horizontal slider.
15
+
16
+ Added worksheet hide_row_col_headers() method to turn off worksheet row
17
+ and column headings.
18
+
19
+ Add functionality to align chart category axis labels.
20
+
21
+ Fix for issue with special characters in worksheet table functions.
22
+
23
+ Fix handling of 'num_format': '0' in duplicate formats.
24
+
25
+
26
+ 2021-01-03 v0.98.0
27
+
28
+ fixed for autofilter rule with blanks plus another filter.
29
+
30
+ 2021-01-02 v0.97.0
31
+
32
+ Added Excel 2010 data bar features such as solid fills and control over
33
+ the display of negative values.
34
+
35
+ Added default formatting for hyperlinks if none is specified. The format
36
+ is the Excel hyperlink style so links change colour after they are
37
+ clicked.
38
+
39
+ Fixed missing plotarea formatting in pie/doughnut charts.
40
+
41
+ 2020-12-31 v0.96.0
42
+
43
+ Added icon sets to conditional formatting.
44
+
45
+ 2020-12-30 v0.95.0
46
+
47
+ Added workbook set_size() method.
48
+
49
+ 2020-12-30 v0.94.0
50
+
51
+ Added font support to chart tables.
52
+
53
+ 2020-12-30 v0.93.0
54
+
55
+ Added trendline properties: intercept, display_equation and
56
+ display_r_squared.
57
+
58
+ 2020-12-30 v0.92.0
59
+
60
+ Fix for insert_image issue when handling images with zero dpi.
61
+
62
+ 2020-12-30 v0.91.0
63
+
64
+ Add set_custom_property() workbook method to set custom document
65
+ properties.
66
+
67
+ 2020-12-28 v0.90.0
68
+
69
+ Added worksheet_by_name() workbook method to retrieve a worksheet
70
+ in a workbook by name.
71
+
72
+ Fixed issue where internal file creation and modification dates where
73
+ in the local timezone instead of UTC.
74
+
75
+ Fixed issue with "external:" urls with space in sheetname.
76
+
77
+ Fixed issue where Unicode full-width number strings were treated as
78
+ numbers in write().
79
+
80
+ 2020-12-27 v0.89.0
81
+
82
+ Added write_boolean() worksheet method to write Excel boolean values.
83
+
84
+
85
+ 2020-12-26 v0.88.0
86
+
87
+ Added transparency option to solid fills in chart areas.
88
+
89
+ Added options to configure chart axis tick placement.
90
+
3
91
  2020-12-26 v0.87.0
4
92
 
5
93
  Added chart pattern and gradient fills.
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012-2014 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.86](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
  #
@@ -1285,6 +1213,9 @@ def write_cat_axis(params) # :nodoc:
1285
1213
  # Write the c:majorTickMark element.
1286
1214
  write_major_tick_mark(x_axis.major_tick_mark)
1287
1215
 
1216
+ # Write the c:minorTickMark element.
1217
+ write_minor_tick_mark(x_axis.minor_tick_mark)
1218
+
1288
1219
  # Write the c:tickLblPos element.
1289
1220
  write_tick_label_pos(x_axis.label_position)
1290
1221
 
@@ -1303,7 +1234,7 @@ def write_cat_axis(params) # :nodoc:
1303
1234
  # Write the c:auto element.
1304
1235
  write_auto(1) unless x_axis.text_axis
1305
1236
  # Write the c:labelAlign element.
1306
- write_label_align('ctr')
1237
+ write_label_align(x_axis.label_align)
1307
1238
  # Write the c:labelOffset element.
1308
1239
  write_label_offset(100)
1309
1240
  # Write the c:tickLblSkip element.
@@ -1359,6 +1290,9 @@ def write_val_axis_base(x_axis, y_axis, axis_ids_0, axis_ids_1, position) # :no
1359
1290
  # Write the c:majorTickMark element.
1360
1291
  write_major_tick_mark(y_axis.major_tick_mark)
1361
1292
 
1293
+ # Write the c:minorTickMark element.
1294
+ write_minor_tick_mark(y_axis.minor_tick_mark)
1295
+
1362
1296
  # Write the c:tickLblPos element.
1363
1297
  write_tick_label_pos(y_axis.label_position)
1364
1298
 
@@ -1581,6 +1515,15 @@ def write_major_tick_mark(val)
1581
1515
  @writer.empty_tag('c:majorTickMark', [ ['val', val] ])
1582
1516
  end
1583
1517
 
1518
+ #
1519
+ # Write the <c:minorTickMark> element.
1520
+ #
1521
+ def write_minor_tick_mark(val)
1522
+ return unless ptrue?(val)
1523
+
1524
+ @writer.empty_tag('c:minorTickMark', [ ['val', val] ])
1525
+ end
1526
+
1584
1527
  #
1585
1528
  # Write the <c:tickLblPos> element.
1586
1529
  #
@@ -1625,6 +1568,12 @@ def write_auto(val) # :nodoc:
1625
1568
  # Write the <c:labelAlign> element.
1626
1569
  #
1627
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
1628
1577
  @writer.empty_tag('c:lblAlgn', [ ['val', val] ])
1629
1578
  end
1630
1579
 
@@ -1727,10 +1676,10 @@ def write_c_minor_time_unit(val) # :nodoc:
1727
1676
  # Write the <c:legend> element.
1728
1677
  #
1729
1678
  def write_legend # :nodoc:
1730
- position = @legend_position.sub(/^overlay_/, '')
1679
+ position = @legend.position.sub(/^overlay_/, '')
1731
1680
  return if position == 'none' || (not position_allowed.has_key?(position))
1732
1681
 
1733
- @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)
1734
1683
  @writer.tag_elements('c:legend') do
1735
1684
  # Write the c:legendPos element.
1736
1685
  write_legend_pos(position_allowed[position])
@@ -1738,20 +1687,23 @@ def write_legend # :nodoc:
1738
1687
  # Write the c:legendEntry element.
1739
1688
  @delete_series.each { |i| write_legend_entry(i) } if @delete_series
1740
1689
  # Write the c:layout element.
1741
- write_layout(@legend_layout, 'legend')
1742
- # Write the c:txPr element.
1743
- write_tx_pr(nil, @legend_font) if ptrue?(@legend_font)
1690
+ write_layout(@legend.layout, 'legend')
1744
1691
  # Write the c:overlay element.
1745
- 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)
1746
1697
  end
1747
1698
  end
1748
1699
 
1749
1700
  def position_allowed
1750
1701
  {
1751
- 'right' => 'r',
1752
- 'left' => 'l',
1753
- 'top' => 't',
1754
- 'bottom' => 'b'
1702
+ 'right' => 'r',
1703
+ 'left' => 'l',
1704
+ 'top' => 't',
1705
+ 'bottom' => 'b',
1706
+ 'top_right' => 'tr'
1755
1707
  }
1756
1708
  end
1757
1709
 
@@ -1923,26 +1875,6 @@ def write_rich(title, horiz) # :nodoc:
1923
1875
  write_a_p_rich(title)
1924
1876
  end
1925
1877
  end
1926
-
1927
- #
1928
- # Write the <a:bodyPr> element.
1929
- #
1930
- def write_a_body_pr(rot, horiz = nil) # :nodoc:
1931
- rot = -5400000 if !rot && ptrue?(horiz)
1932
- attributes = []
1933
- attributes << ['rot', rot] if rot
1934
- attributes << ['vert', 'horz'] if ptrue?(horiz)
1935
-
1936
- @writer.empty_tag('a:bodyPr', attributes)
1937
- end
1938
-
1939
- #
1940
- # Write the <a:lstStyle> element.
1941
- #
1942
- def write_a_lst_style # :nodoc:
1943
- @writer.empty_tag('a:lstStyle')
1944
- end
1945
-
1946
1878
  #
1947
1879
  # Write the <a:p> element for rich string titles.
1948
1880
  #
@@ -1955,18 +1887,6 @@ def write_a_p_rich(title) # :nodoc:
1955
1887
  end
1956
1888
  end
1957
1889
 
1958
- #
1959
- # Write the <a:p> element for formula titles.
1960
- #
1961
- def write_a_p_formula(font = nil) # :nodoc:
1962
- @writer.tag_elements('a:p') do
1963
- # Write the a:pPr element.
1964
- write_a_p_pr_formula(font)
1965
- # Write the a:endParaRPr element.
1966
- write_a_end_para_rpr
1967
- end
1968
- end
1969
-
1970
1890
  #
1971
1891
  # Write the <a:pPr> element for rich string titles.
1972
1892
  #
@@ -1974,30 +1894,6 @@ def write_a_p_pr_rich(font) # :nodoc:
1974
1894
  @writer.tag_elements('a:pPr') { write_a_def_rpr(font) }
1975
1895
  end
1976
1896
 
1977
- #
1978
- # Write the <a:pPr> element for formula titles.
1979
- #
1980
- def write_a_p_pr_formula(font) # :nodoc:
1981
- @writer.tag_elements('a:pPr') { write_a_def_rpr(font) }
1982
- end
1983
-
1984
- #
1985
- # Write the <a:defRPr> element.
1986
- #
1987
- def write_a_def_rpr(font = nil) # :nodoc:
1988
- write_def_rpr_r_pr_common(
1989
- font,
1990
- get_font_style_attributes(font),
1991
- 'a:defRPr')
1992
- end
1993
-
1994
- #
1995
- # Write the <a:endParaRPr> element.
1996
- #
1997
- def write_a_end_para_rpr # :nodoc:
1998
- @writer.empty_tag('a:endParaRPr', [ ['lang', 'en-US'] ])
1999
- end
2000
-
2001
1897
  #
2002
1898
  # Write the <a:r> element.
2003
1899
  #
@@ -2021,24 +1917,6 @@ def write_a_r_pr(font) # :nodoc:
2021
1917
  write_def_rpr_r_pr_common(font, attributes, 'a:rPr')
2022
1918
  end
2023
1919
 
2024
- def write_def_rpr_r_pr_common(font, style_attributes, tag) # :nodoc:
2025
- latin_attributes = get_font_latin_attributes(font)
2026
- has_color = ptrue?(font) && ptrue?(font[:_color])
2027
-
2028
- if !latin_attributes.empty? || has_color
2029
- @writer.tag_elements(tag, style_attributes) do
2030
- if has_color
2031
- write_a_solid_fill(:color => font[:_color])
2032
- end
2033
- if !latin_attributes.empty?
2034
- write_a_latin(latin_attributes)
2035
- end
2036
- end
2037
- else
2038
- @writer.empty_tag(tag, style_attributes)
2039
- end
2040
- end
2041
-
2042
1920
  #
2043
1921
  # Write the <a:t> element.
2044
1922
  #
@@ -2046,24 +1924,6 @@ def write_a_t(title) # :nodoc:
2046
1924
  @writer.data_element('a:t', title)
2047
1925
  end
2048
1926
 
2049
- #
2050
- # Write the <c:txPr> element.
2051
- #
2052
- def write_tx_pr(horiz, font) # :nodoc:
2053
- rotation = nil
2054
- if font && font[:_rotation]
2055
- rotation = font[:_rotation]
2056
- end
2057
- @writer.tag_elements('c:txPr') do
2058
- # Write the a:bodyPr element.
2059
- write_a_body_pr(rotation, horiz)
2060
- # Write the a:lstStyle element.
2061
- write_a_lst_style
2062
- # Write the a:p element.
2063
- write_a_p_formula(font)
2064
- end
2065
- end
2066
-
2067
1927
  #
2068
1928
  # Write the <c:marker> element.
2069
1929
  #
@@ -2185,20 +2045,12 @@ def write_a_no_fill # :nodoc:
2185
2045
  end
2186
2046
 
2187
2047
  #
2188
- # Write the <a:solidFill> element.
2048
+ # Write the <a:alpha> element.
2189
2049
  #
2190
- def write_a_solid_fill(line) # :nodoc:
2191
- @writer.tag_elements('a:solidFill') do
2192
- # Write the a:srgbClr element.
2193
- write_a_srgb_clr(color(line[:color])) if line[:color]
2194
- end
2195
- end
2050
+ def write_a_alpha(val)
2051
+ val = (100 - val.to_i) * 1000
2196
2052
 
2197
- #
2198
- # Write the <a:srgbClr> element.
2199
- #
2200
- def write_a_srgb_clr(val) # :nodoc:
2201
- @writer.empty_tag('a:srgbClr', [ ['val', val] ])
2053
+ @writer.empty_tag('a:alpha', [ ['val', val] ])
2202
2054
  end
2203
2055
 
2204
2056
  #
@@ -2229,6 +2081,20 @@ def write_trendline(trendline) # :nodoc:
2229
2081
  write_forward(trendline.forward)
2230
2082
  # Write the c:backward element.
2231
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
2232
2098
  end
2233
2099
  end
2234
2100
 
@@ -2280,6 +2146,54 @@ def write_backward(val) # :nodoc:
2280
2146
  @writer.empty_tag('c:backward', [ ['val', val] ])
2281
2147
  end
2282
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
+
2283
2197
  #
2284
2198
  # Write the <c:hiLowLines> element.
2285
2199
  #