write_xlsx 0.97.0 → 1.04.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (313) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Changes +78 -0
  4. data/LICENSE.txt +1 -1
  5. data/README.md +2 -2
  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_table.rb +9 -3
  15. data/examples/chart_data_tools.rb +25 -7
  16. data/examples/chart_doughnut.rb +17 -5
  17. data/examples/chart_gauge.rb +73 -0
  18. data/examples/chart_line.rb +90 -12
  19. data/examples/chart_pareto.rb +1 -1
  20. data/examples/chart_pie.rb +9 -3
  21. data/examples/chart_radar.rb +13 -4
  22. data/examples/chart_scatter.rb +5 -2
  23. data/examples/chart_secondary_axis.rb +5 -2
  24. data/examples/chart_stock.rb +1 -1
  25. data/examples/chart_styles.rb +1 -1
  26. data/examples/colors.rb +1 -1
  27. data/examples/data_validate.rb +1 -1
  28. data/examples/date_time.rb +1 -1
  29. data/examples/demo.rb +4 -1
  30. data/examples/formats.rb +1 -1
  31. data/examples/headers.rb +1 -1
  32. data/examples/hide_row_col.rb +1 -1
  33. data/examples/hide_sheet.rb +1 -1
  34. data/examples/hyperlink1.rb +1 -1
  35. data/examples/indent.rb +1 -1
  36. data/examples/macros.rb +1 -1
  37. data/examples/merge1.rb +1 -1
  38. data/examples/merge2.rb +1 -1
  39. data/examples/merge3.rb +1 -1
  40. data/examples/merge4.rb +1 -1
  41. data/examples/merge5.rb +1 -1
  42. data/examples/merge6.rb +1 -1
  43. data/examples/outline.rb +1 -1
  44. data/examples/outline_collapsed.rb +1 -1
  45. data/examples/panes.rb +1 -1
  46. data/examples/properties.rb +1 -1
  47. data/examples/regions.rb +1 -1
  48. data/examples/rich_strings.rb +1 -1
  49. data/examples/right_to_left.rb +1 -1
  50. data/examples/shape1.rb +1 -1
  51. data/examples/shape2.rb +1 -1
  52. data/examples/shape3.rb +1 -1
  53. data/examples/shape4.rb +1 -1
  54. data/examples/shape5.rb +1 -1
  55. data/examples/shape6.rb +1 -1
  56. data/examples/shape7.rb +1 -1
  57. data/examples/shape8.rb +1 -1
  58. data/examples/shape_all.rb +1 -1
  59. data/examples/sparklines1.rb +1 -1
  60. data/examples/sparklines2.rb +1 -1
  61. data/examples/stats.rb +1 -1
  62. data/examples/stats_ext.rb +1 -1
  63. data/examples/stocks.rb +1 -1
  64. data/examples/tab_colors.rb +1 -1
  65. data/examples/tables.rb +78 -43
  66. data/lib/write_xlsx/chart.rb +43 -35
  67. data/lib/write_xlsx/chart/area.rb +1 -1
  68. data/lib/write_xlsx/chart/axis.rb +2 -2
  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/legend.rb +14 -0
  73. data/lib/write_xlsx/chart/line.rb +16 -2
  74. data/lib/write_xlsx/chart/pie.rb +30 -15
  75. data/lib/write_xlsx/chart/radar.rb +1 -1
  76. data/lib/write_xlsx/chart/scatter.rb +1 -1
  77. data/lib/write_xlsx/chart/stock.rb +1 -1
  78. data/lib/write_xlsx/chartsheet.rb +35 -7
  79. data/lib/write_xlsx/drawing.rb +86 -30
  80. data/lib/write_xlsx/format.rb +9 -9
  81. data/lib/write_xlsx/package/comments.rb +61 -58
  82. data/lib/write_xlsx/package/conditional_format.rb +9 -1
  83. data/lib/write_xlsx/package/relationships.rb +4 -4
  84. data/lib/write_xlsx/package/styles.rb +26 -8
  85. data/lib/write_xlsx/package/table.rb +13 -7
  86. data/lib/write_xlsx/package/vml.rb +20 -19
  87. data/lib/write_xlsx/shape.rb +4 -3
  88. data/lib/write_xlsx/sheets.rb +18 -16
  89. data/lib/write_xlsx/sparkline.rb +1 -1
  90. data/lib/write_xlsx/utility.rb +96 -7
  91. data/lib/write_xlsx/version.rb +1 -1
  92. data/lib/write_xlsx/workbook.rb +99 -49
  93. data/lib/write_xlsx/worksheet.rb +225 -145
  94. data/lib/write_xlsx/worksheet/data_validation.rb +10 -14
  95. data/lib/write_xlsx/worksheet/hyperlink.rb +16 -37
  96. data/test/chart/test_write_legend_pos.rb +9 -1
  97. data/test/chartsheet/test_write_sheet_protection.rb +91 -0
  98. data/test/drawing/test_drawing_chart_01.rb +6 -2
  99. data/test/drawing/test_drawing_image_01.rb +12 -3
  100. data/test/drawing/test_drawing_shape_01.rb +8 -5
  101. data/test/drawing/test_drawing_shape_02.rb +12 -5
  102. data/test/drawing/test_drawing_shape_03.rb +8 -5
  103. data/test/drawing/test_drawing_shape_04.rb +8 -24
  104. data/test/drawing/test_drawing_shape_05.rb +8 -5
  105. data/test/drawing/test_drawing_shape_06.rb +11 -6
  106. data/test/drawing/test_drawing_shape_07.rb +11 -6
  107. data/test/drawing/test_write_a_graphic_frame_locks.rb +1 -1
  108. data/test/drawing/test_write_c_chart.rb +1 -1
  109. data/test/drawing/test_write_c_nv_graphic_frame_pr.rb +1 -1
  110. data/test/drawing/test_write_c_nv_pr.rb +1 -1
  111. data/test/drawing/test_write_col.rb +1 -1
  112. data/test/drawing/test_write_col_off.rb +1 -1
  113. data/test/drawing/test_write_ext.rb +1 -1
  114. data/test/drawing/test_write_pos.rb +1 -1
  115. data/test/drawing/test_write_row.rb +1 -1
  116. data/test/drawing/test_write_row_off.rb +1 -1
  117. data/test/drawing/test_write_xfrm_extension.rb +1 -1
  118. data/test/drawing/test_write_xfrm_offset.rb +1 -1
  119. data/test/package/comments/test_comments_01.rb +54 -0
  120. data/test/package/comments/test_comments_02.rb +54 -0
  121. data/test/perl_output/chart_gauge.xlsx +0 -0
  122. data/test/perl_output/chart_line.xlsx +0 -0
  123. data/test/perl_output/comments2.xlsx +0 -0
  124. data/test/perl_output/formats.xlsx +0 -0
  125. data/test/perl_output/tables.xlsx +0 -0
  126. data/test/regression/images/happy.jpg +0 -0
  127. data/test/regression/images/red2.png +0 -0
  128. data/test/regression/test_array_formula03.rb +36 -0
  129. data/test/regression/test_autofilter08.rb +110 -0
  130. data/test/regression/test_autofilter09.rb +110 -0
  131. data/test/regression/test_autofilter10.rb +110 -0
  132. data/test/regression/test_chart_axis26.rb +10 -8
  133. data/test/regression/test_chart_axis27.rb +1 -1
  134. data/test/regression/test_chart_axis28.rb +1 -1
  135. data/test/regression/test_chart_axis29.rb +1 -1
  136. data/test/regression/test_chart_axis33.rb +1 -1
  137. data/test/regression/test_chart_axis42.rb +44 -0
  138. data/test/regression/test_chart_axis43.rb +44 -0
  139. data/test/regression/test_chart_axis44.rb +54 -0
  140. data/test/regression/test_chart_axis45.rb +54 -0
  141. data/test/regression/test_chart_axis46.rb +54 -0
  142. data/test/regression/test_chart_combined10.rb +43 -0
  143. data/test/regression/test_chart_combined11.rb +63 -0
  144. data/test/regression/test_chart_data_labels25.rb +1 -1
  145. data/test/regression/test_chart_doughnut07.rb +37 -0
  146. data/test/regression/test_chart_font09.rb +1 -1
  147. data/test/regression/test_chart_legend03.rb +41 -0
  148. data/test/regression/test_chart_legend04.rb +41 -0
  149. data/test/regression/test_chart_legend05.rb +41 -0
  150. data/test/regression/test_chart_legend06.rb +41 -0
  151. data/test/regression/test_chart_legend07.rb +38 -0
  152. data/test/regression/test_chart_line05.rb +43 -0
  153. data/test/regression/test_chart_line06.rb +43 -0
  154. data/test/regression/test_chart_size03.rb +4 -1
  155. data/test/regression/test_comment13.rb +36 -0
  156. data/test/regression/test_comment14.rb +29 -0
  157. data/test/regression/test_comment15.rb +28 -0
  158. data/test/regression/test_comment16.rb +34 -0
  159. data/test/regression/test_cond_format19.rb +64 -0
  160. data/test/regression/test_cond_format20.rb +43 -0
  161. data/test/regression/test_format15.rb +26 -0
  162. data/test/regression/test_header_image15.rb +36 -0
  163. data/test/regression/test_header_image16.rb +42 -0
  164. data/test/regression/test_header_image17.rb +46 -0
  165. data/test/regression/test_header_image18.rb +48 -0
  166. data/test/regression/test_header_image19.rb +36 -0
  167. data/test/regression/test_hyperlink32.rb +27 -0
  168. data/test/regression/test_hyperlink33.rb +28 -0
  169. data/test/regression/test_hyperlink34.rb +33 -0
  170. data/test/regression/test_hyperlink35.rb +39 -0
  171. data/test/regression/test_hyperlink36.rb +34 -0
  172. data/test/regression/test_hyperlink37.rb +33 -0
  173. data/test/regression/test_hyperlink38.rb +27 -0
  174. data/test/regression/test_hyperlink39.rb +27 -0
  175. data/test/regression/test_hyperlink40.rb +27 -0
  176. data/test/regression/test_hyperlink41.rb +27 -0
  177. data/test/regression/test_hyperlink42.rb +27 -0
  178. data/test/regression/test_hyperlink43.rb +27 -0
  179. data/test/regression/test_hyperlink44.rb +27 -0
  180. data/test/regression/test_hyperlink45.rb +27 -0
  181. data/test/regression/test_hyperlink47.rb +27 -0
  182. data/test/regression/test_hyperlink48.rb +31 -0
  183. data/test/regression/test_hyperlink49.rb +29 -0
  184. data/test/regression/test_image06.rb +5 -5
  185. data/test/regression/test_image08.rb +5 -4
  186. data/test/regression/test_image15.rb +4 -2
  187. data/test/regression/test_image28.rb +1 -1
  188. data/test/regression/test_image36.rb +26 -0
  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_table23.rb +56 -0
  217. data/test/regression/test_table24.rb +27 -0
  218. data/test/regression/test_table25.rb +27 -0
  219. data/test/regression/xlsx_files/array_formula03.xlsx +0 -0
  220. data/test/regression/xlsx_files/autofilter08.xlsx +0 -0
  221. data/test/regression/xlsx_files/autofilter09.xlsx +0 -0
  222. data/test/regression/xlsx_files/autofilter10.xlsx +0 -0
  223. data/test/regression/xlsx_files/chart_axis26.xlsx +0 -0
  224. data/test/regression/xlsx_files/chart_axis27.xlsx +0 -0
  225. data/test/regression/xlsx_files/chart_axis28.xlsx +0 -0
  226. data/test/regression/xlsx_files/chart_axis29.xlsx +0 -0
  227. data/test/regression/xlsx_files/chart_axis33.xlsx +0 -0
  228. data/test/regression/xlsx_files/chart_axis42.xlsx +0 -0
  229. data/test/regression/xlsx_files/chart_axis43.xlsx +0 -0
  230. data/test/regression/xlsx_files/chart_axis44.xlsx +0 -0
  231. data/test/regression/xlsx_files/chart_axis45.xlsx +0 -0
  232. data/test/regression/xlsx_files/chart_axis46.xlsx +0 -0
  233. data/test/regression/xlsx_files/chart_combined10.xlsx +0 -0
  234. data/test/regression/xlsx_files/chart_combined11.xlsx +0 -0
  235. data/test/regression/xlsx_files/chart_data_labels25.xlsx +0 -0
  236. data/test/regression/xlsx_files/chart_doughnut07.xlsx +0 -0
  237. data/test/regression/xlsx_files/chart_font09.xlsx +0 -0
  238. data/test/regression/xlsx_files/chart_legend03.xlsx +0 -0
  239. data/test/regression/xlsx_files/chart_legend04.xlsx +0 -0
  240. data/test/regression/xlsx_files/chart_legend05.xlsx +0 -0
  241. data/test/regression/xlsx_files/chart_legend06.xlsx +0 -0
  242. data/test/regression/xlsx_files/chart_legend07.xlsx +0 -0
  243. data/test/regression/xlsx_files/chart_line05.xlsx +0 -0
  244. data/test/regression/xlsx_files/chart_line06.xlsx +0 -0
  245. data/test/regression/xlsx_files/comment13.xlsx +0 -0
  246. data/test/regression/xlsx_files/comment14.xlsx +0 -0
  247. data/test/regression/xlsx_files/comment15.xlsx +0 -0
  248. data/test/regression/xlsx_files/comment16.xlsx +0 -0
  249. data/test/regression/xlsx_files/cond_format19.xlsx +0 -0
  250. data/test/regression/xlsx_files/cond_format20.xlsx +0 -0
  251. data/test/regression/xlsx_files/format15.xlsx +0 -0
  252. data/test/regression/xlsx_files/header_image15.xlsx +0 -0
  253. data/test/regression/xlsx_files/header_image16.xlsx +0 -0
  254. data/test/regression/xlsx_files/header_image17.xlsx +0 -0
  255. data/test/regression/xlsx_files/header_image18.xlsx +0 -0
  256. data/test/regression/xlsx_files/header_image19.xlsx +0 -0
  257. data/test/regression/xlsx_files/hyperlink32.xlsx +0 -0
  258. data/test/regression/xlsx_files/hyperlink33.xlsx +0 -0
  259. data/test/regression/xlsx_files/hyperlink34.xlsx +0 -0
  260. data/test/regression/xlsx_files/hyperlink35.xlsx +0 -0
  261. data/test/regression/xlsx_files/hyperlink36.xlsx +0 -0
  262. data/test/regression/xlsx_files/hyperlink37.xlsx +0 -0
  263. data/test/regression/xlsx_files/hyperlink38.xlsx +0 -0
  264. data/test/regression/xlsx_files/hyperlink39.xlsx +0 -0
  265. data/test/regression/xlsx_files/hyperlink40.xlsx +0 -0
  266. data/test/regression/xlsx_files/hyperlink41.xlsx +0 -0
  267. data/test/regression/xlsx_files/hyperlink42.xlsx +0 -0
  268. data/test/regression/xlsx_files/hyperlink43.xlsx +0 -0
  269. data/test/regression/xlsx_files/hyperlink44.xlsx +0 -0
  270. data/test/regression/xlsx_files/hyperlink45.xlsx +0 -0
  271. data/test/regression/xlsx_files/hyperlink46.xlsx +0 -0
  272. data/test/regression/xlsx_files/hyperlink47.xlsx +0 -0
  273. data/test/regression/xlsx_files/hyperlink48.xlsx +0 -0
  274. data/test/regression/xlsx_files/hyperlink49.xlsx +0 -0
  275. data/test/regression/xlsx_files/image06.xlsx +0 -0
  276. data/test/regression/xlsx_files/image36.xlsx +0 -0
  277. data/test/regression/xlsx_files/image44.xlsx +0 -0
  278. data/test/regression/xlsx_files/image45.xlsx +0 -0
  279. data/test/regression/xlsx_files/image46.xlsx +0 -0
  280. data/test/regression/xlsx_files/image47.xlsx +0 -0
  281. data/test/regression/xlsx_files/image48.xlsx +0 -0
  282. data/test/regression/xlsx_files/image49.xlsx +0 -0
  283. data/test/regression/xlsx_files/image50.xlsx +0 -0
  284. data/test/regression/xlsx_files/image51.xlsx +0 -0
  285. data/test/regression/xlsx_files/object_position01.xlsx +0 -0
  286. data/test/regression/xlsx_files/object_position02.xlsx +0 -0
  287. data/test/regression/xlsx_files/object_position03.xlsx +0 -0
  288. data/test/regression/xlsx_files/object_position04.xlsx +0 -0
  289. data/test/regression/xlsx_files/object_position06.xlsx +0 -0
  290. data/test/regression/xlsx_files/object_position07.xlsx +0 -0
  291. data/test/regression/xlsx_files/object_position08.xlsx +0 -0
  292. data/test/regression/xlsx_files/object_position09.xlsx +0 -0
  293. data/test/regression/xlsx_files/object_position10.xlsx +0 -0
  294. data/test/regression/xlsx_files/object_position12.xlsx +0 -0
  295. data/test/regression/xlsx_files/object_position13.xlsx +0 -0
  296. data/test/regression/xlsx_files/object_position14.xlsx +0 -0
  297. data/test/regression/xlsx_files/object_position15.xlsx +0 -0
  298. data/test/regression/xlsx_files/object_position16.xlsx +0 -0
  299. data/test/regression/xlsx_files/object_position17.xlsx +0 -0
  300. data/test/regression/xlsx_files/object_position18.xlsx +0 -0
  301. data/test/regression/xlsx_files/object_position19.xlsx +0 -0
  302. data/test/regression/xlsx_files/object_position20.xlsx +0 -0
  303. data/test/regression/xlsx_files/table23.xlsx +0 -0
  304. data/test/regression/xlsx_files/table24.xlsx +0 -0
  305. data/test/regression/xlsx_files/table25.xlsx +0 -0
  306. data/test/test_example_match.rb +955 -780
  307. data/test/workbook/test_check_sheetname.rb +51 -0
  308. data/test/workbook/test_write_workbook_view.rb +36 -0
  309. data/test/worksheet/test_write_data_validation_02.rb +17 -0
  310. data/test/worksheet/test_write_sheet_view.rb +19 -1
  311. data/write_xlsx.gemspec +1 -0
  312. metadata +349 -7
  313. data/test/package/comments/test_write_text_t.rb +0 -44
