write_xlsx 0.99.0 → 1.07.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (314) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.travis.yml +0 -1
  4. data/Changes +70 -0
  5. data/README.md +1 -1
  6. data/examples/a_simple.rb +1 -1
  7. data/examples/add_vba_project.rb +1 -1
  8. data/examples/array_formula.rb +1 -1
  9. data/examples/chart_area.rb +5 -2
  10. data/examples/chart_bar.rb +5 -2
  11. data/examples/chart_clustered.rb +1 -1
  12. data/examples/chart_column.rb +5 -2
  13. data/examples/chart_combined.rb +1 -1
  14. data/examples/chart_data_labels.rb +320 -0
  15. data/examples/chart_data_table.rb +9 -3
  16. data/examples/chart_data_tools.rb +25 -7
  17. data/examples/chart_doughnut.rb +17 -5
  18. data/examples/chart_gauge.rb +73 -0
  19. data/examples/chart_line.rb +90 -12
  20. data/examples/chart_pareto.rb +1 -1
  21. data/examples/chart_pie.rb +9 -3
  22. data/examples/chart_radar.rb +13 -4
  23. data/examples/chart_scatter.rb +5 -2
  24. data/examples/chart_secondary_axis.rb +5 -2
  25. data/examples/chart_stock.rb +1 -1
  26. data/examples/chart_styles.rb +1 -1
  27. data/examples/colors.rb +1 -1
  28. data/examples/data_validate.rb +1 -1
  29. data/examples/date_time.rb +1 -1
  30. data/examples/demo.rb +4 -1
  31. data/examples/formats.rb +1 -1
  32. data/examples/headers.rb +1 -1
  33. data/examples/hide_row_col.rb +1 -1
  34. data/examples/hide_sheet.rb +1 -1
  35. data/examples/hyperlink1.rb +1 -1
  36. data/examples/indent.rb +1 -1
  37. data/examples/macros.rb +1 -1
  38. data/examples/merge1.rb +1 -1
  39. data/examples/merge2.rb +1 -1
  40. data/examples/merge3.rb +1 -1
  41. data/examples/merge4.rb +1 -1
  42. data/examples/merge5.rb +1 -1
  43. data/examples/merge6.rb +1 -1
  44. data/examples/outline.rb +1 -1
  45. data/examples/outline_collapsed.rb +1 -1
  46. data/examples/panes.rb +1 -1
  47. data/examples/properties.rb +1 -1
  48. data/examples/regions.rb +1 -1
  49. data/examples/rich_strings.rb +1 -1
  50. data/examples/right_to_left.rb +1 -1
  51. data/examples/shape1.rb +1 -1
  52. data/examples/shape2.rb +1 -1
  53. data/examples/shape3.rb +1 -1
  54. data/examples/shape4.rb +1 -1
  55. data/examples/shape5.rb +1 -1
  56. data/examples/shape6.rb +1 -1
  57. data/examples/shape7.rb +1 -1
  58. data/examples/shape8.rb +1 -1
  59. data/examples/shape_all.rb +1 -1
  60. data/examples/sparklines1.rb +1 -1
  61. data/examples/sparklines2.rb +1 -1
  62. data/examples/stats.rb +1 -1
  63. data/examples/stats_ext.rb +1 -1
  64. data/examples/stocks.rb +1 -1
  65. data/examples/tab_colors.rb +1 -1
  66. data/examples/tables.rb +78 -43
  67. data/lib/write_xlsx/chart.rb +163 -34
  68. data/lib/write_xlsx/chart/area.rb +1 -1
  69. data/lib/write_xlsx/chart/bar.rb +1 -1
  70. data/lib/write_xlsx/chart/column.rb +1 -1
  71. data/lib/write_xlsx/chart/doughnut.rb +1 -1
  72. data/lib/write_xlsx/chart/line.rb +16 -2
  73. data/lib/write_xlsx/chart/pie.rb +21 -8
  74. data/lib/write_xlsx/chart/radar.rb +1 -1
  75. data/lib/write_xlsx/chart/scatter.rb +1 -1
  76. data/lib/write_xlsx/chart/series.rb +100 -0
  77. data/lib/write_xlsx/chart/stock.rb +1 -1
  78. data/lib/write_xlsx/chartsheet.rb +5 -5
  79. data/lib/write_xlsx/drawing.rb +86 -30
  80. data/lib/write_xlsx/format.rb +5 -5
  81. data/lib/write_xlsx/package/comments.rb +11 -11
  82. data/lib/write_xlsx/package/relationships.rb +4 -4
  83. data/lib/write_xlsx/package/styles.rb +26 -8
  84. data/lib/write_xlsx/package/table.rb +8 -7
  85. data/lib/write_xlsx/package/vml.rb +20 -19
  86. data/lib/write_xlsx/shape.rb +4 -3
  87. data/lib/write_xlsx/sheets.rb +18 -16
  88. data/lib/write_xlsx/sparkline.rb +1 -1
  89. data/lib/write_xlsx/utility.rb +40 -7
  90. data/lib/write_xlsx/version.rb +1 -1
  91. data/lib/write_xlsx/workbook.rb +69 -44
  92. data/lib/write_xlsx/worksheet.rb +206 -138
  93. data/lib/write_xlsx/worksheet/hyperlink.rb +16 -37
  94. data/test/drawing/test_drawing_chart_01.rb +6 -2
  95. data/test/drawing/test_drawing_image_01.rb +12 -3
  96. data/test/drawing/test_drawing_shape_01.rb +8 -5
  97. data/test/drawing/test_drawing_shape_02.rb +12 -5
  98. data/test/drawing/test_drawing_shape_03.rb +8 -5
  99. data/test/drawing/test_drawing_shape_04.rb +8 -24
  100. data/test/drawing/test_drawing_shape_05.rb +8 -5
  101. data/test/drawing/test_drawing_shape_06.rb +11 -6
  102. data/test/drawing/test_drawing_shape_07.rb +11 -6
  103. data/test/drawing/test_write_a_graphic_frame_locks.rb +1 -1
  104. data/test/drawing/test_write_c_chart.rb +1 -1
  105. data/test/drawing/test_write_c_nv_graphic_frame_pr.rb +1 -1
  106. data/test/drawing/test_write_c_nv_pr.rb +1 -1
  107. data/test/drawing/test_write_col.rb +1 -1
  108. data/test/drawing/test_write_col_off.rb +1 -1
  109. data/test/drawing/test_write_ext.rb +1 -1
  110. data/test/drawing/test_write_pos.rb +1 -1
  111. data/test/drawing/test_write_row.rb +1 -1
  112. data/test/drawing/test_write_row_off.rb +1 -1
  113. data/test/drawing/test_write_xfrm_extension.rb +1 -1
  114. data/test/drawing/test_write_xfrm_offset.rb +1 -1
  115. data/test/perl_output/chart_data_labels.xlsx +0 -0
  116. data/test/perl_output/chart_gauge.xlsx +0 -0
  117. data/test/perl_output/chart_line.xlsx +0 -0
  118. data/test/perl_output/comments2.xlsx +0 -0
  119. data/test/perl_output/tables.xlsx +0 -0
  120. data/test/regression/images/red2.png +0 -0
  121. data/test/regression/test_array_formula04.rb +31 -0
  122. data/test/regression/test_chart_axis26.rb +10 -8
  123. data/test/regression/test_chart_axis27.rb +1 -1
  124. data/test/regression/test_chart_axis28.rb +1 -1
  125. data/test/regression/test_chart_axis29.rb +1 -1
  126. data/test/regression/test_chart_axis33.rb +1 -1
  127. data/test/regression/test_chart_axis44.rb +54 -0
  128. data/test/regression/test_chart_axis45.rb +54 -0
  129. data/test/regression/test_chart_axis46.rb +54 -0
  130. data/test/regression/test_chart_combined10.rb +43 -0
  131. data/test/regression/test_chart_combined11.rb +63 -0
  132. data/test/regression/test_chart_data_labels25.rb +1 -1
  133. data/test/regression/test_chart_data_labels26.rb +44 -0
  134. data/test/regression/test_chart_data_labels27.rb +44 -0
  135. data/test/regression/test_chart_data_labels28.rb +52 -0
  136. data/test/regression/test_chart_data_labels29.rb +43 -0
  137. data/test/regression/test_chart_data_labels30.rb +46 -0
  138. data/test/regression/test_chart_data_labels31.rb +49 -0
  139. data/test/regression/test_chart_data_labels32.rb +54 -0
  140. data/test/regression/test_chart_data_labels33.rb +52 -0
  141. data/test/regression/test_chart_data_labels34.rb +54 -0
  142. data/test/regression/test_chart_data_labels35.rb +46 -0
  143. data/test/regression/test_chart_data_labels36.rb +54 -0
  144. data/test/regression/test_chart_data_labels37.rb +51 -0
  145. data/test/regression/test_chart_data_labels38.rb +54 -0
  146. data/test/regression/test_chart_data_labels39.rb +53 -0
  147. data/test/regression/test_chart_data_labels40.rb +53 -0
  148. data/test/regression/test_chart_data_labels41.rb +54 -0
  149. data/test/regression/test_chart_data_labels42.rb +58 -0
  150. data/test/regression/test_chart_data_labels43.rb +58 -0
  151. data/test/regression/test_chart_data_labels44.rb +56 -0
  152. data/test/regression/test_chart_data_labels45.rb +57 -0
  153. data/test/regression/test_chart_data_labels46.rb +61 -0
  154. data/test/regression/test_chart_data_labels47.rb +61 -0
  155. data/test/regression/test_chart_doughnut07.rb +37 -0
  156. data/test/regression/test_chart_font09.rb +1 -1
  157. data/test/regression/test_chart_line05.rb +43 -0
  158. data/test/regression/test_chart_line06.rb +43 -0
  159. data/test/regression/test_chart_size03.rb +4 -1
  160. data/test/regression/test_comment14.rb +29 -0
  161. data/test/regression/test_comment15.rb +28 -0
  162. data/test/regression/test_comment16.rb +34 -0
  163. data/test/regression/test_header_image15.rb +36 -0
  164. data/test/regression/test_header_image16.rb +42 -0
  165. data/test/regression/test_header_image17.rb +46 -0
  166. data/test/regression/test_header_image18.rb +48 -0
  167. data/test/regression/test_header_image19.rb +36 -0
  168. data/test/regression/test_hyperlink32.rb +27 -0
  169. data/test/regression/test_hyperlink33.rb +28 -0
  170. data/test/regression/test_hyperlink34.rb +33 -0
  171. data/test/regression/test_hyperlink35.rb +39 -0
  172. data/test/regression/test_hyperlink36.rb +34 -0
  173. data/test/regression/test_hyperlink37.rb +33 -0
  174. data/test/regression/test_hyperlink38.rb +27 -0
  175. data/test/regression/test_hyperlink39.rb +27 -0
  176. data/test/regression/test_hyperlink40.rb +27 -0
  177. data/test/regression/test_hyperlink41.rb +27 -0
  178. data/test/regression/test_hyperlink42.rb +27 -0
  179. data/test/regression/test_hyperlink43.rb +27 -0
  180. data/test/regression/test_hyperlink44.rb +27 -0
  181. data/test/regression/test_hyperlink45.rb +27 -0
  182. data/test/regression/test_hyperlink47.rb +27 -0
  183. data/test/regression/test_hyperlink48.rb +31 -0
  184. data/test/regression/test_hyperlink49.rb +29 -0
  185. data/test/regression/test_image06.rb +5 -5
  186. data/test/regression/test_image08.rb +5 -4
  187. data/test/regression/test_image15.rb +4 -2
  188. data/test/regression/test_image28.rb +1 -1
  189. data/test/regression/test_image44.rb +28 -0
  190. data/test/regression/test_image45.rb +29 -0
  191. data/test/regression/test_image46.rb +29 -0
  192. data/test/regression/test_image47.rb +28 -0
  193. data/test/regression/test_image48.rb +32 -0
  194. data/test/regression/test_image49.rb +38 -0
  195. data/test/regression/test_image50.rb +24 -0
  196. data/test/regression/test_image51.rb +30 -0
  197. data/test/regression/test_object_position01.rb +26 -0
  198. data/test/regression/test_object_position02.rb +26 -0
  199. data/test/regression/test_object_position03.rb +26 -0
  200. data/test/regression/test_object_position04.rb +44 -0
  201. data/test/regression/test_object_position06.rb +28 -0
  202. data/test/regression/test_object_position07.rb +28 -0
  203. data/test/regression/test_object_position08.rb +47 -0
  204. data/test/regression/test_object_position09.rb +50 -0
  205. data/test/regression/test_object_position10.rb +28 -0
  206. data/test/regression/test_object_position12.rb +25 -0
  207. data/test/regression/test_object_position13.rb +25 -0
  208. data/test/regression/test_object_position14.rb +25 -0
  209. data/test/regression/test_object_position15.rb +29 -0
  210. data/test/regression/test_object_position16.rb +29 -0
  211. data/test/regression/test_object_position17.rb +29 -0
  212. data/test/regression/test_object_position18.rb +29 -0
  213. data/test/regression/test_object_position19.rb +29 -0
  214. data/test/regression/test_object_position20.rb +29 -0
  215. data/test/regression/test_shape_connect01.rb +4 -2
  216. data/test/regression/test_table24.rb +27 -0
  217. data/test/regression/test_table25.rb +27 -0
  218. data/test/regression/xlsx_files/array_formula04.xlsx +0 -0
  219. data/test/regression/xlsx_files/chart_axis26.xlsx +0 -0
  220. data/test/regression/xlsx_files/chart_axis27.xlsx +0 -0
  221. data/test/regression/xlsx_files/chart_axis28.xlsx +0 -0
  222. data/test/regression/xlsx_files/chart_axis29.xlsx +0 -0
  223. data/test/regression/xlsx_files/chart_axis33.xlsx +0 -0
  224. data/test/regression/xlsx_files/chart_axis44.xlsx +0 -0
  225. data/test/regression/xlsx_files/chart_axis45.xlsx +0 -0
  226. data/test/regression/xlsx_files/chart_axis46.xlsx +0 -0
  227. data/test/regression/xlsx_files/chart_combined10.xlsx +0 -0
  228. data/test/regression/xlsx_files/chart_combined11.xlsx +0 -0
  229. data/test/regression/xlsx_files/chart_data_labels25.xlsx +0 -0
  230. data/test/regression/xlsx_files/chart_data_labels26.xlsx +0 -0
  231. data/test/regression/xlsx_files/chart_data_labels27.xlsx +0 -0
  232. data/test/regression/xlsx_files/chart_data_labels28.xlsx +0 -0
  233. data/test/regression/xlsx_files/chart_data_labels29.xlsx +0 -0
  234. data/test/regression/xlsx_files/chart_data_labels30.xlsx +0 -0
  235. data/test/regression/xlsx_files/chart_data_labels31.xlsx +0 -0
  236. data/test/regression/xlsx_files/chart_data_labels32.xlsx +0 -0
  237. data/test/regression/xlsx_files/chart_data_labels33.xlsx +0 -0
  238. data/test/regression/xlsx_files/chart_data_labels34.xlsx +0 -0
  239. data/test/regression/xlsx_files/chart_data_labels35.xlsx +0 -0
  240. data/test/regression/xlsx_files/chart_data_labels36.xlsx +0 -0
  241. data/test/regression/xlsx_files/chart_data_labels37.xlsx +0 -0
  242. data/test/regression/xlsx_files/chart_data_labels38.xlsx +0 -0
  243. data/test/regression/xlsx_files/chart_data_labels39.xlsx +0 -0
  244. data/test/regression/xlsx_files/chart_data_labels40.xlsx +0 -0
  245. data/test/regression/xlsx_files/chart_data_labels41.xlsx +0 -0
  246. data/test/regression/xlsx_files/chart_data_labels42.xlsx +0 -0
  247. data/test/regression/xlsx_files/chart_data_labels43.xlsx +0 -0
  248. data/test/regression/xlsx_files/chart_data_labels44.xlsx +0 -0
  249. data/test/regression/xlsx_files/chart_data_labels45.xlsx +0 -0
  250. data/test/regression/xlsx_files/chart_data_labels46.xlsx +0 -0
  251. data/test/regression/xlsx_files/chart_data_labels47.xlsx +0 -0
  252. data/test/regression/xlsx_files/chart_doughnut07.xlsx +0 -0
  253. data/test/regression/xlsx_files/chart_font09.xlsx +0 -0
  254. data/test/regression/xlsx_files/chart_line05.xlsx +0 -0
  255. data/test/regression/xlsx_files/chart_line06.xlsx +0 -0
  256. data/test/regression/xlsx_files/comment14.xlsx +0 -0
  257. data/test/regression/xlsx_files/comment15.xlsx +0 -0
  258. data/test/regression/xlsx_files/comment16.xlsx +0 -0
  259. data/test/regression/xlsx_files/header_image15.xlsx +0 -0
  260. data/test/regression/xlsx_files/header_image16.xlsx +0 -0
  261. data/test/regression/xlsx_files/header_image17.xlsx +0 -0
  262. data/test/regression/xlsx_files/header_image18.xlsx +0 -0
  263. data/test/regression/xlsx_files/header_image19.xlsx +0 -0
  264. data/test/regression/xlsx_files/hyperlink32.xlsx +0 -0
  265. data/test/regression/xlsx_files/hyperlink33.xlsx +0 -0
  266. data/test/regression/xlsx_files/hyperlink34.xlsx +0 -0
  267. data/test/regression/xlsx_files/hyperlink35.xlsx +0 -0
  268. data/test/regression/xlsx_files/hyperlink36.xlsx +0 -0
  269. data/test/regression/xlsx_files/hyperlink37.xlsx +0 -0
  270. data/test/regression/xlsx_files/hyperlink38.xlsx +0 -0
  271. data/test/regression/xlsx_files/hyperlink39.xlsx +0 -0
  272. data/test/regression/xlsx_files/hyperlink40.xlsx +0 -0
  273. data/test/regression/xlsx_files/hyperlink41.xlsx +0 -0
  274. data/test/regression/xlsx_files/hyperlink42.xlsx +0 -0
  275. data/test/regression/xlsx_files/hyperlink43.xlsx +0 -0
  276. data/test/regression/xlsx_files/hyperlink44.xlsx +0 -0
  277. data/test/regression/xlsx_files/hyperlink45.xlsx +0 -0
  278. data/test/regression/xlsx_files/hyperlink46.xlsx +0 -0
  279. data/test/regression/xlsx_files/hyperlink47.xlsx +0 -0
  280. data/test/regression/xlsx_files/hyperlink48.xlsx +0 -0
  281. data/test/regression/xlsx_files/hyperlink49.xlsx +0 -0
  282. data/test/regression/xlsx_files/image06.xlsx +0 -0
  283. data/test/regression/xlsx_files/image44.xlsx +0 -0
  284. data/test/regression/xlsx_files/image45.xlsx +0 -0
  285. data/test/regression/xlsx_files/image46.xlsx +0 -0
  286. data/test/regression/xlsx_files/image47.xlsx +0 -0
  287. data/test/regression/xlsx_files/image48.xlsx +0 -0
  288. data/test/regression/xlsx_files/image49.xlsx +0 -0
  289. data/test/regression/xlsx_files/image50.xlsx +0 -0
  290. data/test/regression/xlsx_files/image51.xlsx +0 -0
  291. data/test/regression/xlsx_files/object_position01.xlsx +0 -0
  292. data/test/regression/xlsx_files/object_position02.xlsx +0 -0
  293. data/test/regression/xlsx_files/object_position03.xlsx +0 -0
  294. data/test/regression/xlsx_files/object_position04.xlsx +0 -0
  295. data/test/regression/xlsx_files/object_position06.xlsx +0 -0
  296. data/test/regression/xlsx_files/object_position07.xlsx +0 -0
  297. data/test/regression/xlsx_files/object_position08.xlsx +0 -0
  298. data/test/regression/xlsx_files/object_position09.xlsx +0 -0
  299. data/test/regression/xlsx_files/object_position10.xlsx +0 -0
  300. data/test/regression/xlsx_files/object_position12.xlsx +0 -0
  301. data/test/regression/xlsx_files/object_position13.xlsx +0 -0
  302. data/test/regression/xlsx_files/object_position14.xlsx +0 -0
  303. data/test/regression/xlsx_files/object_position15.xlsx +0 -0
  304. data/test/regression/xlsx_files/object_position16.xlsx +0 -0
  305. data/test/regression/xlsx_files/object_position17.xlsx +0 -0
  306. data/test/regression/xlsx_files/object_position18.xlsx +0 -0
  307. data/test/regression/xlsx_files/object_position19.xlsx +0 -0
  308. data/test/regression/xlsx_files/object_position20.xlsx +0 -0
  309. data/test/regression/xlsx_files/table24.xlsx +0 -0
  310. data/test/regression/xlsx_files/table25.xlsx +0 -0
  311. data/test/test_example_match.rb +1268 -780
  312. data/test/workbook/test_check_sheetname.rb +51 -0
  313. data/write_xlsx.gemspec +1 -0
  314. metadata +367 -5
