write_xlsx 1.09.4 → 1.10.0

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