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