@@ -5,7 +5,7 @@
5
5
  # Example of how to set Excel worksheet tab colours.
6
6
  #
7
7
  # reverse(c), May 2006, John McNamara, jmcnamara@cpan.org
8
- # convert to ruby by Hideo NAKAMURA, cxn03651@msj.biglobe.ne.jp
8
+ # convert to ruby by Hideo NAKAMURA, nakamura.hideo@gmail.com
9
9
  #
10
10
 
11
11
  require 'write_xlsx'
data/examples/tables.rb CHANGED
@@ -9,7 +9,7 @@
9
9
  # structure that can be references in a formula or formatted collectively.
10
10
  #
11
11
  # reverse(c), March 2001, John McNamara, jmcnamara@cpan.org
12
- # convert to ruby by Hideo NAKAMURA, cxn03651@msj.biglobe.ne.jp
12
+ # convert to ruby by Hideo NAKAMURA, nakamura.hideo@gmail.com
13
13
  #
14
14
 
15
15
  require 'write_xlsx'
@@ -28,6 +28,7 @@
28
28
  worksheet10 = workbook.add_worksheet
29
29
  worksheet11 = workbook.add_worksheet
30
30
  worksheet12 = workbook.add_worksheet
31
+ worksheet13 = workbook.add_worksheet
31
32
 