@@ -8,7 +8,7 @@
8
8
  # See formatting note in Chart.
9
9
  #
10
10
  # Copyright 2000-2011, John McNamara, jmcnamara@cpan.org
11
- # Convert to ruby by Hideo NAKAMURA, cxn03651@msj.biglobe.ne.jp
11
+ # Convert to ruby by Hideo NAKAMURA, nakamura.hideo@gmail.com
12
12
  #
13
13
 
14
14
  require 'write_xlsx/package/xml_writer_simple'
@@ -16,7 +16,7 @@ class Axis < Caption
16
16
  attr_reader :log_base, :crossing, :position_axis, :label_position, :visible
17
17
  attr_reader :num_format_linked, :num_font, :layout, :interval_unit
18
18
  attr_reader :interval_tick, :major_gridlines, :minor_gridlines, :reverse
19
- attr_reader :line, :fill, :text_axis
19
+ attr_reader :line, :fill, :text_axis, :label_align
20
20
  #
21
21
  # Convert user defined axis values into axis instance.
22
22
  #
@@ -28,7 +28,7 @@ def merge_with_hash(params) # :nodoc:
28
28
  :reverse, :min, :max, :minor_unit, :major_unit, :minor_unit_type,
29
29
  :major_unit_type, :log_base, :crossing, :position_axis,
