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
@@ -219,10 +219,17 @@ def check_valid_citeria_types
219
219
  end
220
220
 
221
221
  def convert_date_time_value_if_required
222
- @date_1904 = date_1904?
223
222
  if @validate == 'date' || @validate == 'time'
224
- unless convert_date_time_value(:value) && convert_date_time_value(:maximum)
225
- raise WriteXLSXOptionParameterError, "Invalid date/time value."
223
+ date_time = convert_date_time(@value)
224
+ if date_time
225
+ @value = date_time
226
+ end
227
+
228
+ if @maximum
229
+ date_time = convert_date_time(@maximum)
230
+ if date_time
231
+ @maximum = date_time
232
+ end
226
233
  end
227
234
  end
228
235
  end
@@ -292,17 +299,6 @@ def valid_criteria_type # :nodoc:
292
299
  }
293
300
  end
294
301
 
295
- def convert_date_time_value(key) # :nodoc:
296
- value = instance_variable_get("@#{key}")
297
- if value && value.to_s =~ /T/
298
- date_time = convert_date_time(value)
299
- instance_variable_set("@#{key}", date_time) if date_time
300
- date_time
301
- else
302
- true
303
- end
304
- end
305
-
306
302
  def date_1904?
307
303
  @date_1904
308
304
  end
@@ -7,19 +7,19 @@ class Hyperlink # :nodoc:
7
7
 
8
8
  attr_reader :str, :tip
9
9
 
10
- MAXIMUM_URLS_SIZE = 255
10
+ MAXIMUM_URLS_SIZE = 2079
11
11
 
12
- def self.factory(url, str = nil, tip = nil)
12
+ def self.factory(url, str = nil, tip = nil, max_url_length = MAXIMUM_URLS_SIZE)
13
13
  if url =~ /^internal:(.+)/
14
- InternalHyperlink.new($~[1], str, tip)
14
+ InternalHyperlink.new($~[1], str, tip, max_url_length)
15
15
  elsif url =~ /^external:(.+)/
16
- ExternalHyperlink.new($~[1], str, tip)
16
+ ExternalHyperlink.new($~[1], str, tip, max_url_length)
17
17
  else
18
- new(url, str, tip)
18
+ new(url, str, tip, max_url_length)
19
19
  end
20
20
  end
21
21
 
22
- def initialize(url, str, tip)
22
+ def initialize(url, str, tip, max_url_length)
23
23
  # The displayed string defaults to the url string.
24
24
  str ||= url.dup
25
25
 
@@ -33,8 +33,8 @@ def initialize(url, str, tip)
33
33
  url = escape_url(url)
34
34
 
35
35
  # Excel limits the escaped URL and location/anchor to 255 characters.
36
- if url.bytesize > 255 || (!@url_str.nil? && @url_str.bytesize > 255)
37
- raise "Ignoring URL '#{url}' where link or anchor > 255 characters since it exceeds Excel's limit for URLS. See LIMITATIONS section of the Excel::Writer::XLSX documentation."
36
+ if url.bytesize > max_url_length || (!@url_str.nil? && @url_str.bytesize > max_url_length)
37
+ raise "Ignoring URL '#{url}' where link or anchor > #{max_url_length} characters since it exceeds Excel's limit for URLS. See LIMITATIONS section of the Excel::Writer::XLSX documentation."
38
38
  end
39
39
 
40
40
  @url = url
@@ -61,33 +61,12 @@ def external_hyper_link
61
61
  def display_on
62
62
  @display = @url_str
63
63
  end