32
33
  currency_format = workbook.add_format(:num_format => '$#,##0')
33
34
 
@@ -60,7 +61,7 @@
60
61
  #
61
62
  # Example 2.
62
63
  #
63
- caption = 'Default table with data.';
64
+ caption = 'Default table with data.'
64
65
 
65
66
  # Set the columns widths.
66
67
  worksheet2.set_column('B:G', 12)
@@ -130,7 +131,7 @@
130
131
  #
131
132
  # Example 6.
132
133
  #
133
- caption = 'Table with banded columns but without default banded rows.';
134
+ caption = 'Table with banded columns but without default banded rows.'
134
135
 
135
136
  # Set the columns widths.
136
137
  worksheet6.set_column('B:G', 12)
@@ -149,7 +150,7 @@
149
150
  #
150
151
  # Example 7.
151
152
  #
152
- caption = 'Table with user defined column headers';
153
+ caption = 'Table with user defined column headers'
153
154
 
154
155
  # Set the columns widths.
155
156
  worksheet7.set_column('B:G', 12)
@@ -176,7 +177,7 @@
176
177
  #
177
178
  # Example 8.
178
179
  #
179
- caption = 'Table with user defined column headers';
180
+ caption = 'Table with user defined column headers'
180
181
 
181
182
  # Set the columns widths.