30
30
  :label_position, :num_format, :num_format_linked, :interval_unit,
31
- :interval_tick, :line, :fill
31
+ :interval_tick, :line, :fill, :label_align
32
32
  ].each { |val| instance_variable_set("@#{val}", args[val]) }
33
33
  set_major_minor_gridlines(args)
34
34
 
@@ -8,7 +8,7 @@
8
8
  # See formatting note in Chart.
9
9
  #
10
10
  # Copyright 2000-2011, John McNamara, jmcnamara@cpan.org
11
- # Convert to ruby by Hideo NAKAMURA, cxn03651@msj.biglobe.ne.jp
11
+ # Convert to ruby by Hideo NAKAMURA, nakamura.hideo@gmail.com
12
12
  #
13
13
 
14
14
  require 'write_xlsx/package/xml_writer_simple'
@@ -8,7 +8,7 @@
8
8
  # See formatting note in Chart.
9
9
  #
10
10
  # Copyright 2000-2011, John McNamara, jmcnamara@cpan.org
11
- # Convert to ruby by Hideo NAKAMURA, cxn03651@msj.biglobe.ne.jp
11
+ # Convert to ruby by Hideo NAKAMURA, nakamura.hideo@gmail.com
12
12
  #
13
13
 
14
14
  require 'write_xlsx/package/xml_writer_simple'
