write_xlsx 1.09.3 → 1.11.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2065) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +128 -0
  3. data/.rubocop_todo.yml +445 -0
  4. data/Changes +49 -0
  5. data/Gemfile +2 -0
  6. data/LICENSE.txt +1 -1
  7. data/README.md +2 -2
  8. data/Rakefile +14 -8
  9. data/examples/array_formula.rb +2 -2
  10. data/examples/autofilter.rb +50 -26
  11. data/examples/autofit.rb +37 -0
  12. data/examples/chart_area.rb +16 -16
  13. data/examples/chart_bar.rb +16 -16
  14. data/examples/chart_clustered.rb +12 -12
  15. data/examples/chart_column.rb +16 -16
  16. data/examples/chart_combined.rb +27 -28
  17. data/examples/chart_data_labels.rb +103 -115
  18. data/examples/chart_data_table.rb +29 -29
  19. data/examples/chart_data_tools.rb +55 -61
  20. data/examples/chart_doughnut.rb +34 -38
  21. data/examples/chart_gauge.rb +20 -20
  22. data/examples/chart_line.rb +44 -45
  23. data/examples/chart_pareto.rb +18 -18
  24. data/examples/chart_pie.rb +22 -22
  25. data/examples/chart_radar.rb +41 -47
  26. data/examples/chart_scatter.rb +16 -16
  27. data/examples/chart_secondary_axis.rb +16 -16
  28. data/examples/chart_stock.rb +22 -23
  29. data/examples/chart_styles.rb +8 -9
  30. data/examples/colors.rb +31 -34
  31. data/examples/comments1.rb +1 -0
  32. data/examples/comments2.rb +85 -114
  33. data/examples/conditional_format.rb +164 -155
  34. data/examples/data_validate.rb +135 -122
  35. data/examples/date_time.rb +30 -30
  36. data/examples/defined_name.rb +5 -5
  37. data/examples/demo.rb +14 -16
  38. data/examples/diag_border.rb +7 -8
  39. data/examples/dynamic_arrays.rb +247 -0
  40. data/examples/formats.rb +95 -107
  41. data/examples/headers.rb +2 -7
  42. data/examples/hyperlink1.rb +5 -6
  43. data/examples/ignore_errors.rb +2 -2
  44. data/examples/indent.rb +2 -2
  45. data/examples/lambda.rb +43 -0
  46. data/examples/macros.rb +6 -6
  47. data/examples/merge1.rb +1 -4
  48. data/examples/merge2.rb +9 -12
  49. data/examples/merge3.rb +6 -7
  50. data/examples/merge4.rb +22 -24
  51. data/examples/merge5.rb +24 -24
  52. data/examples/merge6.rb +8 -8
  53. data/examples/outline.rb +9 -17
  54. data/examples/outline_collapsed.rb +7 -7
  55. data/examples/panes.rb +16 -16
  56. data/examples/properties.rb +9 -9
  57. data/examples/protection.rb +2 -2
  58. data/examples/rich_strings.rb +25 -17
  59. data/examples/shape1.rb +9 -9
  60. data/examples/shape2.rb +19 -19
  61. data/examples/shape3.rb +6 -6
  62. data/examples/shape4.rb +9 -9
  63. data/examples/shape5.rb +9 -9
  64. data/examples/shape6.rb +9 -9
  65. data/examples/shape7.rb +15 -15
  66. data/examples/shape8.rb +15 -15
  67. data/examples/shape_all.rb +7 -7
  68. data/examples/sparklines1.rb +23 -24
  69. data/examples/sparklines2.rb +152 -152
  70. data/examples/tables.rb +119 -127
  71. data/examples/update_range_format_with_params.rb +4 -4
  72. data/examples/watermark.png +0 -0
  73. data/examples/watermark.rb +26 -0
  74. data/lib/write_xlsx/chart/area.rb +9 -9
  75. data/lib/write_xlsx/chart/axis.rb +13 -24
  76. data/lib/write_xlsx/chart/bar.rb +9 -12
  77. data/lib/write_xlsx/chart/caption.rb +1 -0
  78. data/lib/write_xlsx/chart/column.rb +4 -4
  79. data/lib/write_xlsx/chart/doughnut.rb +4 -2
  80. data/lib/write_xlsx/chart/legend.rb +1 -0
  81. data/lib/write_xlsx/chart/line.rb +18 -18
  82. data/lib/write_xlsx/chart/pie.rb +27 -14
  83. data/lib/write_xlsx/chart/radar.rb +10 -10
  84. data/lib/write_xlsx/chart/scatter.rb +23 -25
  85. data/lib/write_xlsx/chart/series.rb +112 -73
  86. data/lib/write_xlsx/chart/stock.rb +30 -24
  87. data/lib/write_xlsx/chart.rb +320 -269
  88. data/lib/write_xlsx/chartsheet.rb +33 -32
  89. data/lib/write_xlsx/col_name.rb +9 -3
  90. data/lib/write_xlsx/colors.rb +21 -19
  91. data/lib/write_xlsx/compatibility.rb +15 -15
  92. data/lib/write_xlsx/drawing.rb +72 -63
  93. data/lib/write_xlsx/format.rb +71 -69
  94. data/lib/write_xlsx/formats.rb +2 -0
  95. data/lib/write_xlsx/gradient.rb +7 -9
  96. data/lib/write_xlsx/package/app.rb +17 -16
  97. data/lib/write_xlsx/package/button.rb +9 -5
  98. data/lib/write_xlsx/package/comments.rb +36 -38
  99. data/lib/write_xlsx/package/conditional_format.rb +112 -120
  100. data/lib/write_xlsx/package/content_types.rb +21 -21
  101. data/lib/write_xlsx/package/core.rb +6 -4
  102. data/lib/write_xlsx/package/custom.rb +8 -7
  103. data/lib/write_xlsx/package/metadata.rb +7 -5
  104. data/lib/write_xlsx/package/packager.rb +39 -25
  105. data/lib/write_xlsx/package/relationships.rb +2 -1
  106. data/lib/write_xlsx/package/shared_strings.rb +17 -15
  107. data/lib/write_xlsx/package/styles.rb +74 -90
  108. data/lib/write_xlsx/package/table.rb +186 -131
  109. data/lib/write_xlsx/package/theme.rb +4 -3
  110. data/lib/write_xlsx/package/vml.rb +25 -31
  111. data/lib/write_xlsx/package/xml_writer_simple.rb +46 -40
  112. data/lib/write_xlsx/shape.rb +26 -36
  113. data/lib/write_xlsx/sheets.rb +41 -45
  114. data/lib/write_xlsx/sparkline.rb +299 -307
  115. data/lib/write_xlsx/utility.rb +210 -188
  116. data/lib/write_xlsx/version.rb +3 -1
  117. data/lib/write_xlsx/workbook.rb +289 -331
  118. data/lib/write_xlsx/worksheet/cell_data.rb +87 -66
  119. data/lib/write_xlsx/worksheet/data_validation.rb +79 -74
  120. data/lib/write_xlsx/worksheet/hyperlink.rb +14 -19
  121. data/lib/write_xlsx/worksheet/page_setup.rb +10 -11
  122. data/lib/write_xlsx/worksheet.rb +1449 -866
  123. data/lib/write_xlsx/zip_file_utils.rb +33 -34
  124. data/lib/write_xlsx.rb +2 -3
  125. data/write_xlsx.gemspec +26 -19
  126. metadata +72 -3884
  127. data/.gitattributes +0 -1
  128. data/.gitignore +0 -45
  129. data/.travis.yml +0 -75
  130. data/bin/extract_vba.rb +0 -34
  131. data/test/chart/test_add_series.rb +0 -190
  132. data/test/chart/test_process_names.rb +0 -27
  133. data/test/chart/test_write_a_latin.rb +0 -22
  134. data/test/chart/test_write_auto.rb +0 -15
  135. data/test/chart/test_write_ax_id.rb +0 -15
  136. data/test/chart/test_write_ax_pos.rb +0 -15
  137. data/test/chart/test_write_cross_ax.rb +0 -15
  138. data/test/chart/test_write_crosses.rb +0 -15
  139. data/test/chart/test_write_d_lbls.rb +0 -292
  140. data/test/chart/test_write_format_code.rb +0 -16
  141. data/test/chart/test_write_idx.rb +0 -15
  142. data/test/chart/test_write_label_align.rb +0 -15
  143. data/test/chart/test_write_label_offset.rb +0 -15
  144. data/test/chart/test_write_lang.rb +0 -15
  145. data/test/chart/test_write_layout.rb +0 -15
  146. data/test/chart/test_write_legend.rb +0 -16
  147. data/test/chart/test_write_legend_pos.rb +0 -23
  148. data/test/chart/test_write_major_gridlines.rb +0 -15
  149. data/test/chart/test_write_marker.rb +0 -17
  150. data/test/chart/test_write_marker_size.rb +0 -15
  151. data/test/chart/test_write_marker_value.rb +0 -16
  152. data/test/chart/test_write_num_cache.rb +0 -16
  153. data/test/chart/test_write_number_format.rb +0 -48
  154. data/test/chart/test_write_order.rb +0 -15
  155. data/test/chart/test_write_orientation.rb +0 -15
  156. data/test/chart/test_write_page_margins.rb +0 -15
  157. data/test/chart/test_write_page_setup.rb +0 -15
  158. data/test/chart/test_write_plot_vis_only.rb +0 -15
  159. data/test/chart/test_write_pt.rb +0 -16
  160. data/test/chart/test_write_pt_count.rb +0 -16
  161. data/test/chart/test_write_series_formula.rb +0 -16
  162. data/test/chart/test_write_style.rb +0 -41
  163. data/test/chart/test_write_symbol.rb +0 -16
  164. data/test/chart/test_write_tick_lbl_pos.rb +0 -16
  165. data/test/chart/test_write_v.rb +0 -16
  166. data/test/chartsheet/test_chartsheet01.rb +0 -31
  167. data/test/chartsheet/test_write_sheet_protection.rb +0 -91
  168. data/test/drawing/test_drawing_chart_01.rb +0 -54
  169. data/test/drawing/test_drawing_image_01.rb +0 -68
  170. data/test/drawing/test_drawing_shape_01.rb +0 -71
  171. data/test/drawing/test_drawing_shape_02.rb +0 -80
  172. data/test/drawing/test_drawing_shape_03.rb +0 -41
  173. data/test/drawing/test_drawing_shape_04.rb +0 -105
  174. data/test/drawing/test_drawing_shape_05.rb +0 -48
  175. data/test/drawing/test_drawing_shape_06.rb +0 -47
  176. data/test/drawing/test_drawing_shape_07.rb +0 -52
  177. data/test/drawing/test_write_a_graphic_frame_locks.rb +0 -18
  178. data/test/drawing/test_write_c_chart.rb +0 -18
  179. data/test/drawing/test_write_c_nv_graphic_frame_pr.rb +0 -28
  180. data/test/drawing/test_write_c_nv_pr.rb +0 -18
  181. data/test/drawing/test_write_col.rb +0 -18
  182. data/test/drawing/test_write_col_off.rb +0 -18
  183. data/test/drawing/test_write_pos.rb +0 -18
  184. data/test/drawing/test_write_row.rb +0 -18
  185. data/test/drawing/test_write_row_off.rb +0 -18
  186. data/test/drawing/test_write_xdr_ext.rb +0 -18
  187. data/test/drawing/test_write_xfrm_extension.rb +0 -18
  188. data/test/drawing/test_write_xfrm_offset.rb +0 -18
  189. data/test/helper.rb +0 -206
  190. data/test/package/app/test_app01.rb +0 -44
  191. data/test/package/app/test_app02.rb +0 -46
  192. data/test/package/app/test_app03.rb +0 -53
  193. data/test/package/comments/test_comments_01.rb +0 -54
  194. data/test/package/comments/test_comments_02.rb +0 -54
  195. data/test/package/content_types/test_content_types.rb +0 -35
  196. data/test/package/content_types/test_write_default.rb +0 -13
  197. data/test/package/content_types/test_write_override.rb +0 -13
  198. data/test/package/core/test_core01.rb +0 -28
  199. data/test/package/core/test_core02.rb +0 -42
  200. data/test/package/relationships/test_relationships.rb +0 -28
  201. data/test/package/relationships/test_sheet_rels.rb +0 -22
  202. data/test/package/shared_strings/test_shared_strings01.rb +0 -30
  203. data/test/package/shared_strings/test_shared_strings02.rb +0 -30
  204. data/test/package/shared_strings/test_write_si.rb +0 -16
  205. data/test/package/styles/test_styles_01.rb +0 -60
  206. data/test/package/styles/test_styles_02.rb +0 -95
  207. data/test/package/styles/test_styles_03.rb +0 -81
  208. data/test/package/styles/test_styles_04.rb +0 -207
  209. data/test/package/styles/test_styles_05.rb +0 -141
  210. data/test/package/styles/test_styles_06.rb +0 -95
  211. data/test/package/styles/test_styles_07.rb +0 -95
  212. data/test/package/styles/test_styles_08.rb +0 -100
  213. data/test/package/styles/test_styles_09.rb +0 -86
  214. data/test/package/table/test_table01.rb +0 -42
  215. data/test/package/table/test_table02.rb +0 -44
  216. data/test/package/table/test_table03.rb +0 -48
  217. data/test/package/table/test_table04.rb +0 -46
  218. data/test/package/table/test_table05.rb +0 -46
  219. data/test/package/table/test_table06.rb +0 -52
  220. data/test/package/table/test_table07.rb +0 -47
  221. data/test/package/table/test_table08.rb +0 -53
  222. data/test/package/table/test_table09.rb +0 -65
  223. data/test/package/table/test_table10.rb +0 -45
  224. data/test/package/table/test_table11.rb +0 -60
  225. data/test/package/table/test_table12.rb +0 -60
  226. data/test/package/table/test_table13.rb +0 -69
  227. data/test/package/table/test_write_auto_filter.rb +0 -23
  228. data/test/package/table/test_write_table_column.rb +0 -22
  229. data/test/package/table/test_write_table_style_info.rb +0 -26
  230. data/test/package/vml/test_write_auto_fill.rb +0 -14
  231. data/test/package/vml/test_write_div.rb +0 -14
  232. data/test/package/vml/test_write_idmap.rb +0 -14
  233. data/test/package/vml/test_write_path.rb +0 -30
  234. data/test/package/vml/test_write_shapelayout.rb +0 -14
  235. data/test/package/vml/test_write_shapetype.rb +0 -22
  236. data/test/package/vml/test_write_stroke.rb +0 -14
  237. data/test/perl_output/a_simple.xlsx +0 -0
  238. data/test/perl_output/add_vba_project.xlsm +0 -0
  239. data/test/perl_output/array_formula.xlsx +0 -0
  240. data/test/perl_output/autofilter.xlsx +0 -0
  241. data/test/perl_output/background.xlsx +0 -0
  242. data/test/perl_output/chart_area.xlsx +0 -0
  243. data/test/perl_output/chart_bar.xlsx +0 -0
  244. data/test/perl_output/chart_column.xlsx +0 -0
  245. data/test/perl_output/chart_combined.xlsx +0 -0
  246. data/test/perl_output/chart_data_labels.xlsx +0 -0
  247. data/test/perl_output/chart_data_table.xlsx +0 -0
  248. data/test/perl_output/chart_data_tools.xlsx +0 -0
  249. data/test/perl_output/chart_doughnut.xlsx +0 -0
  250. data/test/perl_output/chart_gauge.xlsx +0 -0
  251. data/test/perl_output/chart_line.xlsx +0 -0
  252. data/test/perl_output/chart_pareto.xlsx +0 -0
  253. data/test/perl_output/chart_pie.xlsx +0 -0
  254. data/test/perl_output/chart_radar.xlsx +0 -0
  255. data/test/perl_output/chart_scatter.xlsx +0 -0
  256. data/test/perl_output/chart_scatter06.xlsx +0 -0
  257. data/test/perl_output/chart_secondary_axis.xlsx +0 -0
  258. data/test/perl_output/chart_stock.xlsx +0 -0
  259. data/test/perl_output/comments1.xlsx +0 -0
  260. data/test/perl_output/comments2.xlsx +0 -0
  261. data/test/perl_output/conditional_format.xlsx +0 -0
  262. data/test/perl_output/data_validate.xlsx +0 -0
  263. data/test/perl_output/date_time.xlsx +0 -0
  264. data/test/perl_output/defined_name.xlsx +0 -0
  265. data/test/perl_output/demo.xlsx +0 -0
  266. data/test/perl_output/diag_border.xlsx +0 -0
  267. data/test/perl_output/fit_to_pages.xlsx +0 -0
  268. data/test/perl_output/formats.xlsx +0 -0
  269. data/test/perl_output/headers.xlsx +0 -0
  270. data/test/perl_output/hide_first_sheet.xlsx +0 -0
  271. data/test/perl_output/hide_row_col.xlsx +0 -0
  272. data/test/perl_output/hide_sheet.xlsx +0 -0
  273. data/test/perl_output/hyperlink.xlsx +0 -0
  274. data/test/perl_output/ignore_errors.xlsx +0 -0
  275. data/test/perl_output/indent.xlsx +0 -0
  276. data/test/perl_output/keep_leading_zeros.xlsx +0 -0
  277. data/test/perl_output/merge1.xlsx +0 -0
  278. data/test/perl_output/merge2.xlsx +0 -0
  279. data/test/perl_output/merge3.xlsx +0 -0
  280. data/test/perl_output/merge4.xlsx +0 -0
  281. data/test/perl_output/merge5.xlsx +0 -0
  282. data/test/perl_output/merge6.xlsx +0 -0
  283. data/test/perl_output/multi_line.xlsx +0 -0
  284. data/test/perl_output/outline.xlsx +0 -0
  285. data/test/perl_output/outline_collapsed.xlsx +0 -0
  286. data/test/perl_output/panes.xlsx +0 -0
  287. data/test/perl_output/print_scale.xlsx +0 -0
  288. data/test/perl_output/properties.xlsx +0 -0
  289. data/test/perl_output/protection.xlsx +0 -0
  290. data/test/perl_output/regions.xlsx +0 -0
  291. data/test/perl_output/rich_strings.xlsx +0 -0
  292. data/test/perl_output/right_to_left.xlsx +0 -0
  293. data/test/perl_output/shape1.xlsx +0 -0
  294. data/test/perl_output/shape2.xlsx +0 -0
  295. data/test/perl_output/shape3.xlsx +0 -0
  296. data/test/perl_output/shape4.xlsx +0 -0
  297. data/test/perl_output/shape5.xlsx +0 -0
  298. data/test/perl_output/shape6.xlsx +0 -0
  299. data/test/perl_output/shape7.xlsx +0 -0
  300. data/test/perl_output/shape8.xlsx +0 -0
  301. data/test/perl_output/shape_all.xlsx +0 -0
  302. data/test/perl_output/sparklines1.xlsx +0 -0
  303. data/test/perl_output/sparklines2.xlsx +0 -0
  304. data/test/perl_output/stats.xlsx +0 -0
  305. data/test/perl_output/stats_ext.xlsx +0 -0
  306. data/test/perl_output/stocks.xlsx +0 -0
  307. data/test/perl_output/tab_colors.xlsx +0 -0
  308. data/test/perl_output/tables.xlsx +0 -0
  309. data/test/regression/_test_hyperlink31.rb +0 -26
  310. data/test/regression/disabled_test_vml04.rb +0 -41
  311. data/test/regression/images/black_150.jpg +0 -0
  312. data/test/regression/images/black_150.png +0 -0
  313. data/test/regression/images/black_150e.png +0 -0
  314. data/test/regression/images/black_300.jpg +0 -0
  315. data/test/regression/images/black_300.png +0 -0
  316. data/test/regression/images/black_300e.png +0 -0
  317. data/test/regression/images/black_72.jpg +0 -0
  318. data/test/regression/images/black_72.png +0 -0
  319. data/test/regression/images/black_72e.png +0 -0
  320. data/test/regression/images/black_96.jpg +0 -0
  321. data/test/regression/images/black_96.png +0 -0
  322. data/test/regression/images/blue.jpg +0 -0
  323. data/test/regression/images/blue.png +0 -0
  324. data/test/regression/images/grey.jpg +0 -0
  325. data/test/regression/images/grey.png +0 -0
  326. data/test/regression/images/happy.jpg +0 -0
  327. data/test/regression/images/issue32.png +0 -0
  328. data/test/regression/images/logo.gif +0 -0
  329. data/test/regression/images/logo.jpg +0 -0
  330. data/test/regression/images/logo.png +0 -0
  331. data/test/regression/images/mylogo.png +0 -0
  332. data/test/regression/images/red.bmp +0 -0
  333. data/test/regression/images/red.gif +0 -0
  334. data/test/regression/images/red.jpg +0 -0
  335. data/test/regression/images/red.png +0 -0
  336. data/test/regression/images/red2.png +0 -0
  337. data/test/regression/images/red_208.png +0 -0
  338. data/test/regression/images/red_64x20.png +0 -0
  339. data/test/regression/images/train.jpg +0 -0
  340. data/test/regression/images/yellow.jpg +0 -0
  341. data/test/regression/images/yellow.png +0 -0
  342. data/test/regression/images/zero_dpi.jpg +0 -0
  343. data/test/regression/klt.csv +0 -4
  344. data/test/regression/test_array_formula01.rb +0 -31
  345. data/test/regression/test_array_formula02.rb +0 -32
  346. data/test/regression/test_array_formula03.rb +0 -36
  347. data/test/regression/test_array_formula04.rb +0 -31
  348. data/test/regression/test_autofilter00.rb +0 -84
  349. data/test/regression/test_autofilter01.rb +0 -86
  350. data/test/regression/test_autofilter02.rb +0 -104
  351. data/test/regression/test_autofilter03.rb +0 -104
  352. data/test/regression/test_autofilter04.rb +0 -107
  353. data/test/regression/test_autofilter05.rb +0 -108
  354. data/test/regression/test_autofilter06.rb +0 -108
  355. data/test/regression/test_autofilter07.rb +0 -107
  356. data/test/regression/test_autofilter08.rb +0 -110
  357. data/test/regression/test_autofilter09.rb +0 -110
  358. data/test/regression/test_autofilter10.rb +0 -110
  359. data/test/regression/test_background01.rb +0 -23
  360. data/test/regression/test_background02.rb +0 -23
  361. data/test/regression/test_background03.rb +0 -24
  362. data/test/regression/test_background04.rb +0 -25
  363. data/test/regression/test_background05.rb +0 -25
  364. data/test/regression/test_background06.rb +0 -31
  365. data/test/regression/test_background07.rb +0 -37
  366. data/test/regression/test_button01.rb +0 -23
  367. data/test/regression/test_button02.rb +0 -29
  368. data/test/regression/test_button03.rb +0 -24
  369. data/test/regression/test_button04.rb +0 -25
  370. data/test/regression/test_button05.rb +0 -28
  371. data/test/regression/test_button06.rb +0 -28
  372. data/test/regression/test_button07.rb +0 -35
  373. data/test/regression/test_button08.rb +0 -28
  374. data/test/regression/test_button13.rb +0 -30
  375. data/test/regression/test_button14.rb +0 -31
  376. data/test/regression/test_chart_area01.rb +0 -45
  377. data/test/regression/test_chart_area02.rb +0 -45
  378. data/test/regression/test_chart_area03.rb +0 -45
  379. data/test/regression/test_chart_area04.rb +0 -44
  380. data/test/regression/test_chart_axis01.rb +0 -45
  381. data/test/regression/test_chart_axis02.rb +0 -45
  382. data/test/regression/test_chart_axis03.rb +0 -67
  383. data/test/regression/test_chart_axis04.rb +0 -52
  384. data/test/regression/test_chart_axis05.rb +0 -47
  385. data/test/regression/test_chart_axis06.rb +0 -49
  386. data/test/regression/test_chart_axis07.rb +0 -53
  387. data/test/regression/test_chart_axis08.rb +0 -52
  388. data/test/regression/test_chart_axis09.rb +0 -46
  389. data/test/regression/test_chart_axis10.rb +0 -52
  390. data/test/regression/test_chart_axis11.rb +0 -46
  391. data/test/regression/test_chart_axis12.rb +0 -46
  392. data/test/regression/test_chart_axis13.rb +0 -52
  393. data/test/regression/test_chart_axis14.rb +0 -66
  394. data/test/regression/test_chart_axis15.rb +0 -47
  395. data/test/regression/test_chart_axis16.rb +0 -69
  396. data/test/regression/test_chart_axis17.rb +0 -45
  397. data/test/regression/test_chart_axis18.rb +0 -43
  398. data/test/regression/test_chart_axis19.rb +0 -45
  399. data/test/regression/test_chart_axis20.rb +0 -45
  400. data/test/regression/test_chart_axis21.rb +0 -49
  401. data/test/regression/test_chart_axis22.rb +0 -44
  402. data/test/regression/test_chart_axis23.rb +0 -45
  403. data/test/regression/test_chart_axis24.rb +0 -45
  404. data/test/regression/test_chart_axis25.rb +0 -44
  405. data/test/regression/test_chart_axis26.rb +0 -46
  406. data/test/regression/test_chart_axis27.rb +0 -44
  407. data/test/regression/test_chart_axis28.rb +0 -44
  408. data/test/regression/test_chart_axis29.rb +0 -43
  409. data/test/regression/test_chart_axis30.rb +0 -40
  410. data/test/regression/test_chart_axis31.rb +0 -40
  411. data/test/regression/test_chart_axis32.rb +0 -40
  412. data/test/regression/test_chart_axis33.rb +0 -44
  413. data/test/regression/test_chart_axis34.rb +0 -43
  414. data/test/regression/test_chart_axis35.rb +0 -43
  415. data/test/regression/test_chart_axis36.rb +0 -43
  416. data/test/regression/test_chart_axis37.rb +0 -45
  417. data/test/regression/test_chart_axis38.rb +0 -43
  418. data/test/regression/test_chart_axis39.rb +0 -50
  419. data/test/regression/test_chart_axis40.rb +0 -44
  420. data/test/regression/test_chart_axis41.rb +0 -48
  421. data/test/regression/test_chart_axis42.rb +0 -44
  422. data/test/regression/test_chart_axis43.rb +0 -44
  423. data/test/regression/test_chart_axis44.rb +0 -54
  424. data/test/regression/test_chart_axis45.rb +0 -54
  425. data/test/regression/test_chart_axis46.rb +0 -54
  426. data/test/regression/test_chart_axis47.rb +0 -52
  427. data/test/regression/test_chart_axis48.rb +0 -53
  428. data/test/regression/test_chart_bar01.rb +0 -44
  429. data/test/regression/test_chart_bar02.rb +0 -54
  430. data/test/regression/test_chart_bar03.rb +0 -66
  431. data/test/regression/test_chart_bar04.rb +0 -69
  432. data/test/regression/test_chart_bar05.rb +0 -39
  433. data/test/regression/test_chart_bar06.rb +0 -49
  434. data/test/regression/test_chart_bar07.rb +0 -53
  435. data/test/regression/test_chart_bar08.rb +0 -43
  436. data/test/regression/test_chart_bar09.rb +0 -42
  437. data/test/regression/test_chart_bar10.rb +0 -46
  438. data/test/regression/test_chart_bar11.rb +0 -72
  439. data/test/regression/test_chart_bar12.rb +0 -38
  440. data/test/regression/test_chart_bar13.rb +0 -48
  441. data/test/regression/test_chart_bar14.rb +0 -64
  442. data/test/regression/test_chart_bar15.rb +0 -51
  443. data/test/regression/test_chart_bar16.rb +0 -49
  444. data/test/regression/test_chart_bar17.rb +0 -45
  445. data/test/regression/test_chart_bar18.rb +0 -56
  446. data/test/regression/test_chart_bar19.rb +0 -48
  447. data/test/regression/test_chart_bar20.rb +0 -45
  448. data/test/regression/test_chart_bar21.rb +0 -49
  449. data/test/regression/test_chart_bar22.rb +0 -66
  450. data/test/regression/test_chart_bar23.rb +0 -60
  451. data/test/regression/test_chart_bar24.rb +0 -44
  452. data/test/regression/test_chart_blank01.rb +0 -41
  453. data/test/regression/test_chart_blank02.rb +0 -41
  454. data/test/regression/test_chart_blank03.rb +0 -41
  455. data/test/regression/test_chart_blank04.rb +0 -41
  456. data/test/regression/test_chart_blank05.rb +0 -44
  457. data/test/regression/test_chart_blank06.rb +0 -41
  458. data/test/regression/test_chart_chartarea01.rb +0 -52
  459. data/test/regression/test_chart_chartarea02.rb +0 -52
  460. data/test/regression/test_chart_chartarea03.rb +0 -55
  461. data/test/regression/test_chart_chartarea04.rb +0 -71
  462. data/test/regression/test_chart_chartarea05.rb +0 -49
  463. data/test/regression/test_chart_chartarea06.rb +0 -49
  464. data/test/regression/test_chart_clustered01.rb +0 -65
  465. data/test/regression/test_chart_column01.rb +0 -39
  466. data/test/regression/test_chart_column02.rb +0 -44
  467. data/test/regression/test_chart_column03.rb +0 -44
  468. data/test/regression/test_chart_column04.rb +0 -44
  469. data/test/regression/test_chart_column05.rb +0 -39
  470. data/test/regression/test_chart_column06.rb +0 -45
  471. data/test/regression/test_chart_column07.rb +0 -40
  472. data/test/regression/test_chart_column08.rb +0 -42
  473. data/test/regression/test_chart_column09.rb +0 -39
  474. data/test/regression/test_chart_column10.rb +0 -39
  475. data/test/regression/test_chart_column11.rb +0 -41
  476. data/test/regression/test_chart_column12.rb +0 -37
  477. data/test/regression/test_chart_combined01.rb +0 -37
  478. data/test/regression/test_chart_combined02.rb +0 -43
  479. data/test/regression/test_chart_combined03.rb +0 -45
  480. data/test/regression/test_chart_combined04.rb +0 -47
  481. data/test/regression/test_chart_combined05.rb +0 -49
  482. data/test/regression/test_chart_combined06.rb +0 -49
  483. data/test/regression/test_chart_combined07.rb +0 -53
  484. data/test/regression/test_chart_combined08.rb +0 -65
  485. data/test/regression/test_chart_combined09.rb +0 -50
  486. data/test/regression/test_chart_combined10.rb +0 -43
  487. data/test/regression/test_chart_combined11.rb +0 -63
  488. data/test/regression/test_chart_crossing01.rb +0 -49
  489. data/test/regression/test_chart_crossing02.rb +0 -47
  490. data/test/regression/test_chart_crossing03.rb +0 -52
  491. data/test/regression/test_chart_crossing04.rb +0 -52
  492. data/test/regression/test_chart_crossing05.rb +0 -46
  493. data/test/regression/test_chart_crossing06.rb +0 -46
  494. data/test/regression/test_chart_data_labels01.rb +0 -47
  495. data/test/regression/test_chart_data_labels02.rb +0 -47
  496. data/test/regression/test_chart_data_labels03.rb +0 -47
  497. data/test/regression/test_chart_data_labels04.rb +0 -47
  498. data/test/regression/test_chart_data_labels05.rb +0 -50
  499. data/test/regression/test_chart_data_labels06.rb +0 -50
  500. data/test/regression/test_chart_data_labels07.rb +0 -40
  501. data/test/regression/test_chart_data_labels08.rb +0 -46
  502. data/test/regression/test_chart_data_labels09.rb +0 -47
  503. data/test/regression/test_chart_data_labels10.rb +0 -47
  504. data/test/regression/test_chart_data_labels11.rb +0 -37
  505. data/test/regression/test_chart_data_labels12.rb +0 -37
  506. data/test/regression/test_chart_data_labels13.rb +0 -37
  507. data/test/regression/test_chart_data_labels14.rb +0 -37
  508. data/test/regression/test_chart_data_labels15.rb +0 -37
  509. data/test/regression/test_chart_data_labels16.rb +0 -40
  510. data/test/regression/test_chart_data_labels17.rb +0 -63
  511. data/test/regression/test_chart_data_labels18.rb +0 -53
  512. data/test/regression/test_chart_data_labels19.rb +0 -53
  513. data/test/regression/test_chart_data_labels20.rb +0 -44
  514. data/test/regression/test_chart_data_labels21.rb +0 -48
  515. data/test/regression/test_chart_data_labels22.rb +0 -47
  516. data/test/regression/test_chart_data_labels23.rb +0 -50
  517. data/test/regression/test_chart_data_labels24.rb +0 -50
  518. data/test/regression/test_chart_data_labels25.rb +0 -61
  519. data/test/regression/test_chart_data_labels26.rb +0 -44
  520. data/test/regression/test_chart_data_labels27.rb +0 -44
  521. data/test/regression/test_chart_data_labels28.rb +0 -52
  522. data/test/regression/test_chart_data_labels29.rb +0 -43
  523. data/test/regression/test_chart_data_labels30.rb +0 -46
  524. data/test/regression/test_chart_data_labels31.rb +0 -49
  525. data/test/regression/test_chart_data_labels32.rb +0 -54
  526. data/test/regression/test_chart_data_labels33.rb +0 -52
  527. data/test/regression/test_chart_data_labels34.rb +0 -54
  528. data/test/regression/test_chart_data_labels35.rb +0 -46
  529. data/test/regression/test_chart_data_labels36.rb +0 -54
  530. data/test/regression/test_chart_data_labels37.rb +0 -51
  531. data/test/regression/test_chart_data_labels38.rb +0 -54
  532. data/test/regression/test_chart_data_labels39.rb +0 -53
  533. data/test/regression/test_chart_data_labels40.rb +0 -53
  534. data/test/regression/test_chart_data_labels41.rb +0 -54
  535. data/test/regression/test_chart_data_labels42.rb +0 -58
  536. data/test/regression/test_chart_data_labels43.rb +0 -58
  537. data/test/regression/test_chart_data_labels44.rb +0 -56
  538. data/test/regression/test_chart_data_labels45.rb +0 -57
  539. data/test/regression/test_chart_data_labels46.rb +0 -61
  540. data/test/regression/test_chart_data_labels47.rb +0 -61
  541. data/test/regression/test_chart_data_labels48.rb +0 -55
  542. data/test/regression/test_chart_data_labels49.rb +0 -55
  543. data/test/regression/test_chart_data_labels50.rb +0 -57
  544. data/test/regression/test_chart_date01.rb +0 -53
  545. data/test/regression/test_chart_date02.rb +0 -59
  546. data/test/regression/test_chart_date03.rb +0 -59
  547. data/test/regression/test_chart_date04.rb +0 -61
  548. data/test/regression/test_chart_date05.rb +0 -57
  549. data/test/regression/test_chart_display_units01.rb +0 -35
  550. data/test/regression/test_chart_display_units02.rb +0 -36
  551. data/test/regression/test_chart_display_units03.rb +0 -36
  552. data/test/regression/test_chart_display_units04.rb +0 -36
  553. data/test/regression/test_chart_display_units05.rb +0 -36
  554. data/test/regression/test_chart_display_units06.rb +0 -36
  555. data/test/regression/test_chart_display_units07.rb +0 -36
  556. data/test/regression/test_chart_display_units08.rb +0 -36
  557. data/test/regression/test_chart_display_units09.rb +0 -36
  558. data/test/regression/test_chart_display_units10.rb +0 -36
  559. data/test/regression/test_chart_display_units11.rb +0 -36
  560. data/test/regression/test_chart_display_units12.rb +0 -41
  561. data/test/regression/test_chart_doughnut01.rb +0 -39
  562. data/test/regression/test_chart_doughnut02.rb +0 -38
  563. data/test/regression/test_chart_doughnut03.rb +0 -38
  564. data/test/regression/test_chart_doughnut04.rb +0 -38
  565. data/test/regression/test_chart_doughnut05.rb +0 -38
  566. data/test/regression/test_chart_doughnut06.rb +0 -34
  567. data/test/regression/test_chart_doughnut07.rb +0 -37
  568. data/test/regression/test_chart_drop_lines01.rb +0 -46
  569. data/test/regression/test_chart_drop_lines02.rb +0 -51
  570. data/test/regression/test_chart_drop_lines03.rb +0 -46
  571. data/test/regression/test_chart_drop_lines04.rb +0 -64
  572. data/test/regression/test_chart_errorbars01.rb +0 -46
  573. data/test/regression/test_chart_errorbars02.rb +0 -56
  574. data/test/regression/test_chart_errorbars03.rb +0 -52
  575. data/test/regression/test_chart_errorbars04.rb +0 -47
  576. data/test/regression/test_chart_errorbars05.rb +0 -46
  577. data/test/regression/test_chart_errorbars06.rb +0 -46
  578. data/test/regression/test_chart_errorbars07.rb +0 -65
  579. data/test/regression/test_chart_errorbars08.rb +0 -50
  580. data/test/regression/test_chart_errorbars09.rb +0 -50
  581. data/test/regression/test_chart_errorbars10.rb +0 -52
  582. data/test/regression/test_chart_font01.rb +0 -54
  583. data/test/regression/test_chart_font02.rb +0 -56
  584. data/test/regression/test_chart_font03.rb +0 -59
  585. data/test/regression/test_chart_font04.rb +0 -57
  586. data/test/regression/test_chart_font05.rb +0 -54
  587. data/test/regression/test_chart_font06.rb +0 -84
  588. data/test/regression/test_chart_font07.rb +0 -44
  589. data/test/regression/test_chart_font08.rb +0 -44
  590. data/test/regression/test_chart_font09.rb +0 -40
  591. data/test/regression/test_chart_format01.rb +0 -44
  592. data/test/regression/test_chart_format02.rb +0 -45
  593. data/test/regression/test_chart_format03.rb +0 -46
  594. data/test/regression/test_chart_format04.rb +0 -45
  595. data/test/regression/test_chart_format05.rb +0 -45
  596. data/test/regression/test_chart_format06.rb +0 -50
  597. data/test/regression/test_chart_format07.rb +0 -55
  598. data/test/regression/test_chart_format08.rb +0 -50
  599. data/test/regression/test_chart_format09.rb +0 -54
  600. data/test/regression/test_chart_format10.rb +0 -57
  601. data/test/regression/test_chart_format11.rb +0 -61
  602. data/test/regression/test_chart_format12.rb +0 -58
  603. data/test/regression/test_chart_format13.rb +0 -50
  604. data/test/regression/test_chart_format14.rb +0 -54
  605. data/test/regression/test_chart_format15.rb +0 -52
  606. data/test/regression/test_chart_format16.rb +0 -55
  607. data/test/regression/test_chart_format17.rb +0 -39
  608. data/test/regression/test_chart_format18.rb +0 -43
  609. data/test/regression/test_chart_format19.rb +0 -46
  610. data/test/regression/test_chart_format20.rb +0 -54
  611. data/test/regression/test_chart_format21.rb +0 -47
  612. data/test/regression/test_chart_format22.rb +0 -47
  613. data/test/regression/test_chart_format23.rb +0 -47
  614. data/test/regression/test_chart_format24.rb +0 -52
  615. data/test/regression/test_chart_format25.rb +0 -46
  616. data/test/regression/test_chart_format26.rb +0 -48
  617. data/test/regression/test_chart_format27.rb +0 -58
  618. data/test/regression/test_chart_format28.rb +0 -52
  619. data/test/regression/test_chart_format29.rb +0 -59
  620. data/test/regression/test_chart_format30.rb +0 -53
  621. data/test/regression/test_chart_format31.rb +0 -60
  622. data/test/regression/test_chart_gap01.rb +0 -47
  623. data/test/regression/test_chart_gap02.rb +0 -47
  624. data/test/regression/test_chart_gap03.rb +0 -47
  625. data/test/regression/test_chart_gap04.rb +0 -54
  626. data/test/regression/test_chart_gap05.rb +0 -56
  627. data/test/regression/test_chart_gradient01.rb +0 -43
  628. data/test/regression/test_chart_gradient02.rb +0 -43
  629. data/test/regression/test_chart_gradient03.rb +0 -46
  630. data/test/regression/test_chart_gradient04.rb +0 -46
  631. data/test/regression/test_chart_gradient05.rb +0 -46
  632. data/test/regression/test_chart_gradient06.rb +0 -46
  633. data/test/regression/test_chart_gradient07.rb +0 -44
  634. data/test/regression/test_chart_gradient08.rb +0 -43
  635. data/test/regression/test_chart_gradient09.rb +0 -43
  636. data/test/regression/test_chart_gradient10.rb +0 -43
  637. data/test/regression/test_chart_gradient11.rb +0 -43
  638. data/test/regression/test_chart_gradient12.rb +0 -46
  639. data/test/regression/test_chart_gradient13.rb +0 -46
  640. data/test/regression/test_chart_gridlines01.rb +0 -42
  641. data/test/regression/test_chart_gridlines02.rb +0 -47
  642. data/test/regression/test_chart_gridlines03.rb +0 -63
  643. data/test/regression/test_chart_gridlines04.rb +0 -44
  644. data/test/regression/test_chart_gridlines05.rb +0 -48
  645. data/test/regression/test_chart_gridlines06.rb +0 -53
  646. data/test/regression/test_chart_gridlines07.rb +0 -69
  647. data/test/regression/test_chart_gridlines08.rb +0 -45
  648. data/test/regression/test_chart_gridlines09.rb +0 -67
  649. data/test/regression/test_chart_layout01.rb +0 -48
  650. data/test/regression/test_chart_layout02.rb +0 -48
  651. data/test/regression/test_chart_layout03.rb +0 -49
  652. data/test/regression/test_chart_layout04.rb +0 -47
  653. data/test/regression/test_chart_layout05.rb +0 -64
  654. data/test/regression/test_chart_layout06.rb +0 -48
  655. data/test/regression/test_chart_layout07.rb +0 -48
  656. data/test/regression/test_chart_layout08.rb +0 -49
  657. data/test/regression/test_chart_legend01.rb +0 -41
  658. data/test/regression/test_chart_legend02.rb +0 -41
  659. data/test/regression/test_chart_legend03.rb +0 -41
  660. data/test/regression/test_chart_legend04.rb +0 -41
  661. data/test/regression/test_chart_legend05.rb +0 -41
  662. data/test/regression/test_chart_legend06.rb +0 -41
  663. data/test/regression/test_chart_legend07.rb +0 -38
  664. data/test/regression/test_chart_line01.rb +0 -39
  665. data/test/regression/test_chart_line02.rb +0 -44
  666. data/test/regression/test_chart_line03.rb +0 -39
  667. data/test/regression/test_chart_line04.rb +0 -39
  668. data/test/regression/test_chart_line05.rb +0 -43
  669. data/test/regression/test_chart_line06.rb +0 -43
  670. data/test/regression/test_chart_name01.rb +0 -43
  671. data/test/regression/test_chart_name02.rb +0 -55
  672. data/test/regression/test_chart_name03.rb +0 -55
  673. data/test/regression/test_chart_order01.rb +0 -54
  674. data/test/regression/test_chart_order02.rb +0 -54
  675. data/test/regression/test_chart_order03.rb +0 -60
  676. data/test/regression/test_chart_pattern01.rb +0 -49
  677. data/test/regression/test_chart_pattern02.rb +0 -106
  678. data/test/regression/test_chart_pattern03.rb +0 -105
  679. data/test/regression/test_chart_pattern04.rb +0 -105
  680. data/test/regression/test_chart_pattern05.rb +0 -105
  681. data/test/regression/test_chart_pattern06.rb +0 -105
  682. data/test/regression/test_chart_pattern07.rb +0 -105
  683. data/test/regression/test_chart_pattern08.rb +0 -105
  684. data/test/regression/test_chart_pattern09.rb +0 -57
  685. data/test/regression/test_chart_pattern10.rb +0 -57
  686. data/test/regression/test_chart_pie01.rb +0 -36
  687. data/test/regression/test_chart_pie02.rb +0 -38
  688. data/test/regression/test_chart_pie03.rb +0 -38
  689. data/test/regression/test_chart_pie04.rb +0 -38
  690. data/test/regression/test_chart_pie05.rb +0 -38
  691. data/test/regression/test_chart_points01.rb +0 -37
  692. data/test/regression/test_chart_points02.rb +0 -40
  693. data/test/regression/test_chart_points03.rb +0 -42
  694. data/test/regression/test_chart_points04.rb +0 -52
  695. data/test/regression/test_chart_points05.rb +0 -49
  696. data/test/regression/test_chart_points06.rb +0 -49
  697. data/test/regression/test_chart_radar01.rb +0 -39
  698. data/test/regression/test_chart_radar02.rb +0 -43
  699. data/test/regression/test_chart_radar03.rb +0 -43
  700. data/test/regression/test_chart_scatter01.rb +0 -45
  701. data/test/regression/test_chart_scatter02.rb +0 -49
  702. data/test/regression/test_chart_scatter03.rb +0 -49
  703. data/test/regression/test_chart_scatter04.rb +0 -49
  704. data/test/regression/test_chart_scatter05.rb +0 -49
  705. data/test/regression/test_chart_scatter06.rb +0 -51
  706. data/test/regression/test_chart_scatter07.rb +0 -59
  707. data/test/regression/test_chart_scatter08.rb +0 -57
  708. data/test/regression/test_chart_scatter09.rb +0 -59
  709. data/test/regression/test_chart_scatter10.rb +0 -59
  710. data/test/regression/test_chart_scatter11.rb +0 -59
  711. data/test/regression/test_chart_scatter12.rb +0 -51
  712. data/test/regression/test_chart_scatter13.rb +0 -51
  713. data/test/regression/test_chart_scatter14.rb +0 -52
  714. data/test/regression/test_chart_scatter15.rb +0 -44
  715. data/test/regression/test_chart_size01.rb +0 -41
  716. data/test/regression/test_chart_size02.rb +0 -41
  717. data/test/regression/test_chart_size03.rb +0 -42
  718. data/test/regression/test_chart_size04.rb +0 -41
  719. data/test/regression/test_chart_size05.rb +0 -39
  720. data/test/regression/test_chart_sparse01.rb +0 -51
  721. data/test/regression/test_chart_stock01.rb +0 -65
  722. data/test/regression/test_chart_stock02.rb +0 -71
  723. data/test/regression/test_chart_str01.rb +0 -43
  724. data/test/regression/test_chart_str02.rb +0 -47
  725. data/test/regression/test_chart_table01.rb +0 -42
  726. data/test/regression/test_chart_table02.rb +0 -47
  727. data/test/regression/test_chart_table03.rb +0 -56
  728. data/test/regression/test_chart_title01.rb +0 -39
  729. data/test/regression/test_chart_title02.rb +0 -39
  730. data/test/regression/test_chartsheet01.rb +0 -41
  731. data/test/regression/test_chartsheet02.rb +0 -48
  732. data/test/regression/test_chartsheet03.rb +0 -46
  733. data/test/regression/test_chartsheet04.rb +0 -46
  734. data/test/regression/test_chartsheet05.rb +0 -46
  735. data/test/regression/test_chartsheet06.rb +0 -42
  736. data/test/regression/test_chartsheet07.rb +0 -55
  737. data/test/regression/test_chartsheet08.rb +0 -59
  738. data/test/regression/test_chartsheet09.rb +0 -50
  739. data/test/regression/test_comment01.rb +0 -27
  740. data/test/regression/test_comment02.rb +0 -28
  741. data/test/regression/test_comment03.rb +0 -31
  742. data/test/regression/test_comment04.rb +0 -36
  743. data/test/regression/test_comment06.rb +0 -33
  744. data/test/regression/test_comment07.rb +0 -35
  745. data/test/regression/test_comment08.rb +0 -35
  746. data/test/regression/test_comment09.rb +0 -31
  747. data/test/regression/test_comment10.rb +0 -30
  748. data/test/regression/test_comment11.rb +0 -31
  749. data/test/regression/test_comment12.rb +0 -30
  750. data/test/regression/test_comment13.rb +0 -36
  751. data/test/regression/test_comment14.rb +0 -29
  752. data/test/regression/test_comment15.rb +0 -28
  753. data/test/regression/test_comment16.rb +0 -34
  754. data/test/regression/test_cond_format01.rb +0 -45
  755. data/test/regression/test_cond_format02.rb +0 -40
  756. data/test/regression/test_cond_format03.rb +0 -51
  757. data/test/regression/test_cond_format04.rb +0 -50
  758. data/test/regression/test_cond_format05.rb +0 -40
  759. data/test/regression/test_cond_format06.rb +0 -44
  760. data/test/regression/test_cond_format07.rb +0 -61
  761. data/test/regression/test_cond_format08.rb +0 -45
  762. data/test/regression/test_cond_format10.rb +0 -42
  763. data/test/regression/test_cond_format11.rb +0 -46
  764. data/test/regression/test_cond_format12.rb +0 -46
  765. data/test/regression/test_cond_format13.rb +0 -52
  766. data/test/regression/test_cond_format14.rb +0 -42
  767. data/test/regression/test_cond_format15.rb +0 -53
  768. data/test/regression/test_cond_format16.rb +0 -53
  769. data/test/regression/test_cond_format17.rb +0 -37
  770. data/test/regression/test_cond_format18.rb +0 -136
  771. data/test/regression/test_cond_format19.rb +0 -64
  772. data/test/regression/test_cond_format20.rb +0 -43
  773. data/test/regression/test_custom_colors01.rb +0 -33
  774. data/test/regression/test_data_validation01.rb +0 -22
  775. data/test/regression/test_data_validation02.rb +0 -27
  776. data/test/regression/test_data_validation03.rb +0 -44
  777. data/test/regression/test_data_validation04.rb +0 -37
  778. data/test/regression/test_data_validation05.rb +0 -36
  779. data/test/regression/test_data_validation08.rb +0 -24
  780. data/test/regression/test_date_1904_01.rb +0 -31
  781. data/test/regression/test_date_1904_02.rb +0 -34
  782. data/test/regression/test_date_examples01.rb +0 -48
  783. data/test/regression/test_default_format01.rb +0 -22
  784. data/test/regression/test_default_row01.rb +0 -26
  785. data/test/regression/test_default_row02.rb +0 -28
  786. data/test/regression/test_default_row03.rb +0 -28
  787. data/test/regression/test_default_row04.rb +0 -31
  788. data/test/regression/test_default_row05.rb +0 -32
  789. data/test/regression/test_defined_name01.rb +0 -45
  790. data/test/regression/test_defined_name02.rb +0 -30
  791. data/test/regression/test_defined_name03.rb +0 -30
  792. data/test/regression/test_defined_name04.rb +0 -50
  793. data/test/regression/test_dynamic_array01.rb +0 -25
  794. data/test/regression/test_escapes01.rb +0 -35
  795. data/test/regression/test_escapes02.rb +0 -32
  796. data/test/regression/test_escapes03.rb +0 -33
  797. data/test/regression/test_escapes04.rb +0 -31
  798. data/test/regression/test_escapes05.rb +0 -32
  799. data/test/regression/test_escapes06.rb +0 -26
  800. data/test/regression/test_escapes07.rb +0 -29
  801. data/test/regression/test_escapes08.rb +0 -30
  802. data/test/regression/test_excel2003_style01.rb +0 -21
  803. data/test/regression/test_excel2003_style02.rb +0 -37
  804. data/test/regression/test_excel2003_style03.rb +0 -40
  805. data/test/regression/test_excel2003_style04.rb +0 -24
  806. data/test/regression/test_excel2003_style05.rb +0 -31
  807. data/test/regression/test_excel2003_style06.rb +0 -31
  808. data/test/regression/test_excel2003_style07.rb +0 -31
  809. data/test/regression/test_excel2003_style08.rb +0 -26
  810. data/test/regression/test_firstsheet01.rb +0 -43
  811. data/test/regression/test_fit_to_pages01.rb +0 -35
  812. data/test/regression/test_fit_to_pages02.rb +0 -35
  813. data/test/regression/test_fit_to_pages03.rb +0 -35
  814. data/test/regression/test_fit_to_pages04.rb +0 -35
  815. data/test/regression/test_fit_to_pages05.rb +0 -35
  816. data/test/regression/test_format01.rb +0 -35
  817. data/test/regression/test_format02.rb +0 -47
  818. data/test/regression/test_format03.rb +0 -31
  819. data/test/regression/test_format04.rb +0 -41
  820. data/test/regression/test_format05.rb +0 -26
  821. data/test/regression/test_format11.rb +0 -28
  822. data/test/regression/test_format12.rb +0 -41
  823. data/test/regression/test_format13.rb +0 -31
  824. data/test/regression/test_format14.rb +0 -26
  825. data/test/regression/test_format15.rb +0 -26
  826. data/test/regression/test_format16.rb +0 -24
  827. data/test/regression/test_format17.rb +0 -24
  828. data/test/regression/test_formula_results01.rb +0 -37
  829. data/test/regression/test_gridlines01.rb +0 -34
  830. data/test/regression/test_header01.rb +0 -28
  831. data/test/regression/test_header02.rb +0 -28
  832. data/test/regression/test_header03.rb +0 -31
  833. data/test/regression/test_header04.rb +0 -30
  834. data/test/regression/test_header_image01.rb +0 -26
  835. data/test/regression/test_header_image02.rb +0 -33
  836. data/test/regression/test_header_image03.rb +0 -34
  837. data/test/regression/test_header_image04.rb +0 -34
  838. data/test/regression/test_header_image05.rb +0 -28
  839. data/test/regression/test_header_image06.rb +0 -32
  840. data/test/regression/test_header_image07.rb +0 -29
  841. data/test/regression/test_header_image08.rb +0 -33
  842. data/test/regression/test_header_image09.rb +0 -32
  843. data/test/regression/test_header_image10.rb +0 -36
  844. data/test/regression/test_header_image11.rb +0 -28
  845. data/test/regression/test_header_image12.rb +0 -28
  846. data/test/regression/test_header_image13.rb +0 -36
  847. data/test/regression/test_header_image14.rb +0 -36
  848. data/test/regression/test_header_image15.rb +0 -36
  849. data/test/regression/test_header_image16.rb +0 -42
  850. data/test/regression/test_header_image17.rb +0 -46
  851. data/test/regression/test_header_image18.rb +0 -48
  852. data/test/regression/test_header_image19.rb +0 -36
  853. data/test/regression/test_hide01.rb +0 -25
  854. data/test/regression/test_hyperlink01.rb +0 -26
  855. data/test/regression/test_hyperlink02.rb +0 -30
  856. data/test/regression/test_hyperlink03.rb +0 -36
  857. data/test/regression/test_hyperlink04.rb +0 -34
  858. data/test/regression/test_hyperlink05.rb +0 -29
  859. data/test/regression/test_hyperlink06.rb +0 -28
  860. data/test/regression/test_hyperlink07.rb +0 -23
  861. data/test/regression/test_hyperlink08.rb +0 -27
  862. data/test/regression/test_hyperlink09.rb +0 -28
  863. data/test/regression/test_hyperlink10.rb +0 -27
  864. data/test/regression/test_hyperlink11.rb +0 -27
  865. data/test/regression/test_hyperlink12.rb +0 -28
  866. data/test/regression/test_hyperlink13.rb +0 -27
  867. data/test/regression/test_hyperlink14.rb +0 -27
  868. data/test/regression/test_hyperlink15.rb +0 -29
  869. data/test/regression/test_hyperlink16.rb +0 -29
  870. data/test/regression/test_hyperlink17.rb +0 -30
  871. data/test/regression/test_hyperlink18.rb +0 -30
  872. data/test/regression/test_hyperlink20.rb +0 -32
  873. data/test/regression/test_hyperlink21.rb +0 -27
  874. data/test/regression/test_hyperlink22.rb +0 -27
  875. data/test/regression/test_hyperlink23.rb +0 -27
  876. data/test/regression/test_hyperlink24.rb +0 -27
  877. data/test/regression/test_hyperlink25.rb +0 -30
  878. data/test/regression/test_hyperlink26.rb +0 -30
  879. data/test/regression/test_hyperlink27.rb +0 -27
  880. data/test/regression/test_hyperlink28.rb +0 -50
  881. data/test/regression/test_hyperlink29.rb +0 -27
  882. data/test/regression/test_hyperlink30.rb +0 -36
  883. data/test/regression/test_hyperlink32.rb +0 -27
  884. data/test/regression/test_hyperlink33.rb +0 -28
  885. data/test/regression/test_hyperlink34.rb +0 -33
  886. data/test/regression/test_hyperlink35.rb +0 -39
  887. data/test/regression/test_hyperlink36.rb +0 -34
  888. data/test/regression/test_hyperlink37.rb +0 -33
  889. data/test/regression/test_hyperlink38.rb +0 -27
  890. data/test/regression/test_hyperlink39.rb +0 -27
  891. data/test/regression/test_hyperlink40.rb +0 -27
  892. data/test/regression/test_hyperlink41.rb +0 -27
  893. data/test/regression/test_hyperlink42.rb +0 -27
  894. data/test/regression/test_hyperlink43.rb +0 -27
  895. data/test/regression/test_hyperlink44.rb +0 -27
  896. data/test/regression/test_hyperlink45.rb +0 -27
  897. data/test/regression/test_hyperlink47.rb +0 -27
  898. data/test/regression/test_hyperlink48.rb +0 -31
  899. data/test/regression/test_hyperlink49.rb +0 -29
  900. data/test/regression/test_hyperlink50.rb +0 -27
  901. data/test/regression/test_hyperlink51.rb +0 -27
  902. data/test/regression/test_ignore_error01.rb +0 -23
  903. data/test/regression/test_ignore_error02.rb +0 -24
  904. data/test/regression/test_ignore_error03.rb +0 -26
  905. data/test/regression/test_ignore_error04.rb +0 -26
  906. data/test/regression/test_ignore_error05.rb +0 -32
  907. data/test/regression/test_ignore_error06.rb +0 -32
  908. data/test/regression/test_image01.rb +0 -23
  909. data/test/regression/test_image02.rb +0 -23
  910. data/test/regression/test_image03.rb +0 -23
  911. data/test/regression/test_image04.rb +0 -23
  912. data/test/regression/test_image05.rb +0 -26
  913. data/test/regression/test_image06.rb +0 -36
  914. data/test/regression/test_image07.rb +0 -25
  915. data/test/regression/test_image08.rb +0 -27
  916. data/test/regression/test_image09.rb +0 -24
  917. data/test/regression/test_image10.rb +0 -24
  918. data/test/regression/test_image11.rb +0 -24
  919. data/test/regression/test_image12.rb +0 -27
  920. data/test/regression/test_image13.rb +0 -27
  921. data/test/regression/test_image14.rb +0 -29
  922. data/test/regression/test_image15.rb +0 -31
  923. data/test/regression/test_image16.rb +0 -24
  924. data/test/regression/test_image17.rb +0 -23
  925. data/test/regression/test_image18.rb +0 -27
  926. data/test/regression/test_image19.rb +0 -24
  927. data/test/regression/test_image22.rb +0 -24
  928. data/test/regression/test_image23.rb +0 -30
  929. data/test/regression/test_image24.rb +0 -24
  930. data/test/regression/test_image25.rb +0 -24
  931. data/test/regression/test_image26.rb +0 -30
  932. data/test/regression/test_image27.rb +0 -24
  933. data/test/regression/test_image28.rb +0 -27
  934. data/test/regression/test_image29.rb +0 -27
  935. data/test/regression/test_image30.rb +0 -27
  936. data/test/regression/test_image31.rb +0 -30
  937. data/test/regression/test_image32.rb +0 -28
  938. data/test/regression/test_image33.rb +0 -32
  939. data/test/regression/test_image35.rb +0 -26
  940. data/test/regression/test_image36.rb +0 -26
  941. data/test/regression/test_image44.rb +0 -28
  942. data/test/regression/test_image45.rb +0 -29
  943. data/test/regression/test_image46.rb +0 -29
  944. data/test/regression/test_image47.rb +0 -28
  945. data/test/regression/test_image48.rb +0 -32
  946. data/test/regression/test_image49.rb +0 -38
  947. data/test/regression/test_image50.rb +0 -24
  948. data/test/regression/test_image51.rb +0 -30
  949. data/test/regression/test_image52.rb +0 -26
  950. data/test/regression/test_image53.rb +0 -26
  951. data/test/regression/test_image54.rb +0 -26
  952. data/test/regression/test_image55.rb +0 -27
  953. data/test/regression/test_image56.rb +0 -23
  954. data/test/regression/test_image57.rb +0 -23
  955. data/test/regression/test_landscape01.rb +0 -27
  956. data/test/regression/test_macro01.rb +0 -29
  957. data/test/regression/test_merge_cells01.rb +0 -25
  958. data/test/regression/test_merge_range01.rb +0 -24
  959. data/test/regression/test_merge_range02.rb +0 -24
  960. data/test/regression/test_merge_range03.rb +0 -26
  961. data/test/regression/test_merge_range04.rb +0 -24
  962. data/test/regression/test_merge_range05.rb +0 -24
  963. data/test/regression/test_object_position01.rb +0 -26
  964. data/test/regression/test_object_position02.rb +0 -26
  965. data/test/regression/test_object_position03.rb +0 -26
  966. data/test/regression/test_object_position04.rb +0 -44
  967. data/test/regression/test_object_position06.rb +0 -28
  968. data/test/regression/test_object_position07.rb +0 -28
  969. data/test/regression/test_object_position08.rb +0 -47
  970. data/test/regression/test_object_position09.rb +0 -50
  971. data/test/regression/test_object_position10.rb +0 -28
  972. data/test/regression/test_object_position12.rb +0 -25
  973. data/test/regression/test_object_position13.rb +0 -25
  974. data/test/regression/test_object_position14.rb +0 -25
  975. data/test/regression/test_object_position15.rb +0 -29
  976. data/test/regression/test_object_position16.rb +0 -29
  977. data/test/regression/test_object_position17.rb +0 -29
  978. data/test/regression/test_object_position18.rb +0 -29
  979. data/test/regression/test_object_position19.rb +0 -29
  980. data/test/regression/test_object_position20.rb +0 -29
  981. data/test/regression/test_outline01.rb +0 -84
  982. data/test/regression/test_outline02.rb +0 -87
  983. data/test/regression/test_outline03.rb +0 -57
  984. data/test/regression/test_outline04.rb +0 -53
  985. data/test/regression/test_outline05.rb +0 -88
  986. data/test/regression/test_outline06.rb +0 -87
  987. data/test/regression/test_page_breaks01.rb +0 -34
  988. data/test/regression/test_page_breaks02.rb +0 -34
  989. data/test/regression/test_page_breaks03.rb +0 -34
  990. data/test/regression/test_page_breaks04.rb +0 -34
  991. data/test/regression/test_page_breaks05.rb +0 -34
  992. data/test/regression/test_page_breaks06.rb +0 -35
  993. data/test/regression/test_page_view01.rb +0 -34
  994. data/test/regression/test_panes01.rb +0 -61
  995. data/test/regression/test_print_across01.rb +0 -35
  996. data/test/regression/test_print_area01.rb +0 -34
  997. data/test/regression/test_print_area02.rb +0 -34
  998. data/test/regression/test_print_area03.rb +0 -34
  999. data/test/regression/test_print_area04.rb +0 -34
  1000. data/test/regression/test_print_area05.rb +0 -34
  1001. data/test/regression/test_print_area06.rb +0 -34
  1002. data/test/regression/test_print_area07.rb +0 -35
  1003. data/test/regression/test_print_options01.rb +0 -34
  1004. data/test/regression/test_print_options02.rb +0 -34
  1005. data/test/regression/test_print_options03.rb +0 -34
  1006. data/test/regression/test_print_options04.rb +0 -34
  1007. data/test/regression/test_print_options05.rb +0 -37
  1008. data/test/regression/test_print_options06.rb +0 -35
  1009. data/test/regression/test_print_options07.rb +0 -31
  1010. data/test/regression/test_print_scale01.rb +0 -35
  1011. data/test/regression/test_print_scale02.rb +0 -35
  1012. data/test/regression/test_properties01.rb +0 -36
  1013. data/test/regression/test_properties02.rb +0 -25
  1014. data/test/regression/test_properties03.rb +0 -26
  1015. data/test/regression/test_properties04.rb +0 -61
  1016. data/test/regression/test_properties05.rb +0 -30
  1017. data/test/regression/test_protect01.rb +0 -28
  1018. data/test/regression/test_protect02.rb +0 -30
  1019. data/test/regression/test_protect03.rb +0 -30
  1020. data/test/regression/test_protect04.rb +0 -32
  1021. data/test/regression/test_protect05.rb +0 -35
  1022. data/test/regression/test_protect06.rb +0 -35
  1023. data/test/regression/test_protect07.rb +0 -23
  1024. data/test/regression/test_quote_name01.rb +0 -48
  1025. data/test/regression/test_quote_name03.rb +0 -41
  1026. data/test/regression/test_quote_name04.rb +0 -40
  1027. data/test/regression/test_repeat01.rb +0 -34
  1028. data/test/regression/test_repeat02.rb +0 -34
  1029. data/test/regression/test_repeat03.rb +0 -35
  1030. data/test/regression/test_repeat04.rb +0 -34
  1031. data/test/regression/test_repeat05.rb +0 -41
  1032. data/test/regression/test_rich_string01.rb +0 -28
  1033. data/test/regression/test_rich_string02.rb +0 -28
  1034. data/test/regression/test_rich_string03.rb +0 -28
  1035. data/test/regression/test_rich_string04.rb +0 -28
  1036. data/test/regression/test_rich_string05.rb +0 -30
  1037. data/test/regression/test_rich_string06.rb +0 -27
  1038. data/test/regression/test_rich_string07.rb +0 -33
  1039. data/test/regression/test_rich_string08.rb +0 -29
  1040. data/test/regression/test_rich_string09.rb +0 -31
  1041. data/test/regression/test_rich_string10.rb +0 -30
  1042. data/test/regression/test_rich_string11.rb +0 -29
  1043. data/test/regression/test_rich_string12.rb +0 -32
  1044. data/test/regression/test_row_col_format01.rb +0 -24
  1045. data/test/regression/test_row_col_format02.rb +0 -25
  1046. data/test/regression/test_row_col_format03.rb +0 -24
  1047. data/test/regression/test_row_col_format04.rb +0 -25
  1048. data/test/regression/test_row_col_format05.rb +0 -26
  1049. data/test/regression/test_row_col_format06.rb +0 -29
  1050. data/test/regression/test_row_col_format07.rb +0 -24
  1051. data/test/regression/test_row_col_format08.rb +0 -34
  1052. data/test/regression/test_row_col_format09.rb +0 -33
  1053. data/test/regression/test_row_col_format10.rb +0 -24
  1054. data/test/regression/test_row_col_format11.rb +0 -23
  1055. data/test/regression/test_row_col_format12.rb +0 -23
  1056. data/test/regression/test_row_col_format13.rb +0 -28
  1057. data/test/regression/test_row_col_format14.rb +0 -28
  1058. data/test/regression/test_selection01.rb +0 -23
  1059. data/test/regression/test_selection02.rb +0 -33
  1060. data/test/regression/test_set_column01.rb +0 -63
  1061. data/test/regression/test_set_column02.rb +0 -64
  1062. data/test/regression/test_set_column03.rb +0 -34
  1063. data/test/regression/test_set_column04.rb +0 -42
  1064. data/test/regression/test_set_column05.rb +0 -52
  1065. data/test/regression/test_set_column06.rb +0 -49
  1066. data/test/regression/test_set_column07.rb +0 -45
  1067. data/test/regression/test_set_column08.rb +0 -42
  1068. data/test/regression/test_set_column09.rb +0 -31
  1069. data/test/regression/test_set_column10.rb +0 -55
  1070. data/test/regression/test_set_column11.rb +0 -48
  1071. data/test/regression/test_set_print_scale01.rb +0 -36
  1072. data/test/regression/test_set_row01.rb +0 -35
  1073. data/test/regression/test_set_row02.rb +0 -35
  1074. data/test/regression/test_set_row03.rb +0 -35
  1075. data/test/regression/test_set_row04.rb +0 -35
  1076. data/test/regression/test_set_start_page01.rb +0 -33
  1077. data/test/regression/test_set_start_page02.rb +0 -33
  1078. data/test/regression/test_set_start_page03.rb +0 -33
  1079. data/test/regression/test_shape01.rb +0 -25
  1080. data/test/regression/test_shape02.rb +0 -42
  1081. data/test/regression/test_shape03.rb +0 -45
  1082. data/test/regression/test_shape04.rb +0 -43
  1083. data/test/regression/test_shape_connect01.rb +0 -48
  1084. data/test/regression/test_shape_connect02.rb +0 -42
  1085. data/test/regression/test_shape_connect03.rb +0 -78
  1086. data/test/regression/test_shape_connect04.rb +0 -75
  1087. data/test/regression/test_shape_scale01.rb +0 -45
  1088. data/test/regression/test_shape_stencil01.rb +0 -39
  1089. data/test/regression/test_shared_strings01.rb +0 -32
  1090. data/test/regression/test_shared_strings02.rb +0 -45
  1091. data/test/regression/test_shared_strings_encoding.rb +0 -0
  1092. data/test/regression/test_simple01.rb +0 -24
  1093. data/test/regression/test_simple02.rb +0 -32
  1094. data/test/regression/test_simple03.rb +0 -39
  1095. data/test/regression/test_simple04.rb +0 -29
  1096. data/test/regression/test_simple05.rb +0 -40
  1097. data/test/regression/test_tab_color01.rb +0 -20
  1098. data/test/regression/test_table01.rb +0 -27
  1099. data/test/regression/test_table02.rb +0 -37
  1100. data/test/regression/test_table03.rb +0 -33
  1101. data/test/regression/test_table04.rb +0 -37
  1102. data/test/regression/test_table05.rb +0 -41
  1103. data/test/regression/test_table06.rb +0 -44
  1104. data/test/regression/test_table07.rb +0 -29
  1105. data/test/regression/test_table08.rb +0 -48
  1106. data/test/regression/test_table09.rb +0 -65
  1107. data/test/regression/test_table10.rb +0 -68
  1108. data/test/regression/test_table11.rb +0 -37
  1109. data/test/regression/test_table12.rb +0 -36
  1110. data/test/regression/test_table13.rb +0 -51
  1111. data/test/regression/test_table14.rb +0 -51
  1112. data/test/regression/test_table15.rb +0 -37
  1113. data/test/regression/test_table16.rb +0 -37
  1114. data/test/regression/test_table17.rb +0 -70
  1115. data/test/regression/test_table20.rb +0 -34
  1116. data/test/regression/test_table21.rb +0 -36
  1117. data/test/regression/test_table22.rb +0 -32
  1118. data/test/regression/test_table23.rb +0 -56
  1119. data/test/regression/test_table24.rb +0 -27
  1120. data/test/regression/test_table25.rb +0 -27
  1121. data/test/regression/test_table26.rb +0 -38
  1122. data/test/regression/test_tutorial01.rb +0 -38
  1123. data/test/regression/test_tutorial02.rb +0 -44
  1124. data/test/regression/test_tutorial03.rb +0 -49
  1125. data/test/regression/test_types02.rb +0 -25
  1126. data/test/regression/test_types08.rb +0 -31
  1127. data/test/regression/test_update_range_format_with_params.rb +0 -42
  1128. data/test/regression/test_urls_as_strings.rb +0 -25
  1129. data/test/regression/test_utf8_01.rb +0 -23
  1130. data/test/regression/test_utf8_03.rb +0 -23
  1131. data/test/regression/test_utf8_04.rb +0 -23
  1132. data/test/regression/test_utf8_05.rb +0 -26
  1133. data/test/regression/test_utf8_06.rb +0 -28
  1134. data/test/regression/test_utf8_07.rb +0 -27
  1135. data/test/regression/test_utf8_08.rb +0 -38
  1136. data/test/regression/test_utf8_09.rb +0 -20
  1137. data/test/regression/test_utf8_10.rb +0 -42
  1138. data/test/regression/test_utf8_11.rb +0 -23
  1139. data/test/regression/test_vml01.rb +0 -29
  1140. data/test/regression/test_vml02.rb +0 -31
  1141. data/test/regression/test_vml03.rb +0 -40
  1142. data/test/regression/xlsx_files/array_formula01.xlsx +0 -0
  1143. data/test/regression/xlsx_files/array_formula02.xlsx +0 -0
  1144. data/test/regression/xlsx_files/array_formula03.xlsx +0 -0
  1145. data/test/regression/xlsx_files/array_formula04.xlsx +0 -0
  1146. data/test/regression/xlsx_files/autofilter00.xlsx +0 -0
  1147. data/test/regression/xlsx_files/autofilter01.xlsx +0 -0
  1148. data/test/regression/xlsx_files/autofilter02.xlsx +0 -0
  1149. data/test/regression/xlsx_files/autofilter03.xlsx +0 -0
  1150. data/test/regression/xlsx_files/autofilter04.xlsx +0 -0
  1151. data/test/regression/xlsx_files/autofilter05.xlsx +0 -0
  1152. data/test/regression/xlsx_files/autofilter06.xlsx +0 -0
  1153. data/test/regression/xlsx_files/autofilter07.xlsx +0 -0
  1154. data/test/regression/xlsx_files/autofilter08.xlsx +0 -0
  1155. data/test/regression/xlsx_files/autofilter09.xlsx +0 -0
  1156. data/test/regression/xlsx_files/autofilter10.xlsx +0 -0
  1157. data/test/regression/xlsx_files/background01.xlsx +0 -0
  1158. data/test/regression/xlsx_files/background02.xlsx +0 -0
  1159. data/test/regression/xlsx_files/background03.xlsx +0 -0
  1160. data/test/regression/xlsx_files/background04.xlsx +0 -0
  1161. data/test/regression/xlsx_files/background05.xlsx +0 -0
  1162. data/test/regression/xlsx_files/background06.xlsx +0 -0
  1163. data/test/regression/xlsx_files/background07.xlsx +0 -0
  1164. data/test/regression/xlsx_files/button01.xlsx +0 -0
  1165. data/test/regression/xlsx_files/button02.xlsx +0 -0
  1166. data/test/regression/xlsx_files/button03.xlsx +0 -0
  1167. data/test/regression/xlsx_files/button04.xlsx +0 -0
  1168. data/test/regression/xlsx_files/button05.xlsx +0 -0
  1169. data/test/regression/xlsx_files/button07.xlsm +0 -0
  1170. data/test/regression/xlsx_files/button08.xlsx +0 -0
  1171. data/test/regression/xlsx_files/button09.xlsx +0 -0
  1172. data/test/regression/xlsx_files/button10.xlsx +0 -0
  1173. data/test/regression/xlsx_files/button11.xlsx +0 -0
  1174. data/test/regression/xlsx_files/button12.xlsx +0 -0
  1175. data/test/regression/xlsx_files/chart_area01.xlsx +0 -0
  1176. data/test/regression/xlsx_files/chart_area02.xlsx +0 -0
  1177. data/test/regression/xlsx_files/chart_area03.xlsx +0 -0
  1178. data/test/regression/xlsx_files/chart_area04.xlsx +0 -0
  1179. data/test/regression/xlsx_files/chart_axis01.xlsx +0 -0
  1180. data/test/regression/xlsx_files/chart_axis02.xlsx +0 -0
  1181. data/test/regression/xlsx_files/chart_axis03.xlsx +0 -0
  1182. data/test/regression/xlsx_files/chart_axis04.xlsx +0 -0
  1183. data/test/regression/xlsx_files/chart_axis05.xlsx +0 -0
  1184. data/test/regression/xlsx_files/chart_axis06.xlsx +0 -0
  1185. data/test/regression/xlsx_files/chart_axis07.xlsx +0 -0
  1186. data/test/regression/xlsx_files/chart_axis08.xlsx +0 -0
  1187. data/test/regression/xlsx_files/chart_axis09.xlsx +0 -0
  1188. data/test/regression/xlsx_files/chart_axis10.xlsx +0 -0
  1189. data/test/regression/xlsx_files/chart_axis11.xlsx +0 -0
  1190. data/test/regression/xlsx_files/chart_axis12.xlsx +0 -0
  1191. data/test/regression/xlsx_files/chart_axis13.xlsx +0 -0
  1192. data/test/regression/xlsx_files/chart_axis14.xlsx +0 -0
  1193. data/test/regression/xlsx_files/chart_axis15.xlsx +0 -0
  1194. data/test/regression/xlsx_files/chart_axis16.xlsx +0 -0
  1195. data/test/regression/xlsx_files/chart_axis17.xlsx +0 -0
  1196. data/test/regression/xlsx_files/chart_axis18.xlsx +0 -0
  1197. data/test/regression/xlsx_files/chart_axis19.xlsx +0 -0
  1198. data/test/regression/xlsx_files/chart_axis20.xlsx +0 -0
  1199. data/test/regression/xlsx_files/chart_axis21.xlsx +0 -0
  1200. data/test/regression/xlsx_files/chart_axis22.xlsx +0 -0
  1201. data/test/regression/xlsx_files/chart_axis23.xlsx +0 -0
  1202. data/test/regression/xlsx_files/chart_axis24.xlsx +0 -0
  1203. data/test/regression/xlsx_files/chart_axis25.xlsx +0 -0
  1204. data/test/regression/xlsx_files/chart_axis26.xlsx +0 -0
  1205. data/test/regression/xlsx_files/chart_axis27.xlsx +0 -0
  1206. data/test/regression/xlsx_files/chart_axis28.xlsx +0 -0
  1207. data/test/regression/xlsx_files/chart_axis29.xlsx +0 -0
  1208. data/test/regression/xlsx_files/chart_axis30.xlsx +0 -0
  1209. data/test/regression/xlsx_files/chart_axis31.xlsx +0 -0
  1210. data/test/regression/xlsx_files/chart_axis32.xlsx +0 -0
  1211. data/test/regression/xlsx_files/chart_axis33.xlsx +0 -0
  1212. data/test/regression/xlsx_files/chart_axis34.xlsx +0 -0
  1213. data/test/regression/xlsx_files/chart_axis35.xlsx +0 -0
  1214. data/test/regression/xlsx_files/chart_axis36.xlsx +0 -0
  1215. data/test/regression/xlsx_files/chart_axis37.xlsx +0 -0
  1216. data/test/regression/xlsx_files/chart_axis38.xlsx +0 -0
  1217. data/test/regression/xlsx_files/chart_axis39.xlsx +0 -0
  1218. data/test/regression/xlsx_files/chart_axis40.xlsx +0 -0
  1219. data/test/regression/xlsx_files/chart_axis41.xlsx +0 -0
  1220. data/test/regression/xlsx_files/chart_axis42.xlsx +0 -0
  1221. data/test/regression/xlsx_files/chart_axis43.xlsx +0 -0
  1222. data/test/regression/xlsx_files/chart_axis44.xlsx +0 -0
  1223. data/test/regression/xlsx_files/chart_axis45.xlsx +0 -0
  1224. data/test/regression/xlsx_files/chart_axis46.xlsx +0 -0
  1225. data/test/regression/xlsx_files/chart_axis47.xlsx +0 -0
  1226. data/test/regression/xlsx_files/chart_axis48.xlsx +0 -0
  1227. data/test/regression/xlsx_files/chart_bar01.xlsx +0 -0
  1228. data/test/regression/xlsx_files/chart_bar02.xlsx +0 -0
  1229. data/test/regression/xlsx_files/chart_bar03.xlsx +0 -0
  1230. data/test/regression/xlsx_files/chart_bar04.xlsx +0 -0
  1231. data/test/regression/xlsx_files/chart_bar05.xlsx +0 -0
  1232. data/test/regression/xlsx_files/chart_bar06.xlsx +0 -0
  1233. data/test/regression/xlsx_files/chart_bar07.xlsx +0 -0
  1234. data/test/regression/xlsx_files/chart_bar08.xlsx +0 -0
  1235. data/test/regression/xlsx_files/chart_bar09.xlsx +0 -0
  1236. data/test/regression/xlsx_files/chart_bar10.xlsx +0 -0
  1237. data/test/regression/xlsx_files/chart_bar11.xlsx +0 -0
  1238. data/test/regression/xlsx_files/chart_bar12.xlsx +0 -0
  1239. data/test/regression/xlsx_files/chart_bar13.xlsx +0 -0
  1240. data/test/regression/xlsx_files/chart_bar14.xlsx +0 -0
  1241. data/test/regression/xlsx_files/chart_bar15.xlsx +0 -0
  1242. data/test/regression/xlsx_files/chart_bar16.xlsx +0 -0
  1243. data/test/regression/xlsx_files/chart_bar17.xlsx +0 -0
  1244. data/test/regression/xlsx_files/chart_bar18.xlsx +0 -0
  1245. data/test/regression/xlsx_files/chart_bar19.xlsx +0 -0
  1246. data/test/regression/xlsx_files/chart_bar20.xlsx +0 -0
  1247. data/test/regression/xlsx_files/chart_bar21.xlsx +0 -0
  1248. data/test/regression/xlsx_files/chart_bar22.xlsx +0 -0
  1249. data/test/regression/xlsx_files/chart_bar23.xlsx +0 -0
  1250. data/test/regression/xlsx_files/chart_bar24.xlsx +0 -0
  1251. data/test/regression/xlsx_files/chart_blank01.xlsx +0 -0
  1252. data/test/regression/xlsx_files/chart_blank02.xlsx +0 -0
  1253. data/test/regression/xlsx_files/chart_blank03.xlsx +0 -0
  1254. data/test/regression/xlsx_files/chart_blank04.xlsx +0 -0
  1255. data/test/regression/xlsx_files/chart_blank05.xlsx +0 -0
  1256. data/test/regression/xlsx_files/chart_blank06.xlsx +0 -0
  1257. data/test/regression/xlsx_files/chart_chartarea01.xlsx +0 -0
  1258. data/test/regression/xlsx_files/chart_chartarea03.xlsx +0 -0
  1259. data/test/regression/xlsx_files/chart_chartarea04.xlsx +0 -0
  1260. data/test/regression/xlsx_files/chart_chartarea05.xlsx +0 -0
  1261. data/test/regression/xlsx_files/chart_chartarea06.xlsx +0 -0
  1262. data/test/regression/xlsx_files/chart_clustered01.xlsx +0 -0
  1263. data/test/regression/xlsx_files/chart_column01.xlsx +0 -0
  1264. data/test/regression/xlsx_files/chart_column02.xlsx +0 -0
  1265. data/test/regression/xlsx_files/chart_column03.xlsx +0 -0
  1266. data/test/regression/xlsx_files/chart_column04.xlsx +0 -0
  1267. data/test/regression/xlsx_files/chart_column05.xlsx +0 -0
  1268. data/test/regression/xlsx_files/chart_column06.xlsx +0 -0
  1269. data/test/regression/xlsx_files/chart_column07.xlsx +0 -0
  1270. data/test/regression/xlsx_files/chart_column08.xlsx +0 -0
  1271. data/test/regression/xlsx_files/chart_column09.xlsx +0 -0
  1272. data/test/regression/xlsx_files/chart_column10.xlsx +0 -0
  1273. data/test/regression/xlsx_files/chart_column11.xlsx +0 -0
  1274. data/test/regression/xlsx_files/chart_column12.xlsx +0 -0
  1275. data/test/regression/xlsx_files/chart_combined01.xlsx +0 -0
  1276. data/test/regression/xlsx_files/chart_combined02.xlsx +0 -0
  1277. data/test/regression/xlsx_files/chart_combined03.xlsx +0 -0
  1278. data/test/regression/xlsx_files/chart_combined04.xlsx +0 -0
  1279. data/test/regression/xlsx_files/chart_combined05.xlsx +0 -0
  1280. data/test/regression/xlsx_files/chart_combined06.xlsx +0 -0
  1281. data/test/regression/xlsx_files/chart_combined07.xlsx +0 -0
  1282. data/test/regression/xlsx_files/chart_combined08.xlsx +0 -0
  1283. data/test/regression/xlsx_files/chart_combined09.xlsx +0 -0
  1284. data/test/regression/xlsx_files/chart_combined10.xlsx +0 -0
  1285. data/test/regression/xlsx_files/chart_combined11.xlsx +0 -0
  1286. data/test/regression/xlsx_files/chart_crossing01.xlsx +0 -0
  1287. data/test/regression/xlsx_files/chart_crossing02.xlsx +0 -0
  1288. data/test/regression/xlsx_files/chart_crossing03.xlsx +0 -0
  1289. data/test/regression/xlsx_files/chart_crossing04.xlsx +0 -0
  1290. data/test/regression/xlsx_files/chart_crossing05.xlsx +0 -0
  1291. data/test/regression/xlsx_files/chart_crossing06.xlsx +0 -0
  1292. data/test/regression/xlsx_files/chart_data_labels01.xlsx +0 -0
  1293. data/test/regression/xlsx_files/chart_data_labels02.xlsx +0 -0
  1294. data/test/regression/xlsx_files/chart_data_labels03.xlsx +0 -0
  1295. data/test/regression/xlsx_files/chart_data_labels04.xlsx +0 -0
  1296. data/test/regression/xlsx_files/chart_data_labels05.xlsx +0 -0
  1297. data/test/regression/xlsx_files/chart_data_labels06.xlsx +0 -0
  1298. data/test/regression/xlsx_files/chart_data_labels07.xlsx +0 -0
  1299. data/test/regression/xlsx_files/chart_data_labels08.xlsx +0 -0
  1300. data/test/regression/xlsx_files/chart_data_labels09.xlsx +0 -0
  1301. data/test/regression/xlsx_files/chart_data_labels10.xlsx +0 -0
  1302. data/test/regression/xlsx_files/chart_data_labels11.xlsx +0 -0
  1303. data/test/regression/xlsx_files/chart_data_labels12.xlsx +0 -0
  1304. data/test/regression/xlsx_files/chart_data_labels13.xlsx +0 -0
  1305. data/test/regression/xlsx_files/chart_data_labels14.xlsx +0 -0
  1306. data/test/regression/xlsx_files/chart_data_labels15.xlsx +0 -0
  1307. data/test/regression/xlsx_files/chart_data_labels16.xlsx +0 -0
  1308. data/test/regression/xlsx_files/chart_data_labels17.xlsx +0 -0
  1309. data/test/regression/xlsx_files/chart_data_labels18.xlsx +0 -0
  1310. data/test/regression/xlsx_files/chart_data_labels19.xlsx +0 -0
  1311. data/test/regression/xlsx_files/chart_data_labels20.xlsx +0 -0
  1312. data/test/regression/xlsx_files/chart_data_labels21.xlsx +0 -0
  1313. data/test/regression/xlsx_files/chart_data_labels22.xlsx +0 -0
  1314. data/test/regression/xlsx_files/chart_data_labels23.xlsx +0 -0
  1315. data/test/regression/xlsx_files/chart_data_labels24.xlsx +0 -0
  1316. data/test/regression/xlsx_files/chart_data_labels25.xlsx +0 -0
  1317. data/test/regression/xlsx_files/chart_data_labels26.xlsx +0 -0
  1318. data/test/regression/xlsx_files/chart_data_labels27.xlsx +0 -0
  1319. data/test/regression/xlsx_files/chart_data_labels28.xlsx +0 -0
  1320. data/test/regression/xlsx_files/chart_data_labels29.xlsx +0 -0
  1321. data/test/regression/xlsx_files/chart_data_labels30.xlsx +0 -0
  1322. data/test/regression/xlsx_files/chart_data_labels31.xlsx +0 -0
  1323. data/test/regression/xlsx_files/chart_data_labels32.xlsx +0 -0
  1324. data/test/regression/xlsx_files/chart_data_labels33.xlsx +0 -0
  1325. data/test/regression/xlsx_files/chart_data_labels34.xlsx +0 -0
  1326. data/test/regression/xlsx_files/chart_data_labels35.xlsx +0 -0
  1327. data/test/regression/xlsx_files/chart_data_labels36.xlsx +0 -0
  1328. data/test/regression/xlsx_files/chart_data_labels37.xlsx +0 -0
  1329. data/test/regression/xlsx_files/chart_data_labels38.xlsx +0 -0
  1330. data/test/regression/xlsx_files/chart_data_labels39.xlsx +0 -0
  1331. data/test/regression/xlsx_files/chart_data_labels40.xlsx +0 -0
  1332. data/test/regression/xlsx_files/chart_data_labels41.xlsx +0 -0
  1333. data/test/regression/xlsx_files/chart_data_labels42.xlsx +0 -0
  1334. data/test/regression/xlsx_files/chart_data_labels43.xlsx +0 -0
  1335. data/test/regression/xlsx_files/chart_data_labels44.xlsx +0 -0
  1336. data/test/regression/xlsx_files/chart_data_labels45.xlsx +0 -0
  1337. data/test/regression/xlsx_files/chart_data_labels46.xlsx +0 -0
  1338. data/test/regression/xlsx_files/chart_data_labels47.xlsx +0 -0
  1339. data/test/regression/xlsx_files/chart_data_labels48.xlsx +0 -0
  1340. data/test/regression/xlsx_files/chart_data_labels49.xlsx +0 -0
  1341. data/test/regression/xlsx_files/chart_data_labels50.xlsx +0 -0
  1342. data/test/regression/xlsx_files/chart_date01.xlsx +0 -0
  1343. data/test/regression/xlsx_files/chart_date02.xlsx +0 -0
  1344. data/test/regression/xlsx_files/chart_date03.xlsx +0 -0
  1345. data/test/regression/xlsx_files/chart_date04.xlsx +0 -0
  1346. data/test/regression/xlsx_files/chart_date05.xlsx +0 -0
  1347. data/test/regression/xlsx_files/chart_display_units01.xlsx +0 -0
  1348. data/test/regression/xlsx_files/chart_display_units02.xlsx +0 -0
  1349. data/test/regression/xlsx_files/chart_display_units03.xlsx +0 -0
  1350. data/test/regression/xlsx_files/chart_display_units04.xlsx +0 -0
  1351. data/test/regression/xlsx_files/chart_display_units05.xlsx +0 -0
  1352. data/test/regression/xlsx_files/chart_display_units06.xlsx +0 -0
  1353. data/test/regression/xlsx_files/chart_display_units07.xlsx +0 -0
  1354. data/test/regression/xlsx_files/chart_display_units08.xlsx +0 -0
  1355. data/test/regression/xlsx_files/chart_display_units09.xlsx +0 -0
  1356. data/test/regression/xlsx_files/chart_display_units10.xlsx +0 -0
  1357. data/test/regression/xlsx_files/chart_display_units11.xlsx +0 -0
  1358. data/test/regression/xlsx_files/chart_display_units12.xlsx +0 -0
  1359. data/test/regression/xlsx_files/chart_doughnut01.xlsx +0 -0
  1360. data/test/regression/xlsx_files/chart_doughnut02.xlsx +0 -0
  1361. data/test/regression/xlsx_files/chart_doughnut03.xlsx +0 -0
  1362. data/test/regression/xlsx_files/chart_doughnut04.xlsx +0 -0
  1363. data/test/regression/xlsx_files/chart_doughnut05.xlsx +0 -0
  1364. data/test/regression/xlsx_files/chart_doughnut06.xlsx +0 -0
  1365. data/test/regression/xlsx_files/chart_doughnut07.xlsx +0 -0
  1366. data/test/regression/xlsx_files/chart_drop_lines01.xlsx +0 -0
  1367. data/test/regression/xlsx_files/chart_drop_lines02.xlsx +0 -0
  1368. data/test/regression/xlsx_files/chart_drop_lines03.xlsx +0 -0
  1369. data/test/regression/xlsx_files/chart_drop_lines04.xlsx +0 -0
  1370. data/test/regression/xlsx_files/chart_errorbars01.xlsx +0 -0
  1371. data/test/regression/xlsx_files/chart_errorbars02.xlsx +0 -0
  1372. data/test/regression/xlsx_files/chart_errorbars03.xlsx +0 -0
  1373. data/test/regression/xlsx_files/chart_errorbars04.xlsx +0 -0
  1374. data/test/regression/xlsx_files/chart_errorbars05.xlsx +0 -0
  1375. data/test/regression/xlsx_files/chart_errorbars06.xlsx +0 -0
  1376. data/test/regression/xlsx_files/chart_errorbars07.xlsx +0 -0
  1377. data/test/regression/xlsx_files/chart_errorbars08.xlsx +0 -0
  1378. data/test/regression/xlsx_files/chart_errorbars09.xlsx +0 -0
  1379. data/test/regression/xlsx_files/chart_errorbars10.xlsx +0 -0
  1380. data/test/regression/xlsx_files/chart_font01.xlsx +0 -0
  1381. data/test/regression/xlsx_files/chart_font02.xlsx +0 -0
  1382. data/test/regression/xlsx_files/chart_font03.xlsx +0 -0
  1383. data/test/regression/xlsx_files/chart_font04.xlsx +0 -0
  1384. data/test/regression/xlsx_files/chart_font05.xlsx +0 -0
  1385. data/test/regression/xlsx_files/chart_font06.xlsx +0 -0
  1386. data/test/regression/xlsx_files/chart_font07.xlsx +0 -0
  1387. data/test/regression/xlsx_files/chart_font08.xlsx +0 -0
  1388. data/test/regression/xlsx_files/chart_font09.xlsx +0 -0
  1389. data/test/regression/xlsx_files/chart_format01.xlsx +0 -0
  1390. data/test/regression/xlsx_files/chart_format02.xlsx +0 -0
  1391. data/test/regression/xlsx_files/chart_format03.xlsx +0 -0
  1392. data/test/regression/xlsx_files/chart_format04.xlsx +0 -0
  1393. data/test/regression/xlsx_files/chart_format05.xlsx +0 -0
  1394. data/test/regression/xlsx_files/chart_format06.xlsx +0 -0
  1395. data/test/regression/xlsx_files/chart_format07.xlsx +0 -0
  1396. data/test/regression/xlsx_files/chart_format08.xlsx +0 -0
  1397. data/test/regression/xlsx_files/chart_format09.xlsx +0 -0
  1398. data/test/regression/xlsx_files/chart_format10.xlsx +0 -0
  1399. data/test/regression/xlsx_files/chart_format11.xlsx +0 -0
  1400. data/test/regression/xlsx_files/chart_format12.xlsx +0 -0
  1401. data/test/regression/xlsx_files/chart_format13.xlsx +0 -0
  1402. data/test/regression/xlsx_files/chart_format14.xlsx +0 -0
  1403. data/test/regression/xlsx_files/chart_format15.xlsx +0 -0
  1404. data/test/regression/xlsx_files/chart_format16.xlsx +0 -0
  1405. data/test/regression/xlsx_files/chart_format17.xlsx +0 -0
  1406. data/test/regression/xlsx_files/chart_format18.xlsx +0 -0
  1407. data/test/regression/xlsx_files/chart_format19.xlsx +0 -0
  1408. data/test/regression/xlsx_files/chart_format20.xlsx +0 -0
  1409. data/test/regression/xlsx_files/chart_format21.xlsx +0 -0
  1410. data/test/regression/xlsx_files/chart_format22.xlsx +0 -0
  1411. data/test/regression/xlsx_files/chart_format23.xlsx +0 -0
  1412. data/test/regression/xlsx_files/chart_format24.xlsx +0 -0
  1413. data/test/regression/xlsx_files/chart_format25.xlsx +0 -0
  1414. data/test/regression/xlsx_files/chart_format26.xlsx +0 -0
  1415. data/test/regression/xlsx_files/chart_format27.xlsx +0 -0
  1416. data/test/regression/xlsx_files/chart_format28.xlsx +0 -0
  1417. data/test/regression/xlsx_files/chart_format29.xlsx +0 -0
  1418. data/test/regression/xlsx_files/chart_format30.xlsx +0 -0
  1419. data/test/regression/xlsx_files/chart_format31.xlsx +0 -0
  1420. data/test/regression/xlsx_files/chart_gap01.xlsx +0 -0
  1421. data/test/regression/xlsx_files/chart_gap02.xlsx +0 -0
  1422. data/test/regression/xlsx_files/chart_gap03.xlsx +0 -0
  1423. data/test/regression/xlsx_files/chart_gap04.xlsx +0 -0
  1424. data/test/regression/xlsx_files/chart_gap05.xlsx +0 -0
  1425. data/test/regression/xlsx_files/chart_gradient01.xlsx +0 -0
  1426. data/test/regression/xlsx_files/chart_gradient02.xlsx +0 -0
  1427. data/test/regression/xlsx_files/chart_gradient03.xlsx +0 -0
  1428. data/test/regression/xlsx_files/chart_gradient04.xlsx +0 -0
  1429. data/test/regression/xlsx_files/chart_gradient05.xlsx +0 -0
  1430. data/test/regression/xlsx_files/chart_gradient06.xlsx +0 -0
  1431. data/test/regression/xlsx_files/chart_gradient07.xlsx +0 -0
  1432. data/test/regression/xlsx_files/chart_gradient08.xlsx +0 -0
  1433. data/test/regression/xlsx_files/chart_gradient09.xlsx +0 -0
  1434. data/test/regression/xlsx_files/chart_gradient10.xlsx +0 -0
  1435. data/test/regression/xlsx_files/chart_gradient11.xlsx +0 -0
  1436. data/test/regression/xlsx_files/chart_gradient12.xlsx +0 -0
  1437. data/test/regression/xlsx_files/chart_gradient13.xlsx +0 -0
  1438. data/test/regression/xlsx_files/chart_gridlines01.xlsx +0 -0
  1439. data/test/regression/xlsx_files/chart_gridlines02.xlsx +0 -0
  1440. data/test/regression/xlsx_files/chart_gridlines03.xlsx +0 -0
  1441. data/test/regression/xlsx_files/chart_gridlines04.xlsx +0 -0
  1442. data/test/regression/xlsx_files/chart_gridlines05.xlsx +0 -0
  1443. data/test/regression/xlsx_files/chart_gridlines06.xlsx +0 -0
  1444. data/test/regression/xlsx_files/chart_gridlines07.xlsx +0 -0
  1445. data/test/regression/xlsx_files/chart_gridlines08.xlsx +0 -0
  1446. data/test/regression/xlsx_files/chart_gridlines09.xlsx +0 -0
  1447. data/test/regression/xlsx_files/chart_layout01.xlsx +0 -0
  1448. data/test/regression/xlsx_files/chart_layout02.xlsx +0 -0
  1449. data/test/regression/xlsx_files/chart_layout03.xlsx +0 -0
  1450. data/test/regression/xlsx_files/chart_layout04.xlsx +0 -0
  1451. data/test/regression/xlsx_files/chart_layout05.xlsx +0 -0
  1452. data/test/regression/xlsx_files/chart_layout06.xlsx +0 -0
  1453. data/test/regression/xlsx_files/chart_layout07.xlsx +0 -0
  1454. data/test/regression/xlsx_files/chart_layout08.xlsx +0 -0
  1455. data/test/regression/xlsx_files/chart_legend01.xlsx +0 -0
  1456. data/test/regression/xlsx_files/chart_legend03.xlsx +0 -0
  1457. data/test/regression/xlsx_files/chart_legend04.xlsx +0 -0
  1458. data/test/regression/xlsx_files/chart_legend05.xlsx +0 -0
  1459. data/test/regression/xlsx_files/chart_legend06.xlsx +0 -0
  1460. data/test/regression/xlsx_files/chart_legend07.xlsx +0 -0
  1461. data/test/regression/xlsx_files/chart_line01.xlsx +0 -0
  1462. data/test/regression/xlsx_files/chart_line02.xlsx +0 -0
  1463. data/test/regression/xlsx_files/chart_line03.xlsx +0 -0
  1464. data/test/regression/xlsx_files/chart_line04.xlsx +0 -0
  1465. data/test/regression/xlsx_files/chart_line05.xlsx +0 -0
  1466. data/test/regression/xlsx_files/chart_line06.xlsx +0 -0
  1467. data/test/regression/xlsx_files/chart_name01.xlsx +0 -0
  1468. data/test/regression/xlsx_files/chart_name02.xlsx +0 -0
  1469. data/test/regression/xlsx_files/chart_name03.xlsx +0 -0
  1470. data/test/regression/xlsx_files/chart_order01.xlsx +0 -0
  1471. data/test/regression/xlsx_files/chart_order03.xlsx +0 -0
  1472. data/test/regression/xlsx_files/chart_pattern01.xlsx +0 -0
  1473. data/test/regression/xlsx_files/chart_pattern02.xlsx +0 -0
  1474. data/test/regression/xlsx_files/chart_pattern03.xlsx +0 -0
  1475. data/test/regression/xlsx_files/chart_pattern04.xlsx +0 -0
  1476. data/test/regression/xlsx_files/chart_pattern05.xlsx +0 -0
  1477. data/test/regression/xlsx_files/chart_pattern06.xlsx +0 -0
  1478. data/test/regression/xlsx_files/chart_pattern07.xlsx +0 -0
  1479. data/test/regression/xlsx_files/chart_pattern08.xlsx +0 -0
  1480. data/test/regression/xlsx_files/chart_pattern09.xlsx +0 -0
  1481. data/test/regression/xlsx_files/chart_pattern10.xlsx +0 -0
  1482. data/test/regression/xlsx_files/chart_pie01.xlsx +0 -0
  1483. data/test/regression/xlsx_files/chart_pie02.xlsx +0 -0
  1484. data/test/regression/xlsx_files/chart_pie03.xlsx +0 -0
  1485. data/test/regression/xlsx_files/chart_pie04.xlsx +0 -0
  1486. data/test/regression/xlsx_files/chart_pie05.xlsx +0 -0
  1487. data/test/regression/xlsx_files/chart_points01.xlsx +0 -0
  1488. data/test/regression/xlsx_files/chart_points02.xlsx +0 -0
  1489. data/test/regression/xlsx_files/chart_points03.xlsx +0 -0
  1490. data/test/regression/xlsx_files/chart_points04.xlsx +0 -0
  1491. data/test/regression/xlsx_files/chart_points05.xlsx +0 -0
  1492. data/test/regression/xlsx_files/chart_points06.xlsx +0 -0
  1493. data/test/regression/xlsx_files/chart_radar01.xlsx +0 -0
  1494. data/test/regression/xlsx_files/chart_radar02.xlsx +0 -0
  1495. data/test/regression/xlsx_files/chart_radar03.xlsx +0 -0
  1496. data/test/regression/xlsx_files/chart_scatter01.xlsx +0 -0
  1497. data/test/regression/xlsx_files/chart_scatter02.xlsx +0 -0
  1498. data/test/regression/xlsx_files/chart_scatter03.xlsx +0 -0
  1499. data/test/regression/xlsx_files/chart_scatter04.xlsx +0 -0
  1500. data/test/regression/xlsx_files/chart_scatter05.xlsx +0 -0
  1501. data/test/regression/xlsx_files/chart_scatter06.xlsx +0 -0
  1502. data/test/regression/xlsx_files/chart_scatter07.xlsx +0 -0
  1503. data/test/regression/xlsx_files/chart_scatter08.xlsx +0 -0
  1504. data/test/regression/xlsx_files/chart_scatter09.xlsx +0 -0
  1505. data/test/regression/xlsx_files/chart_scatter10.xlsx +0 -0
  1506. data/test/regression/xlsx_files/chart_scatter11.xlsx +0 -0
  1507. data/test/regression/xlsx_files/chart_scatter12.xlsx +0 -0
  1508. data/test/regression/xlsx_files/chart_scatter14.xlsx +0 -0
  1509. data/test/regression/xlsx_files/chart_scatter15.xlsx +0 -0
  1510. data/test/regression/xlsx_files/chart_size01.xlsx +0 -0
  1511. data/test/regression/xlsx_files/chart_size04.xlsx +0 -0
  1512. data/test/regression/xlsx_files/chart_sparse01.xlsx +0 -0
  1513. data/test/regression/xlsx_files/chart_stock01.xlsx +0 -0
  1514. data/test/regression/xlsx_files/chart_stock02.xlsx +0 -0
  1515. data/test/regression/xlsx_files/chart_str01.xlsx +0 -0
  1516. data/test/regression/xlsx_files/chart_str02.xlsx +0 -0
  1517. data/test/regression/xlsx_files/chart_table01.xlsx +0 -0
  1518. data/test/regression/xlsx_files/chart_table02.xlsx +0 -0
  1519. data/test/regression/xlsx_files/chart_table03.xlsx +0 -0
  1520. data/test/regression/xlsx_files/chart_title01.xlsx +0 -0
  1521. data/test/regression/xlsx_files/chart_title02.xlsx +0 -0
  1522. data/test/regression/xlsx_files/chartsheet01.xlsx +0 -0
  1523. data/test/regression/xlsx_files/chartsheet02.xlsx +0 -0
  1524. data/test/regression/xlsx_files/chartsheet03.xlsx +0 -0
  1525. data/test/regression/xlsx_files/chartsheet04.xlsx +0 -0
  1526. data/test/regression/xlsx_files/chartsheet05.xlsx +0 -0
  1527. data/test/regression/xlsx_files/chartsheet06.xlsx +0 -0
  1528. data/test/regression/xlsx_files/chartsheet07.xlsx +0 -0
  1529. data/test/regression/xlsx_files/chartsheet08.xlsx +0 -0
  1530. data/test/regression/xlsx_files/chartsheet09.xlsx +0 -0
  1531. data/test/regression/xlsx_files/comment01.xlsx +0 -0
  1532. data/test/regression/xlsx_files/comment02.xlsx +0 -0
  1533. data/test/regression/xlsx_files/comment03.xlsx +0 -0
  1534. data/test/regression/xlsx_files/comment04.xlsx +0 -0
  1535. data/test/regression/xlsx_files/comment05.xlsx +0 -0
  1536. data/test/regression/xlsx_files/comment06.xlsx +0 -0
  1537. data/test/regression/xlsx_files/comment07.xlsx +0 -0
  1538. data/test/regression/xlsx_files/comment08.xlsx +0 -0
  1539. data/test/regression/xlsx_files/comment09.xlsx +0 -0
  1540. data/test/regression/xlsx_files/comment10.xlsx +0 -0
  1541. data/test/regression/xlsx_files/comment11.xlsx +0 -0
  1542. data/test/regression/xlsx_files/comment12.xlsx +0 -0
  1543. data/test/regression/xlsx_files/comment13.xlsx +0 -0
  1544. data/test/regression/xlsx_files/comment14.xlsx +0 -0
  1545. data/test/regression/xlsx_files/comment15.xlsx +0 -0
  1546. data/test/regression/xlsx_files/comment16.xlsx +0 -0
  1547. data/test/regression/xlsx_files/cond_format01.xlsx +0 -0
  1548. data/test/regression/xlsx_files/cond_format02.xlsx +0 -0
  1549. data/test/regression/xlsx_files/cond_format03.xlsx +0 -0
  1550. data/test/regression/xlsx_files/cond_format04.xlsx +0 -0
  1551. data/test/regression/xlsx_files/cond_format05.xlsx +0 -0
  1552. data/test/regression/xlsx_files/cond_format06.xlsx +0 -0
  1553. data/test/regression/xlsx_files/cond_format07.xlsx +0 -0
  1554. data/test/regression/xlsx_files/cond_format08.xlsx +0 -0
  1555. data/test/regression/xlsx_files/cond_format10.xlsx +0 -0
  1556. data/test/regression/xlsx_files/cond_format11.xlsx +0 -0
  1557. data/test/regression/xlsx_files/cond_format12.xlsx +0 -0
  1558. data/test/regression/xlsx_files/cond_format14.xlsx +0 -0
  1559. data/test/regression/xlsx_files/cond_format15.xlsx +0 -0
  1560. data/test/regression/xlsx_files/cond_format16.xlsx +0 -0
  1561. data/test/regression/xlsx_files/cond_format17.xlsx +0 -0
  1562. data/test/regression/xlsx_files/cond_format18.xlsx +0 -0
  1563. data/test/regression/xlsx_files/cond_format19.xlsx +0 -0
  1564. data/test/regression/xlsx_files/cond_format20.xlsx +0 -0
  1565. data/test/regression/xlsx_files/custom_colors01.xlsx +0 -0
  1566. data/test/regression/xlsx_files/data_validation01.xlsx +0 -0
  1567. data/test/regression/xlsx_files/data_validation02.xlsx +0 -0
  1568. data/test/regression/xlsx_files/data_validation03.xlsx +0 -0
  1569. data/test/regression/xlsx_files/data_validation08.xlsx +0 -0
  1570. data/test/regression/xlsx_files/date_1904_01.xlsx +0 -0
  1571. data/test/regression/xlsx_files/date_1904_02.xlsx +0 -0
  1572. data/test/regression/xlsx_files/date_examples01.xlsx +0 -0
  1573. data/test/regression/xlsx_files/default_format01.xlsx +0 -0
  1574. data/test/regression/xlsx_files/default_row01.xlsx +0 -0
  1575. data/test/regression/xlsx_files/default_row02.xlsx +0 -0
  1576. data/test/regression/xlsx_files/default_row03.xlsx +0 -0
  1577. data/test/regression/xlsx_files/default_row04.xlsx +0 -0
  1578. data/test/regression/xlsx_files/default_row05.xlsx +0 -0
  1579. data/test/regression/xlsx_files/defined_name01.xlsx +0 -0
  1580. data/test/regression/xlsx_files/defined_name02.xlsx +0 -0
  1581. data/test/regression/xlsx_files/defined_name03.xlsx +0 -0
  1582. data/test/regression/xlsx_files/defined_name04.xlsx +0 -0
  1583. data/test/regression/xlsx_files/dynamic_array01.xlsx +0 -0
  1584. data/test/regression/xlsx_files/escapes01.xlsx +0 -0
  1585. data/test/regression/xlsx_files/escapes02.xlsx +0 -0
  1586. data/test/regression/xlsx_files/escapes03.xlsx +0 -0
  1587. data/test/regression/xlsx_files/escapes04.xlsx +0 -0
  1588. data/test/regression/xlsx_files/escapes05.xlsx +0 -0
  1589. data/test/regression/xlsx_files/escapes06.xlsx +0 -0
  1590. data/test/regression/xlsx_files/escapes07.xlsx +0 -0
  1591. data/test/regression/xlsx_files/escapes08.xlsx +0 -0
  1592. data/test/regression/xlsx_files/excel2003_style01.xlsx +0 -0
  1593. data/test/regression/xlsx_files/excel2003_style02.xlsx +0 -0
  1594. data/test/regression/xlsx_files/excel2003_style03.xlsx +0 -0
  1595. data/test/regression/xlsx_files/excel2003_style04.xlsx +0 -0
  1596. data/test/regression/xlsx_files/excel2003_style05.xlsx +0 -0
  1597. data/test/regression/xlsx_files/excel2003_style06.xlsx +0 -0
  1598. data/test/regression/xlsx_files/excel2003_style07.xlsx +0 -0
  1599. data/test/regression/xlsx_files/excel2003_style08.xlsx +0 -0
  1600. data/test/regression/xlsx_files/filehandle01.xlsx +0 -0
  1601. data/test/regression/xlsx_files/firstsheet01.xlsx +0 -0
  1602. data/test/regression/xlsx_files/fit_to_pages01.xlsx +0 -0
  1603. data/test/regression/xlsx_files/fit_to_pages02.xlsx +0 -0
  1604. data/test/regression/xlsx_files/fit_to_pages03.xlsx +0 -0
  1605. data/test/regression/xlsx_files/fit_to_pages04.xlsx +0 -0
  1606. data/test/regression/xlsx_files/fit_to_pages05.xlsx +0 -0
  1607. data/test/regression/xlsx_files/format01.xlsx +0 -0
  1608. data/test/regression/xlsx_files/format02.xlsx +0 -0
  1609. data/test/regression/xlsx_files/format03.xlsx +0 -0
  1610. data/test/regression/xlsx_files/format04.xlsx +0 -0
  1611. data/test/regression/xlsx_files/format05.xlsx +0 -0
  1612. data/test/regression/xlsx_files/format11.xlsx +0 -0
  1613. data/test/regression/xlsx_files/format12.xlsx +0 -0
  1614. data/test/regression/xlsx_files/format13.xlsx +0 -0
  1615. data/test/regression/xlsx_files/format14.xlsx +0 -0
  1616. data/test/regression/xlsx_files/format15.xlsx +0 -0
  1617. data/test/regression/xlsx_files/format16.xlsx +0 -0
  1618. data/test/regression/xlsx_files/format17.xlsx +0 -0
  1619. data/test/regression/xlsx_files/formula_results01.xlsx +0 -0
  1620. data/test/regression/xlsx_files/gridlines01.xlsx +0 -0
  1621. data/test/regression/xlsx_files/header01.xlsx +0 -0
  1622. data/test/regression/xlsx_files/header02.xlsx +0 -0
  1623. data/test/regression/xlsx_files/header03.xlsx +0 -0
  1624. data/test/regression/xlsx_files/header04.xlsx +0 -0
  1625. data/test/regression/xlsx_files/header_image01.xlsx +0 -0
  1626. data/test/regression/xlsx_files/header_image02.xlsx +0 -0
  1627. data/test/regression/xlsx_files/header_image03.xlsx +0 -0
  1628. data/test/regression/xlsx_files/header_image04.xlsx +0 -0
  1629. data/test/regression/xlsx_files/header_image05.xlsx +0 -0
  1630. data/test/regression/xlsx_files/header_image06.xlsx +0 -0
  1631. data/test/regression/xlsx_files/header_image07.xlsx +0 -0
  1632. data/test/regression/xlsx_files/header_image08.xlsx +0 -0
  1633. data/test/regression/xlsx_files/header_image09.xlsx +0 -0
  1634. data/test/regression/xlsx_files/header_image10.xlsx +0 -0
  1635. data/test/regression/xlsx_files/header_image11.xlsx +0 -0
  1636. data/test/regression/xlsx_files/header_image12.xlsx +0 -0
  1637. data/test/regression/xlsx_files/header_image13.xlsx +0 -0
  1638. data/test/regression/xlsx_files/header_image14.xlsx +0 -0
  1639. data/test/regression/xlsx_files/header_image15.xlsx +0 -0
  1640. data/test/regression/xlsx_files/header_image16.xlsx +0 -0
  1641. data/test/regression/xlsx_files/header_image17.xlsx +0 -0
  1642. data/test/regression/xlsx_files/header_image18.xlsx +0 -0
  1643. data/test/regression/xlsx_files/header_image19.xlsx +0 -0
  1644. data/test/regression/xlsx_files/hide01.xlsx +0 -0
  1645. data/test/regression/xlsx_files/hyperlink01.xlsx +0 -0
  1646. data/test/regression/xlsx_files/hyperlink02.xlsx +0 -0
  1647. data/test/regression/xlsx_files/hyperlink03.xlsx +0 -0
  1648. data/test/regression/xlsx_files/hyperlink04.xlsx +0 -0
  1649. data/test/regression/xlsx_files/hyperlink05.xlsx +0 -0
  1650. data/test/regression/xlsx_files/hyperlink06.xlsx +0 -0
  1651. data/test/regression/xlsx_files/hyperlink07.xlsx +0 -0
  1652. data/test/regression/xlsx_files/hyperlink08.xlsx +0 -0
  1653. data/test/regression/xlsx_files/hyperlink09.xlsx +0 -0
  1654. data/test/regression/xlsx_files/hyperlink10.xlsx +0 -0
  1655. data/test/regression/xlsx_files/hyperlink11.xlsx +0 -0
  1656. data/test/regression/xlsx_files/hyperlink12.xlsx +0 -0
  1657. data/test/regression/xlsx_files/hyperlink13.xlsx +0 -0
  1658. data/test/regression/xlsx_files/hyperlink14.xlsx +0 -0
  1659. data/test/regression/xlsx_files/hyperlink15.xlsx +0 -0
  1660. data/test/regression/xlsx_files/hyperlink16.xlsx +0 -0
  1661. data/test/regression/xlsx_files/hyperlink17.xlsx +0 -0
  1662. data/test/regression/xlsx_files/hyperlink18.xlsx +0 -0
  1663. data/test/regression/xlsx_files/hyperlink20.xlsx +0 -0
  1664. data/test/regression/xlsx_files/hyperlink21.xlsx +0 -0
  1665. data/test/regression/xlsx_files/hyperlink22.xlsx +0 -0
  1666. data/test/regression/xlsx_files/hyperlink23.xlsx +0 -0
  1667. data/test/regression/xlsx_files/hyperlink24.xlsx +0 -0
  1668. data/test/regression/xlsx_files/hyperlink25.xlsx +0 -0
  1669. data/test/regression/xlsx_files/hyperlink26.xlsx +0 -0
  1670. data/test/regression/xlsx_files/hyperlink27.xlsx +0 -0
  1671. data/test/regression/xlsx_files/hyperlink28.xlsx +0 -0
  1672. data/test/regression/xlsx_files/hyperlink29.xlsx +0 -0
  1673. data/test/regression/xlsx_files/hyperlink30.xlsx +0 -0
  1674. data/test/regression/xlsx_files/hyperlink31.xlsx +0 -0
  1675. data/test/regression/xlsx_files/hyperlink32.xlsx +0 -0
  1676. data/test/regression/xlsx_files/hyperlink33.xlsx +0 -0
  1677. data/test/regression/xlsx_files/hyperlink34.xlsx +0 -0
  1678. data/test/regression/xlsx_files/hyperlink35.xlsx +0 -0
  1679. data/test/regression/xlsx_files/hyperlink36.xlsx +0 -0
  1680. data/test/regression/xlsx_files/hyperlink37.xlsx +0 -0
  1681. data/test/regression/xlsx_files/hyperlink38.xlsx +0 -0
  1682. data/test/regression/xlsx_files/hyperlink39.xlsx +0 -0
  1683. data/test/regression/xlsx_files/hyperlink40.xlsx +0 -0
  1684. data/test/regression/xlsx_files/hyperlink41.xlsx +0 -0
  1685. data/test/regression/xlsx_files/hyperlink42.xlsx +0 -0
  1686. data/test/regression/xlsx_files/hyperlink43.xlsx +0 -0
  1687. data/test/regression/xlsx_files/hyperlink44.xlsx +0 -0
  1688. data/test/regression/xlsx_files/hyperlink45.xlsx +0 -0
  1689. data/test/regression/xlsx_files/hyperlink46.xlsx +0 -0
  1690. data/test/regression/xlsx_files/hyperlink47.xlsx +0 -0
  1691. data/test/regression/xlsx_files/hyperlink48.xlsx +0 -0
  1692. data/test/regression/xlsx_files/hyperlink49.xlsx +0 -0
  1693. data/test/regression/xlsx_files/hyperlink50.xlsx +0 -0
  1694. data/test/regression/xlsx_files/hyperlink51.xlsx +0 -0
  1695. data/test/regression/xlsx_files/ignore_error01.xlsx +0 -0
  1696. data/test/regression/xlsx_files/ignore_error02.xlsx +0 -0
  1697. data/test/regression/xlsx_files/ignore_error03.xlsx +0 -0
  1698. data/test/regression/xlsx_files/ignore_error04.xlsx +0 -0
  1699. data/test/regression/xlsx_files/ignore_error05.xlsx +0 -0
  1700. data/test/regression/xlsx_files/ignore_error06.xlsx +0 -0
  1701. data/test/regression/xlsx_files/image01.xlsx +0 -0
  1702. data/test/regression/xlsx_files/image02.xlsx +0 -0
  1703. data/test/regression/xlsx_files/image03.xlsx +0 -0
  1704. data/test/regression/xlsx_files/image04.xlsx +0 -0
  1705. data/test/regression/xlsx_files/image05.xlsx +0 -0
  1706. data/test/regression/xlsx_files/image06.xlsx +0 -0
  1707. data/test/regression/xlsx_files/image07.xlsx +0 -0
  1708. data/test/regression/xlsx_files/image08.xlsx +0 -0
  1709. data/test/regression/xlsx_files/image09.xlsx +0 -0
  1710. data/test/regression/xlsx_files/image10.xlsx +0 -0
  1711. data/test/regression/xlsx_files/image11.xlsx +0 -0
  1712. data/test/regression/xlsx_files/image12.xlsx +0 -0
  1713. data/test/regression/xlsx_files/image13.xlsx +0 -0
  1714. data/test/regression/xlsx_files/image14.xlsx +0 -0
  1715. data/test/regression/xlsx_files/image15.xlsx +0 -0
  1716. data/test/regression/xlsx_files/image16.xlsx +0 -0
  1717. data/test/regression/xlsx_files/image17.xlsx +0 -0
  1718. data/test/regression/xlsx_files/image18.xlsx +0 -0
  1719. data/test/regression/xlsx_files/image19.xlsx +0 -0
  1720. data/test/regression/xlsx_files/image22.xlsx +0 -0
  1721. data/test/regression/xlsx_files/image23.xlsx +0 -0
  1722. data/test/regression/xlsx_files/image24.xlsx +0 -0
  1723. data/test/regression/xlsx_files/image25.xlsx +0 -0
  1724. data/test/regression/xlsx_files/image26.xlsx +0 -0
  1725. data/test/regression/xlsx_files/image27.xlsx +0 -0
  1726. data/test/regression/xlsx_files/image28.xlsx +0 -0
  1727. data/test/regression/xlsx_files/image29.xlsx +0 -0
  1728. data/test/regression/xlsx_files/image30.xlsx +0 -0
  1729. data/test/regression/xlsx_files/image31.xlsx +0 -0
  1730. data/test/regression/xlsx_files/image32.xlsx +0 -0
  1731. data/test/regression/xlsx_files/image33.xlsx +0 -0
  1732. data/test/regression/xlsx_files/image35.xlsx +0 -0
  1733. data/test/regression/xlsx_files/image36.xlsx +0 -0
  1734. data/test/regression/xlsx_files/image44.xlsx +0 -0
  1735. data/test/regression/xlsx_files/image45.xlsx +0 -0
  1736. data/test/regression/xlsx_files/image46.xlsx +0 -0
  1737. data/test/regression/xlsx_files/image47.xlsx +0 -0
  1738. data/test/regression/xlsx_files/image48.xlsx +0 -0
  1739. data/test/regression/xlsx_files/image49.xlsx +0 -0
  1740. data/test/regression/xlsx_files/image50.xlsx +0 -0
  1741. data/test/regression/xlsx_files/image51.xlsx +0 -0
  1742. data/test/regression/xlsx_files/image52.xlsx +0 -0
  1743. data/test/regression/xlsx_files/image53.xlsx +0 -0
  1744. data/test/regression/xlsx_files/image54.xlsx +0 -0
  1745. data/test/regression/xlsx_files/image55.xlsx +0 -0
  1746. data/test/regression/xlsx_files/image56.xlsx +0 -0
  1747. data/test/regression/xlsx_files/image57.xlsx +0 -0
  1748. data/test/regression/xlsx_files/landscape01.xlsx +0 -0
  1749. data/test/regression/xlsx_files/macro01.xlsm +0 -0
  1750. data/test/regression/xlsx_files/merge_cells01.xlsx +0 -0
  1751. data/test/regression/xlsx_files/merge_range01.xlsx +0 -0
  1752. data/test/regression/xlsx_files/merge_range02.xlsx +0 -0
  1753. data/test/regression/xlsx_files/merge_range03.xlsx +0 -0
  1754. data/test/regression/xlsx_files/merge_range04.xlsx +0 -0
  1755. data/test/regression/xlsx_files/merge_range05.xlsx +0 -0
  1756. data/test/regression/xlsx_files/object_position01.xlsx +0 -0
  1757. data/test/regression/xlsx_files/object_position02.xlsx +0 -0
  1758. data/test/regression/xlsx_files/object_position03.xlsx +0 -0
  1759. data/test/regression/xlsx_files/object_position04.xlsx +0 -0
  1760. data/test/regression/xlsx_files/object_position06.xlsx +0 -0
  1761. data/test/regression/xlsx_files/object_position07.xlsx +0 -0
  1762. data/test/regression/xlsx_files/object_position08.xlsx +0 -0
  1763. data/test/regression/xlsx_files/object_position09.xlsx +0 -0
  1764. data/test/regression/xlsx_files/object_position10.xlsx +0 -0
  1765. data/test/regression/xlsx_files/object_position12.xlsx +0 -0
  1766. data/test/regression/xlsx_files/object_position13.xlsx +0 -0
  1767. data/test/regression/xlsx_files/object_position14.xlsx +0 -0
  1768. data/test/regression/xlsx_files/object_position15.xlsx +0 -0
  1769. data/test/regression/xlsx_files/object_position16.xlsx +0 -0
  1770. data/test/regression/xlsx_files/object_position17.xlsx +0 -0
  1771. data/test/regression/xlsx_files/object_position18.xlsx +0 -0
  1772. data/test/regression/xlsx_files/object_position19.xlsx +0 -0
  1773. data/test/regression/xlsx_files/object_position20.xlsx +0 -0
  1774. data/test/regression/xlsx_files/outline01.xlsx +0 -0
  1775. data/test/regression/xlsx_files/outline02.xlsx +0 -0
  1776. data/test/regression/xlsx_files/outline03.xlsx +0 -0
  1777. data/test/regression/xlsx_files/outline04.xlsx +0 -0
  1778. data/test/regression/xlsx_files/outline05.xlsx +0 -0
  1779. data/test/regression/xlsx_files/outline06.xlsx +0 -0
  1780. data/test/regression/xlsx_files/page_breaks01.xlsx +0 -0
  1781. data/test/regression/xlsx_files/page_breaks02.xlsx +0 -0
  1782. data/test/regression/xlsx_files/page_breaks03.xlsx +0 -0
  1783. data/test/regression/xlsx_files/page_breaks04.xlsx +0 -0
  1784. data/test/regression/xlsx_files/page_breaks05.xlsx +0 -0
  1785. data/test/regression/xlsx_files/page_breaks06.xlsx +0 -0
  1786. data/test/regression/xlsx_files/page_view01.xlsx +0 -0
  1787. data/test/regression/xlsx_files/panes01.xlsx +0 -0
  1788. data/test/regression/xlsx_files/print_across01.xlsx +0 -0
  1789. data/test/regression/xlsx_files/print_area01.xlsx +0 -0
  1790. data/test/regression/xlsx_files/print_area02.xlsx +0 -0
  1791. data/test/regression/xlsx_files/print_area03.xlsx +0 -0
  1792. data/test/regression/xlsx_files/print_area04.xlsx +0 -0
  1793. data/test/regression/xlsx_files/print_area05.xlsx +0 -0
  1794. data/test/regression/xlsx_files/print_area06.xlsx +0 -0
  1795. data/test/regression/xlsx_files/print_area07.xlsx +0 -0
  1796. data/test/regression/xlsx_files/print_options01.xlsx +0 -0
  1797. data/test/regression/xlsx_files/print_options02.xlsx +0 -0
  1798. data/test/regression/xlsx_files/print_options03.xlsx +0 -0
  1799. data/test/regression/xlsx_files/print_options04.xlsx +0 -0
  1800. data/test/regression/xlsx_files/print_options05.xlsx +0 -0
  1801. data/test/regression/xlsx_files/print_options06.xlsx +0 -0
  1802. data/test/regression/xlsx_files/print_options07.xlsx +0 -0
  1803. data/test/regression/xlsx_files/print_scale01.xlsx +0 -0
  1804. data/test/regression/xlsx_files/print_scale02.xlsx +0 -0
  1805. data/test/regression/xlsx_files/properties01.xlsx +0 -0
  1806. data/test/regression/xlsx_files/properties02.xlsx +0 -0
  1807. data/test/regression/xlsx_files/properties03.xlsx +0 -0
  1808. data/test/regression/xlsx_files/properties04.xlsx +0 -0
  1809. data/test/regression/xlsx_files/properties05.xlsx +0 -0
  1810. data/test/regression/xlsx_files/protect01.xlsx +0 -0
  1811. data/test/regression/xlsx_files/protect02.xlsx +0 -0
  1812. data/test/regression/xlsx_files/protect03.xlsx +0 -0
  1813. data/test/regression/xlsx_files/protect04.xlsx +0 -0
  1814. data/test/regression/xlsx_files/protect05.xlsx +0 -0
  1815. data/test/regression/xlsx_files/protect06.xlsx +0 -0
  1816. data/test/regression/xlsx_files/protect07.xlsx +0 -0
  1817. data/test/regression/xlsx_files/quote_name01.xlsx +0 -0
  1818. data/test/regression/xlsx_files/quote_name02.xlsx +0 -0
  1819. data/test/regression/xlsx_files/quote_name03.xlsx +0 -0
  1820. data/test/regression/xlsx_files/quote_name04.xlsx +0 -0
  1821. data/test/regression/xlsx_files/repeat01.xlsx +0 -0
  1822. data/test/regression/xlsx_files/repeat02.xlsx +0 -0
  1823. data/test/regression/xlsx_files/repeat03.xlsx +0 -0
  1824. data/test/regression/xlsx_files/repeat04.xlsx +0 -0
  1825. data/test/regression/xlsx_files/repeat05.xlsx +0 -0
  1826. data/test/regression/xlsx_files/rich_string01.xlsx +0 -0
  1827. data/test/regression/xlsx_files/rich_string02.xlsx +0 -0
  1828. data/test/regression/xlsx_files/rich_string03.xlsx +0 -0
  1829. data/test/regression/xlsx_files/rich_string04.xlsx +0 -0
  1830. data/test/regression/xlsx_files/rich_string05.xlsx +0 -0
  1831. data/test/regression/xlsx_files/rich_string06.xlsx +0 -0
  1832. data/test/regression/xlsx_files/rich_string07.xlsx +0 -0
  1833. data/test/regression/xlsx_files/rich_string08.xlsx +0 -0
  1834. data/test/regression/xlsx_files/rich_string09.xlsx +0 -0
  1835. data/test/regression/xlsx_files/rich_string10.xlsx +0 -0
  1836. data/test/regression/xlsx_files/rich_string11.xlsx +0 -0
  1837. data/test/regression/xlsx_files/rich_string12.xlsx +0 -0
  1838. data/test/regression/xlsx_files/row_col_format01.xlsx +0 -0
  1839. data/test/regression/xlsx_files/row_col_format02.xlsx +0 -0
  1840. data/test/regression/xlsx_files/row_col_format03.xlsx +0 -0
  1841. data/test/regression/xlsx_files/row_col_format04.xlsx +0 -0
  1842. data/test/regression/xlsx_files/row_col_format05.xlsx +0 -0
  1843. data/test/regression/xlsx_files/row_col_format06.xlsx +0 -0
  1844. data/test/regression/xlsx_files/row_col_format07.xlsx +0 -0
  1845. data/test/regression/xlsx_files/row_col_format08.xlsx +0 -0
  1846. data/test/regression/xlsx_files/row_col_format09.xlsx +0 -0
  1847. data/test/regression/xlsx_files/row_col_format10.xlsx +0 -0
  1848. data/test/regression/xlsx_files/row_col_format11.xlsx +0 -0
  1849. data/test/regression/xlsx_files/row_col_format12.xlsx +0 -0
  1850. data/test/regression/xlsx_files/row_col_format13.xlsx +0 -0
  1851. data/test/regression/xlsx_files/row_col_format14.xlsx +0 -0
  1852. data/test/regression/xlsx_files/selection01.xlsx +0 -0
  1853. data/test/regression/xlsx_files/selection02.xlsx +0 -0
  1854. data/test/regression/xlsx_files/set_column01.xlsx +0 -0
  1855. data/test/regression/xlsx_files/set_column03.xlsx +0 -0
  1856. data/test/regression/xlsx_files/set_column04.xlsx +0 -0
  1857. data/test/regression/xlsx_files/set_column05.xlsx +0 -0
  1858. data/test/regression/xlsx_files/set_column06.xlsx +0 -0
  1859. data/test/regression/xlsx_files/set_column07.xlsx +0 -0
  1860. data/test/regression/xlsx_files/set_column08.xlsx +0 -0
  1861. data/test/regression/xlsx_files/set_column09.xlsx +0 -0
  1862. data/test/regression/xlsx_files/set_print_scale01.xlsx +0 -0
  1863. data/test/regression/xlsx_files/set_row01.xlsx +0 -0
  1864. data/test/regression/xlsx_files/set_row03.xlsx +0 -0
  1865. data/test/regression/xlsx_files/set_start_page01.xlsx +0 -0
  1866. data/test/regression/xlsx_files/set_start_page02.xlsx +0 -0
  1867. data/test/regression/xlsx_files/set_start_page03.xlsx +0 -0
  1868. data/test/regression/xlsx_files/shape01.xlsx +0 -0
  1869. data/test/regression/xlsx_files/shape02.xlsx +0 -0
  1870. data/test/regression/xlsx_files/shape03.xlsx +0 -0
  1871. data/test/regression/xlsx_files/shape04.xlsx +0 -0
  1872. data/test/regression/xlsx_files/shape_connect01.xlsx +0 -0
  1873. data/test/regression/xlsx_files/shape_connect02.xlsx +0 -0
  1874. data/test/regression/xlsx_files/shape_connect03.xlsx +0 -0
  1875. data/test/regression/xlsx_files/shape_connect04.xlsx +0 -0
  1876. data/test/regression/xlsx_files/shape_scale01.xlsx +0 -0
  1877. data/test/regression/xlsx_files/shape_stencil01.xlsx +0 -0
  1878. data/test/regression/xlsx_files/shared_strings01.xlsx +0 -0
  1879. data/test/regression/xlsx_files/shared_strings02.xlsx +0 -0
  1880. data/test/regression/xlsx_files/shared_strings_encoding.xlsx +0 -0
  1881. data/test/regression/xlsx_files/simple01.xlsx +0 -0
  1882. data/test/regression/xlsx_files/simple02.xlsx +0 -0
  1883. data/test/regression/xlsx_files/simple03.xlsx +0 -0
  1884. data/test/regression/xlsx_files/simple04.xlsx +0 -0
  1885. data/test/regression/xlsx_files/simple05.xlsx +0 -0
  1886. data/test/regression/xlsx_files/tab_color01.xlsx +0 -0
  1887. data/test/regression/xlsx_files/table01.xlsx +0 -0
  1888. data/test/regression/xlsx_files/table02.xlsx +0 -0
  1889. data/test/regression/xlsx_files/table03.xlsx +0 -0
  1890. data/test/regression/xlsx_files/table04.xlsx +0 -0
  1891. data/test/regression/xlsx_files/table05.xlsx +0 -0
  1892. data/test/regression/xlsx_files/table06.xlsx +0 -0
  1893. data/test/regression/xlsx_files/table07.xlsx +0 -0
  1894. data/test/regression/xlsx_files/table08.xlsx +0 -0
  1895. data/test/regression/xlsx_files/table09.xlsx +0 -0
  1896. data/test/regression/xlsx_files/table10.xlsx +0 -0
  1897. data/test/regression/xlsx_files/table11.xlsx +0 -0
  1898. data/test/regression/xlsx_files/table12.xlsx +0 -0
  1899. data/test/regression/xlsx_files/table13.xlsx +0 -0
  1900. data/test/regression/xlsx_files/table14.xlsx +0 -0
  1901. data/test/regression/xlsx_files/table15.xlsx +0 -0
  1902. data/test/regression/xlsx_files/table17.xlsx +0 -0
  1903. data/test/regression/xlsx_files/table18.xlsx +0 -0
  1904. data/test/regression/xlsx_files/table19.xlsx +0 -0
  1905. data/test/regression/xlsx_files/table21.xlsx +0 -0
  1906. data/test/regression/xlsx_files/table22.xlsx +0 -0
  1907. data/test/regression/xlsx_files/table23.xlsx +0 -0
  1908. data/test/regression/xlsx_files/table24.xlsx +0 -0
  1909. data/test/regression/xlsx_files/table25.xlsx +0 -0
  1910. data/test/regression/xlsx_files/table26.xlsx +0 -0
  1911. data/test/regression/xlsx_files/tutorial01.xlsx +0 -0
  1912. data/test/regression/xlsx_files/tutorial02.xlsx +0 -0
  1913. data/test/regression/xlsx_files/tutorial03.xlsx +0 -0
  1914. data/test/regression/xlsx_files/types02.xlsx +0 -0
  1915. data/test/regression/xlsx_files/types08.xlsx +0 -0
  1916. data/test/regression/xlsx_files/update_range_format_with_params.xlsx +0 -0
  1917. data/test/regression/xlsx_files/urls_as_strings.xlsx +0 -0
  1918. data/test/regression/xlsx_files/utf8_01.xlsx +0 -0
  1919. data/test/regression/xlsx_files/utf8_03.xlsx +0 -0
  1920. data/test/regression/xlsx_files/utf8_04.xlsx +0 -0
  1921. data/test/regression/xlsx_files/utf8_05.xlsx +0 -0
  1922. data/test/regression/xlsx_files/utf8_06.xlsx +0 -0
  1923. data/test/regression/xlsx_files/utf8_07.xlsx +0 -0
  1924. data/test/regression/xlsx_files/utf8_08.xlsx +0 -0
  1925. data/test/regression/xlsx_files/utf8_09.xlsx +0 -0
  1926. data/test/regression/xlsx_files/utf8_10.xlsx +0 -0
  1927. data/test/regression/xlsx_files/utf8_11.xlsx +0 -0
  1928. data/test/regression/xlsx_files/vbaProject01.bin +0 -0
  1929. data/test/regression/xlsx_files/vbaProject02.bin +0 -0
  1930. data/test/regression/xlsx_files/vml01.xlsx +0 -0
  1931. data/test/regression/xlsx_files/vml02.xlsx +0 -0
  1932. data/test/regression/xlsx_files/vml03.xlsx +0 -0
  1933. data/test/regression/xlsx_files/vml04.xlsx +0 -0
  1934. data/test/republic.png +0 -0
  1935. data/test/run_test.rb +0 -9
  1936. data/test/test_delete_files.rb +0 -37
  1937. data/test/test_example_match.rb +0 -6348
  1938. data/test/test_option_hash_for_workbook.rb +0 -72
  1939. data/test/test_xml_writer_simple.rb +0 -64
  1940. data/test/utility/test_range.rb +0 -20
  1941. data/test/vbaProject.bin +0 -0
  1942. data/test/workbook/test_check_sheetname.rb +0 -51
  1943. data/test/workbook/test_define_name.rb +0 -16
  1944. data/test/workbook/test_get_chart_range.rb +0 -57
  1945. data/test/workbook/test_sort_defined_names.rb +0 -77
  1946. data/test/workbook/test_workbook_01.rb +0 -29
  1947. data/test/workbook/test_workbook_02.rb +0 -31
  1948. data/test/workbook/test_workbook_03.rb +0 -31
  1949. data/test/workbook/test_worksheet_by_name.rb +0 -35
  1950. data/test/workbook/test_write_calc_pr.rb +0 -41
  1951. data/test/workbook/test_write_defined_name.rb +0 -17
  1952. data/test/workbook/test_write_defined_names.rb +0 -41
  1953. data/test/workbook/test_write_workbook_view.rb +0 -117
  1954. data/test/worksheet/test_calculate_spans.rb +0 -58
  1955. data/test/worksheet/test_cond_format_01.rb +0 -82
  1956. data/test/worksheet/test_cond_format_02.rb +0 -87
  1957. data/test/worksheet/test_cond_format_03.rb +0 -97
  1958. data/test/worksheet/test_cond_format_04.rb +0 -85
  1959. data/test/worksheet/test_cond_format_05.rb +0 -96
  1960. data/test/worksheet/test_cond_format_06.rb +0 -106
  1961. data/test/worksheet/test_cond_format_07.rb +0 -116
  1962. data/test/worksheet/test_cond_format_08.rb +0 -115
  1963. data/test/worksheet/test_cond_format_09.rb +0 -108
  1964. data/test/worksheet/test_cond_format_10.rb +0 -83
  1965. data/test/worksheet/test_cond_format_11.rb +0 -85
  1966. data/test/worksheet/test_cond_format_12.rb +0 -133
  1967. data/test/worksheet/test_cond_format_13.rb +0 -135
  1968. data/test/worksheet/test_cond_format_14.rb +0 -132
  1969. data/test/worksheet/test_cond_format_15.rb +0 -93
  1970. data/test/worksheet/test_cond_format_16.rb +0 -138
  1971. data/test/worksheet/test_cond_format_17.rb +0 -141
  1972. data/test/worksheet/test_cond_format_18.rb +0 -135
  1973. data/test/worksheet/test_cond_format_19.rb +0 -139
  1974. data/test/worksheet/test_cond_format_20.rb +0 -119
  1975. data/test/worksheet/test_cond_format_21.rb +0 -90
  1976. data/test/worksheet/test_cond_format_22.rb +0 -266
  1977. data/test/worksheet/test_cond_format_23.rb +0 -242
  1978. data/test/worksheet/test_cond_format_24.rb +0 -303
  1979. data/test/worksheet/test_convert_date_time_01.rb +0 -439
  1980. data/test/worksheet/test_convert_date_time_02.rb +0 -472
  1981. data/test/worksheet/test_convert_date_time_03.rb +0 -435
  1982. data/test/worksheet/test_convert_date_time_04.rb +0 -19
  1983. data/test/worksheet/test_data_bar_01.rb +0 -53
  1984. data/test/worksheet/test_data_bar_02.rb +0 -79
  1985. data/test/worksheet/test_data_bar_03.rb +0 -147
  1986. data/test/worksheet/test_data_bar_04.rb +0 -145
  1987. data/test/worksheet/test_data_bar_05.rb +0 -147
  1988. data/test/worksheet/test_data_bar_06.rb +0 -145
  1989. data/test/worksheet/test_data_bar_07.rb +0 -146
  1990. data/test/worksheet/test_data_bar_08.rb +0 -54
  1991. data/test/worksheet/test_data_bar_09.rb +0 -80
  1992. data/test/worksheet/test_data_bar_10.rb +0 -165
  1993. data/test/worksheet/test_data_bar_11.rb +0 -167
  1994. data/test/worksheet/test_data_bar_12.rb +0 -104
  1995. data/test/worksheet/test_extract_filter_tokens.rb +0 -109
  1996. data/test/worksheet/test_parse_filter_expression.rb +0 -143
  1997. data/test/worksheet/test_pixels_to_row_col.rb +0 -46
  1998. data/test/worksheet/test_position_object.rb +0 -50
  1999. data/test/worksheet/test_repeat_formula.rb +0 -55
  2000. data/test/worksheet/test_sparkline_01.rb +0 -65
  2001. data/test/worksheet/test_sparkline_02.rb +0 -92
  2002. data/test/worksheet/test_sparkline_03.rb +0 -133
  2003. data/test/worksheet/test_sparkline_04.rb +0 -93
  2004. data/test/worksheet/test_sparkline_05.rb +0 -93
  2005. data/test/worksheet/test_sparkline_06.rb +0 -114
  2006. data/test/worksheet/test_sparkline_07.rb +0 -357
  2007. data/test/worksheet/test_sparkline_08.rb +0 -177
  2008. data/test/worksheet/test_sparkline_09.rb +0 -1250
  2009. data/test/worksheet/test_sparkline_10.rb +0 -107
  2010. data/test/worksheet/test_sparkline_11.rb +0 -218
  2011. data/test/worksheet/test_sparkline_12.rb +0 -94
  2012. data/test/worksheet/test_update_format_methods.rb +0 -91
  2013. data/test/worksheet/test_worksheet_01.rb +0 -32
  2014. data/test/worksheet/test_worksheet_02.rb +0 -38
  2015. data/test/worksheet/test_worksheet_03.rb +0 -44
  2016. data/test/worksheet/test_worksheet_04.rb +0 -45
  2017. data/test/worksheet/test_write_array_formula_01.rb +0 -98
  2018. data/test/worksheet/test_write_autofilter.rb +0 -260
  2019. data/test/worksheet/test_write_brk.rb +0 -18
  2020. data/test/worksheet/test_write_cell.rb +0 -54
  2021. data/test/worksheet/test_write_cell_value.rb +0 -33
  2022. data/test/worksheet/test_write_col_breaks.rb +0 -27
  2023. data/test/worksheet/test_write_col_info.rb +0 -95
  2024. data/test/worksheet/test_write_conditional_formatting.rb +0 -72
  2025. data/test/worksheet/test_write_custom_filter.rb +0 -18
  2026. data/test/worksheet/test_write_custom_filters.rb +0 -25
  2027. data/test/worksheet/test_write_data_validation_01.rb +0 -113
  2028. data/test/worksheet/test_write_data_validation_02.rb +0 -585
  2029. data/test/worksheet/test_write_dimension.rb +0 -94
  2030. data/test/worksheet/test_write_filter.rb +0 -18
  2031. data/test/worksheet/test_write_filter_column.rb +0 -18
  2032. data/test/worksheet/test_write_filters.rb +0 -32
  2033. data/test/worksheet/test_write_formula_does_not_change_formula_string.rb +0 -18
  2034. data/test/worksheet/test_write_header_footer.rb +0 -58
  2035. data/test/worksheet/test_write_hyperlink.rb +0 -32
  2036. data/test/worksheet/test_write_legacy_drawing.rb +0 -19
  2037. data/test/worksheet/test_write_merge_cell.rb +0 -18
  2038. data/test/worksheet/test_write_merge_cells.rb +0 -192
  2039. data/test/worksheet/test_write_methods.rb +0 -248
  2040. data/test/worksheet/test_write_page_margins.rb +0 -98
  2041. data/test/worksheet/test_write_page_set_up_pr.rb +0 -19
  2042. data/test/worksheet/test_write_page_setup.rb +0 -54
  2043. data/test/worksheet/test_write_pane.rb +0 -123
  2044. data/test/worksheet/test_write_phonetic_pr.rb +0 -19
  2045. data/test/worksheet/test_write_print_options.rb +0 -77
  2046. data/test/worksheet/test_write_row_breaks.rb +0 -27
  2047. data/test/worksheet/test_write_row_element.rb +0 -69
  2048. data/test/worksheet/test_write_selection.rb +0 -18
  2049. data/test/worksheet/test_write_sheet_calc_pr.rb +0 -18
  2050. data/test/worksheet/test_write_sheet_data.rb +0 -18
  2051. data/test/worksheet/test_write_sheet_format_pr.rb +0 -18
  2052. data/test/worksheet/test_write_sheet_pr.rb +0 -36
  2053. data/test/worksheet/test_write_sheet_protection.rb +0 -174
  2054. data/test/worksheet/test_write_sheet_view.rb +0 -71
  2055. data/test/worksheet/test_write_sheet_view1.rb +0 -64
  2056. data/test/worksheet/test_write_sheet_view2.rb +0 -56
  2057. data/test/worksheet/test_write_sheet_view3.rb +0 -83
  2058. data/test/worksheet/test_write_sheet_view4.rb +0 -83
  2059. data/test/worksheet/test_write_sheet_view5.rb +0 -74
  2060. data/test/worksheet/test_write_sheet_view6.rb +0 -51
  2061. data/test/worksheet/test_write_sheet_view7.rb +0 -71
  2062. data/test/worksheet/test_write_sheet_view8.rb +0 -51
  2063. data/test/worksheet/test_write_sheet_view9.rb +0 -51
  2064. data/test/worksheet/test_write_tab_color.rb +0 -23
  2065. data/test/worksheet/test_write_worksheet_attributes.rb +0 -21
@@ -1,5 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # frozen_string_literal: true
3
+
3
4
  require 'write_xlsx/package/xml_writer_simple'
4
5
  require 'write_xlsx/package/button'
5
6
  require 'write_xlsx/colors'
@@ -14,6 +15,7 @@ require 'write_xlsx/worksheet/data_validation'
14
15
  require 'write_xlsx/worksheet/hyperlink'
15
16
  require 'write_xlsx/worksheet/page_setup'
16
17
  require 'tempfile'
18
+ require 'date'
17
19
 
18
20
  module Writexlsx
19
21
  class Worksheet
@@ -21,6 +23,7 @@ module Writexlsx
21
23
 
22
24
  MAX_DIGIT_WIDTH = 7 # For Calabri 11. # :nodoc:
23
25
  PADDING = 5 # :nodoc:
26
+ COLINFO = Struct.new('ColInfo', :width, :format, :hidden, :level, :collapsed, :autofit)
24
27
 
25
28
  attr_reader :index # :nodoc:
26
29
  attr_reader :charts, :images, :tables, :shapes, :drawings # :nodoc:
@@ -29,21 +32,26 @@ module Writexlsx
29
32
  attr_reader :vml_data_id # :nodoc:
30
33
  attr_reader :vml_header_id # :nodoc:
31
34
  attr_reader :autofilter_area # :nodoc:
32
- attr_reader :writer, :set_rows, :col_formats # :nodoc:
35
+ attr_reader :writer, :set_rows, :col_info # :nodoc:
33
36
  attr_reader :vml_shape_id # :nodoc:
34
37
  attr_reader :comments, :comments_author # :nodoc:
35
38
  attr_accessor :data_bars_2010, :dxf_priority # :nodoc:
36
39
  attr_reader :vba_codename # :nodoc:
37
- attr_writer :excel_version
40
+ attr_writer :excel_version # :nodoc:
41
+ attr_reader :filter_cells # :nodoc:
42
+
43
+ def initialize(workbook, index, name) # :nodoc:
44
+ rowmax = 1_048_576
45
+ colmax = 16_384
46
+ strmax = 32_767
38
47
 
39
- def initialize(workbook, index, name) #:nodoc:
40
48
  @writer = Package::XMLWriterSimple.new
41
49
 
42
50
  @workbook = workbook
43
51
  @index = index
44
52
  @name = name
45
- @colinfo = {}
46
- @cell_data_table = {}
53
+ @col_info = {}
54
+ @cell_data_table = []
47
55
  @excel_version = 2007
48
56
  @palette = workbook.palette
49
57
  @default_url_format = workbook.default_url_format
@@ -53,6 +61,10 @@ module Writexlsx
53
61
 
54
62
  @screen_gridlines = true
55
63
  @show_zeros = true
64
+
65
+ @xls_rowmax = rowmax
66
+ @xls_colmax = colmax
67
+ @xls_strmax = strmax
56
68
  @dim_rowmin = nil
57
69
  @dim_rowmax = nil
58
70
  @dim_colmin = nil
@@ -60,6 +72,7 @@ module Writexlsx
60
72
  @selections = []
61
73
  @panes = []
62
74
  @hide_row_col_headers = 0
75
+ @top_left_cell = ''
63
76
 
64
77
  @tab_color = 0
65
78
 
@@ -74,11 +87,10 @@ module Writexlsx
74
87
  @filter_on = false
75
88
  @filter_range = []
76
89
  @filter_cols = {}
90
+ @filter_cells = {}
77
91
  @filter_type = {}
78
92
 
79
- @col_sizes = {}
80
93
  @row_sizes = {}
81
- @col_formats = {}
82
94
 
83
95
  @last_shape_id = 1
84
96
  @rel_count = 0
@@ -87,8 +99,8 @@ module Writexlsx
87
99
  @external_drawing_links = []
88
100
  @external_comment_links = []
89
101
  @external_vml_links = []
90
- @external_table_links = []
91
102
  @external_background_links = []
103
+ @external_table_links = []
92
104
  @drawing_links = []
93
105
  @vml_drawing_links = []
94
106
  @charts = []
@@ -102,6 +114,9 @@ module Writexlsx
102
114
  @vml_drawing_rels = {}
103
115
  @vml_drawing_rels_id = 0
104
116
  @has_dynamic_arrays = false
117
+
118
+ @use_future_functions = false
119
+
105
120
  @header_images = []
106
121
  @footer_images = []
107
122
  @background_image = ''
@@ -115,6 +130,7 @@ module Writexlsx
115
130
  @default_col_width = 8.43
116
131
  @default_col_pixels = 64
117
132
  @default_row_rezoed = 0
133
+ @default_date_pixels = 68
118
134
 
119
135
  @merge = []
120
136
 
@@ -138,19 +154,19 @@ module Writexlsx
138
154
  @original_row_height = 12.75
139
155
  @default_row_height = 12.75
140
156
  @default_row_pixels = 17
141
- self::margins_left_right = 0.75
142
- self::margins_top_bottom = 1
157
+ self.margins_left_right = 0.75
158
+ self.margins_top_bottom = 1
143
159
  @page_setup.margin_header = 0.5
144
160
  @page_setup.margin_footer = 0.5
145
161
  @page_setup.header_footer_aligns = false
146
162
  end
147
163
  end
148
164
 
149
- def set_xml_writer(filename) #:nodoc:
165
+ def set_xml_writer(filename) # :nodoc:
150
166
  @writer.set_xml_writer(filename)
151
167
  end
152
168
 
153
- def assemble_xml_file #:nodoc:
169
+ def assemble_xml_file # :nodoc:
154
170
  write_xml_declaration do
155
171
  @writer.tag_elements('worksheet', write_worksheet_attributes) do
156
172
  write_sheet_pr
@@ -188,9 +204,7 @@ module Writexlsx
188
204
  #
189
205
  # The name method is used to retrieve the name of a worksheet.
190
206
  #
191
- def name
192
- @name
193
- end
207
+ attr_reader :name
194
208
 
195
209
  #
196
210
  # Set this worksheet as a selected worksheet, i.e. the worksheet has its tab
@@ -214,15 +228,26 @@ module Writexlsx
214
228
  #
215
229
  # Hide this worksheet.
216
230
  #
217
- def hide
218
- @hidden = true
231
+ def hide(hidden = :hidden)
232
+ @hidden = hidden
219
233
  @selected = false
220
234
  @workbook.activesheet = 0 if @workbook.activesheet == @index
221
235
  @workbook.firstsheet = 0 if @workbook.firstsheet == @index
222
236
  end
223
237
 
238
+ #
239
+ # Hide this worksheet. This can only be unhidden from VBA.
240
+ #
241
+ def very_hidden
242
+ hide(:very_hidden)
243
+ end
244
+
224
245
  def hidden? # :nodoc:
225
- @hidden
246
+ @hidden == :hidden
247
+ end
248
+
249
+ def very_hidden? # :nodoc:
250
+ @hidden == :very_hidden
226
251
  end
227
252
 
228
253
  #
@@ -244,8 +269,10 @@ module Writexlsx
244
269
  @protect = protect_default_settings.merge(options)
245
270
 
246
271
  # Set the password after the user defined values.
247
- @protect[:password] =
248
- encode_password(password) if password && password != ''
272
+ if password && password != ''
273
+ @protect[:password] =
274
+ encode_password(password)
275
+ end
249
276
  end
250
277
 
251
278
  #
@@ -255,8 +282,8 @@ module Writexlsx
255
282
  if range.nil?
256
283
  raise "The range must be defined in unprotect_range())\n"
257
284
  else
258
- range.gsub!(/\$/, "")
259
- range.sub!(/^=/, "")
285
+ range = range.gsub("$", "")
286
+ range = range.sub(/^=/, "")
260
287
  @num_protected_ranges += 1
261
288
  end
262
289
 
@@ -268,23 +295,23 @@ module Writexlsx
268
295
 
269
296
  def protect_default_settings # :nodoc:
270
297
  {
271
- :sheet => true,
272
- :content => false,
273
- :objects => false,
274
- :scenarios => false,
275
- :format_cells => false,
276
- :format_columns => false,
277
- :format_rows => false,
278
- :insert_columns => false,
279
- :insert_rows => false,
280
- :insert_hyperlinks => false,
281
- :delete_columns => false,
282
- :delete_rows => false,
283
- :select_locked_cells => true,
284
- :sort => false,
285
- :autofilter => false,
286
- :pivot_tables => false,
287
- :select_unlocked_cells => true
298
+ sheet: true,
299
+ content: false,
300
+ objects: false,
301
+ scenarios: false,
302
+ format_cells: false,
303
+ format_columns: false,
304
+ format_rows: false,
305
+ insert_columns: false,
306
+ insert_rows: false,
307
+ insert_hyperlinks: false,
308
+ delete_columns: false,
309
+ delete_rows: false,
310
+ select_locked_cells: true,
311
+ sort: false,
312
+ autofilter: false,
313
+ pivot_tables: false,
314
+ select_unlocked_cells: true
288
315
  }
289
316
  end
290
317
  private :protect_default_settings
@@ -299,8 +326,9 @@ module Writexlsx
299
326
  #
300
327
  def set_column(*args)
301
328
  # Check for a cell reference in A1 notation and substitute row and column
302
- if args[0].to_s =~ /^\D/
303
- row1, firstcol, row2, lastcol, *data = substitute_cellref(*args)
329
+ # ruby 3.2 no longer handles =~ for various types
330
+ if args[0].respond_to?(:=~) && args[0].to_s =~ /^\D/
331
+ _row1, firstcol, _row2, lastcol, *data = substitute_cellref(*args)
304
332
  else
305
333
  firstcol, lastcol, *data = args
306
334
  end
@@ -315,6 +343,7 @@ module Writexlsx
315
343
  firstcol, lastcol = lastcol, firstcol if firstcol > lastcol
316
344
 
317
345
  width, format, hidden, level, collapsed = data
346
+ autofit = 0
318
347
 
319
348
  # Check that cols are valid and store max and min values with default row.
320
349
  # NOTE: The check shouldn't modify the row dimensions and should only modify
@@ -332,22 +361,19 @@ module Writexlsx
332
361
  level = 0 if level < 0
333
362
  level = 7 if level > 7
334
363
 
364
+ # Excel has a maximum column width of 255 characters.
365
+ width = 255.0 if width && width > 255.0
366
+
335
367
  @outline_col_level = level if level > @outline_col_level
336
368
 
337
369
  # Store the column data based on the first column. Padded for sorting.
338
- @colinfo[sprintf("%05d", firstcol)] = [firstcol, lastcol, width, format, hidden, level, collapsed]
370
+ (firstcol..lastcol).each do |col|
371
+ @col_info[col] =
372
+ COLINFO.new(width, format, hidden, level, collapsed, autofit)
373
+ end
339
374
 
340
375
  # Store the column change to allow optimisations.
341
376
  @col_size_changed = 1
342
-
343
- # Store the col sizes for use when calculating image vertices taking
344
- # hidden columns into account. Also store the column formats.
345
- width = @default_col_width unless width
346
-
347
- (firstcol .. lastcol).each do |col|
348
- @col_sizes[col] = [width, hidden]
349
- @col_formats[col] = format if format
350
- end
351
377
  end
352
378
 
353
379
  #
@@ -376,13 +402,117 @@ module Writexlsx
376
402
  hidden = data[4] || 0
377
403
  level = data[5]
378
404
 
379
- if ptrue?(pixels)
380
- width = pixels_to_width(pixels)
381
- end
405
+ width = pixels_to_width(pixels) if ptrue?(pixels)
382
406
 
383
407
  set_column(first_col, last_col, width, format, hidden, level)
384
408
  end
385
409
 
410
+ #
411
+ # autofit()
412
+ #
413
+ # Simulate autofit based on the data, and datatypes in each column. We do this
414
+ # by estimating a pixel width for each cell data.
415
+ #
416
+ def autofit
417
+ col_width = {}
418
+
419
+ # Iterate through all the data in the worksheet.
420
+ (@dim_rowmin..@dim_rowmax).each do |row_num|
421
+ # Skip row if it doesn't contain cell data.
422
+ next unless @cell_data_table[row_num]
423
+
424
+ (@dim_colmin..@dim_colmax).each do |col_num|
425
+ length = 0
426
+ case (cell_data = @cell_data_table[row_num][col_num])
427
+ when StringCellData, RichStringCellData
428
+ # Handle strings and rich strings.
429
+ #
430
+ # For standard shared strings we do a reverse lookup
431
+ # from the shared string id to the actual string. For
432
+ # rich strings we use the unformatted string. We also
433
+ # split multiline strings and handle each part
434
+ # separately.
435
+ string = cell_data.raw_string
436
+
437
+ if string =~ /\n/
438
+ # Handle multiline strings.
439
+ length = max = string.split("\n").collect do |str|
440
+ xl_string_pixel_width(str)
441
+ end.max
442
+ else
443
+ length = xl_string_pixel_width(string)
444
+ end
445
+ when DateTimeCellData
446
+
447
+ # Handle dates.
448
+ #
449
+ # The following uses the default width for mm/dd/yyyy
450
+ # dates. It isn't feasible to parse the number format
451
+ # to get the actual string width for all format types.
452
+ length = @default_date_pixels
453
+ when NumberCellData
454
+
455
+ # Handle numbers.
456
+ #
457
+ # We use a workaround/optimization for numbers since
458
+ # digits all have a pixel width of 7. This gives a
459
+ # slightly greater width for the decimal place and
460
+ # minus sign but only by a few pixels and
461
+ # over-estimation is okay.
462
+ length = 7 * cell_data.token.to_s.length
463
+ when BooleanCellData
464
+
465
+ # Handle boolean values.
466
+ #
467
+ # Use the Excel standard widths for TRUE and FALSE.
468
+ if ptrue?(cell_data.token)
469
+ length = 31
470
+ else
471
+ length = 36
472
+ end
473
+ when FormulaCellData, FormulaArrayCellData, DynamicFormulaArrayCellData
474
+ # Handle formulas.
475
+ #
476
+ # We only try to autofit a formula if it has a
477
+ # non-zero value.
478
+ if ptrue?(cell_data.data)
479
+ length = xl_string_pixel_width(cell_data.data)
480
+ end
481
+ end
482
+
483
+ # If the cell is in an autofilter header we add an
484
+ # additional 16 pixels for the dropdown arrow.
485
+ if length > 0 &&
486
+ @filter_cells["#{row_num}:#{col_num}"]
487
+ length += 16
488
+ end
489
+
490
+ # Add the string lenght to the lookup hash.
491
+ max = col_width[col_num] || 0
492
+ col_width[col_num] = length if length > max
493
+ end
494
+ end
495
+
496
+ # Apply the width to the column.
497
+ col_width.each do |col_num, pixel_width|
498
+ # Convert the string pixel width to a character width using an
499
+ # additional padding of 7 pixels, like Excel.
500
+ width = pixels_to_width(pixel_width + 7)
501
+
502
+ # The max column character width in Excel is 255.
503
+ width = 255.0 if width > 255.0
504
+
505
+ # Add the width to an existing col info structure or add a new one.
506
+ if @col_info[col_num]
507
+ @col_info[col_num].width = width
508
+ @col_info[col_num].autofit = 1
509
+ else
510
+ @col_info[col_num] =
511
+ COLINFO.new(width, nil, 0, 0, 0, 1)
512
+ end
513
+ end
514
+ end
515
+
386
516
  #
387
517
  # :call-seq:
388
518
  # set_selection(cell_or_cell_range)
@@ -392,7 +522,12 @@ module Writexlsx
392
522
  def set_selection(*args)
393
523
  return if args.empty?
394
524
 
395
- row_first, col_first, row_last, col_last = row_col_notation(args)
525
+ if (row_col_array = row_col_notation(args.first))
526
+ row_first, col_first, row_last, col_last = row_col_array
527
+ else
528
+ row_first, col_first, row_last, col_last = args
529
+ end
530
+
396
531
  active_cell = xl_rowcol_to_cell(row_first, col_first)
397
532
 
398
533
  if row_last # Range selection.
@@ -408,7 +543,24 @@ module Writexlsx
408
543
  # Selection isn't set for cell A1.
409
544
  return if sqref == 'A1'
410
545
 
411
- @selections = [ [ nil, active_cell, sqref ] ]
546
+ @selections = [[nil, active_cell, sqref]]
547
+ end
548
+
549
+ ###############################################################################
550
+ #
551
+ # set_top_left_cell()
552
+ #
553
+ # Set the first visible cell at the top left of the worksheet.
554
+ #
555
+ def set_top_left_cell(row, col = nil)
556
+ if (row_col_array = row_col_notation(row))
557
+ _row, _col = row_col_array
558
+ else
559
+ _row = row
560
+ _col = col
561
+ end
562
+
563
+ @top_left_cell = xl_rowcol_to_cell(_row, _col)
412
564
  end
413
565
 
414
566
  #
@@ -424,14 +576,19 @@ module Writexlsx
424
576
  return if args.empty?
425
577
 
426
578
  # Check for a cell reference in A1 notation and substitute row and column.
427
- row, col, top_row, left_col, type = row_col_notation(args)
579
+ if (row_col_array = row_col_notation(args.first))
580
+ row, col, top_row, left_col = row_col_array
581
+ type = args[1]
582
+ else
583
+ row, col, top_row, left_col, type = args
584
+ end
428
585
 
429
586
  col ||= 0
430
587
  top_row ||= row
431
588
  left_col ||= col
432
589
  type ||= 0
433
590
 
434
- @panes = [row, col, top_row, left_col, type ]
591
+ @panes = [row, col, top_row, left_col, type]
435
592
  end
436
593
 
437
594
  #
@@ -466,8 +623,17 @@ module Writexlsx
466
623
  #
467
624
  # This method is used to display the worksheet in "Page View/Layout" mode.
468
625
  #
469
- def set_page_view(flag = true)
470
- @page_view = !!flag
626
+ def set_page_view(flag = 1)
627
+ @page_view = flag
628
+ end
629
+
630
+ #
631
+ # set_pagebreak_view
632
+ #
633
+ # Set the page view mode.
634
+ #
635
+ def set_pagebreak_view
636
+ @page_view = 2
471
637
  end
472
638
 
473
639
  #
@@ -492,7 +658,7 @@ module Writexlsx
492
658
 
493
659
  def set_paper(paper_size)
494
660
  put_deprecate_message("#{self}.set_paper")
495
- self::paper = paper_size
661
+ self.paper = paper_size
496
662
  end
497
663
 
498
664
  #
@@ -500,36 +666,29 @@ module Writexlsx
500
666
  #
501
667
  def set_header(string = '', margin = 0.3, options = {})
502
668
  raise 'Header string must be less than 255 characters' if string.length > 255
669
+
503
670
  # Replace the Excel placeholder &[Picture] with the internal &G.
504
- @page_setup.header = string.gsub(/&\[Picture\]/, '&G')
671
+ @page_setup.header = string.gsub("&[Picture]", '&G')
505
672
 
506
- if options[:align_with_margins]
507
- @page_setup.header_footer_aligns = options[:align_with_margins]
508
- end
673
+ @page_setup.header_footer_aligns = options[:align_with_margins] if options[:align_with_margins]
509
674
 
510
- if options[:scale_with_doc]
511
- @page_setup.header_footer_scales = options[:scale_with_doc]
512
- end
675
+ @page_setup.header_footer_scales = options[:scale_with_doc] if options[:scale_with_doc]
513
676
 
514
677
  # Reset the array in case the function is called more than once.
515
678
  @header_images = []
516
679
 
517
680
  [
518
- [:image_left, 'LH'], [:image_center, 'CH'], [:image_right, 'RH']
681
+ [:image_left, 'LH'], [:image_center, 'CH'], [:image_right, 'RH']
519
682
  ].each do |p|
520
- if options[p.first]
521
- @header_images << [options[p.first], p.last]
522
- end
683
+ @header_images << [options[p.first], p.last] if options[p.first]
523
684
  end
524
685
 
525
686
  # placeholeder /&G/ の数
526
- placeholder_count = @page_setup.header.scan(/&G/).count
687
+ placeholder_count = @page_setup.header.scan("&G").count
527
688
 
528
689
  image_count = @header_images.count
529
690
 
530
- if image_count != placeholder_count
531
- raise "Number of header image (#{image_count}) doesn't match placeholder count (#{placeholder_count}) in string: #{@page_setup.header}"
532
- end
691
+ raise "Number of header image (#{image_count}) doesn't match placeholder count (#{placeholder_count}) in string: #{@page_setup.header}" if image_count != placeholder_count
533
692
 
534
693
  @has_header_vml = true if image_count > 0
535
694
 
@@ -543,38 +702,30 @@ module Writexlsx
543
702
  def set_footer(string = '', margin = 0.3, options = {})
544
703
  raise 'Footer string must be less than 255 characters' if string.length > 255
545
704
 
546
- @page_setup.footer = string.dup
705
+ @page_setup.footer = string.dup
547
706
 
548
707
  # Replace the Excel placeholder &[Picture] with the internal &G.
549
- @page_setup.footer = string.gsub(/&\[Picture\]/, '&G')
708
+ @page_setup.footer = string.gsub("&[Picture]", '&G')
550
709
 
551
- if options[:align_with_margins]
552
- @page_setup.header_footer_aligns = options[:align_with_margins]
553
- end
710
+ @page_setup.header_footer_aligns = options[:align_with_margins] if options[:align_with_margins]
554
711
 
555
- if options[:scale_with_doc]
556
- @page_setup.header_footer_scales = options[:scale_with_doc]
557
- end
712
+ @page_setup.header_footer_scales = options[:scale_with_doc] if options[:scale_with_doc]
558
713
 
559
714
  # Reset the array in case the function is called more than once.
560
715
  @footer_images = []
561
716
 
562
717
  [
563
- [:image_left, 'LF'], [:image_center, 'CF'], [:image_right, 'RF']
718
+ [:image_left, 'LF'], [:image_center, 'CF'], [:image_right, 'RF']
564
719
  ].each do |p|
565
- if options[p.first]
566
- @footer_images << [options[p.first], p.last]
567
- end
720
+ @footer_images << [options[p.first], p.last] if options[p.first]
568
721
  end
569
722
 
570
723
  # placeholeder /&G/ の数
571
- placeholder_count = @page_setup.footer.scan(/&G/).count
724
+ placeholder_count = @page_setup.footer.scan("&G").count
572
725
 
573
726
  image_count = @footer_images.count
574
727
 
575
- if image_count != placeholder_count
576
- raise "Number of footer image (#{image_count}) doesn't match placeholder count (#{placeholder_count}) in string: #{@page_setup.footer}"
577
- end
728
+ raise "Number of footer image (#{image_count}) doesn't match placeholder count (#{placeholder_count}) in string: #{@page_setup.footer}" if image_count != placeholder_count
578
729
 
579
730
  @has_header_vml = true if image_count > 0
580
731
 
@@ -600,10 +751,10 @@ module Writexlsx
600
751
  # Set all the page margins to the same value in inches.
601
752
  #
602
753
  def margins=(margin)
603
- self::margin_left = margin
604
- self::margin_right = margin
605
- self::margin_top = margin
606
- self::margin_bottom = margin
754
+ self.margin_left = margin
755
+ self.margin_right = margin
756
+ self.margin_top = margin
757
+ self.margin_bottom = margin
607
758
  end
608
759
 
609
760
  #
@@ -611,8 +762,8 @@ module Writexlsx
611
762
  # See set_margins
612
763
  #
613
764
  def margins_left_right=(margin)
614
- self::margin_left = margin
615
- self::margin_right = margin
765
+ self.margin_left = margin
766
+ self.margin_right = margin
616
767
  end
617
768
 
618
769
  #
@@ -620,8 +771,8 @@ module Writexlsx
620
771
  # See set_margins
621
772
  #
622
773
  def margins_top_bottom=(margin)
623
- self::margin_top = margin
624
- self::margin_bottom = margin
774
+ self.margin_top = margin
775
+ self.margin_bottom = margin
625
776
  end
626
777
 
627
778
  #
@@ -661,7 +812,7 @@ module Writexlsx
661
812
  #
662
813
  def set_margins(margin)
663
814
  put_deprecate_message("#{self}.set_margins")
664
- self::margins = margin
815
+ self.margins = margin
665
816
  end
666
817
 
667
818
  #
@@ -670,7 +821,7 @@ module Writexlsx
670
821
  #
671
822
  def set_margins_LR(margin)
672
823
  put_deprecate_message("#{self}.set_margins_LR")
673
- self::margins_left_right = margin
824
+ self.margins_left_right = margin
674
825
  end
675
826
 
676
827
  #
@@ -679,7 +830,7 @@ module Writexlsx
679
830
  #
680
831
  def set_margins_TB(margin)
681
832
  put_deprecate_message("#{self}.set_margins_TB")
682
- self::margins_top_bottom = margin
833
+ self.margins_top_bottom = margin
683
834
  end
684
835
 
685
836
  #
@@ -688,7 +839,7 @@ module Writexlsx
688
839
  #
689
840
  def set_margin_left(margin = 0.7)
690
841
  put_deprecate_message("#{self}.set_margin_left")
691
- self::margin_left = margin
842
+ self.margin_left = margin
692
843
  end
693
844
 
694
845
  #
@@ -697,7 +848,7 @@ module Writexlsx
697
848
  #
698
849
  def set_margin_right(margin = 0.7)
699
850
  put_deprecate_message("#{self}.set_margin_right")
700
- self::margin_right = margin
851
+ self.margin_right = margin
701
852
  end
702
853
 
703
854
  #
@@ -706,7 +857,7 @@ module Writexlsx
706
857
  #
707
858
  def set_margin_top(margin = 0.75)
708
859
  put_deprecate_message("#{self}.set_margin_top")
709
- self::margin_top = margin
860
+ self.margin_top = margin
710
861
  end
711
862
 
712
863
  #
@@ -715,7 +866,7 @@ module Writexlsx
715
866
  #
716
867
  def set_margin_bottom(margin = 0.75)
717
868
  put_deprecate_message("#{self}.set_margin_bottom")
718
- self::margin_bottom = margin
869
+ self.margin_bottom = margin
719
870
  end
720
871
 
721
872
  #
@@ -747,7 +898,7 @@ module Writexlsx
747
898
  #
748
899
  def repeat_columns(*args)
749
900
  if args[0] =~ /^\D/
750
- dummy, first_col, dummy, last_col = substitute_cellref(*args)
901
+ _dummy, first_col, _dummy, last_col = substitute_cellref(*args)
751
902
  else
752
903
  first_col, last_col = args
753
904
  end
@@ -771,13 +922,17 @@ module Writexlsx
771
922
  #
772
923
  def print_area(*args)
773
924
  return @page_setup.print_area.dup if args.empty?
774
- row1, col1, row2, col2 = row_col_notation(args)
925
+
926
+ if (row_col_array = row_col_notation(args.first))
927
+ row1, col1, row2, col2 = row_col_array
928
+ else
929
+ row1, col1, row2, col2 = args
930
+ end
931
+
775
932
  return if [row1, col1, row2, col2].include?(nil)
776
933
 
777
934
  # Ignore max print area since this is the same as no print area for Excel.
778
- if row1 == 0 && col1 == 0 && row2 == ROW_MAX - 1 && col2 == COL_MAX - 1
779
- return
780
- end
935
+ return if row1 == 0 && col1 == 0 && row2 == ROW_MAX - 1 && col2 == COL_MAX - 1
781
936
 
782
937
  # Build up the print area range "=Sheet2!R1C1:R2C1"
783
938
  @page_setup.print_area = convert_name_area(row1, col1, row2, col2)
@@ -788,12 +943,12 @@ module Writexlsx
788
943
  #
789
944
  def zoom=(scale)
790
945
  # Confine the scale to Excel's range
791
- if scale < 10 or scale > 400
792
- # carp "Zoom factor scale outside range: 10 <= zoom <= 400"
793
- @zoom = 100
794
- else
795
- @zoom = scale.to_i
796
- end
946
+ @zoom = if scale < 10 or scale > 400
947
+ # carp "Zoom factor scale outside range: 10 <= zoom <= 400"
948
+ 100
949
+ else
950
+ scale.to_i
951
+ end
797
952
  end
798
953
 
799
954
  # This method is deprecated. use zoom=().
@@ -823,23 +978,24 @@ module Writexlsx
823
978
  #
824
979
  def set_print_scale(scale = 100)
825
980
  put_deprecate_message("#{self}.set_print_scale")
826
- self::print_scale = (scale)
981
+ self.print_scale = (scale)
827
982
  end
828
983
 
829
- #
830
- # Set the option to print the worksheet in black and white.
831
- #
832
- def print_black_and_white
833
- @page_setup.black_white = true
984
+ #
985
+ # Set the option to print the worksheet in black and white.
986
+ #
987
+ def print_black_and_white
988
+ @page_setup.black_white = true
989
+ @page_setup.page_setup_changed = true
834
990
  end
835
991
 
836
- #
837
- # Causes the write() method to treat integers with a leading zero as a string.
838
- # This ensures that any leading zeros such, as in zip codes, are maintained.
839
- #
840
- def keep_leading_zeros(flag = true)
841
- @leading_zeros = !!flag
842
- end
992
+ #
993
+ # Causes the write() method to treat integers with a leading zero as a string.
994
+ # This ensures that any leading zeros such, as in zip codes, are maintained.
995
+ #
996
+ def keep_leading_zeros(flag = true)
997
+ @leading_zeros = !!flag
998
+ end
843
999
 
844
1000
  #
845
1001
  # Display the worksheet right to left for some eastern versions of Excel.
@@ -852,7 +1008,7 @@ module Writexlsx
852
1008
  # Hide cell zero values.
853
1009
  #
854
1010
  def hide_zero(flag = true)
855
- @show_zeros = !flag
1011
+ @show_zeros = !flag
856
1012
  end
857
1013
 
858
1014
  #
@@ -877,7 +1033,7 @@ module Writexlsx
877
1033
 
878
1034
  def set_start_page(page_start)
879
1035
  put_deprecate_message("#{self}.set_start_page")
880
- self::start_page = page_start
1036
+ self.start_page = page_start
881
1037
  end
882
1038
 
883
1039
  #
@@ -889,88 +1045,126 @@ module Writexlsx
889
1045
  # data the {#write()}[#method-i-write] method acts as a general alias for several more
890
1046
  # specific methods:
891
1047
  #
892
- def write(*args)
1048
+ def write(row, col, token = nil, format = nil, value1 = nil, value2 = nil)
893
1049
  # Check for a cell reference in A1 notation and substitute row and column
894
- row_col_args = row_col_notation(args)
895
- token = row_col_args[2] || ''
896
-
1050
+ if (row_col_array = row_col_notation(row))
1051
+ _row, _col = row_col_array
1052
+ _token = col
1053
+ _format = token
1054
+ _value1 = format
1055
+ _value2 = value1
1056
+ else
1057
+ _row = row
1058
+ _col = col
1059
+ _token = token
1060
+ _format = format
1061
+ _value1 = value1
1062
+ _value2 = value2
1063
+ end
1064
+ _token ||= ''
1065
+ _token = _token.to_s if token.instance_of?(Time) || token.instance_of?(Date)
1066
+
1067
+ if _format.respond_to?(:force_text_format?) && _format.force_text_format?
1068
+ write_string(_row, _col, _token, _format) # Force text format
897
1069
  # Match an array ref.
898
- if token.respond_to?(:to_ary)
899
- write_row(*args)
900
- elsif token.respond_to?(:coerce) # Numeric
901
- write_number(*args)
902
- # Match integer with leading zero(s)
903
- elsif @leading_zeros && token =~ /^0\d*$/
904
- write_string(*args)
905
- elsif token =~ /\A([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?\Z/
906
- write_number(*args)
907
- # Match formula
908
- elsif token =~ /^=/
909
- write_formula(*args)
910
- # Match array formula
911
- elsif token =~ /^\{=.*\}$/
912
- write_formula(*args)
913
- # Match blank
914
- elsif token == ''
915
- row_col_args.delete_at(2) # remove the empty string from the parameter list
916
- write_blank(*row_col_args)
917
- elsif @workbook.strings_to_urls
918
- # Match http, https or ftp URL
919
- if token =~ %r|\A[fh]tt?ps?://|
920
- write_url(*args)
921
- # Match mailto:
922
- elsif token =~ %r|\Amailto:|
923
- write_url(*args)
924
- # Match internal or external sheet link
925
- elsif token =~ %r!\A(?:in|ex)ternal:!
926
- write_url(*args)
1070
+ elsif _token.respond_to?(:to_ary)
1071
+ write_row(_row, _col, _token, _format, _value1, _value2)
1072
+ elsif _token.respond_to?(:coerce) # Numeric
1073
+ write_number(_row, _col, _token, _format)
1074
+ elsif _token.respond_to?(:=~) # String
1075
+ # Match integer with leading zero(s)
1076
+ if @leading_zeros && _token =~ /^0\d*$/
1077
+ write_string(_row, _col, _token, _format)
1078
+ elsif _token =~ /\A([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?\Z/
1079
+ write_number(_row, _col, _token, _format)
1080
+ # Match formula
1081
+ elsif _token =~ /^=/
1082
+ write_formula(_row, _col, _token, _format, _value1)
1083
+ # Match array formula
1084
+ elsif _token =~ /^\{=.*\}$/
1085
+ write_formula(_row, _col, _token, _format, _value1)
1086
+ # Match blank
1087
+ elsif _token == ''
1088
+ # row_col_args.delete_at(2) # remove the empty string from the parameter list
1089
+ write_blank(_row, _col, _format)
1090
+ elsif @workbook.strings_to_urls
1091
+ # Match http, https or ftp URL
1092
+ if _token =~ %r{\A[fh]tt?ps?://}
1093
+ write_url(_row, _col, _token, _format, _value1, _value2)
1094
+ # Match mailto:
1095
+ elsif _token =~ /\Amailto:/
1096
+ write_url(_row, _col, _token, _format, _value1, _value2)
1097
+ # Match internal or external sheet link
1098
+ elsif _token =~ /\A(?:in|ex)ternal:/
1099
+ write_url(_row, _col, _token, _format, _value1, _value2)
1100
+ else
1101
+ write_string(_row, _col, _token, _format)
1102
+ end
927
1103
  else
928
- write_string(*args)
1104
+ write_string(_row, _col, _token, _format)
929
1105
  end
930
1106
  else
931
- write_string(*args)
1107
+ write_string(_row, _col, _token, _format)
932
1108
  end
933
1109
  end
934
1110
 
935
1111
  #
936
1112
  # :call-seq:
937
- # write_row(row, col, array [ , format ] )
1113
+ # write_row(row, col, array [ , format ])
938
1114
  #
939
1115
  # Write a row of data starting from (row, col). Call write_col() if any of
940
1116
  # the elements of the array are in turn array. This allows the writing
941
1117
  # of 1D or 2D arrays of data in one go.
942
1118
  #
943
- def write_row(*args)
1119
+ def write_row(row, col, tokens = nil, *options)
944
1120
  # Check for a cell reference in A1 notation and substitute row and column
945
- row, col, tokens, *options = row_col_notation(args)
946
- raise "Not an array ref in call to write_row()$!" unless tokens.respond_to?(:to_ary)
1121
+ if (row_col_array = row_col_notation(row))
1122
+ _row, _col = row_col_array
1123
+ _tokens = col
1124
+ _options = [tokens] + options
1125
+ else
1126
+ _row = row
1127
+ _col = col
1128
+ _tokens = tokens
1129
+ _options = options
1130
+ end
1131
+ raise "Not an array ref in call to write_row()$!" unless _tokens.respond_to?(:to_ary)
947
1132
 
948
- tokens.each do |token|
1133
+ _tokens.each do |_token|
949
1134
  # Check for nested arrays
950
- if token.respond_to?(:to_ary)
951
- write_col(row, col, token, *options)
1135
+ if _token.respond_to?(:to_ary)
1136
+ write_col(_row, _col, _token, *_options)
952
1137
  else
953
- write(row, col, token, *options)
1138
+ write(_row, _col, _token, *_options)
954
1139
  end
955
- col += 1
1140
+ _col += 1
956
1141
  end
957
1142
  end
958
1143
 
959
1144
  #
960
1145
  # :call-seq:
961
- # write_col(row, col, array [ , format ] )
1146
+ # write_col(row, col, array [ , format ])
962
1147
  #
963
1148
  # Write a column of data starting from (row, col). Call write_row() if any of
964
1149
  # the elements of the array are in turn array. This allows the writing
965
1150
  # of 1D or 2D arrays of data in one go.
966
1151
  #
967
- def write_col(*args)
968
- row, col, tokens, *options = row_col_notation(args)
1152
+ def write_col(row, col, tokens = nil, *options)
1153
+ if (row_col_array = row_col_notation(row))
1154
+ _row, _col = row_col_array
1155
+ _tokens = col
1156
+ _options = [tokens] + options if options
1157
+ else
1158
+ _row = row
1159
+ _col = col
1160
+ _tokens = tokens
1161
+ _options = options
1162
+ end
969
1163
 
970
- tokens.each do |token|
1164
+ _tokens.each do |_token|
971
1165
  # write() will deal with any nested arrays
972
- write(row, col, token, *options)
973
- row += 1
1166
+ write(_row, _col, _token, *_options)
1167
+ _row += 1
974
1168
  end
975
1169
  end
976
1170
 
@@ -980,87 +1174,124 @@ module Writexlsx
980
1174
  #
981
1175
  # Write a comment to the specified row and column (zero indexed).
982
1176
  #
983
- def write_comment(*args)
1177
+ def write_comment(row, col, string = nil, options = nil)
984
1178
  # Check for a cell reference in A1 notation and substitute row and column
985
- row, col, string, options = row_col_notation(args)
986
- raise WriteXLSXInsufficientArgumentError if [row, col, string].include?(nil)
1179
+ if (row_col_array = row_col_notation(row))
1180
+ _row, _col = row_col_array
1181
+ _string = col
1182
+ _options = string
1183
+ else
1184
+ _row = row
1185
+ _col = col
1186
+ _string = string
1187
+ _options = options
1188
+ end
1189
+ raise WriteXLSXInsufficientArgumentError if [_row, _col, _string].include?(nil)
987
1190
 
988
1191
  # Check that row and col are valid and store max and min values
989
- check_dimensions(row, col)
990
- store_row_col_max_min_values(row, col)
1192
+ check_dimensions(_row, _col)
1193
+ store_row_col_max_min_values(_row, _col)
991
1194
 
992
1195
  @has_vml = true
993
1196
 
994
1197
  # Process the properties of the cell comment.
995
- @comments.add(@workbook, self, row, col, string, options)
1198
+ @comments.add(@workbook, self, _row, _col, _string, _options)
996
1199
  end
997
1200
 
998
1201
  #
999
1202
  # :call-seq:
1000
- # write_number(row, column, number [ , format ] )
1203
+ # write_number(row, column, number [ , format ])
1001
1204
  #
1002
1205
  # Write an integer or a float to the cell specified by row and column:
1003
1206
  #
1004
- def write_number(*args)
1207
+ def write_number(row, col, number, format = nil)
1005
1208
  # Check for a cell reference in A1 notation and substitute row and column
1006
- row, col, num, xf = row_col_notation(args)
1007
- raise WriteXLSXInsufficientArgumentError if row.nil? || col.nil? || num.nil?
1209
+ if (row_col_array = row_col_notation(row))
1210
+ _row, _col = row_col_array
1211
+ _number = col
1212
+ _format = number
1213
+ else
1214
+ _row = row
1215
+ _col = col
1216
+ _number = number
1217
+ _format = format
1218
+ end
1219
+ raise WriteXLSXInsufficientArgumentError if _row.nil? || _col.nil? || _number.nil?
1008
1220
 
1009
1221
  # Check that row and col are valid and store max and min values
1010
- check_dimensions(row, col)
1011
- store_row_col_max_min_values(row, col)
1222
+ check_dimensions(_row, _col)
1223
+ store_row_col_max_min_values(_row, _col)
1012
1224
 
1013
- store_data_to_table(NumberCellData.new(self, row, col, num, xf))
1225
+ store_data_to_table(NumberCellData.new(_number, _format), _row, _col)
1014
1226
  end
1015
1227
 
1016
1228
  #
1017
1229
  # :call-seq:
1018
- # write_string(row, column, string [, format ] )
1230
+ # write_string(row, column, string [, format ])
1019
1231
  #
1020
1232
  # Write a string to the specified row and column (zero indexed).
1021
1233
  # +format+ is optional.
1022
1234
  #
1023
- def write_string(*args)
1235
+ def write_string(row, col, string = nil, format = nil)
1024
1236
  # Check for a cell reference in A1 notation and substitute row and column
1025
- row, col, str, xf = row_col_notation(args)
1026
- str &&= str.to_s
1027
- raise WriteXLSXInsufficientArgumentError if row.nil? || col.nil? || str.nil?
1237
+ if (row_col_array = row_col_notation(row))
1238
+ _row, _col = row_col_array
1239
+ _string = col
1240
+ _format = string
1241
+ else
1242
+ _row = row
1243
+ _col = col
1244
+ _string = string
1245
+ _format = format
1246
+ end
1247
+ _string &&= _string.to_s
1248
+ raise WriteXLSXInsufficientArgumentError if _row.nil? || _col.nil? || _string.nil?
1028
1249
 
1029
1250
  # Check that row and col are valid and store max and min values
1030
- check_dimensions(row, col)
1031
- store_row_col_max_min_values(row, col)
1251
+ check_dimensions(_row, _col)
1252
+ store_row_col_max_min_values(_row, _col)
1032
1253
 
1033
- index = shared_string_index(str.length > STR_MAX ? str[0, STR_MAX] : str)
1254
+ index = shared_string_index(_string.length > STR_MAX ? _string[0, STR_MAX] : _string)
1034
1255
 
1035
- store_data_to_table(StringCellData.new(self, row, col, index, xf))
1256
+ store_data_to_table(StringCellData.new(index, _format, _string), _row, _col)
1036
1257
  end
1037
1258
 
1038
1259
  #
1039
1260
  # :call-seq:
1040
- # write_rich_string(row, column, (string | format, string)+, [,cell_format] )
1261
+ # write_rich_string(row, column, (string | format, string)+, [,cell_format])
1041
1262
  #
1042
1263
  # The write_rich_string() method is used to write strings with multiple formats.
1043
1264
  # The method receives string fragments prefixed by format objects. The final
1044
1265
  # format object is used as the cell format.
1045
1266
  #
1046
- def write_rich_string(*args)
1267
+ def write_rich_string(row, col, *rich_strings)
1047
1268
  # Check for a cell reference in A1 notation and substitute row and column
1048
- row, col, *rich_strings = row_col_notation(args)
1049
- raise WriteXLSXInsufficientArgumentError if [row, col, rich_strings[0]].include?(nil)
1269
+ if (row_col_array = row_col_notation(row))
1270
+ _row, _col = row_col_array
1271
+ _rich_strings = [col] + rich_strings
1272
+ else
1273
+ _row = row
1274
+ _col = col
1275
+ _rich_strings = rich_strings
1276
+ end
1277
+ raise WriteXLSXInsufficientArgumentError if [_row, _col, _rich_strings[0]].include?(nil)
1050
1278
 
1051
- xf = cell_format_of_rich_string(rich_strings)
1279
+ _xf = cell_format_of_rich_string(_rich_strings)
1052
1280
 
1053
1281
  # Check that row and col are valid and store max and min values
1054
- check_dimensions(row, col)
1055
- store_row_col_max_min_values(row, col)
1282
+ check_dimensions(_row, _col)
1283
+ store_row_col_max_min_values(_row, _col)
1056
1284
 
1057
- fragments, length = rich_strings_fragments(rich_strings)
1285
+ _fragments, _raw_string = rich_strings_fragments(_rich_strings)
1058
1286
  # can't allow 2 formats in a row
1059
- return -4 unless fragments
1287
+ return -4 unless _fragments
1060
1288
 
1061
- index = shared_string_index(xml_str_of_rich_string(fragments))
1289
+ # Check that the string si < 32767 chars.
1290
+ return 3 if _raw_string.size > @xls_strmax
1062
1291
 
1063
- store_data_to_table(StringCellData.new(self, row, col, index, xf))
1292
+ index = shared_string_index(xml_str_of_rich_string(_fragments))
1293
+
1294
+ store_data_to_table(RichStringCellData.new(index, _xf, _raw_string), _row, _col)
1064
1295
  end
1065
1296
 
1066
1297
  #
@@ -1071,40 +1302,256 @@ module Writexlsx
1071
1302
  # A blank cell is used to specify formatting without adding a string
1072
1303
  # or a number.
1073
1304
  #
1074
- def write_blank(*args)
1305
+ def write_blank(row, col, format = nil)
1075
1306
  # Check for a cell reference in A1 notation and substitute row and column
1076
- row, col, xf = row_col_notation(args)
1077
- raise WriteXLSXInsufficientArgumentError if [row, col].include?(nil)
1307
+ if (row_col_array = row_col_notation(row))
1308
+ _row, _col = row_col_array
1309
+ _format = col
1310
+ else
1311
+ _row = row
1312
+ _col = col
1313
+ _format = format
1314
+ end
1315
+ raise WriteXLSXInsufficientArgumentError if [_row, _col].include?(nil)
1078
1316
 
1079
1317
  # Don't write a blank cell unless it has a format
1080
- return unless xf
1318
+ return unless _format
1081
1319
 
1082
1320
  # Check that row and col are valid and store max and min values
1083
- check_dimensions(row, col)
1084
- store_row_col_max_min_values(row, col)
1321
+ check_dimensions(_row, _col)
1322
+ store_row_col_max_min_values(_row, _col)
1323
+
1324
+ store_data_to_table(BlankCellData.new(_format), _row, _col)
1325
+ end
1085
1326
 
1086
- store_data_to_table(BlankCellData.new(self, row, col, xf))
1327
+ def expand_formula(formula, function, addition = '')
1328
+ if formula =~ /\b(#{function})/
1329
+ formula.gsub(
1330
+ ::Regexp.last_match(1),
1331
+ "_xlfn#{addition}.#{::Regexp.last_match(1)}"
1332
+ )
1333
+ else
1334
+ formula
1335
+ end
1336
+ end
1337
+ private :expand_formula
1338
+
1339
+ #
1340
+ # Utility method to strip equal sign and array braces from a formula
1341
+ # and also expand out future and dynamic array formulas.
1342
+ #
1343
+ def prepare_formula(given_formula, expand_future_functions = nil)
1344
+ # Ignore empty/null formulas.
1345
+ return given_formula unless ptrue?(given_formula)
1346
+
1347
+ # Remove array formula braces and the leading =.
1348
+ formula = given_formula.sub(/^\{(.*)\}$/, '\1').sub(/^=/, '')
1349
+
1350
+ # # Don't expand formulas that the user has already expanded.
1351
+ return formula if formula =~ /_xlfn\./
1352
+
1353
+ # Expand dynamic array formulas.
1354
+ formula = expand_formula(formula, 'ANCHORARRAY\(')
1355
+ formula = expand_formula(formula, 'BYCOL\(')
1356
+ formula = expand_formula(formula, 'BYROW\(')
1357
+ formula = expand_formula(formula, 'CHOOSECOLS\(')
1358
+ formula = expand_formula(formula, 'CHOOSEROWS\(')
1359
+ formula = expand_formula(formula, 'DROP\(')
1360
+ formula = expand_formula(formula, 'EXPAND\(')
1361
+ formula = expand_formula(formula, 'FILTER\(', '._xlws')
1362
+ formula = expand_formula(formula, 'HSTACK\(')
1363
+ formula = expand_formula(formula, 'LAMBDA\(')
1364
+ formula = expand_formula(formula, 'MAKEARRAY\(')
1365
+ formula = expand_formula(formula, 'MAP\(')
1366
+ formula = expand_formula(formula, 'RANDARRAY\(')
1367
+ formula = expand_formula(formula, 'REDUCE\(')
1368
+ formula = expand_formula(formula, 'SCAN\(')
1369
+ formula = expand_formula(formula, 'SEQUENCE\(')
1370
+ formula = expand_formula(formula, 'SINGLE\(')
1371
+ formula = expand_formula(formula, 'SORT\(', '._xlws')
1372
+ formula = expand_formula(formula, 'SORTBY\(')
1373
+ formula = expand_formula(formula, 'SWITCH\(')
1374
+ formula = expand_formula(formula, 'TAKE\(')
1375
+ formula = expand_formula(formula, 'TEXTSPLIT\(')
1376
+ formula = expand_formula(formula, 'TOCOL\(')
1377
+ formula = expand_formula(formula, 'TOROW\(')
1378
+ formula = expand_formula(formula, 'UNIQUE\(')
1379
+ formula = expand_formula(formula, 'VSTACK\(')
1380
+ formula = expand_formula(formula, 'WRAPCOLS\(')
1381
+ formula = expand_formula(formula, 'WRAPROWS\(')
1382
+ formula = expand_formula(formula, 'XLOOKUP\(')
1383
+
1384
+ if !@use_future_functions && !ptrue?(expand_future_functions)
1385
+ return formula
1386
+ end
1387
+
1388
+ # Future functions.
1389
+ formula = expand_formula(formula, 'ACOTH\(')
1390
+ formula = expand_formula(formula, 'ACOT\(')
1391
+ formula = expand_formula(formula, 'AGGREGATE\(')
1392
+ formula = expand_formula(formula, 'ARABIC\(')
1393
+ formula = expand_formula(formula, 'ARRAYTOTEXT\(')
1394
+ formula = expand_formula(formula, 'BASE\(')
1395
+ formula = expand_formula(formula, 'BETA.DIST\(')
1396
+ formula = expand_formula(formula, 'BETA.INV\(')
1397
+ formula = expand_formula(formula, 'BINOM.DIST.RANGE\(')
1398
+ formula = expand_formula(formula, 'BINOM.DIST\(')
1399
+ formula = expand_formula(formula, 'BINOM.INV\(')
1400
+ formula = expand_formula(formula, 'BITAND\(')
1401
+ formula = expand_formula(formula, 'BITLSHIFT\(')
1402
+ formula = expand_formula(formula, 'BITOR\(')
1403
+ formula = expand_formula(formula, 'BITRSHIFT\(')
1404
+ formula = expand_formula(formula, 'BITXOR\(')
1405
+ formula = expand_formula(formula, 'CEILING.MATH\(')
1406
+ formula = expand_formula(formula, 'CEILING.PRECISE\(')
1407
+ formula = expand_formula(formula, 'CHISQ.DIST.RT\(')
1408
+ formula = expand_formula(formula, 'CHISQ.DIST\(')
1409
+ formula = expand_formula(formula, 'CHISQ.INV.RT\(')
1410
+ formula = expand_formula(formula, 'CHISQ.INV\(')
1411
+ formula = expand_formula(formula, 'CHISQ.TEST\(')
1412
+ formula = expand_formula(formula, 'COMBINA\(')
1413
+ formula = expand_formula(formula, 'CONCAT\(')
1414
+ formula = expand_formula(formula, 'CONFIDENCE.NORM\(')
1415
+ formula = expand_formula(formula, 'CONFIDENCE.T\(')
1416
+ formula = expand_formula(formula, 'COTH\(')
1417
+ formula = expand_formula(formula, 'COT\(')
1418
+ formula = expand_formula(formula, 'COVARIANCE.P\(')
1419
+ formula = expand_formula(formula, 'COVARIANCE.S\(')
1420
+ formula = expand_formula(formula, 'CSCH\(')
1421
+ formula = expand_formula(formula, 'CSC\(')
1422
+ formula = expand_formula(formula, 'DAYS\(')
1423
+ formula = expand_formula(formula, 'DECIMAL\(')
1424
+ formula = expand_formula(formula, 'ERF.PRECISE\(')
1425
+ formula = expand_formula(formula, 'ERFC.PRECISE\(')
1426
+ formula = expand_formula(formula, 'EXPON.DIST\(')
1427
+ formula = expand_formula(formula, 'F.DIST.RT\(')
1428
+ formula = expand_formula(formula, 'F.DIST\(')
1429
+ formula = expand_formula(formula, 'F.INV.RT\(')
1430
+ formula = expand_formula(formula, 'F.INV\(')
1431
+ formula = expand_formula(formula, 'F.TEST\(')
1432
+ formula = expand_formula(formula, 'FILTERXML\(')
1433
+ formula = expand_formula(formula, 'FLOOR.MATH\(')
1434
+ formula = expand_formula(formula, 'FLOOR.PRECISE\(')
1435
+ formula = expand_formula(formula, 'FORECAST.ETS.CONFINT\(')
1436
+ formula = expand_formula(formula, 'FORECAST.ETS.SEASONALITY\(')
1437
+ formula = expand_formula(formula, 'FORECAST.ETS.STAT\(')
1438
+ formula = expand_formula(formula, 'FORECAST.ETS\(')
1439
+ formula = expand_formula(formula, 'FORECAST.LINEAR\(')
1440
+ formula = expand_formula(formula, 'FORMULATEXT\(')
1441
+ formula = expand_formula(formula, 'GAMMA.DIST\(')
1442
+ formula = expand_formula(formula, 'GAMMA.INV\(')
1443
+ formula = expand_formula(formula, 'GAMMALN.PRECISE\(')
1444
+ formula = expand_formula(formula, 'GAMMA\(')
1445
+ formula = expand_formula(formula, 'GAUSS\(')
1446
+ formula = expand_formula(formula, 'HYPGEOM.DIST\(')
1447
+ formula = expand_formula(formula, 'IFNA\(')
1448
+ formula = expand_formula(formula, 'IFS\(')
1449
+ formula = expand_formula(formula, 'IMCOSH\(')
1450
+ formula = expand_formula(formula, 'IMCOT\(')
1451
+ formula = expand_formula(formula, 'IMCSCH\(')
1452
+ formula = expand_formula(formula, 'IMCSC\(')
1453
+ formula = expand_formula(formula, 'IMSECH\(')
1454
+ formula = expand_formula(formula, 'IMSEC\(')
1455
+ formula = expand_formula(formula, 'IMSINH\(')
1456
+ formula = expand_formula(formula, 'IMTAN\(')
1457
+ formula = expand_formula(formula, 'ISFORMULA\(')
1458
+ formula = expand_formula(formula, 'ISOMITTED\(')
1459
+ formula = expand_formula(formula, 'ISOWEEKNUM\(')
1460
+ formula = expand_formula(formula, 'LET\(')
1461
+ formula = expand_formula(formula, 'LOGNORM.DIST\(')
1462
+ formula = expand_formula(formula, 'LOGNORM.INV\(')
1463
+ formula = expand_formula(formula, 'MAXIFS\(')
1464
+ formula = expand_formula(formula, 'MINIFS\(')
1465
+ formula = expand_formula(formula, 'MODE.MULT\(')
1466
+ formula = expand_formula(formula, 'MODE.SNGL\(')
1467
+ formula = expand_formula(formula, 'MUNIT\(')
1468
+ formula = expand_formula(formula, 'NEGBINOM.DIST\(')
1469
+ formula = expand_formula(formula, 'NORM.DIST\(')
1470
+ formula = expand_formula(formula, 'NORM.INV\(')
1471
+ formula = expand_formula(formula, 'NORM.S.DIST\(')
1472
+ formula = expand_formula(formula, 'NORM.S.INV\(')
1473
+ formula = expand_formula(formula, 'NUMBERVALUE\(')
1474
+ formula = expand_formula(formula, 'PDURATION\(')
1475
+ formula = expand_formula(formula, 'PERCENTILE.EXC\(')
1476
+ formula = expand_formula(formula, 'PERCENTILE.INC\(')
1477
+ formula = expand_formula(formula, 'PERCENTRANK.EXC\(')
1478
+ formula = expand_formula(formula, 'PERCENTRANK.INC\(')
1479
+ formula = expand_formula(formula, 'PERMUTATIONA\(')
1480
+ formula = expand_formula(formula, 'PHI\(')
1481
+ formula = expand_formula(formula, 'POISSON.DIST\(')
1482
+ formula = expand_formula(formula, 'QUARTILE.EXC\(')
1483
+ formula = expand_formula(formula, 'QUARTILE.INC\(')
1484
+ formula = expand_formula(formula, 'QUERYSTRING\(')
1485
+ formula = expand_formula(formula, 'RANK.AVG\(')
1486
+ formula = expand_formula(formula, 'RANK.EQ\(')
1487
+ formula = expand_formula(formula, 'RRI\(')
1488
+ formula = expand_formula(formula, 'SECH\(')
1489
+ formula = expand_formula(formula, 'SEC\(')
1490
+ formula = expand_formula(formula, 'SHEETS\(')
1491
+ formula = expand_formula(formula, 'SHEET\(')
1492
+ formula = expand_formula(formula, 'SKEW.P\(')
1493
+ formula = expand_formula(formula, 'STDEV.P\(')
1494
+ formula = expand_formula(formula, 'STDEV.S\(')
1495
+ formula = expand_formula(formula, 'T.DIST.2T\(')
1496
+ formula = expand_formula(formula, 'T.DIST.RT\(')
1497
+ formula = expand_formula(formula, 'T.DIST\(')
1498
+ formula = expand_formula(formula, 'T.INV.2T\(')
1499
+ formula = expand_formula(formula, 'T.INV\(')
1500
+ formula = expand_formula(formula, 'T.TEST\(')
1501
+ formula = expand_formula(formula, 'TEXTAFTER\(')
1502
+ formula = expand_formula(formula, 'TEXTBEFORE\(')
1503
+ formula = expand_formula(formula, 'TEXTJOIN\(')
1504
+ formula = expand_formula(formula, 'UNICHAR\(')
1505
+ formula = expand_formula(formula, 'UNICODE\(')
1506
+ formula = expand_formula(formula, 'VALUETOTEXT\(')
1507
+ formula = expand_formula(formula, 'VAR.P\(')
1508
+ formula = expand_formula(formula, 'VAR.S\(')
1509
+ formula = expand_formula(formula, 'WEBSERVICE\(')
1510
+ formula = expand_formula(formula, 'WEIBULL.DIST\(')
1511
+ formula = expand_formula(formula, 'XMATCH\(')
1512
+ formula = expand_formula(formula, 'XOR\(')
1513
+ expand_formula(formula, 'Z.TEST\(')
1087
1514
  end
1088
1515
 
1089
1516
  #
1090
1517
  # :call-seq:
1091
- # write_formula(row, column, formula [ , format [ , value ] ] )
1518
+ # write_formula(row, column, formula [ , format [ , value ] ])
1092
1519
  #
1093
1520
  # Write a formula or function to the cell specified by +row+ and +column+:
1094
1521
  #
1095
- def write_formula(*args)
1522
+ def write_formula(row, col, formula = nil, format = nil, value = nil)
1096
1523
  # Check for a cell reference in A1 notation and substitute row and column
1097
- row, col, formula, format, value = row_col_notation(args)
1098
- raise WriteXLSXInsufficientArgumentError if [row, col, formula].include?(nil)
1524
+ if (row_col_array = row_col_notation(row))
1525
+ _row, _col = row_col_array
1526
+ _formula = col
1527
+ _format = formula
1528
+ _value = format
1529
+ else
1530
+ _row = row
1531
+ _col = col
1532
+ _formula = formula
1533
+ _format = format
1534
+ _value = value
1535
+ end
1536
+ raise WriteXLSXInsufficientArgumentError if [_row, _col, _formula].include?(nil)
1099
1537
 
1100
- if formula =~ /^\{=.*\}$/
1101
- write_array_formula(row, col, row, col, formula, format, value)
1538
+ # Check for dynamic array functions.
1539
+ regex = /\bLET\(|\bSORT\(|\bLAMBDA\(|\bSINGLE\(|\bSORTBY\(|\bUNIQUE\(|\bXMATCH\(|\bFILTER\(|\bXLOOKUP\(|\bSEQUENCE\(|\bRANDARRAY\(|\bANCHORARRAY\(/
1540
+ if _formula =~ regex
1541
+ return write_dynamic_array_formula(
1542
+ _row, _col, _row, _col, _formula, _format, _value
1543
+ )
1544
+ end
1545
+
1546
+ # Hand off array formulas.
1547
+ if _formula =~ /^\{=.*\}$/
1548
+ write_array_formula(_row, _col, _row, _col, _formula, _format, _value)
1102
1549
  else
1103
- check_dimensions(row, col)
1104
- store_row_col_max_min_values(row, col)
1105
- formula = formula.sub(/^=/, '')
1550
+ check_dimensions(_row, _col)
1551
+ store_row_col_max_min_values(_row, _col)
1552
+ _formula = _formula.sub(/^=/, '')
1106
1553
 
1107
- store_data_to_table(FormulaCellData.new(self, row, col, formula, format, value))
1554
+ store_data_to_table(FormulaCellData.new(_formula, _format, _value), _row, _col)
1108
1555
  end
1109
1556
  end
1110
1557
 
@@ -1114,7 +1561,20 @@ module Writexlsx
1114
1561
  #
1115
1562
  def write_array_formula_base(type, *args)
1116
1563
  # Check for a cell reference in A1 notation and substitute row and column
1117
- row1, col1, row2, col2, formula, xf, value = row_col_notation(args)
1564
+ # Convert single cell to range
1565
+ if args.first.to_s =~ /^([A-Za-z]+[0-9]+)$/
1566
+ range = "#{::Regexp.last_match(1)}:#{::Regexp.last_match(1)}"
1567
+ params = [range] + args[1..-1]
1568
+ else
1569
+ params = args
1570
+ end
1571
+
1572
+ if (row_col_array = row_col_notation(params.first))
1573
+ row1, col1, row2, col2 = row_col_array
1574
+ formula, xf, value = params[1..-1]
1575
+ else
1576
+ row1, col1, row2, col2, formula, xf, value = params
1577
+ end
1118
1578
  raise WriteXLSXInsufficientArgumentError if [row1, col1, row2, col2, formula].include?(nil)
1119
1579
 
1120
1580
  # Swap last row/col with first row/col as necessary
@@ -1128,29 +1588,31 @@ module Writexlsx
1128
1588
  store_row_col_max_min_values(row2, col2)
1129
1589
 
1130
1590
  # Define array range
1131
- if row1 == row2 && col1 == col2
1132
- range = xl_rowcol_to_cell(row1, col1)
1133
- else
1134
- range ="#{xl_rowcol_to_cell(row1, col1)}:#{xl_rowcol_to_cell(row2, col2)}"
1135
- end
1591
+ range = if row1 == row2 && col1 == col2
1592
+ xl_rowcol_to_cell(row1, col1)
1593
+ else
1594
+ "#{xl_rowcol_to_cell(row1, col1)}:#{xl_rowcol_to_cell(row2, col2)}"
1595
+ end
1136
1596
 
1137
- # Remove array formula braces and the leading =.
1138
- formula = formula.sub(/^\{(.*)\}$/, '\1').sub(/^=/, '')
1597
+ # Modify the formula string, as needed.
1598
+ formula = prepare_formula(formula, 1)
1139
1599
 
1140
1600
  store_data_to_table(
1141
1601
  if type == 'a'
1142
- FormulaArrayCellData.new(self, row1, col1, formula, xf, range, value)
1602
+ FormulaArrayCellData.new(formula, xf, range, value)
1143
1603
  elsif type == 'd'
1144
- DynamicFormulaArrayCellData.new(self, row1, col1, formula, xf, range, value)
1604
+ DynamicFormulaArrayCellData.new(formula, xf, range, value)
1145
1605
  else
1146
1606
  raise "invalid type in write_array_formula_base()."
1147
- end
1607
+ end,
1608
+ row1, col1
1148
1609
  )
1149
1610
 
1150
1611
  # Pad out the rest of the area with formatted zeroes.
1151
1612
  (row1..row2).each do |row|
1152
1613
  (col1..col2).each do |col|
1153
1614
  next if row == row1 && col == col1
1615
+
1154
1616
  write_number(row, col, 0, xf)
1155
1617
  end
1156
1618
  end
@@ -1161,8 +1623,8 @@ module Writexlsx
1161
1623
  #
1162
1624
  # Write an array formula to the specified row and column (zero indexed).
1163
1625
  #
1164
- def write_array_formula(*args)
1165
- write_array_formula_base('a', *args)
1626
+ def write_array_formula(row1, col1, row2 = nil, col2 = nil, formula = nil, format = nil, value = nil)
1627
+ write_array_formula_base('a', row1, col1, row2, col2, formula, format, value)
1166
1628
  end
1167
1629
 
1168
1630
  #
@@ -1170,8 +1632,8 @@ module Writexlsx
1170
1632
  #
1171
1633
  # Write a dynamic formula to the specified row and column (zero indexed).
1172
1634
  #
1173
- def write_dynamic_array_formula(*args)
1174
- write_array_formula_base('d', *args)
1635
+ def write_dynamic_array_formula(row1, col1, row2 = nil, col2 = nil, formula = nil, format = nil, value = nil)
1636
+ write_array_formula_base('d', row1, col1, row2, col2, formula, format, value)
1175
1637
  @has_dynamic_arrays = true
1176
1638
  end
1177
1639
 
@@ -1180,19 +1642,27 @@ module Writexlsx
1180
1642
  #
1181
1643
  # Write a boolean value to the specified row and column (zero indexed).
1182
1644
  #
1183
- def write_boolean(*args)
1184
- row, col, val, xf = row_col_notation(args)
1185
- raise WriteXLSXInsufficientArgumentError if row.nil? || col.nil?
1645
+ def write_boolean(row, col, val = nil, format = nil)
1646
+ if (row_col_array = row_col_notation(row))
1647
+ _row, _col = row_col_array
1648
+ _val = col
1649
+ _format = val
1650
+ else
1651
+ _row = row
1652
+ _col = col
1653
+ _val = val
1654
+ _format = format
1655
+ end
1656
+ raise WriteXLSXInsufficientArgumentError if _row.nil? || _col.nil?
1186
1657
 
1187
- val = val ? 1 : 0 # Boolean value.
1658
+ _val = _val ? 1 : 0 # Boolean value.
1188
1659
  # xf : cell format.
1189
- type = 'l' # The data type
1190
1660
 
1191
1661
  # Check that row and col are valid and store max and min values
1192
- check_dimensions(row, col)
1193
- store_row_col_max_min_values(row, col)
1662
+ check_dimensions(_row, _col)
1663
+ store_row_col_max_min_values(_row, _col)
1194
1664
 
1195
- store_data_to_table(BooleanCellData.new(self, row, col, val, xf))
1665
+ store_data_to_table(BooleanCellData.new(_val, _format), _row, _col)
1196
1666
  end
1197
1667
 
1198
1668
  #
@@ -1201,40 +1671,47 @@ module Writexlsx
1201
1671
  #
1202
1672
  # Update formatting of the cell to the specified row and column (zero indexed).
1203
1673
  #
1204
- def update_format_with_params(*args)
1205
- row, col, params = row_col_notation(args)
1206
- raise WriteXLSXInsufficientArgumentError if row.nil? || col.nil? || params.nil?
1674
+ def update_format_with_params(row, col, params = nil)
1675
+ if (row_col_array = row_col_notation(row))
1676
+ _row, _col = row_col_array
1677
+ _params = args[1]
1678
+ else
1679
+ _row = row
1680
+ _col = col
1681
+ _params = params
1682
+ end
1683
+ raise WriteXLSXInsufficientArgumentError if _row.nil? || _col.nil? || _params.nil?
1207
1684
 
1208
1685
  # Check that row and col are valid and store max and min values
1209
- check_dimensions(row, col)
1210
- store_row_col_max_min_values(row, col)
1686
+ check_dimensions(_row, _col)
1687
+ store_row_col_max_min_values(_row, _col)
1211
1688
 
1212
1689
  format = nil
1213
1690
  cell_data = nil
1214
- if @cell_data_table[row].nil? || @cell_data_table[row][col].nil?
1215
- format = @workbook.add_format(params)
1216
- write_blank(row, col, format)
1691
+ if @cell_data_table[_row].nil? || @cell_data_table[_row][_col].nil?
1692
+ format = @workbook.add_format(_params)
1693
+ write_blank(_row, _col, format)
1217
1694
  else
1218
- if @cell_data_table[row][col].xf.nil?
1219
- format = @workbook.add_format(params)
1220
- cell_data = @cell_data_table[row][col]
1695
+ if @cell_data_table[_row][_col].xf.nil?
1696
+ format = @workbook.add_format(_params)
1697
+ cell_data = @cell_data_table[_row][_col]
1221
1698
  else
1222
1699
  format = @workbook.add_format
1223
- cell_data = @cell_data_table[row][col]
1700
+ cell_data = @cell_data_table[_row][_col]
1224
1701
  format.copy(cell_data.xf)
1225
- format.set_format_properties(params)
1702
+ format.set_format_properties(_params)
1226
1703
  end
1227
1704
  # keep original value of cell
1228
- if cell_data.is_a? FormulaCellData
1229
- value = "=#{cell_data.token}"
1230
- elsif cell_data.is_a? FormulaArrayCellData
1231
- value = "{=#{cell_data.token}}"
1232
- elsif cell_data.is_a? StringCellData
1233
- value = @workbook.shared_strings.string(cell_data.data[:sst_id])
1234
- else
1235
- value = cell_data.data
1236
- end
1237
- write(row, col, value, format)
1705
+ value = if cell_data.is_a? FormulaCellData
1706
+ "=#{cell_data.token}"
1707
+ elsif cell_data.is_a? FormulaArrayCellData
1708
+ "{=#{cell_data.token}}"
1709
+ elsif cell_data.is_a? StringCellData
1710
+ @workbook.shared_strings.string(cell_data.data[:sst_id])
1711
+ else
1712
+ cell_data.data
1713
+ end
1714
+ write(_row, _col, value, format)
1238
1715
  end
1239
1716
  end
1240
1717
 
@@ -1244,22 +1721,31 @@ module Writexlsx
1244
1721
  #
1245
1722
  # Update formatting of cells in range to the specified row and column (zero indexed).
1246
1723
  #
1247
- def update_range_format_with_params(*args)
1248
- row_first, col_first, row_last, col_last, params = row_col_notation(args)
1724
+ def update_range_format_with_params(row_first, col_first, row_last = nil, col_last = nil, params = nil)
1725
+ if (row_col_array = row_col_notation(row_first))
1726
+ _row_first, _col_first, _row_last, _col_last = row_col_array
1727
+ params = args[1..-1]
1728
+ else
1729
+ _row_first = row_first
1730
+ _col_first = col_first
1731
+ _row_last = row_last
1732
+ _col_last = col_last
1733
+ _params = params
1734
+ end
1249
1735
 
1250
- raise WriteXLSXInsufficientArgumentError if [row_first, col_first, row_last, col_last, params].include?(nil)
1736
+ raise WriteXLSXInsufficientArgumentError if [_row_first, _col_first, _row_last, _col_last, _params].include?(nil)
1251
1737
 
1252
1738
  # Swap last row/col with first row/col as necessary
1253
- row_first, row_last = row_last, row_first if row_first > row_last
1254
- col_first, col_last = col_last, col_first if col_first > col_last
1739
+ _row_first, _row_last = _row_last, _row_first if _row_first > _row_last
1740
+ _col_first, _col_last = _col_last, _col_first if _col_first > _col_last
1255
1741
 
1256
1742
  # Check that column number is valid and store the max value
1257
- check_dimensions(row_last, col_last)
1258
- store_row_col_max_min_values(row_last, col_last)
1743
+ check_dimensions(_row_last, _col_last)
1744
+ store_row_col_max_min_values(_row_last, _col_last)
1259
1745
 
1260
- (row_first..row_last).each do |row|
1261
- (col_first..col_last).each do |col|
1262
- update_format_with_params(row, col, params)
1746
+ (_row_first.._row_last).each do |row|
1747
+ (_col_first.._col_last).each do |col|
1748
+ update_format_with_params(row, col, _params)
1263
1749
  end
1264
1750
  end
1265
1751
  end
@@ -1287,7 +1773,7 @@ module Writexlsx
1287
1773
 
1288
1774
  #
1289
1775
  # :call-seq:
1290
- # write_url(row, column, url [ , format, label, tip ] )
1776
+ # write_url(row, column, url [ , format, label, tip ])
1291
1777
  #
1292
1778
  # Write a hyperlink to a URL in the cell specified by +row+ and +column+.
1293
1779
  # The hyperlink is comprised of two elements: the visible label and
@@ -1296,79 +1782,109 @@ module Writexlsx
1296
1782
  # The label is written using the {#write()}[#method-i-write] method. Therefore it is
1297
1783
  # possible to write strings, numbers or formulas as labels.
1298
1784
  #
1299
- def write_url(*args)
1785
+ def write_url(row, col, url = nil, format = nil, str = nil, tip = nil)
1300
1786
  # Check for a cell reference in A1 notation and substitute row and column
1301
- row, col, url, xf, str, tip = row_col_notation(args)
1302
- xf, str = str, xf if str.respond_to?(:xf_index) || !xf.respond_to?(:xf_index)
1303
- raise WriteXLSXInsufficientArgumentError if [row, col, url].include?(nil)
1787
+ if (row_col_array = row_col_notation(row))
1788
+ _row, _col = row_col_array
1789
+ _url = col
1790
+ _format = url
1791
+ _str = format
1792
+ _tip = str
1793
+ else
1794
+ _row = row
1795
+ _col = col
1796
+ _url = url
1797
+ _format = format
1798
+ _str = str
1799
+ _tip = tip
1800
+ end
1801
+ _format, _str = _str, _format if _str.respond_to?(:xf_index) || !_format.respond_to?(:xf_index)
1802
+ raise WriteXLSXInsufficientArgumentError if [_row, _col, _url].include?(nil)
1304
1803
 
1305
1804
  # Check that row and col are valid and store max and min values
1306
- check_dimensions(row, col)
1307
- store_row_col_max_min_values(row, col)
1805
+ check_dimensions(_row, _col)
1806
+ store_row_col_max_min_values(_row, _col)
1308
1807
 
1309
- hyperlink = Hyperlink.factory(url, str, tip)
1310
- store_hyperlink(row, col, hyperlink)
1808
+ hyperlink = Hyperlink.factory(_url, _str, _tip)
1809
+ store_hyperlink(_row, _col, hyperlink)
1311
1810
 
1312
- if hyperlinks_count > 65_530
1313
- raise "URL '#{url}' added but URL exceeds Excel's limit of 65,530 URLs per worksheet."
1314
- end
1811
+ raise "URL '#{url}' added but URL exceeds Excel's limit of 65,530 URLs per worksheet." if hyperlinks_count > 65_530
1315
1812
 
1316
1813
  # Add the default URL format.
1317
- xf = @default_url_format unless xf
1814
+ _format ||= @default_url_format
1318
1815
 
1319
1816
  # Write the hyperlink string.
1320
- write_string(row, col, hyperlink.str, xf)
1817
+ write_string(_row, _col, hyperlink.str, _format)
1321
1818
  end
1322
1819
 
1323
1820
  #
1324
1821
  # :call-seq:
1325
- # write_date_time (row, col, date_string [ , format ] )
1822
+ # write_date_time (row, col, date_string [ , format ])
1326
1823
  #
1327
1824
  # Write a datetime string in ISO8601 "yyyy-mm-ddThh:mm:ss.ss" format as a
1328
1825
  # number representing an Excel date. format is optional.
1329
1826
  #
1330
- def write_date_time(*args)
1827
+ def write_date_time(row, col, str, format = nil)
1331
1828
  # Check for a cell reference in A1 notation and substitute row and column
1332
- row, col, str, xf = row_col_notation(args)
1333
- raise WriteXLSXInsufficientArgumentError if [row, col, str].include?(nil)
1829
+ if (row_col_array = row_col_notation(row))
1830
+ _row, _col = row_col_array
1831
+ _str = col
1832
+ _format = str
1833
+ else
1834
+ _row = row
1835
+ _col = col
1836
+ _str = str
1837
+ _format = format
1838
+ end
1839
+ raise WriteXLSXInsufficientArgumentError if [_row, _col, _str].include?(nil)
1334
1840
 
1335
1841
  # Check that row and col are valid and store max and min values
1336
- check_dimensions(row, col)
1337
- store_row_col_max_min_values(row, col)
1842
+ check_dimensions(_row, _col)
1843
+ store_row_col_max_min_values(_row, _col)
1338
1844
 
1339
- date_time = convert_date_time(str)
1845
+ date_time = convert_date_time(_str)
1340
1846
 
1341
1847
  if date_time
1342
- store_data_to_table(NumberCellData.new(self, row, col, date_time, xf))
1848
+ store_data_to_table(DateTimeCellData.new(date_time, _format), _row, _col)
1343
1849
  else
1344
1850
  # If the date isn't valid then write it as a string.
1345
- write_string(*args)
1851
+ write_string(_row, _col, _str, _format)
1346
1852
  end
1347
1853
  end
1348
1854
 
1349
1855
  #
1350
1856
  # :call-seq:
1351
- # insert_chart(row, column, chart [ , x, y, x_scale, y_scale ] )
1857
+ # insert_chart(row, column, chart [ , x, y, x_scale, y_scale ])
1352
1858
  #
1353
1859
  # This method can be used to insert a Chart object into a worksheet.
1354
1860
  # The Chart must be created by the add_chart() Workbook method and
1355
1861
  # it must have the embedded option set.
1356
1862
  #
1357
- def insert_chart(*args)
1863
+ def insert_chart(row, col, chart = nil, *options)
1358
1864
  # Check for a cell reference in A1 notation and substitute row and column.
1359
- row, col, chart, *options = row_col_notation(args)
1360
- raise WriteXLSXInsufficientArgumentError if [row, col, chart].include?(nil)
1361
-
1362
- if options.first.class == Hash
1363
- params = options.first
1364
- x_offset = params[:x_offset]
1365
- y_offset = params[:y_offset]
1366
- x_scale = params[:x_scale]
1367
- y_scale = params[:y_scale]
1368
- anchor = params[:object_position]
1865
+ if (row_col_array = row_col_notation(row))
1866
+ _row, _col = row_col_array
1867
+ _chart = col
1868
+ _options = [chart] + options
1869
+ else
1870
+ _row = row
1871
+ _col = col
1872
+ _chart = chart
1873
+ _options = options
1874
+ end
1875
+ raise WriteXLSXInsufficientArgumentError if [_row, _col, _chart].include?(nil)
1369
1876
 
1877
+ if _options.first.instance_of?(Hash)
1878
+ params = _options.first
1879
+ x_offset = params[:x_offset]
1880
+ y_offset = params[:y_offset]
1881
+ x_scale = params[:x_scale]
1882
+ y_scale = params[:y_scale]
1883
+ anchor = params[:object_position]
1884
+ description = params[:description]
1885
+ decorative = params[:decorative]
1370
1886
  else
1371
- x_offset, y_offset, x_scale, y_scale, anchor = options
1887
+ x_offset, y_offset, x_scale, y_scale, anchor = _options
1372
1888
  end
1373
1889
  x_offset ||= 0
1374
1890
  y_offset ||= 0
@@ -1376,37 +1892,49 @@ module Writexlsx
1376
1892
  y_scale ||= 1
1377
1893
  anchor ||= 1
1378
1894
 
1379
- raise "Not a Chart object in insert_chart()" unless chart.is_a?(Chart) || chart.is_a?(Chartsheet)
1380
- raise "Not a embedded style Chart object in insert_chart()" if chart.respond_to?(:embedded) && chart.embedded == 0
1895
+ raise "Not a Chart object in insert_chart()" unless _chart.is_a?(Chart) || _chart.is_a?(Chartsheet)
1896
+ raise "Not a embedded style Chart object in insert_chart()" if _chart.respond_to?(:embedded) && _chart.embedded == 0
1381
1897
 
1382
- if chart.already_inserted? || (chart.combined && chart.combined.already_inserted?)
1898
+ if _chart.already_inserted? || (_chart.combined && _chart.combined.already_inserted?)
1383
1899
  raise "Chart cannot be inserted in a worksheet more than once"
1384
1900
  else
1385
- chart.already_inserted = true
1386
- chart.combined.already_inserted = true if chart.combined
1901
+ _chart.already_inserted = true
1902
+ _chart.combined.already_inserted = true if _chart.combined
1387
1903
  end
1388
1904
 
1389
1905
  # Use the values set with chart.set_size, if any.
1390
- x_scale = chart.x_scale if chart.x_scale != 1
1391
- y_scale = chart.y_scale if chart.y_scale != 1
1392
- x_offset = chart.x_offset if ptrue?(chart.x_offset)
1393
- y_offset = chart.y_offset if ptrue?(chart.y_offset)
1394
-
1395
- @charts << [row, col, chart, x_offset, y_offset, x_scale, y_scale, anchor]
1906
+ x_scale = _chart.x_scale if _chart.x_scale != 1
1907
+ y_scale = _chart.y_scale if _chart.y_scale != 1
1908
+ x_offset = _chart.x_offset if ptrue?(_chart.x_offset)
1909
+ y_offset = _chart.y_offset if ptrue?(_chart.y_offset)
1910
+
1911
+ @charts << [
1912
+ _row, _col, _chart, x_offset, y_offset,
1913
+ x_scale, y_scale, anchor, description, decorative
1914
+ ]
1396
1915
  end
1397
1916
 
1398
1917
  #
1399
1918
  # :call-seq:
1400
1919
  # insert_image(row, column, filename, options)
1401
1920
  #
1402
- def insert_image(*args)
1921
+ def insert_image(row, col, image = nil, *options)
1403
1922
  # Check for a cell reference in A1 notation and substitute row and column.
1404
- row, col, image, *options = row_col_notation(args)
1405
- raise WriteXLSXInsufficientArgumentError if [row, col, image].include?(nil)
1923
+ if (row_col_array = row_col_notation(row))
1924
+ _row, _col = row_col_array
1925
+ _image = col
1926
+ _options = [image] + options
1927
+ else
1928
+ _row = row
1929
+ _col = col
1930
+ _image = image
1931
+ _options = options
1932
+ end
1933
+ raise WriteXLSXInsufficientArgumentError if [_row, _col, _image].include?(nil)
1406
1934
 
1407
- if options.first.class == Hash
1935
+ if _options.first.instance_of?(Hash)
1408
1936
  # Newer hash bashed options
1409
- params = options.first
1937
+ params = _options.first
1410
1938
  x_offset = params[:x_offset]
1411
1939
  y_offset = params[:y_offset]
1412
1940
  x_scale = params[:x_scale]
@@ -1417,7 +1945,7 @@ module Writexlsx
1417
1945
  description = params[:description]
1418
1946
  decorative = params[:decorative]
1419
1947
  else
1420
- x_offset, y_offset, x_scale, y_scale, anchor = options
1948
+ x_offset, y_offset, x_scale, y_scale, anchor = _options
1421
1949
  end
1422
1950
  x_offset ||= 0
1423
1951
  y_offset ||= 0
@@ -1426,55 +1954,67 @@ module Writexlsx
1426
1954
  anchor ||= 2
1427
1955
 
1428
1956
  @images << [
1429
- row, col, image, x_offset, y_offset,
1957
+ _row, _col, _image, x_offset, y_offset,
1430
1958
  x_scale, y_scale, url, tip, anchor, description, decorative
1431
1959
  ]
1432
1960
  end
1433
1961
 
1434
1962
  #
1435
1963
  # :call-seq:
1436
- # repeat_formula(row, column, formula [ , format ] )
1964
+ # repeat_formula(row, column, formula [ , format ])
1437
1965
  #
1438
1966
  # Deprecated. This is a writeexcel gem's method that is no longer
1439
1967
  # required by WriteXLSX.
1440
1968
  #
1441
- def repeat_formula(*args)
1969
+ def repeat_formula(row, col, formula, format, *pairs)
1442
1970
  # Check for a cell reference in A1 notation and substitute row and column.
1443
- row, col, formula, format, *pairs = row_col_notation(args)
1444
- raise WriteXLSXInsufficientArgumentError if [row, col].include?(nil)
1971
+ if (row_col_array = row_col_notation(row))
1972
+ _row, _col = row_col_array
1973
+ _formula = col
1974
+ _format = formula
1975
+ _pairs = [format] + pairs
1976
+ else
1977
+ _row = row
1978
+ _col = col
1979
+ _formula = formula
1980
+ _format = format
1981
+ _pairs = pairs
1982
+ end
1983
+ raise WriteXLSXInsufficientArgumentError if [_row, _col].include?(nil)
1445
1984
 
1446
- raise "Odd number of elements in pattern/replacement list" unless pairs.size % 2 == 0
1447
- raise "Not a valid formula" unless formula.respond_to?(:to_ary)
1985
+ raise "Odd number of elements in pattern/replacement list" unless _pairs.size.even?
1986
+ raise "Not a valid formula" unless _formula.respond_to?(:to_ary)
1448
1987
 
1449
- tokens = formula.join("\t").split("\t")
1988
+ tokens = _formula.join("\t").split("\t")
1450
1989
  raise "No tokens in formula" if tokens.empty?
1451
1990
 
1452
- value = nil
1453
- if pairs[-2] == 'result'
1454
- value = pairs.pop
1455
- pairs.pop
1991
+ _value = nil
1992
+ if _pairs[-2] == 'result'
1993
+ _value = _pairs.pop
1994
+ _pairs.pop
1456
1995
  end
1457
- while !pairs.empty?
1458
- pattern = pairs.shift
1459
- replace = pairs.shift
1996
+ until _pairs.empty?
1997
+ pattern = _pairs.shift
1998
+ replace = _pairs.shift
1460
1999
 
1461
2000
  tokens.each do |token|
1462
2001
  break if token.sub!(pattern, replace)
1463
2002
  end
1464
2003
  end
1465
- formula = tokens.join('')
1466
- write_formula(row, col, formula, format, value)
2004
+ _formula = tokens.join('')
2005
+ write_formula(_row, _col, _formula, _format, _value)
1467
2006
  end
1468
2007
 
1469
2008
  #
1470
2009
  # :call-seq:
1471
- # set_row(row [ , height, format, hidden, level, collapsed ] )
2010
+ # set_row(row [ , height, format, hidden, level, collapsed ])
1472
2011
  #
1473
2012
  # This method can be used to change the default properties of a row.
1474
2013
  # All parameters apart from +row+ are optional.
1475
2014
  #
1476
2015
  def set_row(*args)
1477
2016
  return unless args[0]
2017
+
1478
2018
  row = args[0]
1479
2019
  height = args[1] || @default_height
1480
2020
  xf = args[2]
@@ -1541,9 +2081,7 @@ module Writexlsx
1541
2081
  @row_size_changed = 1
1542
2082
  end
1543
2083
 
1544
- if ptrue?(zero_height)
1545
- @default_row_zeroed = 1
1546
- end
2084
+ @default_row_zeroed = 1 if ptrue?(zero_height)
1547
2085
  end
1548
2086
 
1549
2087
  #
@@ -1553,14 +2091,20 @@ module Writexlsx
1553
2091
  # others should be blank. All cells should contain the same format.
1554
2092
  #
1555
2093
  def merge_range(*args)
1556
- row_first, col_first, row_last, col_last, string, format, *extra_args = row_col_notation(args)
2094
+ if (row_col_array = row_col_notation(args.first))
2095
+ row_first, col_first, row_last, col_last = row_col_array
2096
+ string, format, *extra_args = args[1..-1]
2097
+ else
2098
+ row_first, col_first, row_last, col_last,
2099
+ string, format, *extra_args = args
2100
+ end
1557
2101
 
1558
2102
  raise "Incorrect number of arguments" if [row_first, col_first, row_last, col_last, format].include?(nil)
1559
2103
  raise "Fifth parameter must be a format object" unless format.respond_to?(:xf_index)
1560
2104
  raise "Can't merge single cell" if row_first == row_last && col_first == col_last
1561
2105
 
1562
2106
  # Swap last row/col with first row/col as necessary
1563
- row_first, row_last = row_last, row_first if row_first > row_last
2107
+ row_first, row_last = row_last, row_first if row_first > row_last
1564
2108
  col_first, col_last = col_last, col_first if col_first > col_last
1565
2109
 
1566
2110
  # Check that the data range is valid and store the max and min values.
@@ -1586,10 +2130,21 @@ module Writexlsx
1586
2130
  def merge_range_type(type, *args)
1587
2131
  case type
1588
2132
  when 'array_formula', 'blank', 'rich_string'
1589
- row_first, col_first, row_last, col_last, *others = row_col_notation(args)
2133
+ if (row_col_array = row_col_notation(args.first))
2134
+ row_first, col_first, row_last, col_last = row_col_array
2135
+ *others = args[1..-1]
2136
+ else
2137
+ row_first, col_first, row_last, col_last, *others = args
2138
+ end
1590
2139
  format = others.pop
1591
2140
  else
1592
- row_first, col_first, row_last, col_last, token, format, *others = row_col_notation(args)
2141
+ if (row_col_array = row_col_notation(args.first))
2142
+ row_first, col_first, row_last, col_last = row_col_array
2143
+ token, format, *others = args[1..-1]
2144
+ else
2145
+ row_first, col_first, row_last, col_last,
2146
+ token, format, *others = args
2147
+ end
1593
2148
  end
1594
2149
 
1595
2150
  raise "Format object missing or in an incorrect position" unless format.respond_to?(:xf_index)
@@ -1682,8 +2237,16 @@ module Writexlsx
1682
2237
  # The insert_button() method can be used to insert an Excel form button
1683
2238
  # into a worksheet.
1684
2239
  #
1685
- def insert_button(*args)
1686
- @buttons_array << button_params(*(row_col_notation(args)))
2240
+ def insert_button(row, col, properties = nil)
2241
+ if (row_col_array = row_col_notation(row))
2242
+ _row, _col = row_col_array
2243
+ _properties = col
2244
+ else
2245
+ _row = row
2246
+ _col = col
2247
+ _properties = properties
2248
+ end
2249
+ @buttons_array << button_params(_row, _col, _properties)
1687
2250
  @has_vml = 1
1688
2251
  end
1689
2252
 
@@ -1705,11 +2268,7 @@ module Writexlsx
1705
2268
  # Set the option to hide gridlines on the screen and the printed page.
1706
2269
  #
1707
2270
  def hide_gridlines(option = 1)
1708
- if option == 2
1709
- @screen_gridlines = false
1710
- else
1711
- @screen_gridlines = true
1712
- end
2271
+ @screen_gridlines = (option != 2)
1713
2272
 
1714
2273
  @page_setup.hide_gridlines(option)
1715
2274
  end
@@ -1743,7 +2302,7 @@ module Writexlsx
1743
2302
  def fit_to_pages(width = 1, height = 1)
1744
2303
  @page_setup.fit_page = true
1745
2304
  @page_setup.fit_width = width
1746
- @page_setup.fit_height = height
2305
+ @page_setup.fit_height = height
1747
2306
  @page_setup.page_setup_changed = true
1748
2307
  end
1749
2308
 
@@ -1753,17 +2312,29 @@ module Writexlsx
1753
2312
  #
1754
2313
  # Set the autofilter area in the worksheet.
1755
2314
  #
1756
- def autofilter(*args)
1757
- row1, col1, row2, col2 = row_col_notation(args)
1758
- return if [row1, col1, row2, col2].include?(nil)
2315
+ def autofilter(row1, col1 = nil, row2 = nil, col2 = nil)
2316
+ if (row_col_array = row_col_notation(row1))
2317
+ _row1, _col1, _row2, _col2 = row_col_array
2318
+ else
2319
+ _row1 = row1
2320
+ _col1 = col1
2321
+ _row2 = row2
2322
+ _col2 = col2
2323
+ end
2324
+ return if [_row1, _col1, _row2, _col2].include?(nil)
1759
2325
 
1760
2326
  # Reverse max and min values if necessary.
1761
- row1, row2 = row2, row1 if row2 < row1
1762
- col1, col2 = col2, col1 if col2 < col1
2327
+ _row1, _row2 = _row2, _row1 if _row2 < _row1
2328
+ _col1, _col2 = _col2, _col1 if _col2 < _col1
1763
2329
 
1764
- @autofilter_area = convert_name_area(row1, col1, row2, col2)
1765
- @autofilter_ref = xl_range(row1, row2, col1, col2)
1766
- @filter_range = [col1, col2]
2330
+ @autofilter_area = convert_name_area(_row1, _col1, _row2, _col2)
2331
+ @autofilter_ref = xl_range(_row1, _row2, _col1, _col2)
2332
+ @filter_range = [_col1, _col2]
2333
+
2334
+ # Store the filter cell positions for use in the autofit calculation.
2335
+ (_col1.._col2).each do |col|
2336
+ @filter_cells["#{_row1}:#{col}"] = 1
2337
+ end
1767
2338
  end
1768
2339
 
1769
2340
  #
@@ -1779,9 +2350,7 @@ module Writexlsx
1779
2350
 
1780
2351
  tokens = extract_filter_tokens(expression)
1781
2352
 
1782
- unless tokens.size == 3 || tokens.size == 7
1783
- raise "Incorrect number of tokens in expression '#{expression}'"
1784
- end
2353
+ raise "Incorrect number of tokens in expression '#{expression}'" unless tokens.size == 3 || tokens.size == 7
1785
2354
 
1786
2355
  tokens = parse_filter_expression(expression, tokens)
1787
2356
 
@@ -1891,7 +2460,9 @@ module Writexlsx
1891
2460
  def prepare_chart(index, chart_id, drawing_id) # :nodoc:
1892
2461
  drawing_type = 1
1893
2462
 
1894
- row, col, chart, x_offset, y_offset, x_scale, y_scale, anchor = @charts[index]
2463
+ row, col, chart, x_offset, y_offset,
2464
+ x_scale, y_scale, anchor, description, decorative = @charts[index]
2465
+
1895
2466
  chart.id = chart_id - 1
1896
2467
  x_scale ||= 0
1897
2468
  y_scale ||= 0
@@ -1909,15 +2480,15 @@ module Writexlsx
1909
2480
  name = chart.name
1910
2481
 
1911
2482
  # Create a Drawing object to use with worksheet unless one already exists.
1912
- drawing = Drawing.new(drawing_type, dimensions, 0, 0, name, nil, anchor, drawing_rel_index, 0, nil, 0)
1913
- if !drawings?
2483
+ drawing = Drawing.new(drawing_type, dimensions, 0, 0, nil, anchor, drawing_rel_index, 0, nil, name, description, decorative)
2484
+ if drawings?
2485
+ @drawings.add_drawing_object(drawing)
2486
+ else
1914
2487
  @drawings = Drawings.new
1915
2488
  @drawings.add_drawing_object(drawing)
1916
2489
  @drawings.embedded = 1
1917
2490
 
1918
- @external_drawing_links << ['/drawing', "../drawings/drawing#{drawing_id}.xml" ]
1919
- else
1920
- @drawings.add_drawing_object(drawing)
2491
+ @external_drawing_links << ['/drawing', "../drawings/drawing#{drawing_id}.xml"]
1921
2492
  end
1922
2493
  @drawing_links << ['/chart', "../charts/chart#{chart_id}.xml"]
1923
2494
  end
@@ -1933,31 +2504,31 @@ module Writexlsx
1933
2504
 
1934
2505
  # Iterate through the table data.
1935
2506
  data = []
1936
- (row_start .. row_end).each do |row_num|
2507
+ (row_start..row_end).each do |row_num|
1937
2508
  # Store nil if row doesn't exist.
1938
- if !@cell_data_table[row_num]
2509
+ unless @cell_data_table[row_num]
1939
2510
  data << nil
1940
2511
  next
1941
2512
  end
1942
2513
 
1943
- (col_start .. col_end).each do |col_num|
1944
- if cell = @cell_data_table[row_num][col_num]
2514
+ (col_start..col_end).each do |col_num|
2515
+ cell = @cell_data_table[row_num][col_num]
2516
+ if cell
1945
2517
  data << cell.data
1946
2518
  else
1947
- # Store nil if col doesn't exist.
1948
2519
  data << nil
1949
2520
  end
1950
2521
  end
1951
2522
  end
1952
2523
 
1953
- return data
2524
+ data
1954
2525
  end
1955
2526
 
1956
2527
  #
1957
2528
  # Calculate the vertices that define the position of a graphical object within
1958
2529
  # the worksheet in pixels.
1959
2530
  #
1960
- def position_object_pixels(col_start, row_start, x1, y1, width, height, anchor = nil) #:nodoc:
2531
+ def position_object_pixels(col_start, row_start, x1, y1, width, height, anchor = nil) # :nodoc:
1961
2532
  # Adjust start column for negative offsets.
1962
2533
  while x1 < 0 && col_start > 0
1963
2534
  x1 += size_col(col_start - 1)
@@ -1975,22 +2546,22 @@ module Writexlsx
1975
2546
  y1 = 0 if y1 < 0
1976
2547
 
1977
2548
  # Calculate the absolute x offset of the top-left vertex.
1978
- if @col_size_changed
1979
- x_abs = (0 .. col_start-1).inject(0) {|sum, col| sum += size_col(col, anchor)}
1980
- else
1981
- # Optimisation for when the column widths haven't changed.
1982
- x_abs = @default_col_pixels * col_start
1983
- end
2549
+ x_abs = if @col_size_changed
2550
+ (0..col_start - 1).inject(0) { |sum, col| sum += size_col(col, anchor) }
2551
+ else
2552
+ # Optimisation for when the column widths haven't changed.
2553
+ @default_col_pixels * col_start
2554
+ end
1984
2555
  x_abs += x1
1985
2556
 
1986
2557
  # Calculate the absolute y offset of the top-left vertex.
1987
2558
  # Store the column change to allow optimisations.
1988
- if @row_size_changed
1989
- y_abs = (0 .. row_start-1).inject(0) {|sum, row| sum += size_row(row, anchor)}
1990
- else
1991
- # Optimisation for when the row heights haven't changed.
1992
- y_abs = @default_row_pixels * row_start
1993
- end
2559
+ y_abs = if @row_size_changed
2560
+ (0..row_start - 1).inject(0) { |sum, row| sum += size_row(row, anchor) }
2561
+ else
2562
+ # Optimisation for when the row heights haven't changed.
2563
+ @default_row_pixels * row_start
2564
+ end
1994
2565
  y_abs += y1
1995
2566
 
1996
2567
  # Adjust start column for offsets that are greater than the col width.
@@ -2043,35 +2614,37 @@ module Writexlsx
2043
2614
  #
2044
2615
  # Write the cell value <v> element.
2045
2616
  #
2046
- def write_cell_value(value = '') #:nodoc:
2047
- return write_cell_formula('=NA()') if !value.nil? && value.is_a?(Float) && value.nan?
2617
+ def write_cell_value(value = '') # :nodoc:
2618
+ return write_cell_formula('=NA()') if value.is_a?(Float) && value.nan?
2048
2619
 
2049
2620
  value ||= ''
2050
- value = value.to_i if value == value.to_i
2621
+
2622
+ int_value = value.to_i
2623
+ value = int_value if value == int_value
2051
2624
  @writer.data_element('v', value)
2052
2625
  end
2053
2626
 
2054
2627
  #
2055
2628
  # Write the cell formula <f> element.
2056
2629
  #
2057
- def write_cell_formula(formula = '') #:nodoc:
2630
+ def write_cell_formula(formula = '') # :nodoc:
2058
2631
  @writer.data_element('f', formula)
2059
2632
  end
2060
2633
 
2061
2634
  #
2062
2635
  # Write the cell array formula <f> element.
2063
2636
  #
2064
- def write_cell_array_formula(formula, range) #:nodoc:
2637
+ def write_cell_array_formula(formula, range) # :nodoc:
2065
2638
  @writer.data_element(
2066
2639
  'f', formula,
2067
2640
  [
2068
- ['t', 'array'],
2641
+ %w[t array],
2069
2642
  ['ref', range]
2070
2643
  ]
2071
2644
  )
2072
2645
  end
2073
2646
 
2074
- def date_1904? #:nodoc:
2647
+ def date_1904? # :nodoc:
2075
2648
  @workbook.date_1904?
2076
2649
  end
2077
2650
 
@@ -2083,9 +2656,9 @@ module Writexlsx
2083
2656
  # Convert from an Excel internal colour index to a XML style #RRGGBB index
2084
2657
  # based on the default or user defined values in the Workbook palette.
2085
2658
  #
2086
- def palette_color(index) #:nodoc:
2659
+ def palette_color(index) # :nodoc:
2087
2660
  if index.to_s =~ /^#([0-9A-F]{6})$/i
2088
- "FF#{$1.upcase}"
2661
+ "FF#{::Regexp.last_match(1).upcase}"
2089
2662
  else
2090
2663
  "FF#{super(index)}"
2091
2664
  end
@@ -2104,8 +2677,8 @@ module Writexlsx
2104
2677
  @external_hyper_links,
2105
2678
  @external_drawing_links,
2106
2679
  @external_vml_links,
2107
- @external_table_links,
2108
2680
  @external_background_links,
2681
+ @external_table_links,
2109
2682
  @external_comment_links
2110
2683
  ].reject { |a| a.empty? }
2111
2684
  end
@@ -2125,7 +2698,7 @@ module Writexlsx
2125
2698
  # The VML o:idmap data id contains a comma separated range when there is
2126
2699
  # more than one 1024 block of comments, like this: data="1,2".
2127
2700
  data = "#{vml_data_id}"
2128
- (1 .. num_comments_block).each do |i|
2701
+ (1..num_comments_block).each do |i|
2129
2702
  data += ",#{vml_data_id + i}"
2130
2703
  end
2131
2704
  @vml_data_id = data
@@ -2183,11 +2756,7 @@ module Writexlsx
2183
2756
  # set the vba name for the worksheet
2184
2757
  #
2185
2758
  def set_vba_name(vba_codename = nil)
2186
- if vba_codename
2187
- @vba_codename = vba_codename
2188
- else
2189
- @vba_codename = @name
2190
- end
2759
+ @vba_codename = vba_codename || @name
2191
2760
  end
2192
2761
 
2193
2762
  #
@@ -2195,33 +2764,29 @@ module Writexlsx
2195
2764
  #
2196
2765
  def ignore_errors(ignores)
2197
2766
  # List of valid input parameters.
2198
- valid_parameter_keys = [
2199
- :number_stored_as_text,
2200
- :eval_error,
2201
- :formula_differs,
2202
- :formula_range,
2203
- :formula_unlocked,
2204
- :empty_cell_reference,
2205
- :list_data_validation,
2206
- :calculated_column,
2207
- :two_digit_text_year
2767
+ valid_parameter_keys = %i[
2768
+ number_stored_as_text
2769
+ eval_error
2770
+ formula_differs
2771
+ formula_range
2772
+ formula_unlocked
2773
+ empty_cell_reference
2774
+ list_data_validation
2775
+ calculated_column
2776
+ two_digit_text_year
2208
2777
  ]
2209
2778
 
2210
- unless (ignores.keys - valid_parameter_keys).empty?
2211
- raise "Unknown parameter '#{ignores.key - valid_parameter_keys}' in ignore_errors()."
2212
- end
2779
+ raise "Unknown parameter '#{ignores.key - valid_parameter_keys}' in ignore_errors()." unless (ignores.keys - valid_parameter_keys).empty?
2213
2780
 
2214
2781
  @ignore_errors = ignores
2215
2782
  end
2216
2783
 
2217
- def write_ext(url)
2784
+ def write_ext(url, &block)
2218
2785
  attributes = [
2219
2786
  ['xmlns:x14', "#{OFFICE_URL}spreadsheetml/2009/9/main"],
2220
2787
  ['uri', url]
2221
2788
  ]
2222
- @writer.tag_elements('ext', attributes) do
2223
- yield
2224
- end
2789
+ @writer.tag_elements('ext', attributes, &block)
2225
2790
  end
2226
2791
 
2227
2792
  def write_sparkline_groups
@@ -2240,6 +2805,33 @@ module Writexlsx
2240
2805
 
2241
2806
  private
2242
2807
 
2808
+ #
2809
+ # Compare adjacent column information structures.
2810
+ #
2811
+ def compare_col_info(col_options, previous_options)
2812
+ if !col_options.width.nil? != !previous_options.width.nil?
2813
+ return nil
2814
+ end
2815
+ if col_options.width && previous_options.width &&
2816
+ col_options.width != previous_options.width
2817
+ return nil
2818
+ end
2819
+
2820
+ if !col_options.format.nil? != !previous_options.format.nil?
2821
+ return nil
2822
+ end
2823
+ if col_options.format && previous_options.format &&
2824
+ col_options.format != previous_options.format
2825
+ return nil
2826
+ end
2827
+
2828
+ return nil if col_options.hidden != previous_options.hidden
2829
+ return nil if col_options.level != previous_options.level
2830
+ return nil if col_options.collapsed != previous_options.collapsed
2831
+
2832
+ true
2833
+ end
2834
+
2243
2835
  #
2244
2836
  # Get the index used to address a drawing rel link.
2245
2837
  #
@@ -2279,11 +2871,7 @@ module Writexlsx
2279
2871
 
2280
2872
  def cell_format_of_rich_string(rich_strings)
2281
2873
  # If the last arg is a format we use it as the cell format.
2282
- if rich_strings[-1].respond_to?(:xf_index)
2283
- rich_strings.pop
2284
- else
2285
- nil
2286
- end
2874
+ rich_strings.pop if rich_strings[-1].respond_to?(:xf_index)
2287
2875
  end
2288
2876
 
2289
2877
  #
@@ -2295,9 +2883,9 @@ module Writexlsx
2295
2883
  # Create a temp format with the default font for unformatted fragments.
2296
2884
  default = Format.new(0)
2297
2885
 
2298
- length = 0 # String length.
2299
2886
  last = 'format'
2300
2887
  pos = 0
2888
+ raw_string = ''
2301
2889
 
2302
2890
  fragments = []
2303
2891
  rich_strings.each do |token|
@@ -2310,20 +2898,20 @@ module Writexlsx
2310
2898
  last = 'format'
2311
2899
  else
2312
2900
  # Token is a string.
2313
- if last != 'format'
2314
- # If previous token wasn't a format add one before the string.
2315
- fragments << default << token
2316
- else
2901
+ if last == 'format'
2317
2902
  # If previous token was a format just add the string.
2318
2903
  fragments << token
2904
+ else
2905
+ # If previous token wasn't a format add one before the string.
2906
+ fragments << default << token
2319
2907
  end
2320
2908
 
2321
- length += token.size # Keep track of actual string length.
2909
+ raw_string += token # Keep track of actual string length.
2322
2910
  last = 'string'
2323
2911
  end
2324
2912
  pos += 1
2325
2913
  end
2326
- [fragments, length]
2914
+ [fragments, raw_string]
2327
2915
  end
2328
2916
 
2329
2917
  def xml_str_of_rich_string(fragments)
@@ -2332,7 +2920,7 @@ module Writexlsx
2332
2920
  writer = Package::XMLWriterSimple.new
2333
2921
 
2334
2922
  # If the first token is a string start the <r> element.
2335
- writer.start_tag('r') if !fragments[0].respond_to?(:xf_index)
2923
+ writer.start_tag('r') unless fragments[0].respond_to?(:xf_index)
2336
2924
 
2337
2925
  # Write the XML elements for the format string fragments.
2338
2926
  fragments.each do |token|
@@ -2354,9 +2942,10 @@ module Writexlsx
2354
2942
 
2355
2943
  # Pad out the rest of the area with formatted blank cells.
2356
2944
  def write_formatted_blank_to_area(row_first, row_last, col_first, col_last, format)
2357
- (row_first .. row_last).each do |row|
2358
- (col_first .. col_last).each do |col|
2945
+ (row_first..row_last).each do |row|
2946
+ (col_first..col_last).each do |col|
2359
2947
  next if row == row_first && col == col_first
2948
+
2360
2949
  write_blank(row, col, format)
2361
2950
  end
2362
2951
  end
@@ -2367,13 +2956,13 @@ module Writexlsx
2367
2956
  # whitespace groups. The only tricky part is to extract string tokens that
2368
2957
  # contain whitespace and/or quoted double quotes (Excel's escaped quotes).
2369
2958
  #
2370
- def extract_filter_tokens(expression = nil) #:nodoc:
2959
+ def extract_filter_tokens(expression = nil) # :nodoc:
2371
2960
  return [] unless expression
2372
2961
 
2373
2962
  tokens = []
2374
2963
  str = expression
2375
2964
  while str =~ /"(?:[^"]|"")*"|\S+/
2376
- tokens << $&
2965
+ tokens << ::Regexp.last_match(0)
2377
2966
  str = $~.post_match
2378
2967
  end
2379
2968
 
@@ -2381,7 +2970,7 @@ module Writexlsx
2381
2970
  tokens.map! do |token|
2382
2971
  token.sub!(/^"/, '')
2383
2972
  token.sub!(/"$/, '')
2384
- token.gsub!(/""/, '"')
2973
+ token.gsub!('""', '"')
2385
2974
 
2386
2975
  # if token is number, convert to numeric.
2387
2976
  if token =~ /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/
@@ -2398,11 +2987,11 @@ module Writexlsx
2398
2987
  # Converts the tokens of a possibly conditional expression into 1 or 2
2399
2988
  # sub expressions for further parsing.
2400
2989
  #
2401
- def parse_filter_expression(expression, tokens) #:nodoc:
2990
+ def parse_filter_expression(expression, tokens) # :nodoc:
2402
2991
  # The number of tokens will be either 3 (for 1 expression)
2403
2992
  # or 7 (for 2 expressions).
2404
2993
  #
2405
- if (tokens.size == 7)
2994
+ if tokens.size == 7
2406
2995
  conditional = tokens[3]
2407
2996
  if conditional =~ /^(and|&&)$/
2408
2997
  conditional = 0
@@ -2410,7 +2999,7 @@ module Writexlsx
2410
2999
  conditional = 1
2411
3000
  else
2412
3001
  raise "Token '#{conditional}' is not a valid conditional " +
2413
- "in filter expression '#{expression}'"
3002
+ "in filter expression '#{expression}'"
2414
3003
  end
2415
3004
  expression_1 = parse_filter_tokens(expression, tokens[0..2])
2416
3005
  expression_2 = parse_filter_tokens(expression, tokens[4..6])
@@ -2423,7 +3012,7 @@ module Writexlsx
2423
3012
  #
2424
3013
  # Parse the 3 tokens of a filter expression and return the operator and token.
2425
3014
  #
2426
- def parse_filter_tokens(expression, tokens) #:nodoc:
3015
+ def parse_filter_tokens(expression, tokens) # :nodoc:
2427
3016
  operators = {
2428
3017
  '==' => 2,
2429
3018
  '=' => 2,
@@ -2438,7 +3027,7 @@ module Writexlsx
2438
3027
  '<' => 1,
2439
3028
  '<=' => 3,
2440
3029
  '>' => 4,
2441
- '>=' => 6,
3030
+ '>=' => 6
2442
3031
  }
2443
3032
 
2444
3033
  operator = operators[tokens[1]]
@@ -2447,40 +3036,38 @@ module Writexlsx
2447
3036
  # Special handling of "Top" filter expressions.
2448
3037
  if tokens[0] =~ /^top|bottom$/i
2449
3038
  value = tokens[1]
2450
- if (value.to_s =~ /\D/ or value.to_i < 1 or value.to_i > 500)
3039
+ if value.to_s =~ /\D/ or value.to_i < 1 or value.to_i > 500
2451
3040
  raise "The value '#{value}' in expression '#{expression}' " +
2452
- "must be in the range 1 to 500"
3041
+ "must be in the range 1 to 500"
2453
3042
  end
2454
3043
  token.downcase!
2455
- if (token != 'items' and token != '%')
3044
+ if token != 'items' and token != '%'
2456
3045
  raise "The type '#{token}' in expression '#{expression}' " +
2457
- "must be either 'items' or '%'"
3046
+ "must be either 'items' or '%'"
2458
3047
  end
2459
3048
 
2460
- if (tokens[0] =~ /^top$/i)
2461
- operator = 30
2462
- else
2463
- operator = 32
2464
- end
3049
+ operator = if tokens[0] =~ /^top$/i
3050
+ 30
3051
+ else
3052
+ 32
3053
+ end
2465
3054
 
2466
- if (tokens[2] == '%')
2467
- operator += 1
2468
- end
3055
+ operator += 1 if tokens[2] == '%'
2469
3056
 
2470
3057
  token = value
2471
3058
  end
2472
3059
 
2473
- if (not operator and tokens[0])
3060
+ if !operator and tokens[0]
2474
3061
  raise "Token '#{tokens[1]}' is not a valid operator " +
2475
- "in filter expression '#{expression}'"
3062
+ "in filter expression '#{expression}'"
2476
3063
  end
2477
3064
 
2478
3065
  # Special handling for Blanks/NonBlanks.
2479
- if (token.to_s =~ /^blanks|nonblanks$/i)
3066
+ if token.to_s =~ /^blanks|nonblanks$/i
2480
3067
  # Only allow Equals or NotEqual in this context.
2481
- if (operator != 2 and operator != 5)
3068
+ if operator != 2 and operator != 5
2482
3069
  raise "The operator '#{tokens[1]}' in expression '#{expression}' " +
2483
- "is not valid in relation to Blanks/NonBlanks'"
3070
+ "is not valid in relation to Blanks/NonBlanks'"
2484
3071
  end
2485
3072
 
2486
3073
  token.downcase!
@@ -2488,25 +3075,19 @@ module Writexlsx
2488
3075
  # The operator should always be 2 (=) to flag a "simple" equality in
2489
3076
  # the binary record. Therefore we convert <> to =.
2490
3077
  if token == 'blanks'
2491
- if operator == 5
2492
- token = ' '
2493
- end
3078
+ token = ' ' if operator == 5
3079
+ elsif operator == 5
3080
+ operator = 2
3081
+ token = 'blanks'
2494
3082
  else
2495
- if operator == 5
2496
- operator = 2
2497
- token = 'blanks'
2498
- else
2499
- operator = 5
2500
- token = ' '
2501
- end
3083
+ operator = 5
3084
+ token = ' '
2502
3085
  end
2503
3086
  end
2504
3087
 
2505
3088
  # if the string token contains an Excel match character then change the
2506
3089
  # operator type to indicate a non "simple" equality.
2507
- if (operator == 2 and token.to_s =~ /[*?]/)
2508
- operator = 22
2509
- end
3090
+ operator = 22 if operator == 2 and token.to_s =~ /[*?]/
2510
3091
 
2511
3092
  [operator, token]
2512
3093
  end
@@ -2518,7 +3099,7 @@ module Writexlsx
2518
3099
  # 2. Sorts the list.
2519
3100
  # 3. Removes 0 from the list if present.
2520
3101
  #
2521
- def sort_pagebreaks(*args) #:nodoc:
3102
+ def sort_pagebreaks(*args) # :nodoc:
2522
3103
  return [] if args.empty?
2523
3104
 
2524
3105
  breaks = args.uniq.sort
@@ -2538,17 +3119,17 @@ module Writexlsx
2538
3119
  # Calculate the vertices that define the position of a graphical object within
2539
3120
  # the worksheet in EMUs.
2540
3121
  #
2541
- def position_object_emus(col_start, row_start, x1, y1, width, height, anchor = nil) #:nodoc:
3122
+ def position_object_emus(col_start, row_start, x1, y1, width, height, anchor = nil) # :nodoc:
2542
3123
  col_start, row_start, x1, y1, col_end, row_end, x2, y2, x_abs, y_abs =
2543
3124
  position_object_pixels(col_start, row_start, x1, y1, width, height, anchor)
2544
3125
 
2545
3126
  # Convert the pixel values to EMUs. See above.
2546
- x1 = (0.5 + 9_525 * x1).to_i
2547
- y1 = (0.5 + 9_525 * y1).to_i
2548
- x2 = (0.5 + 9_525 * x2).to_i
2549
- y2 = (0.5 + 9_525 * y2).to_i
2550
- x_abs = (0.5 + 9_525 * x_abs).to_i
2551
- y_abs = (0.5 + 9_525 * y_abs).to_i
3127
+ x1 = (0.5 + (9_525 * x1)).to_i
3128
+ y1 = (0.5 + (9_525 * y1)).to_i
3129
+ x2 = (0.5 + (9_525 * x2)).to_i
3130
+ y2 = (0.5 + (9_525 * y2)).to_i
3131
+ x_abs = (0.5 + (9_525 * x_abs)).to_i
3132
+ y_abs = (0.5 + (9_525 * y_abs)).to_i
2552
3133
 
2553
3134
  [col_start, row_start, x1, y1, col_end, row_end, x2, y2, x_abs, y_abs]
2554
3135
  end
@@ -2559,19 +3140,20 @@ module Writexlsx
2559
3140
  # we use the default value. A hidden column is treated as having a width of
2560
3141
  # zero unless it has the special "object_position" of 4 (size with cells).
2561
3142
  #
2562
- def size_col(col, anchor = 0) #:nodoc:
3143
+ def size_col(col, anchor = 0) # :nodoc:
2563
3144
  # Look up the cell value to see if it has been changed.
2564
- if @col_sizes[col]
2565
- width, hidden = @col_sizes[col]
3145
+ if @col_info[col]
3146
+ width = @col_info[col].width || @default_col_width
3147
+ hidden = @col_info[col].hidden
2566
3148
 
2567
3149
  # Convert to pixels.
2568
- if hidden == 1 && anchor != 4
2569
- pixels = 0
2570
- elsif width < 1
2571
- pixels = (width * (MAX_DIGIT_WIDTH + PADDING) + 0.5).to_i
2572
- else
2573
- pixels = (width * MAX_DIGIT_WIDTH + 0.5).to_i + PADDING
2574
- end
3150
+ pixels = if hidden == 1 && anchor != 4
3151
+ 0
3152
+ elsif width < 1
3153
+ ((width * (MAX_DIGIT_WIDTH + PADDING)) + 0.5).to_i
3154
+ else
3155
+ ((width * MAX_DIGIT_WIDTH) + 0.5).to_i + PADDING
3156
+ end
2575
3157
  else
2576
3158
  pixels = @default_col_pixels
2577
3159
  end
@@ -2584,16 +3166,16 @@ module Writexlsx
2584
3166
  # treated as having a height of zero unless it has the special
2585
3167
  # "object_position" of 4 (size with cells).
2586
3168
  #
2587
- def size_row(row, anchor = 0) #:nodoc:
3169
+ def size_row(row, anchor = 0) # :nodoc:
2588
3170
  # Look up the cell value to see if it has been changed
2589
3171
  if @row_sizes[row]
2590
3172
  height, hidden = @row_sizes[row]
2591
3173
 
2592
- if hidden == 1 && anchor != 4
2593
- pixels = 0
2594
- else
2595
- pixels = (4 / 3.0 * height).to_i
2596
- end
3174
+ pixels = if hidden == 1 && anchor != 4
3175
+ 0
3176
+ else
3177
+ (4 / 3.0 * height).to_i
3178
+ end
2597
3179
  else
2598
3180
  pixels = (4 / 3.0 * @default_row_height).to_i
2599
3181
  end
@@ -2608,12 +3190,10 @@ module Writexlsx
2608
3190
  padding = 5.0
2609
3191
 
2610
3192
  if pixels <= 12
2611
- width = pixels / (max_digit_width + padding)
3193
+ pixels / (max_digit_width + padding)
2612
3194
  else
2613
- width = (pixels - padding) / max_digit_width
3195
+ (pixels - padding) / max_digit_width
2614
3196
  end
2615
-
2616
- width
2617
3197
  end
2618
3198
 
2619
3199
  #
@@ -2621,19 +3201,19 @@ module Writexlsx
2621
3201
  #
2622
3202
  def pixels_to_height(pixels)
2623
3203
  height = 0.75 * pixels
2624
- height = height.to_i if ( height - height.to_i).abs < 0.1
3204
+ height = height.to_i if (height - height.to_i).abs < 0.1
2625
3205
  height
2626
3206
  end
2627
3207
 
2628
3208
  #
2629
3209
  # Set up image/drawings.
2630
3210
  #
2631
- def prepare_image(index, image_id, drawing_id, width, height, name, image_type, x_dpi = 96, y_dpi = 96, md5 = nil) #:nodoc:
3211
+ def prepare_image(index, image_id, drawing_id, width, height, name, image_type, x_dpi = 96, y_dpi = 96, md5 = nil) # :nodoc:
2632
3212
  x_dpi ||= 96
2633
3213
  y_dpi ||= 96
2634
3214
  drawing_type = 2
2635
3215
 
2636
- row, col, image, x_offset, y_offset,
3216
+ row, col, _image, x_offset, y_offset,
2637
3217
  x_scale, y_scale, url, tip, anchor, description, decorative = @images[index]
2638
3218
 
2639
3219
  width *= x_scale
@@ -2649,41 +3229,37 @@ module Writexlsx
2649
3229
  height = (0.5 + (height * 9_525)).to_i
2650
3230
 
2651
3231
  # Create a Drawing object to use with worksheet unless one already exists.
2652
- drawing = Drawing.new(drawing_type, dimensions, width, height, name, nil, anchor, 0, 0, tip, decorative)
2653
- if !drawings?
3232
+ drawing = Drawing.new(drawing_type, dimensions, width, height, nil, anchor, 0, 0, tip, name, description, decorative)
3233
+ if drawings?
3234
+ drawings = @drawings
3235
+ else
2654
3236
  drawings = Drawings.new
2655
3237
  drawings.embedded = 1
2656
3238
 
2657
3239
  @drawings = drawings
2658
3240
 
2659
3241
  @external_drawing_links << ['/drawing', "../drawings/drawing#{drawing_id}.xml"]
2660
- else
2661
- drawings = @drawings
2662
3242
  end
2663
3243
  drawings.add_drawing_object(drawing)
2664
3244
 
2665
- if description
2666
- drawing.description = description
2667
- end
3245
+ drawing.description = name unless description
2668
3246
 
2669
3247
  if url
2670
3248
  rel_type = '/hyperlink'
2671
3249
  target_mode = 'External'
2672
- if url =~ %r!^[fh]tt?ps?://! || url =~ /^mailto:/
2673
- target = escape_url(url)
2674
- end
3250
+ target = escape_url(url) if url =~ %r{^[fh]tt?ps?://} || url =~ /^mailto:/
2675
3251
  if url =~ /^external:/
2676
3252
  target = escape_url(url.sub(/^external:/, ''))
2677
3253
 
2678
3254
  # Additional escape not required in worksheet hyperlinks
2679
- target = target.gsub(/#/, '%23')
3255
+ target = target.gsub("#", '%23')
2680
3256
 
2681
3257
  # Prefix absolute paths (not relative) with file:///
2682
- if target =~ /^\w:/ || target =~ /^\\\\/
2683
- target = "file:///#{target}"
2684
- else
2685
- target = target.gsub(/\\/, '/')
2686
- end
3258
+ target = if target =~ /^\w:/ || target =~ /^\\\\/
3259
+ "file:///#{target}"
3260
+ else
3261
+ target.gsub("\\", '/')
3262
+ end
2687
3263
  end
2688
3264
 
2689
3265
  if url =~ /^internal:/
@@ -2697,15 +3273,11 @@ Ignoring URL #{target} where link or anchor > 255 characters since it exceeds Ex
2697
3273
  EOS
2698
3274
  end
2699
3275
 
2700
- if target && !@drawing_rels[url]
2701
- @drawing_links << [rel_type, target, target_mode]
2702
- end
3276
+ @drawing_links << [rel_type, target, target_mode] if target && !@drawing_rels[url]
2703
3277
  drawing.url_rel_index = drawing_rel_index(url)
2704
3278
  end
2705
3279
 
2706
- if !@drawing_rels[md5]
2707
- @drawing_links << ['/image', "../media/image#{image_id}.#{image_type}"]
2708
- end
3280
+ @drawing_links << ['/image', "../media/image#{image_id}.#{image_type}"] unless @drawing_rels[md5]
2709
3281
  drawing.rel_index = drawing_rel_index(md5)
2710
3282
  end
2711
3283
  public :prepare_image
@@ -2713,11 +3285,9 @@ EOS
2713
3285
  def prepare_header_image(image_id, width, height, name, image_type, position, x_dpi, y_dpi, md5)
2714
3286
  # Strip the extension from the filename.
2715
3287
  body = name.dup
2716
- body[/\.[^\.]+$/, 0] = ''
3288
+ body[/\.[^.]+$/, 0] = ''
2717
3289
 
2718
- if !@vml_drawing_rels[md5]
2719
- @vml_drawing_links << ['/image', "../media/image#{image_id}.#{image_type}" ]
2720
- end
3290
+ @vml_drawing_links << ['/image', "../media/image#{image_id}.#{image_type}"] unless @vml_drawing_rels[md5]
2721
3291
 
2722
3292
  ref_id = get_vml_drawing_rel_index(md5)
2723
3293
  @header_images_array << [width, height, body, position, x_dpi, y_dpi, ref_id]
@@ -2745,25 +3315,42 @@ EOS
2745
3315
 
2746
3316
  #
2747
3317
  # :call-seq:
2748
- # insert_shape(row, col, shape [ , x, y, x_scale, y_scale ] )
3318
+ # insert_shape(row, col, shape [ , x, y, x_scale, y_scale ])
2749
3319
  #
2750
3320
  # Insert a shape into the worksheet.
2751
3321
  #
2752
- def insert_shape(*args)
3322
+ def insert_shape(
3323
+ row_start, column_start, shape = nil, x_offset = nil, y_offset = nil,
3324
+ x_scale = nil, y_scale = nil, anchor = nil
3325
+ )
2753
3326
  # Check for a cell reference in A1 notation and substitute row and column.
2754
- row_start, column_start, shape, x_offset, y_offset, x_scale, y_scale, anchor =
2755
- row_col_notation(args)
2756
- if [row_start, column_start, shape].include?(nil)
2757
- raise "Insufficient arguments in insert_shape()"
2758
- end
2759
-
2760
- shape.set_position(
2761
- row_start, column_start, x_offset, y_offset,
2762
- x_scale, y_scale, anchor
3327
+ if (row_col_array = row_col_notation(row_start))
3328
+ _row_start, _column_start = row_col_array
3329
+ _shape = column_start
3330
+ _x_offset = shape
3331
+ _y_offset = x_offset
3332
+ _x_scale = y_offset
3333
+ _y_scale = x_scale
3334
+ _anchor = y_scale
3335
+ else
3336
+ _row_start = row_start
3337
+ _column_start = column_start
3338
+ _shape = shape
3339
+ _x_offset = x_offset
3340
+ _y_offset = y_offset
3341
+ _x_scale = x_scale
3342
+ _y_scale = y_scale
3343
+ _anchor = anchor
3344
+ end
3345
+ raise "Insufficient arguments in insert_shape()" if [_row_start, _column_start, _shape].include?(nil)
3346
+
3347
+ _shape.set_position(
3348
+ _row_start, _column_start, _x_offset, _y_offset,
3349
+ _x_scale, _y_scale, _anchor
2763
3350
  )
2764
3351
  # Assign a shape ID.
2765
3352
  while true
2766
- id = shape.id || 0
3353
+ id = _shape.id || 0
2767
3354
  used = @shape_hash[id]
2768
3355
 
2769
3356
  # Test if shape ID is already used. Otherwise assign a new one.
@@ -2771,21 +3358,21 @@ EOS
2771
3358
  break
2772
3359
  else
2773
3360
  @last_shape_id += 1
2774
- shape.id = @last_shape_id
3361
+ _shape.id = @last_shape_id
2775
3362
  end
2776
3363
  end
2777
3364
 
2778
3365
  # Allow lookup of entry into shape array by shape ID.
2779
- @shape_hash[shape.id] = shape.element = @shapes.size
3366
+ @shape_hash[_shape.id] = _shape.element = @shapes.size
2780
3367
 
2781
- if ptrue?(shape.stencil)
2782
- # Insert a copy of the shape, not a reference so that the shape is
2783
- # used as a stencil. Previously stamped copies don't get modified
2784
- # if the stencil is modified.
2785
- insert = shape.dup
2786
- else
2787
- insert = shape
2788
- end
3368
+ insert = if ptrue?(_shape.stencil)
3369
+ # Insert a copy of the shape, not a reference so that the shape is
3370
+ # used as a stencil. Previously stamped copies don't get modified
3371
+ # if the stencil is modified.
3372
+ _shape.dup
3373
+ else
3374
+ _shape
3375
+ end
2789
3376
 
2790
3377
  # For connectors change x/y coords based on location of connected shapes.
2791
3378
  insert.auto_locate_connectors(@shapes, @shape_hash)
@@ -2818,7 +3405,7 @@ EOS
2818
3405
  drawing_type = 3
2819
3406
  drawing = Drawing.new(
2820
3407
  drawing_type, shape.dimensions, shape.width_emu, shape.height_emu,
2821
- shape.name, shape, shape.anchor, drawing_rel_index, 0, nil, 0
3408
+ shape, shape.anchor, drawing_rel_index, 0, shape.name, nil, 0
2822
3409
  )
2823
3410
  drawings.add_drawing_object(drawing)
2824
3411
  end
@@ -2836,32 +3423,31 @@ EOS
2836
3423
  # Set the button caption.
2837
3424
  caption = params[:caption] || "Button #{button_number}"
2838
3425
 
2839
- button.font = { :_caption => caption }
3426
+ button.font = { _caption: caption }
2840
3427
 
2841
3428
  # Set the macro name.
2842
- if params[:macro]
2843
- button.macro = "[0]!#{params[:macro]}"
2844
- else
2845
- button.macro = "[0]!Button#{button_number}_Click"
2846
- end
3429
+ button.macro = if params[:macro]
3430
+ "[0]!#{params[:macro]}"
3431
+ else
3432
+ "[0]!Button#{button_number}_Click"
3433
+ end
3434
+
3435
+ # Set the alt text for the button.
3436
+ button.description = params[:description]
2847
3437
 
2848
3438
  # Ensure that a width and height have been set.
2849
3439
  default_width = @default_col_pixels
2850
3440
  default_height = @default_row_pixels
2851
- params[:width] = default_width if !params[:width]
2852
- params[:height] = default_height if !params[:height]
3441
+ params[:width] = default_width unless params[:width]
3442
+ params[:height] = default_height unless params[:height]
2853
3443
 
2854
3444
  # Set the x/y offsets.
2855
- params[:x_offset] = 0 if !params[:x_offset]
2856
- params[:y_offset] = 0 if !params[:y_offset]
3445
+ params[:x_offset] = 0 unless params[:x_offset]
3446
+ params[:y_offset] = 0 unless params[:y_offset]
2857
3447
 
2858
3448
  # Scale the size of the button box if required.
2859
- if params[:x_scale]
2860
- params[:width] = params[:width] * params[:x_scale]
2861
- end
2862
- if params[:y_scale]
2863
- params[:height] = params[:height] * params[:y_scale]
2864
- end
3449
+ params[:width] = params[:width] * params[:x_scale] if params[:x_scale]
3450
+ params[:height] = params[:height] * params[:y_scale] if params[:y_scale]
2865
3451
 
2866
3452
  # Round the dimensions to the nearest pixel.
2867
3453
  params[:width] = (0.5 + params[:width]).to_i
@@ -2889,34 +3475,28 @@ EOS
2889
3475
  end
2890
3476
 
2891
3477
  #
2892
- # Based on the algorithm provided by Daniel Rentz of OpenOffice.
2893
- #
2894
- def encode_password(password) #:nodoc:
2895
- i = 0
2896
- chars = password.split(//)
2897
- count = chars.size
3478
+ # Hash a worksheet password. Based on the algorithm in ECMA-376-4:2016,
3479
+ # Office Open XML File Foemats -- Transitional Migration Features,
3480
+ # Additional attributes for workbookProtection element (Part 1, §18.2.29). #
3481
+ def encode_password(password) # :nodoc:
3482
+ hash = 0
2898
3483
 
2899
- chars.collect! do |char|
2900
- i += 1
2901
- char = char.ord << i
2902
- low_15 = char & 0x7fff
2903
- high_15 = char & 0x7fff << 15
2904
- high_15 = high_15 >> 15
2905
- char = low_15 | high_15
3484
+ password.reverse.split("").each do |char|
3485
+ hash = ((hash >> 14) & 0x01) | ((hash << 1) & 0x7fff)
3486
+ hash ^= char.ord
2906
3487
  end
2907
3488
 
2908
- encoded_password = 0x0000
2909
- chars.each { |c| encoded_password ^= c }
2910
- encoded_password ^= count
2911
- encoded_password ^= 0xCE4B
3489
+ hash = ((hash >> 14) & 0x01) | ((hash << 1) & 0x7fff)
3490
+ hash ^= password.length
3491
+ hash ^= 0xCE4B
2912
3492
 
2913
- sprintf("%X", encoded_password)
3493
+ sprintf("%X", hash)
2914
3494
  end
2915
3495
 
2916
3496
  #
2917
3497
  # Write the <worksheet> element. This is the root element of Worksheet.
2918
3498
  #
2919
- def write_worksheet_attributes #:nodoc:
3499
+ def write_worksheet_attributes # :nodoc:
2920
3500
  schema = 'http://schemas.openxmlformats.org/'
2921
3501
  attributes = [
2922
3502
  ['xmlns', "#{schema}spreadsheetml/2006/main"],
@@ -2934,7 +3514,7 @@ EOS
2934
3514
  #
2935
3515
  # Write the <sheetPr> element for Sheet level properties.
2936
3516
  #
2937
- def write_sheet_pr #:nodoc:
3517
+ def write_sheet_pr # :nodoc:
2938
3518
  return unless tab_outline_fit? || vba_codename? || filter_on?
2939
3519
 
2940
3520
  attributes = []
@@ -2959,14 +3539,14 @@ EOS
2959
3539
  #
2960
3540
  # Write the <pageSetUpPr> element.
2961
3541
  #
2962
- def write_page_set_up_pr #:nodoc:
2963
- @writer.empty_tag('pageSetUpPr', [ ['fitToPage', 1] ]) if fit_page?
3542
+ def write_page_set_up_pr # :nodoc:
3543
+ @writer.empty_tag('pageSetUpPr', [['fitToPage', 1]]) if fit_page?
2964
3544
  end
2965
3545
 
2966
3546
  # Write the <dimension> element. This specifies the range of cells in the
2967
3547
  # worksheet. As a special case, empty spreadsheets use 'A1' as a range.
2968
3548
  #
2969
- def write_dimension #:nodoc:
3549
+ def write_dimension # :nodoc:
2970
3550
  if !@dim_rowmin && !@dim_colmin
2971
3551
  # If the min dims are undefined then no dimensions have been set
2972
3552
  # and we use the default 'A1'.
@@ -2992,16 +3572,17 @@ EOS
2992
3572
  cell_2 = xl_rowcol_to_cell(@dim_rowmax, @dim_colmax)
2993
3573
  ref = cell_1 + ':' + cell_2
2994
3574
  end
2995
- @writer.empty_tag('dimension', [ ['ref', ref] ])
3575
+ @writer.empty_tag('dimension', [['ref', ref]])
2996
3576
  end
3577
+
2997
3578
  #
2998
3579
  # Write the <sheetViews> element.
2999
3580
  #
3000
- def write_sheet_views #:nodoc:
3581
+ def write_sheet_views # :nodoc:
3001
3582
  @writer.tag_elements('sheetViews', []) { write_sheet_view }
3002
3583
  end
3003
3584
 
3004
- def write_sheet_view #:nodoc:
3585
+ def write_sheet_view # :nodoc:
3005
3586
  attributes = []
3006
3587
  # Hide screen gridlines if required.
3007
3588
  attributes << ['showGridLines', 0] unless @screen_gridlines
@@ -3022,13 +3603,27 @@ EOS
3022
3603
  attributes << ["showOutlineSymbols", 0] if @outline_on
3023
3604
 
3024
3605
  # Set the page view/layout mode if required.
3025
- # TODO. Add pageBreakPreview mode when requested.
3026
- attributes << ['view', 'pageLayout'] if page_view?
3606
+ case @page_view
3607
+ when 1
3608
+ attributes << %w[view pageLayout]
3609
+ when 2
3610
+ attributes << %w[view pageBreakPreview]
3611
+ end
3612
+
3613
+ # Set the first visible cell.
3614
+ attributes << ['topLeftCell', @top_left_cell] if ptrue?(@top_left_cell)
3027
3615
 
3028
3616
  # Set the zoom level.
3029
3617
  if @zoom != 100
3030
- attributes << ['zoomScale', @zoom] unless page_view?
3031
- attributes << ['zoomScaleNormal', @zoom] if zoom_scale_normal?
3618
+ attributes << ['zoomScale', @zoom]
3619
+
3620
+ if @page_view == 1
3621
+ attributes << ['zoomScalePageLayoutView', @zoom]
3622
+ elsif @page_view == 2
3623
+ attributes << ['zoomScaleSheetLayoutView', @zoom]
3624
+ elsif ptrue?(@zoom_scale_normal)
3625
+ attributes << ['zoomScaleNormal', @zoom]
3626
+ end
3032
3627
  end
3033
3628
 
3034
3629
  attributes << ['workbookViewId', 0]
@@ -3046,14 +3641,14 @@ EOS
3046
3641
  #
3047
3642
  # Write the <selection> elements.
3048
3643
  #
3049
- def write_selections #:nodoc:
3644
+ def write_selections # :nodoc:
3050
3645
  @selections.each { |selection| write_selection(*selection) }
3051
3646
  end
3052
3647
 
3053
3648
  #
3054
3649
  # Write the <selection> element.
3055
3650
  #
3056
- def write_selection(pane, active_cell, sqref) #:nodoc:
3651
+ def write_selection(pane, active_cell, sqref) # :nodoc:
3057
3652
  attributes = []
3058
3653
  attributes << ['pane', pane] if pane
3059
3654
  attributes << ['activeCell', active_cell] if active_cell
@@ -3065,71 +3660,94 @@ EOS
3065
3660
  #
3066
3661
  # Write the <sheetFormatPr> element.
3067
3662
  #
3068
- def write_sheet_format_pr #:nodoc:
3069
- base_col_width = 10
3070
-
3663
+ def write_sheet_format_pr # :nodoc:
3071
3664
  attributes = [
3072
3665
  ['defaultRowHeight', @default_row_height]
3073
3666
  ]
3074
- if @default_row_height != @original_row_height
3075
- attributes << ['customHeight', 1]
3076
- end
3667
+ attributes << ['customHeight', 1] if @default_row_height != @original_row_height
3077
3668
 
3078
- if ptrue?(@default_row_zeroed)
3079
- attributes << ['zeroHeight', 1]
3080
- end
3669
+ attributes << ['zeroHeight', 1] if ptrue?(@default_row_zeroed)
3081
3670
 
3082
3671
  attributes << ['outlineLevelRow', @outline_row_level] if @outline_row_level > 0
3083
3672
  attributes << ['outlineLevelCol', @outline_col_level] if @outline_col_level > 0
3084
- if @excel_version == 2010
3085
- attributes << ['x14ac:dyDescent', '0.25']
3086
- end
3673
+ attributes << ['x14ac:dyDescent', '0.25'] if @excel_version == 2010
3087
3674
  @writer.empty_tag('sheetFormatPr', attributes)
3088
3675
  end
3089
3676
 
3090
3677
  #
3091
3678
  # Write the <cols> element and <col> sub elements.
3092
3679
  #
3093
- def write_cols #:nodoc:
3680
+ def write_cols # :nodoc:
3094
3681
  # Exit unless some column have been formatted.
3095
- return if @colinfo.empty?
3682
+ return if @col_info.empty?
3096
3683
 
3097
3684
  @writer.tag_elements('cols') do
3098
- @colinfo.keys.sort.each {|col| write_col_info(@colinfo[col]) }
3685
+ # Use the first element of the column informatin structure to set
3686
+ # the initial/previous properties.
3687
+ first_col = @col_info.keys.min
3688
+ last_col = first_col
3689
+ previous_options = @col_info[first_col]
3690
+ deleted_col = first_col
3691
+ deleted_col_options = previous_options
3692
+
3693
+ @col_info.delete(first_col)
3694
+
3695
+ @col_info.keys.sort.each do |col|
3696
+ col_options = @col_info[col]
3697
+
3698
+ # Check if the column number is contiguous with the previous
3699
+ # column and if the properties are the same.
3700
+ if (col == last_col + 1) &&
3701
+ compare_col_info(col_options, previous_options)
3702
+ last_col = col
3703
+ else
3704
+ # If not contiguous/equal then we write out the current range
3705
+ # of columns and start again.
3706
+ write_col_info([first_col, last_col, previous_options])
3707
+ first_col = col
3708
+ last_col = first_col
3709
+ previous_options = col_options
3710
+ end
3711
+ end
3712
+
3713
+ # We will exit the previous loop with one unhandled column range.
3714
+ write_col_info([first_col, last_col, previous_options])
3715
+
3716
+ # Put back the deleted first column information structure:
3717
+ @col_info[deleted_col] = deleted_col_options
3099
3718
  end
3100
3719
  end
3101
3720
 
3102
3721
  #
3103
3722
  # Write the <col> element.
3104
3723
  #
3105
- def write_col_info(args) #:nodoc:
3724
+ def write_col_info(args) # :nodoc:
3106
3725
  @writer.empty_tag('col', col_info_attributes(args))
3107
3726
  end
3108
3727
 
3109
3728
  def col_info_attributes(args)
3110
- min = args[0] || 0 # First formatted column.
3111
- max = args[1] || 0 # Last formatted column.
3112
- width = args[2] # Col width in user units.
3113
- format = args[3] # Format index.
3114
- hidden = args[4] || 0 # Hidden flag.
3115
- level = args[5] || 0 # Outline level.
3116
- collapsed = args[6] || 0 # Outline level.
3729
+ min = args[0] || 0 # First formatted column.
3730
+ max = args[1] || 0 # Last formatted column.
3731
+ width = args[2].width # Col width in user units.
3732
+ format = args[2].format # Format index.
3733
+ hidden = args[2].hidden || 0 # Hidden flag.
3734
+ level = args[2].level || 0 # Outline level.
3735
+ collapsed = args[2].collapsed || 0 # Outline Collapsed
3736
+ autofit = args[2].autofit || 0 # Best fit for autofit numbers.
3117
3737
  xf_index = format ? format.get_xf_index : 0
3118
3738
 
3119
3739
  custom_width = true
3120
3740
  custom_width = false if width.nil? && hidden == 0
3121
3741
  custom_width = false if width == 8.43
3122
3742
 
3123
- width = hidden == 0 ? @default_col_width : 0 unless width
3743
+ width ||= hidden == 0 ? @default_col_width : 0
3124
3744
 
3125
3745
  # Convert column width from user units to character width.
3126
- if width && width < 1
3127
- width =
3128
- ((width * (MAX_DIGIT_WIDTH + PADDING) + 0.5).to_i / MAX_DIGIT_WIDTH.to_f * 256).to_i / 256.0
3129
- else
3130
- width =
3131
- (((width * MAX_DIGIT_WIDTH + 0.5).to_i + PADDING).to_i/ MAX_DIGIT_WIDTH.to_f * 256).to_i / 256.0
3132
- end
3746
+ width = if width && width < 1
3747
+ (((width * (MAX_DIGIT_WIDTH + PADDING)) + 0.5).to_i / MAX_DIGIT_WIDTH.to_f * 256).to_i / 256.0
3748
+ else
3749
+ ((((width * MAX_DIGIT_WIDTH) + 0.5).to_i + PADDING).to_i / MAX_DIGIT_WIDTH.to_f * 256).to_i / 256.0
3750
+ end
3133
3751
  width = width.to_i if width - width.to_i == 0
3134
3752
 
3135
3753
  attributes = [
@@ -3138,10 +3756,11 @@ EOS
3138
3756
  ['width', width]
3139
3757
  ]
3140
3758
 
3141
- attributes << ['style', xf_index] if xf_index != 0
3142
- attributes << ['hidden', 1] if hidden != 0
3759
+ attributes << ['style', xf_index] if xf_index != 0
3760
+ attributes << ['hidden', 1] if hidden != 0
3761
+ attributes << ['bestFit', 1] if autofit != 0
3143
3762
  attributes << ['customWidth', 1] if custom_width
3144
- attributes << ['outlineLevel', level] if level != 0
3763
+ attributes << ['outlineLevel', level] if level != 0
3145
3764
  attributes << ['collapsed', 1] if collapsed != 0
3146
3765
  attributes
3147
3766
  end
@@ -3149,22 +3768,22 @@ EOS
3149
3768
  #
3150
3769
  # Write the <sheetData> element.
3151
3770
  #
3152
- def write_sheet_data #:nodoc:
3153
- if !@dim_rowmin
3771
+ def write_sheet_data # :nodoc:
3772
+ if @dim_rowmin
3773
+ @writer.tag_elements('sheetData') { write_rows }
3774
+ else
3154
3775
  # If the dimensions aren't defined then there is no data to write.
3155
3776
  @writer.empty_tag('sheetData')
3156
- else
3157
- @writer.tag_elements('sheetData') { write_rows }
3158
3777
  end
3159
3778
  end
3160
3779
 
3161
3780
  #
3162
3781
  # Write out the worksheet data as a series of rows and cells.
3163
3782
  #
3164
- def write_rows #:nodoc:
3783
+ def write_rows # :nodoc:
3165
3784
  calculate_spans
3166
3785
 
3167
- (@dim_rowmin .. @dim_rowmax).each do |row_num|
3786
+ (@dim_rowmin..@dim_rowmax).each do |row_num|
3168
3787
  # Skip row if it doesn't contain row formatting or cell data.
3169
3788
  next if not_contain_formatting_or_data?(row_num)
3170
3789
 
@@ -3177,8 +3796,6 @@ EOS
3177
3796
  write_row_element(row_num, span, *args) do
3178
3797
  write_cell_column_dimension(row_num)
3179
3798
  end
3180
- elsif @comments[row_num]
3181
- write_empty_row(row_num, span, *(@set_rows[row_num]))
3182
3799
  else
3183
3800
  # Row attributes only.
3184
3801
  write_empty_row(row_num, span, *(@set_rows[row_num]))
@@ -3191,29 +3808,31 @@ EOS
3191
3808
  end
3192
3809
 
3193
3810
  def write_cell_column_dimension(row_num) # :nodoc:
3194
- (@dim_colmin .. @dim_colmax).each do |col_num|
3195
- @cell_data_table[row_num][col_num].write_cell if @cell_data_table[row_num][col_num]
3811
+ row = @cell_data_table[row_num]
3812
+ row_name = (row_num + 1).to_s
3813
+ (@dim_colmin..@dim_colmax).each do |col_num|
3814
+ if (cell = row[col_num])
3815
+ cell.write_cell(self, row_num, row_name, col_num)
3816
+ end
3196
3817
  end
3197
3818
  end
3198
3819
 
3199
3820
  #
3200
3821
  # Write the <row> element.
3201
3822
  #
3202
- def write_row_element(*args) # :nodoc:
3203
- @writer.tag_elements('row', row_attributes(args)) do
3204
- yield
3205
- end
3823
+ def write_row_element(*args, &block) # :nodoc:
3824
+ @writer.tag_elements('row', row_attributes(args), &block)
3206
3825
  end
3207
3826
 
3208
3827
  #
3209
3828
  # Write and empty <row> element, i.e., attributes only, no cell data.
3210
3829
  #
3211
- def write_empty_row(*args) #:nodoc:
3830
+ def write_empty_row(*args) # :nodoc:
3212
3831
  @writer.empty_tag('row', row_attributes(args))
3213
3832
  end
3214
3833
 
3215
3834
  def row_attributes(args)
3216
- r, spans, height, format, hidden, level, collapsed, empty_row = args
3835
+ r, spans, height, format, hidden, level, collapsed, _empty_row = args
3217
3836
  height ||= @default_row_height
3218
3837
  hidden ||= 0
3219
3838
  level ||= 0
@@ -3230,36 +3849,34 @@ EOS
3230
3849
  attributes << ['outlineLevel', level] if ptrue?(level)
3231
3850
  attributes << ['collapsed', 1] if ptrue?(collapsed)
3232
3851
 
3233
- if @excel_version == 2010
3234
- attributes << ['x14ac:dyDescent', '0.25']
3235
- end
3852
+ attributes << ['x14ac:dyDescent', '0.25'] if @excel_version == 2010
3236
3853
  attributes
3237
3854
  end
3238
3855
 
3239
3856
  #
3240
3857
  # Write the frozen or split <pane> elements.
3241
3858
  #
3242
- def write_panes #:nodoc:
3859
+ def write_panes # :nodoc:
3243
3860
  return if @panes.empty?
3244
3861
 
3245
3862
  if @panes[4] == 2
3246
3863
  write_split_panes
3247
3864
  else
3248
- write_freeze_panes(*(@panes))
3865
+ write_freeze_panes(*@panes)
3249
3866
  end
3250
3867
  end
3251
3868
 
3252
3869
  #
3253
3870
  # Write the <pane> element for freeze panes.
3254
3871
  #
3255
- def write_freeze_panes(row, col, top_row, left_col, type) #:nodoc:
3872
+ def write_freeze_panes(row, col, top_row, left_col, type) # :nodoc:
3256
3873
  y_split = row
3257
3874
  x_split = col
3258
3875
  top_left_cell = xl_rowcol_to_cell(top_row, left_col)
3259
3876
 
3260
3877
  # Move user cell selection to the panes.
3261
3878
  unless @selections.empty?
3262
- dummy, active_cell, sqref = @selections[0]
3879
+ _dummy, active_cell, sqref = @selections[0]
3263
3880
  @selections = []
3264
3881
  end
3265
3882
 
@@ -3268,13 +3885,13 @@ EOS
3268
3885
  active_pane = set_active_pane_and_cell_selections(row, col, row, col, active_cell, sqref)
3269
3886
 
3270
3887
  # Set the pane type.
3271
- if type == 0
3272
- state = 'frozen'
3273
- elsif type == 1
3274
- state = 'frozenSplit'
3275
- else
3276
- state = 'split'
3277
- end
3888
+ state = if type == 0
3889
+ 'frozen'
3890
+ elsif type == 1
3891
+ 'frozenSplit'
3892
+ else
3893
+ 'split'
3894
+ end
3278
3895
 
3279
3896
  attributes = []
3280
3897
  attributes << ['xSplit', x_split] if x_split > 0
@@ -3291,35 +3908,35 @@ EOS
3291
3908
  #
3292
3909
  # See also, implementers note for split_panes().
3293
3910
  #
3294
- def write_split_panes #:nodoc:
3911
+ def write_split_panes # :nodoc:
3295
3912
  row, col, top_row, left_col = @panes
3296
3913
  has_selection = false
3297
3914
  y_split = row
3298
3915
  x_split = col
3299
3916
 
3300
3917
  # Move user cell selection to the panes.
3301
- if !@selections.empty?
3302
- dummy, active_cell, sqref = @selections[0]
3918
+ unless @selections.empty?
3919
+ _dummy, active_cell, sqref = @selections[0]
3303
3920
  @selections = []
3304
3921
  has_selection = true
3305
3922
  end
3306
3923
 
3307
3924
  # Convert the row and col to 1/20 twip units with padding.
3308
- y_split = (20 * y_split + 300).to_i if y_split > 0
3925
+ y_split = ((20 * y_split) + 300).to_i if y_split > 0
3309
3926
  x_split = calculate_x_split_width(x_split) if x_split > 0
3310
3927
 
3311
3928
  # For non-explicit topLeft definitions, estimate the cell offset based
3312
3929
  # on the pixels dimensions. This is only a workaround and doesn't take
3313
3930
  # adjusted cell dimensions into account.
3314
3931
  if top_row == row && left_col == col
3315
- top_row = (0.5 + (y_split - 300) / 20 / 15).to_i
3316
- left_col = (0.5 + (x_split - 390) / 20 / 3 * 4 / 64).to_i
3932
+ top_row = (0.5 + ((y_split - 300) / 20 / 15)).to_i
3933
+ left_col = (0.5 + ((x_split - 390) / 20 / 3 * 4 / 64)).to_i
3317
3934
  end
3318
3935
 
3319
3936
  top_left_cell = xl_rowcol_to_cell(top_row, left_col)
3320
3937
 
3321
3938
  # If there is no selection set the active cell to the top left cell.
3322
- if !has_selection
3939
+ unless has_selection
3323
3940
  active_cell = top_left_cell
3324
3941
  sqref = top_left_cell
3325
3942
  end
@@ -3339,13 +3956,13 @@ EOS
3339
3956
  #
3340
3957
  # Convert column width from user units to pane split width.
3341
3958
  #
3342
- def calculate_x_split_width(width) #:nodoc:
3959
+ def calculate_x_split_width(width) # :nodoc:
3343
3960
  # Convert to pixels.
3344
- if width < 1
3345
- pixels = int(width * 12 + 0.5)
3346
- else
3347
- pixels = (width * MAX_DIGIT_WIDTH + 0.5).to_i + PADDING
3348
- end
3961
+ pixels = if width < 1
3962
+ int((width * 12) + 0.5)
3963
+ else
3964
+ ((width * MAX_DIGIT_WIDTH) + 0.5).to_i + PADDING
3965
+ end
3349
3966
 
3350
3967
  # Convert to points.
3351
3968
  points = pixels * 3 / 4
@@ -3360,17 +3977,17 @@ EOS
3360
3977
  #
3361
3978
  # Write the <sheetCalcPr> element for the worksheet calculation properties.
3362
3979
  #
3363
- def write_sheet_calc_pr #:nodoc:
3364
- @writer.empty_tag('sheetCalcPr', [ ['fullCalcOnLoad', 1] ])
3980
+ def write_sheet_calc_pr # :nodoc:
3981
+ @writer.empty_tag('sheetCalcPr', [['fullCalcOnLoad', 1]])
3365
3982
  end
3366
3983
 
3367
3984
  #
3368
3985
  # Write the <phoneticPr> element.
3369
3986
  #
3370
- def write_phonetic_pr #:nodoc:
3987
+ def write_phonetic_pr # :nodoc:
3371
3988
  attributes = [
3372
3989
  ['fontId', 0],
3373
- ['type', 'noConversion']
3990
+ %w[type noConversion]
3374
3991
  ]
3375
3992
 
3376
3993
  @writer.empty_tag('phoneticPr', attributes)
@@ -3379,82 +3996,80 @@ EOS
3379
3996
  #
3380
3997
  # Write the <pageMargins> element.
3381
3998
  #
3382
- def write_page_margins #:nodoc:
3999
+ def write_page_margins # :nodoc:
3383
4000
  @page_setup.write_page_margins(@writer)
3384
4001
  end
3385
4002
 
3386
4003
  #
3387
4004
  # Write the <pageSetup> element.
3388
4005
  #
3389
- def write_page_setup #:nodoc:
4006
+ def write_page_setup # :nodoc:
3390
4007
  @page_setup.write_page_setup(@writer)
3391
4008
  end
3392
4009
 
3393
4010
  #
3394
4011
  # Write the <mergeCells> element.
3395
4012
  #
3396
- def write_merge_cells #:nodoc:
4013
+ def write_merge_cells # :nodoc:
3397
4014
  write_some_elements('mergeCells', @merge) do
3398
4015
  @merge.each { |merged_range| write_merge_cell(merged_range) }
3399
4016
  end
3400
4017
  end
3401
4018
 
3402
- def write_some_elements(tag, container)
4019
+ def write_some_elements(tag, container, &block)
3403
4020
  return if container.empty?
3404
4021
 
3405
- @writer.tag_elements(tag, [ ['count', container.size] ]) do
3406
- yield
3407
- end
4022
+ @writer.tag_elements(tag, [['count', container.size]], &block)
3408
4023
  end
3409
4024
 
3410
4025
  #
3411
4026
  # Write the <mergeCell> element.
3412
4027
  #
3413
- def write_merge_cell(merged_range) #:nodoc:
4028
+ def write_merge_cell(merged_range) # :nodoc:
3414
4029
  row_min, col_min, row_max, col_max = merged_range
3415
4030
 
3416
4031
  # Convert the merge dimensions to a cell range.
3417
4032
  cell_1 = xl_rowcol_to_cell(row_min, col_min)
3418
4033
  cell_2 = xl_rowcol_to_cell(row_max, col_max)
3419
4034
 
3420
- @writer.empty_tag('mergeCell', [ ['ref', "#{cell_1}:#{cell_2}"] ])
4035
+ @writer.empty_tag('mergeCell', [['ref', "#{cell_1}:#{cell_2}"]])
3421
4036
  end
3422
4037
 
3423
4038
  #
3424
4039
  # Write the <printOptions> element.
3425
4040
  #
3426
- def write_print_options #:nodoc:
4041
+ def write_print_options # :nodoc:
3427
4042
  @page_setup.write_print_options(@writer)
3428
4043
  end
3429
4044
 
3430
4045
  #
3431
4046
  # Write the <headerFooter> element.
3432
4047
  #
3433
- def write_header_footer #:nodoc:
4048
+ def write_header_footer # :nodoc:
3434
4049
  @page_setup.write_header_footer(@writer, excel2003_style?)
3435
4050
  end
3436
4051
 
3437
4052
  #
3438
4053
  # Write the <rowBreaks> element.
3439
4054
  #
3440
- def write_row_breaks #:nodoc:
4055
+ def write_row_breaks # :nodoc:
3441
4056
  write_breaks('rowBreaks')
3442
4057
  end
3443
4058
 
3444
4059
  #
3445
4060
  # Write the <colBreaks> element.
3446
4061
  #
3447
- def write_col_breaks #:nodoc:
4062
+ def write_col_breaks # :nodoc:
3448
4063
  write_breaks('colBreaks')
3449
4064
  end
3450
4065
 
3451
4066
  def write_breaks(tag) # :nodoc:
3452
4067
  case tag
3453
4068
  when 'rowBreaks'
3454
- page_breaks = sort_pagebreaks(*(@page_setup.hbreaks))
4069
+ page_breaks = sort_pagebreaks(*@page_setup.hbreaks)
3455
4070
  max = 16383
3456
4071
  when 'colBreaks'
3457
- page_breaks = sort_pagebreaks(*(@page_setup.vbreaks))
4072
+ page_breaks = sort_pagebreaks(*@page_setup.vbreaks)
3458
4073
  max = 1048575
3459
4074
  else
3460
4075
  raise "Invalid parameter '#{tag}' in write_breaks."
@@ -3472,10 +4087,11 @@ EOS
3472
4087
  page_breaks.each { |num| write_brk(num, max) }
3473
4088
  end
3474
4089
  end
4090
+
3475
4091
  #
3476
4092
  # Write the <brk> element.
3477
4093
  #
3478
- def write_brk(id, max) #:nodoc:
4094
+ def write_brk(id, max) # :nodoc:
3479
4095
  attributes = [
3480
4096
  ['id', id],
3481
4097
  ['max', max],
@@ -3488,7 +4104,7 @@ EOS
3488
4104
  #
3489
4105
  # Write the <autoFilter> element.
3490
4106
  #
3491
- def write_auto_filter #:nodoc:
4107
+ def write_auto_filter # :nodoc:
3492
4108
  return unless autofilter_ref?
3493
4109
 
3494
4110
  attributes = [
@@ -3510,10 +4126,10 @@ EOS
3510
4126
  # Function to iterate through the columns that form part of an autofilter
3511
4127
  # range and write the appropriate filters.
3512
4128
  #
3513
- def write_autofilters #:nodoc:
4129
+ def write_autofilters # :nodoc:
3514
4130
  col1, col2 = @filter_range
3515
4131
 
3516
- (col1 .. col2).each do |col|
4132
+ (col1..col2).each do |col|
3517
4133
  # Skip if column doesn't have an active filter.
3518
4134
  next unless @filter_cols[col]
3519
4135
 
@@ -3529,8 +4145,8 @@ EOS
3529
4145
  #
3530
4146
  # Write the <filterColumn> element.
3531
4147
  #
3532
- def write_filter_column(col_id, type, *filters) #:nodoc:
3533
- @writer.tag_elements('filterColumn', [ ['colId', col_id] ]) do
4148
+ def write_filter_column(col_id, type, *filters) # :nodoc:
4149
+ @writer.tag_elements('filterColumn', [['colId', col_id]]) do
3534
4150
  if type == 1
3535
4151
  # Type == 1 is the new XLSX style filter.
3536
4152
  write_filters(*filters)
@@ -3544,13 +4160,11 @@ EOS
3544
4160
  #
3545
4161
  # Write the <filters> element.
3546
4162
  #
3547
- def write_filters(*filters) #:nodoc:
3548
- non_blanks = filters.reject { |filter| filter =~ /^blanks$/i }
4163
+ def write_filters(*filters) # :nodoc:
4164
+ non_blanks = filters.reject { |filter| filter.to_s =~ /^blanks$/i }
3549
4165
  attributes = []
3550
4166
 
3551
- if filters != non_blanks
3552
- attributes = [ ['blank', 1] ]
3553
- end
4167
+ attributes = [['blank', 1]] if filters != non_blanks
3554
4168
 
3555
4169
  if filters.size == 1 && non_blanks.empty?
3556
4170
  # Special case for blank cells only.
@@ -3566,14 +4180,14 @@ EOS
3566
4180
  #
3567
4181
  # Write the <filter> element.
3568
4182
  #
3569
- def write_filter(val) #:nodoc:
3570
- @writer.empty_tag('filter', [ ['val', val] ])
4183
+ def write_filter(val) # :nodoc:
4184
+ @writer.empty_tag('filter', [['val', val]])
3571
4185
  end
3572
4186
 
3573
4187
  #
3574
4188
  # Write the <customFilters> element.
3575
4189
  #
3576
- def write_custom_filters(*tokens) #:nodoc:
4190
+ def write_custom_filters(*tokens) # :nodoc:
3577
4191
  if tokens.size == 2
3578
4192
  # One filter expression only.
3579
4193
  @writer.tag_elements('customFilters') { write_custom_filter(*tokens) }
@@ -3581,11 +4195,11 @@ EOS
3581
4195
  # Two filter expressions.
3582
4196
 
3583
4197
  # Check if the "join" operand is "and" or "or".
3584
- if tokens[2] == 0
3585
- attributes = [ ['and', 1] ]
3586
- else
3587
- attributes = [ ['and', 0] ]
3588
- end
4198
+ attributes = if tokens[2] == 0
4199
+ [['and', 1]]
4200
+ else
4201
+ [['and', 0]]
4202
+ end
3589
4203
 
3590
4204
  # Write the two custom filters.
3591
4205
  @writer.tag_elements('customFilters', attributes) do
@@ -3598,7 +4212,7 @@ EOS
3598
4212
  #
3599
4213
  # Write the <customFilter> element.
3600
4214
  #
3601
- def write_custom_filter(operator, val) #:nodoc:
4215
+ def write_custom_filter(operator, val) # :nodoc:
3602
4216
  operators = {
3603
4217
  1 => 'lessThan',
3604
4218
  2 => 'equal',
@@ -3628,8 +4242,9 @@ EOS
3628
4242
  # Process any sored hyperlinks in row/col order and write the <hyperlinks>
3629
4243
  # element. The attributes are different for internal and external links.
3630
4244
  #
3631
- def write_hyperlinks #:nodoc:
4245
+ def write_hyperlinks # :nodoc:
3632
4246
  return unless @hyperlinks
4247
+
3633
4248
  hlink_attributes = []
3634
4249
  @hyperlinks.keys.sort.each do |row_num|
3635
4250
  # Sort the hyperlinks into column order.
@@ -3642,11 +4257,9 @@ EOS
3642
4257
  # If the cell isn't a string then we have to add the url as
3643
4258
  # the string to display
3644
4259
  if ptrue?(@cell_data_table) &&
3645
- ptrue?(@cell_data_table[row_num]) &&
3646
- ptrue?(@cell_data_table[row_num][col_num])
3647
- if @cell_data_table[row_num][col_num].display_url_string?
3648
- link.display_on
3649
- end
4260
+ ptrue?(@cell_data_table[row_num]) &&
4261
+ ptrue?(@cell_data_table[row_num][col_num]) && @cell_data_table[row_num][col_num].display_url_string?
4262
+ link.display_on
3650
4263
  end
3651
4264
 
3652
4265
  if link.respond_to?(:external_hyper_link)
@@ -3672,7 +4285,7 @@ EOS
3672
4285
  #
3673
4286
  # Write the <tabColor> element.
3674
4287
  #
3675
- def write_tab_color #:nodoc:
4288
+ def write_tab_color # :nodoc:
3676
4289
  return unless tab_color?
3677
4290
 
3678
4291
  @writer.empty_tag(
@@ -3701,7 +4314,7 @@ EOS
3701
4314
  #
3702
4315
  # Write the <sheetProtection> element.
3703
4316
  #
3704
- def write_sheet_protection #:nodoc:
4317
+ def write_sheet_protection # :nodoc:
3705
4318
  return unless protect?
3706
4319
 
3707
4320
  attributes = []
@@ -3759,14 +4372,14 @@ EOS
3759
4372
  #
3760
4373
  # Write the <drawing> elements.
3761
4374
  #
3762
- def write_drawings #:nodoc:
4375
+ def write_drawings # :nodoc:
3763
4376
  increment_rel_id_and_write_r_id('drawing') if drawings?
3764
4377
  end
3765
4378
 
3766
4379
  #
3767
4380
  # Write the <legacyDrawing> element.
3768
4381
  #
3769
- def write_legacy_drawing #:nodoc:
4382
+ def write_legacy_drawing # :nodoc:
3770
4383
  increment_rel_id_and_write_r_id('legacyDrawing') if has_vml?
3771
4384
  end
3772
4385
 
@@ -3779,7 +4392,7 @@ EOS
3779
4392
  # Increment the relationship id for any drawings or comments.
3780
4393
  @rel_count += 1
3781
4394
 
3782
- attributes = [ ['r:id', "rId#{@rel_count}"] ]
4395
+ attributes = [['r:id', "rId#{@rel_count}"]]
3783
4396
  @writer.empty_tag('legacyDrawingHF', attributes)
3784
4397
  end
3785
4398
 
@@ -3801,7 +4414,7 @@ EOS
3801
4414
  #
3802
4415
  # Write the underline font element.
3803
4416
  #
3804
- def write_underline(writer, underline) #:nodoc:
4417
+ def write_underline(writer, underline) # :nodoc:
3805
4418
  writer.empty_tag('u', underline_attributes(underline))
3806
4419
  end
3807
4420
 
@@ -3811,7 +4424,7 @@ EOS
3811
4424
  def write_table_parts
3812
4425
  return if @tables.empty?
3813
4426
 
3814
- @writer.tag_elements('tableParts', [ ['count', tables_count] ]) do
4427
+ @writer.tag_elements('tableParts', [['count', tables_count]]) do
3815
4428
  tables_count.times { increment_rel_id_and_write_r_id('tablePart') }
3816
4429
  end
3817
4430
  end
@@ -3850,7 +4463,6 @@ EOS
3850
4463
  def write_ext_list_data_bars
3851
4464
  # Write the ext element.
3852
4465
  write_ext('{78C0D931-6437-407d-A8EE-F0AAD7539E65}') do
3853
-
3854
4466
  @writer.tag_elements('x14:conditionalFormattings') do
3855
4467
  # Write each of the Excel 2010 conditional formatting data bar elements.
3856
4468
  @data_bars_2010.each do |data_bar|
@@ -3860,16 +4472,16 @@ EOS
3860
4472
  end
3861
4473
  end
3862
4474
  end
4475
+
3863
4476
  #
3864
4477
  # Write the <x14:conditionalFormatting> element.
3865
4478
  #
3866
4479
  def write_conditional_formatting_2010(data_bar)
3867
4480
  xmlns_xm = 'http://schemas.microsoft.com/office/excel/2006/main'
3868
4481
 
3869
- attributes = [ ['xmlns:xm', xmlns_xm] ]
4482
+ attributes = [['xmlns:xm', xmlns_xm]]
3870
4483
 
3871
4484
  @writer.tag_elements('x14:conditionalFormatting', attributes) do
3872
-
3873
4485
  # Write the '<x14:cfRule element.
3874
4486
  write_x14_cf_rule(data_bar)
3875
4487
 
@@ -3881,26 +4493,21 @@ EOS
3881
4493
  write_x14_cfvo(data_bar[:x14_max_type], data_bar[:max_value])
3882
4494
 
3883
4495
  # Write the x14:borderColor element.
3884
- if !ptrue?(data_bar[:bar_no_border])
3885
- write_x14_border_color(data_bar[:bar_border_color])
3886
- end
4496
+ write_x14_border_color(data_bar[:bar_border_color]) unless ptrue?(data_bar[:bar_no_border])
3887
4497
 
3888
4498
  # Write the x14:negativeFillColor element.
3889
- if !ptrue?(data_bar[:bar_negative_color_same])
3890
- write_x14_negative_fill_color(data_bar[:bar_negative_color])
3891
- end
4499
+ write_x14_negative_fill_color(data_bar[:bar_negative_color]) unless ptrue?(data_bar[:bar_negative_color_same])
3892
4500
 
3893
4501
  # Write the x14:negativeBorderColor element.
3894
4502
  if !ptrue?(data_bar[:bar_no_border]) &&
3895
4503
  !ptrue?(data_bar[:bar_negative_border_color_same])
3896
4504
  write_x14_negative_border_color(
3897
- data_bar[:bar_negative_border_color])
4505
+ data_bar[:bar_negative_border_color]
4506
+ )
3898
4507
  end
3899
4508
 
3900
4509
  # Write the x14:axisColor element.
3901
- if data_bar[:bar_axis_position] != 'none'
3902
- write_x14_axis_color(data_bar[:bar_axis_color])
3903
- end
4510
+ write_x14_axis_color(data_bar[:bar_axis_color]) if data_bar[:bar_axis_position] != 'none'
3904
4511
 
3905
4512
  # Write closing elements.
3906
4513
  @writer.end_tag('x14:dataBar')
@@ -3915,9 +4522,9 @@ EOS
3915
4522
  # Write the <cfvo> element.
3916
4523
  #
3917
4524
  def write_x14_cfvo(type, value)
3918
- attributes = [ ['type', type ] ]
4525
+ attributes = [['type', type]]
3919
4526
 
3920
- if %w(min max autoMin autoMax).include?(type)
4527
+ if %w[min max autoMin autoMax].include?(type)
3921
4528
  @writer.empty_tag('x14:cfvo', attributes)
3922
4529
  else
3923
4530
  @writer.tag_elements('x14:cfvo', attributes) do
@@ -3939,7 +4546,6 @@ EOS
3939
4546
  ]
3940
4547
 
3941
4548
  @writer.start_tag('x14:cfRule', attributes)
3942
-
3943
4549
  end
3944
4550
 
3945
4551
  #
@@ -3954,32 +4560,22 @@ EOS
3954
4560
  ['maxLength', max_length]
3955
4561
  ]
3956
4562
 
3957
- attributes << ['border', 1] if !ptrue?(data_bar[:bar_no_border])
4563
+ attributes << ['border', 1] unless ptrue?(data_bar[:bar_no_border])
3958
4564
  attributes << ['gradient', 0] if ptrue?(data_bar[:bar_solid])
3959
4565
 
3960
- if data_bar[:bar_direction] == 'left'
3961
- attributes << ['direction', 'leftToRight']
3962
- end
3963
- if data_bar[:bar_direction] == 'right'
3964
- attributes << ['direction', 'rightToLeft']
3965
- end
4566
+ attributes << %w[direction leftToRight] if data_bar[:bar_direction] == 'left'
4567
+ attributes << %w[direction rightToLeft] if data_bar[:bar_direction] == 'right'
3966
4568
 
3967
- if ptrue?(data_bar[:bar_negative_color_same])
3968
- attributes << ['negativeBarColorSameAsPositive', 1]
3969
- end
4569
+ attributes << ['negativeBarColorSameAsPositive', 1] if ptrue?(data_bar[:bar_negative_color_same])
3970
4570
 
3971
4571
  if !ptrue?(data_bar[:bar_no_border]) &&
3972
4572
  !ptrue?(data_bar[:bar_negative_border_color_same])
3973
4573
  attributes << ['negativeBarBorderColorSameAsPositive', 0]
3974
4574
  end
3975
4575
 
3976
- if data_bar[:bar_axis_position] == 'middle'
3977
- attributes << ['axisPosition', 'middle']
3978
- end
4576
+ attributes << %w[axisPosition middle] if data_bar[:bar_axis_position] == 'middle'
3979
4577
 
3980
- if data_bar[:bar_axis_position] == 'none'
3981
- attributes << ['axisPosition', 'none']
3982
- end
4578
+ attributes << %w[axisPosition none] if data_bar[:bar_axis_position] == 'none'
3983
4579
 
3984
4580
  @writer.start_tag('x14:dataBar', attributes)
3985
4581
  end
@@ -3988,7 +4584,7 @@ EOS
3988
4584
  # Write the <x14:borderColor> element.
3989
4585
  #
3990
4586
  def write_x14_border_color(rgb)
3991
- attributes = [ ['rgb', rgb] ]
4587
+ attributes = [['rgb', rgb]]
3992
4588
 
3993
4589
  @writer.empty_tag('x14:borderColor', attributes)
3994
4590
  end
@@ -3997,7 +4593,7 @@ EOS
3997
4593
  # Write the <x14:negativeFillColor> element.
3998
4594
  #
3999
4595
  def write_x14_negative_fill_color(rgb)
4000
- attributes = [ ['rgb', rgb] ]
4596
+ attributes = [['rgb', rgb]]
4001
4597
 
4002
4598
  @writer.empty_tag('x14:negativeFillColor', attributes)
4003
4599
  end
@@ -4006,7 +4602,7 @@ EOS
4006
4602
  # Write the <x14:negativeBorderColor> element.
4007
4603
  #
4008
4604
  def write_x14_negative_border_color(rgb)
4009
- attributes = [ ['rgb', rgb] ]
4605
+ attributes = [['rgb', rgb]]
4010
4606
 
4011
4607
  @writer.empty_tag('x14:negativeBorderColor', attributes)
4012
4608
  end
@@ -4015,7 +4611,7 @@ EOS
4015
4611
  # Write the <x14:axisColor> element.
4016
4612
  #
4017
4613
  def write_x14_axis_color(rgb)
4018
- attributes = [ ['rgb', rgb] ]
4614
+ attributes = [['rgb', rgb]]
4019
4615
 
4020
4616
  @writer.empty_tag('x14:axisColor', attributes)
4021
4617
  end
@@ -4026,7 +4622,6 @@ EOS
4026
4622
  def write_ext_list_sparklines
4027
4623
  # Write the ext element.
4028
4624
  write_ext('{05C60535-1F16-4fd2-B633-F4F36F0B64E0}') do
4029
-
4030
4625
  # Write the x14:sparklineGroups element.
4031
4626
  write_sparkline_groups
4032
4627
  end
@@ -4038,7 +4633,7 @@ EOS
4038
4633
  def write_sparklines(sparkline)
4039
4634
  # Write the sparkline elements.
4040
4635
  @writer.tag_elements('x14:sparklines') do
4041
- (0..sparkline[:count]-1).each do |i|
4636
+ (0..sparkline[:count] - 1).each do |i|
4042
4637
  range = sparkline[:ranges][i]
4043
4638
  location = sparkline[:locations][i]
4044
4639
 
@@ -4052,14 +4647,14 @@ EOS
4052
4647
 
4053
4648
  def sparkline_groups_attributes # :nodoc:
4054
4649
  [
4055
- ['xmlns:xm', "#{OFFICE_URL}excel/2006/main"]
4650
+ ['xmlns:xm', "#{OFFICE_URL}excel/2006/main"]
4056
4651
  ]
4057
4652
  end
4058
4653
 
4059
4654
  #
4060
4655
  # Write the <dataValidations> element.
4061
4656
  #
4062
- def write_data_validations #:nodoc:
4657
+ def write_data_validations # :nodoc:
4063
4658
  write_some_elements('dataValidations', @validations) do
4064
4659
  @validations.each { |validation| validation.write_data_validation(@writer) }
4065
4660
  end
@@ -4068,7 +4663,7 @@ EOS
4068
4663
  #
4069
4664
  # Write the Worksheet conditional formats.
4070
4665
  #
4071
- def write_conditional_formats #:nodoc:
4666
+ def write_conditional_formats # :nodoc:
4072
4667
  @cond_formats.keys.sort.each do |range|
4073
4668
  write_conditional_formatting(range, @cond_formats[range])
4074
4669
  end
@@ -4077,18 +4672,17 @@ EOS
4077
4672
  #
4078
4673
  # Write the <conditionalFormatting> element.
4079
4674
  #
4080
- def write_conditional_formatting(range, cond_formats) #:nodoc:
4081
- @writer.tag_elements('conditionalFormatting', [ ['sqref', range] ]) do
4675
+ def write_conditional_formatting(range, cond_formats) # :nodoc:
4676
+ @writer.tag_elements('conditionalFormatting', [['sqref', range]]) do
4082
4677
  cond_formats.each { |cond_format| cond_format.write_cf_rule }
4083
4678
  end
4084
4679
  end
4085
4680
 
4086
- def store_data_to_table(cell_data) #:nodoc:
4087
- row, col = cell_data.row, cell_data.col
4681
+ def store_data_to_table(cell_data, row, col) # :nodoc:
4088
4682
  if @cell_data_table[row]
4089
4683
  @cell_data_table[row][col] = cell_data
4090
4684
  else
4091
- @cell_data_table[row] = {}
4685
+ @cell_data_table[row] = []
4092
4686
  @cell_data_table[row][col] = cell_data
4093
4687
  end
4094
4688
  end
@@ -4103,44 +4697,40 @@ EOS
4103
4697
  # optimisation and isn't strictly required. However, it makes comparing
4104
4698
  # files easier.
4105
4699
  #
4106
- def calculate_spans #:nodoc:
4700
+ def calculate_spans # :nodoc:
4107
4701
  span_min = nil
4108
4702
  span_max = 0
4109
4703
  spans = []
4110
4704
 
4111
- (@dim_rowmin .. @dim_rowmax).each do |row_num|
4112
- if @cell_data_table[row_num]
4113
- span_min, span_max = calc_spans(@cell_data_table, row_num, span_min, span_max)
4114
- end
4705
+ (@dim_rowmin..@dim_rowmax).each do |row_num|
4706
+ span_min, span_max = calc_spans(@cell_data_table, row_num, span_min, span_max) if @cell_data_table[row_num]
4115
4707
 
4116
4708
  # Calculate spans for comments.
4117
- if @comments[row_num]
4118
- span_min, span_max = calc_spans(@comments, row_num, span_min, span_max)
4119
- end
4709
+ span_min, span_max = calc_spans(@comments, row_num, span_min, span_max) if @comments[row_num]
4120
4710
 
4121
- if ((row_num + 1) % 16 == 0) || (row_num == @dim_rowmax)
4122
- span_index = row_num / 16
4123
- if span_min
4124
- span_min += 1
4125
- span_max += 1
4126
- spans[span_index] = "#{span_min}:#{span_max}"
4127
- span_min = nil
4128
- end
4129
- end
4711
+ next unless ((row_num + 1) % 16 == 0) || (row_num == @dim_rowmax)
4712
+
4713
+ span_index = row_num / 16
4714
+ next unless span_min
4715
+
4716
+ span_min += 1
4717
+ span_max += 1
4718
+ spans[span_index] = "#{span_min}:#{span_max}"
4719
+ span_min = nil
4130
4720
  end
4131
4721
 
4132
4722
  @row_spans = spans
4133
4723
  end
4134
4724
 
4135
4725
  def calc_spans(data, row_num, span_min, span_max)
4136
- (@dim_colmin .. @dim_colmax).each do |col_num|
4726
+ (@dim_colmin..@dim_colmax).each do |col_num|
4137
4727
  if data[row_num][col_num]
4138
- if !span_min
4139
- span_min = col_num
4140
- span_max = col_num
4141
- else
4728
+ if span_min
4142
4729
  span_min = col_num if col_num < span_min
4143
4730
  span_max = col_num if col_num > span_max
4731
+ else
4732
+ span_min = col_num
4733
+ span_max = col_num
4144
4734
  end
4145
4735
  end
4146
4736
  end
@@ -4151,7 +4741,7 @@ EOS
4151
4741
  # Add a string to the shared string table, if it isn't already there, and
4152
4742
  # return the string index.
4153
4743
  #
4154
- def shared_string_index(str) #:nodoc:
4744
+ def shared_string_index(str) # :nodoc:
4155
4745
  @workbook.shared_string_index(str)
4156
4746
  end
4157
4747
 
@@ -4161,7 +4751,7 @@ EOS
4161
4751
  # Convert zero indexed rows and columns to the format required by worksheet
4162
4752
  # named ranges, eg, "Sheet1!$A$1:$C$13".
4163
4753
  #
4164
- def convert_name_area(row_num_1, col_num_1, row_num_2, col_num_2) #:nodoc:
4754
+ def convert_name_area(row_num_1, col_num_1, row_num_2, col_num_2) # :nodoc:
4165
4755
  range1 = ''
4166
4756
  range2 = ''
4167
4757
  row_col_only = false
@@ -4187,25 +4777,25 @@ EOS
4187
4777
  end
4188
4778
 
4189
4779
  # A repeated range is only written once (if it isn't a special case).
4190
- if range1 == range2 && !row_col_only
4191
- area = range1
4192
- else
4193
- area = "#{range1}:#{range2}"
4194
- end
4780
+ area = if range1 == range2 && !row_col_only
4781
+ range1
4782
+ else
4783
+ "#{range1}:#{range2}"
4784
+ end
4195
4785
 
4196
4786
  # Build up the print area range "Sheet1!$A$1:$C$13".
4197
4787
  "#{quote_sheetname(@name)}!#{area}"
4198
4788
  end
4199
4789
 
4200
- def fit_page? #:nodoc:
4790
+ def fit_page? # :nodoc:
4201
4791
  @page_setup.fit_page
4202
4792
  end
4203
4793
 
4204
- def filter_on? #:nodoc:
4794
+ def filter_on? # :nodoc:
4205
4795
  ptrue?(@filter_on)
4206
4796
  end
4207
4797
 
4208
- def tab_color? #:nodoc:
4798
+ def tab_color? # :nodoc:
4209
4799
  ptrue?(@tab_color)
4210
4800
  end
4211
4801
 
@@ -4217,37 +4807,33 @@ EOS
4217
4807
  ptrue?(@vba_codename)
4218
4808
  end
4219
4809
 
4220
- def zoom_scale_normal? #:nodoc:
4810
+ def zoom_scale_normal? # :nodoc:
4221
4811
  ptrue?(@zoom_scale_normal)
4222
4812
  end
4223
4813
 
4224
- def page_view? #:nodoc:
4225
- !!@page_view
4226
- end
4227
-
4228
- def right_to_left? #:nodoc:
4814
+ def right_to_left? # :nodoc:
4229
4815
  !!@right_to_left
4230
4816
  end
4231
4817
 
4232
- def show_zeros? #:nodoc:
4818
+ def show_zeros? # :nodoc:
4233
4819
  !!@show_zeros
4234
4820
  end
4235
4821
 
4236
- def protect? #:nodoc:
4822
+ def protect? # :nodoc:
4237
4823
  !!@protect
4238
4824
  end
4239
4825
 
4240
- def autofilter_ref? #:nodoc:
4826
+ def autofilter_ref? # :nodoc:
4241
4827
  !!@autofilter_ref
4242
4828
  end
4243
4829
 
4244
- def drawings? #:nodoc:
4830
+ def drawings? # :nodoc:
4245
4831
  !!@drawings
4246
4832
  end
4247
4833
 
4248
- def remove_white_space(margin) #:nodoc:
4834
+ def remove_white_space(margin) # :nodoc:
4249
4835
  if margin.respond_to?(:gsub)
4250
- margin.gsub(/[^\d\.]/, '')
4836
+ margin.gsub(/[^\d.]/, '')
4251
4837
  else
4252
4838
  margin
4253
4839
  end
@@ -4260,15 +4846,15 @@ EOS
4260
4846
  col_cell = xl_rowcol_to_cell(0, left_col)
4261
4847
 
4262
4848
  @selections <<
4263
- [ 'topRight', col_cell, col_cell ] <<
4264
- [ 'bottomLeft', row_cell, row_cell ] <<
4265
- [ 'bottomRight', active_cell, sqref ]
4849
+ ['topRight', col_cell, col_cell] <<
4850
+ ['bottomLeft', row_cell, row_cell] <<
4851
+ ['bottomRight', active_cell, sqref]
4266
4852
  elsif col > 0
4267
4853
  active_pane = 'topRight'
4268
- @selections << [ 'topRight', active_cell, sqref ]
4854
+ @selections << ['topRight', active_cell, sqref]
4269
4855
  else
4270
4856
  active_pane = 'bottomLeft'
4271
- @selections << [ 'bottomLeft', active_cell, sqref ]
4857
+ @selections << ['bottomLeft', active_cell, sqref]
4272
4858
  end
4273
4859
  active_pane
4274
4860
  end
@@ -4279,16 +4865,15 @@ EOS
4279
4865
  col_letter = col
4280
4866
 
4281
4867
  # Convert col ref to a cell ref and then to a col number.
4282
- dummy, col = substitute_cellref("#{col}1")
4868
+ _dummy, col = substitute_cellref("#{col}1")
4283
4869
  raise "Invalid column '#{col_letter}'" if col >= COL_MAX
4284
4870
  end
4285
4871
 
4286
4872
  col_first, col_last = @filter_range
4287
4873
 
4288
4874
  # Reject column if it is outside filter range.
4289
- if col < col_first or col > col_last
4290
- raise "Column '#{col}' outside autofilter column range (#{col_first} .. #{col_last})"
4291
- end
4875
+ raise "Column '#{col}' outside autofilter column range (#{col_first} .. #{col_last})" if col < col_first or col > col_last
4876
+
4292
4877
  col
4293
4878
  end
4294
4879
 
@@ -4300,21 +4885,19 @@ EOS
4300
4885
 
4301
4886
  ignore = @ignore_errors
4302
4887
 
4303
- @writer.tag_elements('ignoredErrors' ) do
4888
+ @writer.tag_elements('ignoredErrors') do
4304
4889
  {
4305
- :number_stored_as_text => 'numberStoredAsText',
4306
- :eval_error => 'evalError',
4307
- :formula_differs => 'formula',
4308
- :formula_range => 'formulaRange',
4309
- :formula_unlocked => 'unlockedFormula',
4310
- :empty_cell_reference => 'emptyCellReference',
4311
- :list_data_validation => 'listDataValidation',
4312
- :calculated_column => 'calculatedColumn',
4313
- :two_digit_text_year => 'twoDigitTextYear'
4890
+ number_stored_as_text: 'numberStoredAsText',
4891
+ eval_error: 'evalError',
4892
+ formula_differs: 'formula',
4893
+ formula_range: 'formulaRange',
4894
+ formula_unlocked: 'unlockedFormula',
4895
+ empty_cell_reference: 'emptyCellReference',
4896
+ list_data_validation: 'listDataValidation',
4897
+ calculated_column: 'calculatedColumn',
4898
+ two_digit_text_year: 'twoDigitTextYear'
4314
4899
  }.each do |key, value|
4315
- if ignore[key]
4316
- write_ignored_error(value, ignore[key])
4317
- end
4900
+ write_ignored_error(value, ignore[key]) if ignore[key]
4318
4901
  end
4319
4902
  end
4320
4903
  end