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