182
183
  worksheet8.set_column('B:G', 12)
@@ -208,7 +209,7 @@
208
209
  #
209
210
  # Example 9.
210
211
  #
211
- caption = 'Table with totals row (but no caption or totals).';
212
+ caption = 'Table with totals row (but no caption or totals).'
212
213
 
213
214
  # Set the columns widths.
214
215
  worksheet9.set_column('B:G', 12)
@@ -241,7 +242,7 @@
241
242
  #
242
243
  # Example 10.
243
244
  #
244
- caption = 'Table with totals row with user captions and functions.';
245
+ caption = 'Table with totals row with user captions and functions.'
245
246
 
246
247
  # Set the columns widths.
247
248
  worksheet10.set_column('B:G', 12)
@@ -275,7 +276,7 @@
275
276
  #
276
277
  # Example 11.
277
278
  #
278
- caption = 'Table with alternative Excel style.';
279
+ caption = 'Table with alternative Excel style.'
279
280
 
280
281
  # Set the columns widths.
281
282
  worksheet11.set_column('B:G', 12)
@@ -310,7 +311,7 @@
310
311
  #
311
312
  # Example 12.
312
313
  #
313
- caption = 'Table with column formats.';
314
+ caption = 'Table with no Excel style.'
314
315
 
315
316
  # Set the columns widths.
