write_xlsx 1.09.3 → 1.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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