@@ -8,7 +8,7 @@
8
8
  # See formatting note in Excel::Writer::XLSX::Chart.
9
9
  #
10
10
  # Copyright 2000-2014, John McNamara, jmcnamara@cpan.org
11
- # Convert to ruby by Hideo NAKAMURA, cxn03651@msj.biglobe.ne.jp
11
+ # Convert to ruby by Hideo NAKAMURA, nakamura.hideo@gmail.com
12
12
  #
13
13
 
14
14
  require 'write_xlsx/package/xml_writer_simple'
@@ -0,0 +1,14 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module Writexlsx
4
+ class Chart
5
+ class Legend
6
+ attr_accessor :line, :fill, :pattern, :gradient
7
+ attr_accessor :position, :delete_series, :layout, :font
8
+
9
+ def initialize
10
+ @position = 'right'
11
+ end
12
+ end
13
+ end
14
+ end
@@ -8,7 +8,7 @@
8
8
  # See formatting note in Chart.
9
9
  #
10
10
  # Copyright 2000-2011, John McNamara, jmcnamara@cpan.org
11
- # Convert to ruby by Hideo NAKAMURA, cxn03651@msj.biglobe.ne.jp
11
+ # Convert to ruby by Hideo NAKAMURA, nakamura.hideo@gmail.com
12
12
  #