316
317
  worksheet12.set_column('B:G', 12)
@@ -320,40 +321,74 @@
320
321
 
321
322
  # Add a table to the worksheet.
322
323
  worksheet12.add_table(
323
- 'B3:G8',
324
- {
325
- :data => data,
326
- :total_row => 1,
327
- :columns => [
328
- { :header => 'Product', :total_string => 'Totals' },
329
- {
330
- :header => 'Quarter 1',
331
- :total_function => 'sum',
332
- :format => currency_format,
333
- },
334
- {
335
- :header => 'Quarter 2',
336
- :total_function => 'sum',
337
- :format => currency_format,
338
- },
339
- {
340
- :header => 'Quarter 3',
341
- :total_function => 'sum',
342
- :format => currency_format,
343
- },
344
- {
345
- :header => 'Quarter 4',
346
- :total_function => 'sum',
347
- :format => currency_format,
348
- },
349
- {
350
- :header => 'Year',
351
- :formula => '=SUM(Table8[@[Quarter 1]:[Quarter 4]])',
352
- :total_function => 'sum',
353
- :format => currency_format,
354
- }
355
- ]
356
- }
324
+ 'B3:G8',
325
+ {
326
+ :data => data,
327
+ :style => 'None',
328
+ :total_row => 1,
329
+ :columns => [
330
+ { :header => 'Product', :total_string => 'Totals' },
331
+ { :header => 'Quarter 1', :total_function => 'sum' },
332
+ { :header => 'Quarter 2', :total_function => 'sum' },
333
+ { :header => 'Quarter 3', :total_function => 'sum' },
334
+ { :header => 'Quarter 4', :total_function => 'sum' },
335
+ {
336
+ :header => 'Year',
337
+ :formula => '=SUM(Table12[@[Quarter 1]:[Quarter 4]])',
338
+ :total_function => 'sum'
339
+ }
340
+ ]
341
+ }
342
+ )
343
+
344
+ ###############################################################################
345
+ #
346
+ # Example 13.
347
+ #
348
+ caption = 'Table with column formats.'
349
+
350
+ # Set the columns widths.
351
+ worksheet13.set_column('B:G', 12)
352
+
353
+ # Write the caption.
354
+ worksheet13.write('B1', caption)
355
+
356
+ # Add a table to the worksheet.
357
+ worksheet13.add_table(
358
+ 'B3:G8',
359
+ {
360
+ :data => data,
361
+ :total_row => 1,
362
+ :columns => [
363
+ { :header => 'Product', :total_string => 'Totals' },
364
+ {
365
+ :header => 'Quarter 1',
366
+ :total_function => 'sum',
367
+ :format => currency_format,
368
+ },
369
+ {
370
+ :header => 'Quarter 2',
371
+ :total_function => 'sum',
372
+ :format => currency_format,
373
+ },
374
+ {
375
+ :header => 'Quarter 3',
376
+ :total_function => 'sum',
377
+ :format => currency_format,
378
+ },
379
+ {
380
+ :header => 'Quarter 4',
381
+ :total_function => 'sum',
382
+ :format => currency_format,
383
+ },
384
+ {
385
+ :header => 'Year',
386
+ :formula => '=SUM(Table8[@[Quarter 1]:[Quarter 4]])',
387
+ :total_function => 'sum',
388
+ :format => currency_format,
389
+ }
390
+ ]
391
+ }
357
392
  )