64
-
65
- private
66
-
67
- def escape_url(url)
68
- unless url =~ /%[0-9a-fA-F]{2}/
69
- # Escape the URL escape symbol.
70
- url = url.gsub(/%/, "%25")
71
-
72
- # Escape whitespae in URL.
73
- url = url.gsub(/[\s\x00]/, '%20')
74
-
75
- # Escape other special characters in URL.
76
- re = /(["<>\[\]`^{}])/
77
- while re =~ url
78
- match = $~[1]
79
- url = url.sub(re, sprintf("%%%x", match.ord))
80
- end
81
- end
82
-
83
- url
84
- end
85
64
  end
86
65
 
87
66
  class InternalHyperlink < Hyperlink
88
67
  undef external_hyper_link
89
68
 
90
- def initialize(url, str, tip)
69
+ def initialize(url, str, tip, max_url_length)
91
70
  @url = url
92
71
  # The displayed string defaults to the url string.
93
72
  str ||= @url.dup
@@ -98,9 +77,9 @@ def initialize(url, str, tip)
98
77
  # Copy string for use in hyperlink elements.
99
78
  @url_str = @str.dup
100
79
 
101
- # Excel limits escaped URL to 255 characters.
102
- if @url.bytesize > MAXIMUM_URLS_SIZE
103
- raise "URL '#{@url}' > #{MAXIMUM_URLS_SIZE} characters, it exceeds Excel's limit for URLS."
80
+ # Excel limits escaped URL to #{max_url_length} characters.
81
+ if @url.bytesize > max_url_length
82
+ raise "URL '#{@url}' > #{max_url_length} characters, it exceeds Excel's limit for URLS."
104
83
  end
105
84
 
106
85
  @tip = tip
@@ -118,7 +97,7 @@ def attributes(row, col, dummy = nil)
118
97
  end
119
98
 
120
99
  class ExternalHyperlink < Hyperlink
121
- def initialize(url, str, tip)
100
+ def initialize(url, str, tip, max_url_length)
122
101
  # The displayed string defaults to the url string.
123
102
  str ||= url.dup
124
103
 
@@ -145,9 +124,9 @@ def initialize(url, str, tip)
145
124
  url = url.sub(%r!^.\\!, '')
146
125
  @url_str = url_str
147
126
 
148
- # Excel limits the escaped URL and location/anchor to 255 characters.
149
- if url.bytesize > 255 || (!@url_str.nil? && @url_str.bytesize > 255)
150
- raise "Ignoring URL '#{url}' where link or anchor > 255 characters since it exceeds Excel's limit for URLS. See LIMITATIONS section of the Excel::Writer::XLSX documentation."
127
+ # Excel limits the escaped URL and location/anchor to max_url_length characters.
128
+ if url.bytesize > max_url_length || (!@url_str.nil? && @url_str.bytesize > max_url_length)
129
+ raise "Ignoring URL '#{url}' where link or anchor > #{max_url_length} characters since it exceeds Excel's limit for URLS. See LIMITATIONS section of the Excel::Writer::XLSX documentation."
151
130
  end
152
131
 
153
132
  @url = url
@@ -7,9 +7,17 @@ def setup
7
7
  @chart = Writexlsx::Chart.new('Bar')
8
8
  end
9
9
 
10
- def test_write_legend_pos
10
+ def test_write_legend_pos_default
11
11
  expected = '<c:legendPos val="r"/>'
12
12
  result = @chart.__send__('write_legend_pos', 'r')
13
13
  assert_equal(expected, result)
14
14
  end
15
+
16
+ def test_write_legend_overlay_top_right
17
+ expected = '<c:legend><c:legendPos val="tr"/><c:layout/><c:overlay val="1"/></c:legend>'
18
+ @chart.set_legend(:position => 'overlay_top_right')
19
+ @chart.__send__('write_legend')
20
+ result = @chart.instance_variable_get(:@writer).string
21
+ assert_equal(expected, result)
22
+ end
15
23
  end
@@ -0,0 +1,91 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'helper'
3
+
4
+ class TestChartsheetWriteSheetProtection < Minitest::Test
5
+ def setup
6
+ workbook = WriteXLSX.new(StringIO.new)
7
+ workbook.add_chart(:type => 'line')
8
+ @chartsheet = workbook.sheets.first
9
+ end
10
+
11
+ def test_chartsheet_write_sheet_protection
12
+ expected = '<sheetProtection password="83AF" content="1" objects="1"/>'
13
+
14
+ @chartsheet.protect('', {})
15
+ result = @chartsheet.__send__(:write_sheet_protection)
16
+ assert_equal(expected_to_array(expected), got_to_array(result))
17
+ end
18
+
19
+ def test_chartsheet_write_sheet_protection
20
+ expected = '<sheetProtection password="83AF" content="1" objects="1"/>'
21
+
22
+ @chartsheet.protect('password', {})
23
+ result = @chartsheet.__send__(:write_sheet_protection)
24
+ assert_equal(expected_to_array(expected), got_to_array(result))
25
+ end
26
+
27
+ def test_chartsheet_write_sheet_protection_without_password_and_content
28
+ expected = '<sheetProtection content="1"/>'
29
+
30
+ @chartsheet.protect('', {:objects => 0})
31
+ result = @chartsheet.__send__(:write_sheet_protection)
32
+ assert_equal(expected_to_array(expected), got_to_array(result))
33
+ end
34
+
35
+ def test_chartsheet_write_sheet_protection_with_opjects0_option
36
+ expected = '<sheetProtection password="83AF" content="1"/>'
37
+
38
+ @chartsheet.protect('password', { :objects => 0 })
39
+ result = @chartsheet.__send__(:write_sheet_protection)
40
+ assert_equal(expected_to_array(expected), got_to_array(result))
41
+ end
42
+
43
+ def test_chartsheet_write_sheet_protection_without_password
44
+ expected = '<sheetProtection objects="1"/>'
45
+
46
+ @chartsheet.protect('', { :content => 0 })
47
+ result = @chartsheet.__send__(:write_sheet_protection)
48
+ assert_equal(expected_to_array(expected), got_to_array(result))
49
+ end
50
+
51
+ def test_chartsheet_write_sheet_protection_without_password_and_content_option
52
+ expected = ''
53
+
54
+ @chartsheet.protect('', { :content => 0, :objects => 0 })
55
+ result = @chartsheet.__send__(:write_sheet_protection) || ''
56
+ assert_equal(expected_to_array(expected), got_to_array(result))
57
+ end
58
+
59
+ def test_chartsheet_write_sheet_protection_with_password_and_content_objects_option
60
+ expected = '<sheetProtection password="83AF"/>'
61
+
62
+ @chartsheet.protect('password', { :content => 0, :objects => 0 })
63
+ result = @chartsheet.__send__(:write_sheet_protection)
64
+ assert_equal(expected_to_array(expected), got_to_array(result))
65
+ end
66
+
67
+ def test_chartsheet_write_sheet_protection_with_password_full_options
68
+ expected = '<sheetProtection password="83AF" content="1" objects="1"/>'
69
+
70
+ options = {
71
+ :objects => 1,
72
+ :scenarios => 1,
73
+ :format_cells => 1,
74
+ :format_columns => 1,
75
+ :format_rows => 1,
76
+ :insert_columns => 1,
77
+ :insert_rows => 1,
78
+ :insert_hyperlinks => 1,
79
+ :delete_columns => 1,
80
+ :delete_rows => 1,
81
+ :select_locked_cells => 0,
82
+ :sort => 1,
83
+ :autofilter => 1,
84
+ :pivot_tables => 1,
85
+ :select_unlocked_cells => 0
86
+ }
87
+ @chartsheet.protect('password', options)
88
+ result = @chartsheet.__send__(:write_sheet_protection)
89
+ assert_equal(expected_to_array(expected), got_to_array(result))
90
+ end
91
+ end
@@ -4,8 +4,12 @@
4
4
 
5
5
  class DrawingChart011 < Minitest::Test
6
6
  def test_drawing_chart_01
7
- @obj = Writexlsx::Drawing.new
8
- @obj.add_drawing_object(1, 4, 8, 457200, 104775, 12, 22, 152400, 180975)
7
+ @obj = Writexlsx::Drawings.new
8
+ dimensions = [4, 8, 457200, 104775, 12, 22, 152400, 180975]
9
+ drawing = Writexlsx::Drawing.new(
10
+ 1, dimensions, nil, nil, nil, nil, 1, 1
11
+ )
12
+ @obj.add_drawing_object(drawing)
9
13
  @obj.embedded = true
10
14
  @obj.assemble_xml_file
11
15
  result = got_to_array(@obj.xml_str)
@@ -4,9 +4,18 @@
4
4
 
5
5
  class DrawingImage011 < Minitest::Test
6
6
  def test_drawing_image_01
7
- @obj = Writexlsx::Drawing.new
8
- @obj.add_drawing_object(2, 2, 1, 0, 0, 3, 6, 533257, 190357,
9
- 1219200, 190500, 1142857, 1142857, 'republic.png')
7
+ @obj = Writexlsx::Drawings.new
8
+ dimensions = [
9
+ 2, 1, 0, 0, 3, 6, 533257, 190357, 1219200, 190500
10
+ ]
11
+ drawing = Writexlsx::Drawing.new(
12
+ 2, dimensions, 1142857, 1142857, 'republic.png', nil, 2, 1
13
+ )
14
+ @obj.add_drawing_object(drawing)
15
+ # @obj.add_drawing_object(
16
+ # 2, 2, 1, 0, 0, 3, 6, 533257, 190357,
17
+ # 1219200, 190500, 1142857, 1142857, 'republic.png', nil, 2
18
+ # )
10
19
  @obj.embedded = true
11
20
  @obj.assemble_xml_file
12
21
  result = got_to_array(@obj.xml_str)
@@ -8,12 +8,15 @@ def test_drawing_shape_01
8
8
  shape = Writexlsx::Shape.new
9
9
  shape.id = 1000
10
10
 
11
- @obj = Writexlsx::Drawing.new
11
+ @obj = Writexlsx::Drawings.new
12
12
  @obj.embedded = 1
13
- @obj.add_drawing_object(
14
- 3, 4, 8, 209550, 95250, 12, 22, 209660,
15
- 96260, 10000, 20000, 95250, 190500, 'rect 1', shape
16
- )
13
+ dimensions = [
14
+ 4, 8, 209550, 95250, 12, 22, 209660, 96260, 10000, 20000
15
+ ]
16
+ drawing = Writexlsx::Drawing.new(
17
+ 3, dimensions, 95250, 190500, 'rect 1', shape, 1
18
+ )
19
+ @obj.add_drawing_object(drawing)
17
20
  @obj.assemble_xml_file
18
21
  result = got_to_array(@obj.xml_str)
19
22
  expected = expected_to_array(<<EOS
@@ -13,12 +13,19 @@ def test_drawing_shape_02
13
13
  # Set bulk shape properties via set_properties method
14
14
  shape.set_properties(:type => 'straightConnector1', :connect => 1)
15
15
 
16
- @obj = Writexlsx::Drawing.new
16
+ @obj = Writexlsx::Drawings.new
17
17
  @obj.embedded = 1
18
- @obj.add_drawing_object(
19
- 3, 4, 8, 209550, 95250, 12, 22, 209660,
20
- 96260, 10000, 20000, 95250, 190500, 'Connector 1', shape
21
- )
18
+ dimensions = [
19
+ 4, 8, 209550, 95250, 12, 22, 209660, 96260, 10000, 20000
20
+ ]
21
+ drawing = Writexlsx::Drawing.new(
22
+ 3, dimensions, 95250, 190500, 'Connector 1', shape, 1
23
+ )
24
+ @obj.add_drawing_object(drawing)
25
+ # @obj.add_drawing_object(
26
+ # 3, 4, 8, 209550, 95250, 12, 22, 209660,
27
+ # 96260, 10000, 20000, 95250, 190500, 'Connector 1', shape, 1
28
+ # )
22
29
  @obj.assemble_xml_file
23
30
  result = got_to_array(@obj.xml_str)
24
31
  expected = expected_to_array(<<EOS
@@ -13,12 +13,15 @@ def test_drawing_shape_03
13
13
  shape.end = 1002
14
14
  shape.end_index = 4
15
15
 
16
- @obj = Writexlsx::Drawing.new
16
+ @obj = Writexlsx::Drawings.new
17
17
  @obj.embedded = 1
18
- @obj.add_drawing_object(
19
- 3, 4, 8, 209550, 95250, 12, 22, 209660,
20
- 96260, 10000, 20000, 95250, 190500, '', shape
21
- )
18
+ dimensions = [
19
+ 4, 8, 209550, 95250, 12, 22, 209660, 96260, 10000, 20000
20
+ ]
21
+ drawing = Writexlsx::Drawing.new(
22
+ 3, dimensions, 95250, 190500, '', shape, 1
23
+ )
24
+ @obj.add_drawing_object(drawing)
22
25
  @obj.__send__('write_nv_cxn_sp_pr', 1, shape)
23
26
 
24
27
  result = got_to_array(@obj.xml_str)
@@ -19,36 +19,20 @@ def test_drawing_shape_04
19
19
  shape.palette[0] = [0x00, 0x00, 0x00, 0x00]
20
20
  shape.palette[7] = [0x00, 0x00, 0x00, 0x00]
21
21
 
22
- @obj = Writexlsx::Drawing.new
22
+ @obj = Writexlsx::Drawings.new
23
23
  @obj.embedded = 2
24
- @obj.add_drawing_object(
25
- 3, 4, 8, 209550, 95250, 12, 22, 209660,
26
- 96260, 10000, 20000, 95250, 190500, 'rect 1', shape
27
- )
24
+ dimensions = [
25
+ 4, 8, 209550, 95250, 12, 22, 209660, 96260, 10000, 20000
26
+ ]
27
+ drawing = Writexlsx::Drawing.new(
28
+ 3, dimensions, 95250, 190500, 'rect 1', shape, 1
29
+ )
30
+ @obj.add_drawing_object(drawing)
28
31
  @obj.assemble_xml_file
29
32
 
30
33
  result = got_to_array(@obj.xml_str)
31
34
  expected = expected_to_array(expected_str)
32
35
  assert_equal(expected, result)
33
-
34
- drawing1 = Writexlsx::Drawing.new
35
- @worksheet.instance_variable_set(:@drawing, drawing1)
36
- inserted = @worksheet.insert_shape(4, 8, shape, 300, 400)
37
-
38
- # Force the shape cell x offset to be non-integer
39
- inserted.x_offset += 0.5
40
- @worksheet.__send__(:prepare_shape, 0, 1)
41
-
42
- # Truncate drawing object to just the dimensions
43
- drawing1.instance_variable_get(:@drawings)[0] =
44
- drawing1.instance_variable_get(:@drawings)[0][0..12]
45
-
46
- # Verify fractional dimensions have been rounded
47
- expected = [
48
- 3, 12, 24, 423862, 0, 13, 26, 290512,
49
- 95250, 7739062, 4572000, 476250, 476250
50
- ]
51
- assert_equal(expected, drawing1.instance_variable_get(:@drawings)[0])
52
36
  end
53
37
 
54
38
  def expected_str
@@ -19,14 +19,17 @@ def test_drawing_shape_05
19
19
  shape.flip_h = 1
20
20
  shape.rotation = 90
21
21
 
22
- @obj = Writexlsx::Drawing.new
22
+ @obj = Writexlsx::Drawings.new
23
23
  @obj.instance_variable_set(:@palette, @worksheet.instance_variable_get(:@palette))
24
24
  @obj.embedded = 1
25
25
 
26
- @obj.add_drawing_object(
27
- 3, 4, 8, 209550, 95250, 12, 22, 209660,
28
- 96260, 10000, 20000, 95250, 190500, '', shape
29
- )
26
+ dimensions = [
27
+ 4, 8, 209550, 95250, 12, 22, 209660, 96260, 10000, 20000
28
+ ]
29
+ drawing = Writexlsx::Drawing.new(
30
+ 3, dimensions, 95250, 190500, '', shape, 1
31
+ )
32
+ @obj.add_drawing_object(drawing)
30
33
  @obj.__send__(:write_a_xfrm, 100, 200, 10, 20, shape)
31
34
 
32
35
  result = got_to_array(@obj.xml_str)
@@ -16,13 +16,18 @@ def test_drawing_shape_06
16
16
  shape = Writexlsx::Shape.new
17
17
  shape.adjustments = -10, 100, 20
18
18
 
19
- @obj = Writexlsx::Drawing.new
19
+ @obj = Writexlsx::Drawings.new
20
20
  @obj.embedded = 1
21
-
22
- @obj.add_drawing_object(
23
- 3, 4, 8, 209550, 95250, 12, 22, 209660,
24
- 96260, 10000, 20000, 95250, 190500, '', shape
25
- )
21
+ dimensions = [
22
+ 4, 8, 209550, 95250, 12, 22, 209660, 96260, 10000, 20000
23
+ ]
24
+ drawing = Writexlsx::Drawing.new(
25
+ 3, dimensions, 95250, 190500, '', shape, 1
26
+ )
27
+ @obj.add_drawing_object(drawing)
28
+ # 3, 4, 8, 209550, 95250, 12, 22, 209660,
29
+ # 96260, 10000, 20000, 95250, 190500, '', shape
30
+ # )
26
31
  @obj.__send__(:write_a_av_lst, shape)
27
32
 
28
33
  result = got_to_array(@obj.xml_str)