13
13
 
14
14
  require 'write_xlsx/package/xml_writer_simple'
@@ -22,9 +22,17 @@ class Line < self
22
22
 
23
23
  def initialize(subtype)
24
24
  super(subtype)
25
+ @subtype = @subtype || 'standard'
25
26
  @default_marker = Marker.new(:type => 'none')
26
27
  @smooth_allowed = 1
27
28
 
29
+ # Override and reset the default axis values.
30
+ if @subtype == 'percent_stacked'
31
+ @y_axis.defaults[:num_format] = '0%'
32
+ end
33
+
34
+ set_y_axis
35
+
28
36
  # Set the available data label positions for this chart type.
29
37
  @label_position_default = 'right'
30
38
  @label_positions = {
@@ -54,9 +62,15 @@ def write_line_chart(params)
54
62
  series = axes_series(params)
55
63
  return if series.empty?
56
64
 
65
+ if @subtype == 'percent_stacked'
66
+ subtype = 'percentStacked'
67
+ else
68
+ subtype = @subtype
69
+ end
70
+
57
71
  @writer.tag_elements('c:lineChart') do
58
72
  # Write the c:grouping element.
59
- write_grouping('standard')
73
+ write_grouping(subtype)
60
74
  # Write the series elements.
61
75
  series.each {|s| write_series(s)}
62
76
 
@@ -8,7 +8,7 @@
8
8
  # See formatting note in Chart.
9
9
  #
10
10
  # Copyright 2000-2011, John McNamara, jmcnamara@cpan.org
11
- # Convert to ruby by Hideo NAKAMURA, cxn03651@msj.biglobe.ne.jp
11
+ # Convert to ruby by Hideo NAKAMURA, nakamura.hideo@gmail.com
12
12
  #
13
13
 
14
14
  require 'write_xlsx/package/xml_writer_simple'
@@ -42,13 +42,6 @@ def initialize(subtype)
42
42
  }
43
43
  end
44
44
 
45
- #
46
- # Override parent method to add a warning.
47
- #
48
- def combine(chart)
49
- raise "Combined chart not currently supported for Pie charts"
50
- end
51
-
52
45
  #
53
46
  # Set the Pie/Doughnut chart rotation: the angle of the first slice.
54
47
  #
@@ -91,11 +84,31 @@ def write_pie_chart
91
84
  # Write the <c:plotArea> element.
92
85
  #
93
86
  def write_plot_area
87
+ second_chart = @combined
88
+
94
89
  @writer.tag_elements('c:plotArea') do
95
90
  # Write the c:layout element.
96
91
  write_layout(@plotarea.layout, 'plot')
97
92
  # Write the subclass chart type element.
98
93
  write_chart_type
94
+ # Configure a combined chart if present.
95
+ if second_chart
96
+ # Secondary axis has unique id otherwise use same as primary.
97
+ if second_chart.is_secondary?
98
+ second_chart.id = 1000 + @id
99
+ else
100
+ second_chart.id = @id
101
+ end
102
+
103
+ # Share the same filehandle for writing
104
+ second_chart.writer = @writer
105
+
106
+ # Share series index with primary chart.
107
+ second_chart.series_index = @series_index
108
+
109
+ # Write the subclass chart type elements for combined chart.
110
+ second_chart.write_chart_type
111
+ end
99
112
  # Write the c:spPr eleent for the plotarea formatting.