358
393
 
359
394
  workbook.close
@@ -34,7 +34,7 @@ def write_d_table(writer)
34
34
  @writer.empty_tag('c:showOutline', attributes) if ptrue?(outline)
35
35
  @writer.empty_tag('c:showKeys', attributes) if ptrue?(show_keys)
36
36
  # Write the table font.
37
- write_tx_pr(nil, font) if ptrue?(font)
37
+ write_tx_pr(font) if ptrue?(font)
38
38
  end
39
39
  end
40
40
 
@@ -783,7 +783,7 @@ def write_chart # :nodoc:
783
783
  elsif @title.formula
784
784
  write_title_formula(@title, nil, nil, @title.layout, @title.overlay)
785
785
  elsif @title.name
786
- write_title_rich(@title, nil, @title.layout, @title.overlay)
786
+ write_title_rich(@title, nil, @title.name_font, @title.layout, @title.overlay)
787
787
  end
788
788
 
789
789
  # Write the c:plotArea element.
@@ -1178,8 +1178,8 @@ def write_cat_axis(params) # :nodoc:
1178
1178
  return unless axis_ids
1179
1179
  return if axis_ids.empty?
1180
1180
 
1181
- position = @cat_axis_position
1182
- horiz = @horiz_cat_axis
1181
+ position = @cat_axis_position
1182
+ is_y_axis = @horiz_cat_axis
1183
1183
 
1184
1184
  # Overwrite the default axis position with a user supplied value.
1185
1185
  position = x_axis.position || position
@@ -1202,9 +1202,9 @@ def write_cat_axis(params) # :nodoc:
1202
1202
 
1203
1203
  # Write the axis title elements.
1204
1204
  if x_axis.formula
1205
- write_title_formula(x_axis, horiz, @x_axis, x_axis.layout)
1205
+ write_title_formula(x_axis, is_y_axis, @x_axis, x_axis.layout)
1206
1206
  elsif x_axis.name
1207
- write_title_rich(x_axis, horiz, x_axis.layout)
1207
+ write_title_rich(x_axis, is_y_axis, x_axis.name_font, x_axis.layout)
1208
1208
  end
1209
1209
 
1210
1210
  # Write the c:numFmt element.
@@ -1281,7 +1281,7 @@ def write_val_axis_base(x_axis, y_axis, axis_ids_0, axis_ids_1, position) # :no
1281
1281
  if y_axis.formula
1282
1282
  write_title_formula(y_axis, @horiz_val_axis, nil, y_axis.layout)
1283
1283
  elsif y_axis.name
1284
- write_title_rich(y_axis, @horiz_val_axis, y_axis.layout)
1284
+ write_title_rich(y_axis, @horiz_val_axis, y_axis.name_font, y_axis.layout)
1285
1285
  end
1286
1286
 
1287
1287
  # Write the c:numberFormat element.
@@ -1356,7 +1356,7 @@ def write_date_axis(params) # :nodoc:
1356
1356
  if x_axis.formula
1357
1357
  write_title_formula(x_axis, nil, nil, x_axis.layout)
1358
1358
  elsif x_axis.name
1359
- write_title_rich(x_axis, nil, x_axis.layout)
1359
+ write_title_rich(x_axis, nil, x_axis.name_font, x_axis.layout)
1360
1360
  end
1361
1361
  # Write the c:numFmt element.
1362
1362
  write_number_format(x_axis)
@@ -1693,7 +1693,7 @@ def write_legend # :nodoc:
1693
1693
  # Write the c:spPr element.
1694
1694
  write_sp_pr(@legend)
1695
1695
  # Write the c:txPr element.
1696
- write_tx_pr(nil, @legend.font) if ptrue?(@legend.font)
1696
+ write_tx_pr(@legend.font) if ptrue?(@legend.font)
1697
1697
  end
1698
1698
  end
1699
1699
 
@@ -1808,10 +1808,10 @@ def write_auto_title_deleted
1808
1808
  #
1809
1809
  # Write the <c:title> element for a rich string.
1810
1810
  #
1811
- def write_title_rich(title, horiz = nil, layout = nil, overlay = nil) # :nodoc:
1811
+ def write_title_rich(title, is_y_axis, font, layout, overlay = nil) # :nodoc:
1812
1812
  @writer.tag_elements('c:title') do
1813
1813
  # Write the c:tx element.
1814
- write_tx_rich(title, horiz)
1814
+ write_tx_rich(title, is_y_axis, font)
1815
1815
  # Write the c:layout element.
1816
1816
  write_layout(layout, 'text')
1817
1817
  # Write the c:overlay element.
@@ -1822,7 +1822,7 @@ def write_title_rich(title, horiz = nil, layout = nil, overlay = nil) # :nodoc:
1822
1822
  #
1823
1823
  # Write the <c:title> element for a rich string.
1824
1824
  #