100
113
  write_sp_pr(@plotarea)
101
114
  end
@@ -107,15 +120,15 @@ def write_plot_area
107
120
  # Write the <c:legend> element.
108
121
  #
109
122
  def write_legend
110
- position = @legend_position
123
+ position = @legend.position
111
124
  allowed = %w(right left top bottom)
112
- delete_series = @legend_delete_series || []
125
+ delete_series = @legend.delete_series || []
113
126
 
114
- if @legend_position =~ /^overlay_/
115
- position = @legend_position.sub(/^overlay_/, '')
127
+ if @legend.position =~ /^overlay_/
128
+ position = @legend.position.sub(/^overlay_/, '')
116
129
  overlay = true
117
130
  else
118
- position = @legend_position
131
+ position = @legend.position
119
132
  overlay = false
120
133
  end
121
134
 
@@ -129,11 +142,13 @@ def write_legend
129
142
  # Write the c:legendEntry element.
130
143
  delete_series.each { |index| write_legend_entry(index) }
131
144
  # Write the c:layout element.
132
- write_layout(@legend_layout, 'legend')
145
+ write_layout(@legend.layout, 'legend')
133
146
  # Write the c:overlay element.
134
147
  write_overlay if overlay
148
+ # Write the c:spPr element.
149
+ write_sp_pr(@legend)
135
150
  # Write the c:txPr element. Over-ridden.
136
- write_tx_pr_legend(0, @legend_font)
151
+ write_tx_pr_legend(0, @legend.font)
137
152
  end
138
153
  end
139
154
 
@@ -8,7 +8,7 @@
8
8
  # See formatting note in Chart.
9
9
  #
10
10
  # Copyright 2000-2012, John McNamara, jmcnamara@cpan.org
11
- # Convert to ruby by Hideo NAKAMURA, cxn03651@msj.biglobe.ne.jp
11
+ # Convert to ruby by Hideo NAKAMURA, nakamura.hideo@gmail.com
12
12
  #
13
13
 
14
14
  require 'write_xlsx/package/xml_writer_simple'
@@ -8,7 +8,7 @@
8
8
  # See formatting note in Chart.
9
9
  #
10
10
  # Copyright 2000-2011, John McNamara, jmcnamara@cpan.org
11
- # Convert to ruby by Hideo NAKAMURA, cxn03651@msj.biglobe.ne.jp
11
+ # Convert to ruby by Hideo NAKAMURA, nakamura.hideo@gmail.com
12
12
  #
13
13
 
14
14
  require 'write_xlsx/package/xml_writer_simple'
@@ -8,7 +8,7 @@
8
8
  # See formatting note in Chart.
9
9
  #
10
10
  # Copyright 2000-2011, John McNamara, jmcnamara@cpan.org
11
- # Convert to ruby by Hideo NAKAMURA, cxn03651@msj.biglobe.ne.jp
11
+ # Convert to ruby by Hideo NAKAMURA, nakamura.hideo@gmail.com
12
12
  #
13
13
 
14
14
  require 'write_xlsx/package/xml_writer_simple'
@@ -6,7 +6,7 @@
6
6
  # Used in conjunction with WriteXLSX
7
7
  #
8
8
  # Copyright 2000-2011, John McNamara, jmcnamara@cpan.org
9
- # Convert to ruby by Hideo NAKAMURA, cxn03651@msj.biglobe.ne.jp
9
+ # Convert to ruby by Hideo NAKAMURA, nakamura.hideo@gmail.com
10
10
  #
11
11
 
12
12
  require 'write_xlsx/worksheet'
@@ -19,7 +19,7 @@ class Chartsheet < Worksheet
19
19
 
20
20
  def initialize(workbook, index, name)
21
21
  super
22
- @drawing = Drawing.new
22
+ @drawings = Drawings.new
23
23
  @is_chartsheet = true
24
24
  @chart = nil
25
25
  @charts = [1]
@@ -57,11 +57,39 @@ def assemble_xml_file # :nodoc:
57
57
  end
58
58
  end
59
59
 
60
- def protect(password = '', options = {})
60
+ def protect(password = '', user_options = nil, options = {})
61
+ # Objects are default on for chartsheets.
62
+ if user_options
63
+ if user_options.has_key?(:objects)
64
+ if ptrue?(user_options[:objects])
65
+ options[:objects] = 0
66
+ else
67
+ options[:objects] = 1
68
+ end
69
+ else
70
+ options[:objects] = 0
71
+ end
72
+
73
+ if user_options.has_key?(:content)
74
+ options[:content] = user_options[:content]
75
+ else
76
+ options[:content] = 1
77
+ end
78
+ else
79
+ options[:objects] = 0
80
+ options[:content] = 1
81
+ end
82
+
83
+ # Is objects and content are off then the chartsheet isn't locked.
84
+ # except if it has a password.
85
+ if password == '' && ptrue?(options[:objects]) && !ptrue?(options[:content])
86
+ return
87
+ end
88
+
61
89
  @chart.protection = 1
62
90
 
91
+ # Turn off worksheet defaults.
63
92
  options[:sheet] = 0
64
- options[:content] = 1
65
93
  options[:scenarios] = 1
66
94
 