1825
- def write_title_formula(title, horiz = nil, axis = nil, layout = nil, overlay = nil) # :nodoc:
1825
+ def write_title_formula(title, is_y_axis = nil, axis = nil, layout = nil, overlay = nil) # :nodoc:
1826
1826
  @writer.tag_elements('c:title') do
1827
1827
  # Write the c:tx element.
1828
1828
  write_tx_formula(title.formula, axis ? axis.data_id : title.data_id)
@@ -1831,15 +1831,17 @@ def write_title_formula(title, horiz = nil, axis = nil, layout = nil, overlay =
1831
1831
  # Write the c:overlay element.
1832
1832
  write_overlay if overlay
1833
1833
  # Write the c:txPr element.
1834
- write_tx_pr(horiz, axis ? axis.name_font : title.name_font)
1834
+ write_tx_pr(axis ? axis.name_font : title.name_font, is_y_axis)
1835
1835
  end
1836
1836
  end
1837
1837
 
1838
1838
  #
1839
1839
  # Write the <c:tx> element.
1840
1840
  #
1841
- def write_tx_rich(title, horiz) # :nodoc:
1842
- @writer.tag_elements('c:tx') { write_rich(title, horiz) }
1841
+ def write_tx_rich(title, is_y_axis, font) # :nodoc:
1842
+ @writer.tag_elements('c:tx') do
1843
+ write_rich(title, font, is_y_axis)
1844
+ end
1843
1845
  end
1844
1846
 
1845
1847
  #
@@ -1861,29 +1863,30 @@ def write_tx_formula(title, data_id) # :nodoc:
1861
1863
  #
1862
1864
  # Write the <c:rich> element.
1863
1865
  #
1864
- def write_rich(title, horiz) # :nodoc:
1866
+ def write_rich(title, font, is_y_axis, ignore_rich_pr = false) # :nodoc:
1865
1867
  rotation = nil
1866
- if title.name_font && title.name_font[:_rotation]
1867
- rotation = title.name_font[:_rotation]
1868
+
1869
+ if font && font[:_rotation]
1870
+ rotation = font[:_rotation]
1868
1871
  end
1869
1872
  @writer.tag_elements('c:rich') do
1870
1873
  # Write the a:bodyPr element.
1871
- write_a_body_pr(rotation, horiz)
1874
+ write_a_body_pr(rotation, is_y_axis)
1872
1875
  # Write the a:lstStyle element.
1873
1876
  write_a_lst_style
1874
1877
  # Write the a:p element.
1875
- write_a_p_rich(title)
1878
+ write_a_p_rich(title, font, ignore_rich_pr)
1876
1879
  end
1877
1880
  end
1878
1881
  #
1879
1882
  # Write the <a:p> element for rich string titles.
1880
1883
  #
1881
- def write_a_p_rich(title) # :nodoc:
1884
+ def write_a_p_rich(title, font, ignore_rich_pr) # :nodoc:
1882
1885
  @writer.tag_elements('a:p') do
1883
1886
  # Write the a:pPr element.
1884
- write_a_p_pr_rich(title.name_font)
1887
+ write_a_p_pr_rich(font) if !ignore_rich_pr
1885
1888
  # Write the a:r element.
1886
- write_a_r(title)
1889
+ write_a_r(title, font)
1887
1890
  end
1888
1891
  end
1889
1892
 
@@ -1897,12 +1900,12 @@ def write_a_p_pr_rich(font) # :nodoc:
1897
1900
  #
1898
1901
  # Write the <a:r> element.
1899
1902
  #
1900
- def write_a_r(title) # :nodoc:
1903
+ def write_a_r(title, font) # :nodoc:
1901
1904
  @writer.tag_elements('a:r') do
1902
1905
  # Write the a:rPr element.
1903
- write_a_r_pr(title.name_font)
1906
+ write_a_r_pr(font)
1904
1907
  # Write the a:t element.
1905
- write_a_t(title.name)
1908
+ write_a_t(title.respond_to?(:name) ? title.name : title)
1906
1909
  end
1907
1910
  end
1908
1911
 
@@ -1967,17 +1970,27 @@ def write_symbol(val) # :nodoc:
1967
1970
  @writer.empty_tag('c:symbol', [ ['val', val] ])
1968
1971
  end
1969
1972
 
1973
+ def has_fill_formatting(element)
1974
+ line = series_property(element, :line)
1975
+ fill = series_property(element, :fill)
1976
+ pattern = series_property(element, :pattern)
1977
+ gradient = series_property(element, :gradient)
1978
+
1979
+ (line && ptrue?(line[:_defined])) ||
1980
+ (fill && ptrue?(fill[:_defined])) || pattern || gradient
1981
+ end
1982
+
1983
+
1970
1984
  #
1971
1985
  # Write the <c:spPr> element.
1972
1986
  #
1973
1987
  def write_sp_pr(series) # :nodoc:
1974
- line = series.line
1975
- fill = series.fill
1976
- pattern = series.pattern if series.respond_to?(:pattern)
1977
- gradient = series.gradient if series.respond_to?(:gradient)
1988
+ return if !has_fill_formatting(series)
1978
1989
 
1979
- return if (!line || !ptrue?(line[:_defined])) &&
1980
- (!fill || !ptrue?(fill[:_defined])) && !pattern && !gradient
1990
+ line = series_property(series, :line)
1991
+ fill = series_property(series, :fill)
1992
+ pattern = series_property(series, :pattern)
1993
+ gradient = series_property(series, :gradient)
1981
1994
 
1982
1995
  @writer.tag_elements('c:spPr') do
1983
1996
  # Write the fill elements for solid charts such as pie/doughnut and bar.
@@ -2002,6 +2015,14 @@ def write_sp_pr(series) # :nodoc:
2002
2015
  end
2003
2016
  end
2004
2017
 
2018
+ def series_property(object, property)
2019
+ if object.respond_to?(property)
2020
+ object.send(property)
2021
+ elsif object.respond_to?(:[])
2022
+ object[property]
2023
+ end
2024
+ end
2025
+
2005
2026
  #
2006
2027
  # Write the <a:ln> element.
2007
2028
  #
@@ -2241,7 +2262,12 @@ def write_num_base(tag, data)
2241
2262
  write_format_code('General')
2242
2263
 
2243
2264
  # Write the c:ptCount element.
2244
- write_pt_count(data.size)
2265
+ if data
2266
+ count = data.size
2267
+ else
2268
+ count = 0
2269
+ end
2270
+ write_pt_count(count)
2245
2271
 
2246
2272
  data.each_with_index do |token, i|
2247
2273
  # Write non-numeric data as 0.
@@ -2344,8 +2370,14 @@ def write_d_lbls(labels) # :nodoc:
2344
2370
  return unless labels
2345
2371
 
2346
2372
  @writer.tag_elements('c:dLbls') do
2373
+ # Write the custom c:dLbl elements.
2374
+ if labels[:custom]
2375
+ write_custom_labels(labels, labels[:custom])
2376
+ end
2347
2377
  # Write the c:numFmt element.
2348
2378
  write_data_label_number_format(labels[:num_format]) if labels[:num_format]
2379
+ # Write the c:spPr element.
2380
+ write_sp_pr(labels)
2349
2381
  # Write the data label font elements.
2350
2382
  write_axis_font(labels[:font]) if labels[:font]
2351
2383
  # Write the c:dLblPos element.
@@ -2367,6 +2399,103 @@ def write_d_lbls(labels) # :nodoc:
2367
2399
  end
2368
2400
  end
2369
2401
 
2402
+ #
2403
+ # Write the <c:dLbl> element.
2404
+ #
2405
+ def write_custom_labels(parent, labels)
2406
+ index = 0
2407
+
2408
+ labels.each do |label|
2409
+ index += 1
2410
+ next if !ptrue?(label)
2411
+
2412
+ @writer.tag_elements('c:dLbl') do
2413
+ # Write the c:idx element.
2414
+ write_idx(index - 1)
2415
+
2416
+ if label[:delete] && label[:delete]
2417
+ write_delete(1)
2418
+ elsif label[:formula]
2419
+ write_custom_label_formula(label)
2420
+
2421
+ write_show_val if parent[:value]
2422
+ write_show_cat_name if parent[:category]
2423
+ write_show_ser_name if parent[:series_name]
2424
+ elsif label[:value]
2425
+ write_custom_label_str(label)
2426
+
2427
+ write_show_val if parent[:value]
2428
+ write_show_cat_name if parent[:category]
2429
+ write_show_ser_name if parent[:series_name]
2430
+ else
2431
+ write_custom_label_format_only(label)
2432
+ end
2433
+ end
2434
+ end
2435
+ end
2436
+
2437
+ #
2438
+ # Write parts of the <c:dLbl> element for strings.
2439
+ #
2440
+ def write_custom_label_str(label)
2441
+ value = label[:value]
2442
+ font = label[:font]
2443
+ is_y_axis = 0
2444
+ has_formatting = has_fill_formatting(label)
2445
+
2446
+ # Write the c:layout element.
2447
+ write_layout()
2448
+
2449
+ @writer.tag_elements('c:tx') do
2450
+ # Write the c:rich element.
2451
+ write_rich(value, font, is_y_axis, !has_formatting)
2452
+ end
2453
+
2454
+ # Write the c:cpPr element.
2455
+ write_sp_pr(label)
2456
+ end
2457
+
2458
+ #
2459
+ # Write parts of the <c:dLbl> element for formulas.
2460
+ #
2461
+ def write_custom_label_formula(label)
2462
+ formula = label[:formula]
2463
+ data_id = label[:data_id]
2464
+
2465
+ if data_id
2466
+ data = @formula_data[data_id]
2467
+ end
2468
+
2469
+ # Write the c:layout element.
2470
+ write_layout
2471
+
2472
+ @writer.tag_elements('c:tx') do
2473
+ # Write the c:strRef element.
2474
+ write_str_ref(formula, data, 'str')
2475
+ end
2476
+
2477
+ # Write the data label formatting, if any.
2478
+ write_custom_label_format_only(label)
2479
+ end
2480
+
2481
+ #
2482
+ # Write parts of the <c:dLbl> element for labels where only the formatting has
2483
+ # changed.
2484
+ #
2485
+ def write_custom_label_format_only(label)
2486
+ font = label[:font]
2487
+ has_formatting = has_fill_formatting(label)
2488
+
2489
+ if has_formatting
2490
+ # Write the c:spPr element.
2491
+ write_sp_pr(label)
2492
+ write_tx_pr(font)
2493
+ elsif font
2494
+ @writer.empty_tag('c:spPr')
2495
+ write_tx_pr(font)
2496
+ end
2497
+ end
2498
+
2370
2499
  #
2371
2500
  # Write the <c:showLegendKey> element.
2372
2501
  #
@@ -2695,7 +2824,7 @@ def write_a_gs_lst(gradient)
2695
2824
 
2696
2825
  # Write the a:srgbClr element.
2697
2826
  # TODO: Wait for a feature request to support transparency.
2698
- write_a_srgb_clr( color );
2827
+ write_a_srgb_clr( color )
2699
2828
  end
2700
2829
  end
2701
2830
  end