67
95
  super(password, options)
@@ -148,9 +176,9 @@ def set_high_low_lines(*args)
148
176
  def prepare_chart(index, chart_id, drawing_id) # :nodoc:
149
177
  @chart.id = chart_id - 1
150
178
 
151
- drawing = Drawing.new
152
- @drawing = drawing
153
- @drawing.orientation = @page_setup.orientation
179
+ drawings = Drawings.new
180
+ @drawings = drawings
181
+ @drawings.orientation = @page_setup.orientation
154
182
 
155
183
  @external_drawing_links << [ '/drawing', "../drawings/drawing#{drawing_id}.xml" ]
156
184
 
@@ -4,6 +4,16 @@
4
4
 
5
5
  module Writexlsx
6
6
  class Drawing
7
+ attr_accessor :type, :dimensions, :width, :height, :description, :shape, :anchor, :rel_index, :url_rel_index
8
+ attr_reader :tip
9
+
10
+ def initialize(type, dimensions, width, height, description, shape, anchor, rel_index = nil, url_rel_index = nil, tip = nil)
11
+ @type, @dimensions, @width, @height, @description, @shape, @anchor, @rel_index, @url_rel_index, @tip =
12
+ type, dimensions, width, height, description, shape, anchor, rel_index, url_rel_index, tip
13
+ end
14
+ end
15
+
16
+ class Drawings
7
17
  include Writexlsx::Utility
8
18
 
9
19
  attr_writer :embedded, :orientation
@@ -32,10 +42,10 @@ def assemble_xml_file
32
42
  write_drawing_workspace do
33
43
  if @embedded
34
44
  index = 0
35
- @drawings.each do |dimensions|
45
+ @drawings.each do |drawing|
36
46
  # Write the xdr:twoCellAnchor element.
37
47
  index += 1
38
- write_two_cell_anchor(index, *(dimensions.flatten))
48
+ write_two_cell_anchor(index, drawing)
39
49
  end
40
50
  else
41
51
  # Write the xdr:absoluteAnchor element.
@@ -48,8 +58,8 @@ def assemble_xml_file
48
58
  #
49
59
  # Add a chart, image or shape sub object to the drawing.
50
60
  #
51
- def add_drawing_object(*args)
52
- @drawings << args.flatten
61
+ def add_drawing_object(drawing)
62
+ @drawings << drawing
53
63
  end
54
64
 
55
65
  private
@@ -71,14 +81,29 @@ def write_drawing_workspace
71
81
  # Write the <xdr:twoCellAnchor> element.
72
82
  #
73
83
  def write_two_cell_anchor(*args)
74
- index, type, col_from, row_from, col_from_offset, row_from_offset,
75
- col_to, row_to, col_to_offset, row_to_offset, col_absolute, row_absolute,
76
- width, height, description, shape = args
84
+ index, drawing = args
85
+
86
+ type = drawing.type
87
+ width = drawing.width
88
+ height = drawing.height
89
+ description = drawing.description
90
+ shape = drawing.shape
91
+ anchor = drawing.anchor
92
+ rel_index = drawing.rel_index
93
+ url_rel_index = drawing.url_rel_index
94
+ tip = drawing.tip
95
+
96
+ col_from, row_from, col_from_offset, row_from_offset,
97
+ col_to, row_to, col_to_offset, row_to_offset, col_absolute, row_absolute = drawing.dimensions
77
98
 
78
99
  attributes = []
79
100
 
80
101
  # Add attribute for images.
81
- attributes << [:editAs, 'oneCell'] if type == 2
102
+ if anchor == 2
103
+ attributes << [:editAs, 'oneCell']
104
+ elsif anchor == 3
105
+ attributes << [:editAs, 'absolute']
106
+ end
82
107
 
83
108
  # Add attribute for shapes.
84
109
  attributes << [:editAs, shape.edit_as] if shape && shape.edit_as
@@ -93,10 +118,14 @@ def write_two_cell_anchor(*args)
93
118
  # Graphic frame.
94
119
 
95
120
  # Write the xdr:graphicFrame element for charts.
96
- write_graphic_frame(index, description)
121
+ write_graphic_frame(index, rel_index, description)
97
122
  elsif type == 2
98
123
  # Write the xdr:pic element.
99
- write_pic(index, col_absolute, row_absolute, width, height, description)
124
+ write_pic(
125
+ index, rel_index, col_absolute,
126
+ row_absolute, width, height,
127
+ description, url_rel_index , tip
128
+ )
100
129
  else
101
130
  # Write the xdr:sp element for shapes.
102
131
  write_sp(index, col_absolute, row_absolute, width, height, shape)
@@ -129,7 +158,7 @@ def write_absolute_anchor(index)
129
158
  end
130
159
 
131
160
  # Write the xdr:graphicFrame element.
132
- write_graphic_frame(index)
161
+ write_graphic_frame(index, index)
133
162
 
134
163
  # Write the xdr:clientData element.
135
164
  write_client_data
@@ -203,9 +232,9 @@ def write_row_off(data)
203
232
  #
204
233
  def write_pos(x, y)
205
234
  attributes = [
206
- ['x', x],
207
- ['y', y]
208
- ]
235
+ ['x', x],
236
+ ['y', y]
237
+ ]
209
238
 
210
239
  @writer.empty_tag('xdr:pos', attributes)
211
240
  end
@@ -215,9 +244,9 @@ def write_pos(x, y)
215
244
  #
216
245
  def write_ext(cx, cy)
217
246
  attributes = [
218
- ['cx', cx],
219
- ['cy', cy]
220
- ]
247
+ ['cx', cx],
248
+ ['cy', cy]
249
+ ]
221
250
 
222
251
  @writer.empty_tag('xdr:ext', attributes)
223
252
  end
@@ -225,7 +254,7 @@ def write_ext(cx, cy)
225
254
  #
226
255
  # Write the <xdr:graphicFrame> element.
227
256
  #
228
- def write_graphic_frame(index, name = nil)
257
+ def write_graphic_frame(index, rel_index, name = nil)
229
258
  macro = ''
230
259
 
231
260
  attributes = [ ['macro', macro] ]
@@ -236,7 +265,7 @@ def write_graphic_frame(index, name = nil)
236
265
  # Write the xdr:xfrm element.
237
266
  write_xfrm
238
267
  # Write the a:graphic element.
239
- write_atag_graphic(index)
268
+ write_atag_graphic(rel_index)
240
269
  end
241
270
  end
242
271
 
@@ -257,18 +286,42 @@ def write_nv_graphic_frame_pr(index, name = nil)
257
286
  #
258
287
  # Write the <xdr:cNvPr> element.
259
288
  #
260
- def write_c_nv_pr(id, name, descr = nil)
289
+ def write_c_nv_pr(index, name, description = nil, url_rel_index = nil, tip = nil)
261
290
  attributes = [
262
- ['id', id],
263
- ['name', name]
291
+ ['id', index],
292
+ ['name', name]
264
293
  ]
265
294
 
266
295
  # Add description attribute for images.
267
- attributes << ['descr', descr] if descr
296
+ attributes << ['descr', description] if description
268
297
 
269
- @writer.empty_tag('xdr:cNvPr', attributes)
298
+ if ptrue?(url_rel_index)
299
+ @writer.tag_elements('xdr:cNvPr', attributes) do
300
+ # Write the a:hlinkClick element.
301
+ write_a_hlink_click(url_rel_index, tip)
302
+ end
303
+ else
304
+ @writer.empty_tag('xdr:cNvPr', attributes)
305
+ end
270
306
  end
271
307
 
308
+ #
309
+ # Write the <a:hlinkClick> element.
310
+ #
311
+ def write_a_hlink_click(index, tip)
312
+ schema = 'http://schemas.openxmlformats.org/officeDocument/'
313
+ xmlns_r = "#{schema}2006/relationships"
314
+ r_id = "rId#{index}"
315
+
316
+ attributes = [
317
+ ['xmlns:r', xmlns_r],
318
+ ['r:id', r_id]
319
+ ]
320
+
321
+ attributes << ['tooltip', tip] if tip
322
+
323
+ @writer.empty_tag('a:hlinkClick', attributes)
324
+ end
272
325
 
273
326
  #
274
327
  # Write the <xdr:cNvGraphicFramePr> element.
@@ -351,7 +404,7 @@ def write_atag_graphic(index)
351
404
  # Write the <a:graphicData> element.
352
405
  #
353
406
  def write_atag_graphic_data(index)
354
- uri = 'http://schemas.openxmlformats.org/drawingml/2006/chart'
407
+ uri = 'http://schemas.openxmlformats.org/drawingml/2006/chart'
355
408
 
356
409
  attributes = [ ['uri', uri] ]
357
410
 
@@ -474,12 +527,12 @@ def write_nv_sp_pr(index, shape)
474
527
  #
475
528
  # Write the <xdr:pic> element.
476
529
  #
477
- def write_pic(index, col_absolute, row_absolute, width, height, description)
530
+ def write_pic(index, rel_index, col_absolute, row_absolute, width, height, description, url_rel_index, tip)
478
531
  @writer.tag_elements('xdr:pic') do
479
532
  # Write the xdr:nvPicPr element.
480
- write_nv_pic_pr(index, description)
533
+ write_nv_pic_pr(index, rel_index, description, url_rel_index, tip)
481
534
  # Write the xdr:blipFill element.
482
- write_blip_fill(index)
535
+ write_blip_fill(rel_index)
483
536
 
484
537
  # Pictures are rectangle shapes by default.
485
538
  shape = Shape.new
@@ -493,10 +546,13 @@ def write_pic(index, col_absolute, row_absolute, width, height, description)
493
546
  #
494
547
  # Write the <xdr:nvPicPr> element.
495
548
  #
496
- def write_nv_pic_pr(index, description)
549
+ def write_nv_pic_pr(index, rel_index, description, url_rel_index, tip)
497
550
  @writer.tag_elements('xdr:nvPicPr') do
498
551
  # Write the xdr:cNvPr element.
499
- write_c_nv_pr( index + 1, "Picture #{index}", description )
552
+ write_c_nv_pr(
553
+ index + 1, "Picture #{index}", description,
554
+ url_rel_index, tip
555
+ )
500
556
  # Write the xdr:cNvPicPr element.
501
557
  write_c_nv_pic_pr
502
558
  end