write_xlsx 0.89.0 → 1.01.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Changes +98 -0
- data/LICENSE.txt +1 -1
- data/README.md +2 -2
- data/examples/a_simple.rb +2 -7
- data/examples/add_vba_project.rb +1 -1
- data/examples/array_formula.rb +1 -1
- data/examples/chart_area.rb +5 -2
- data/examples/chart_bar.rb +5 -2
- data/examples/chart_clustered.rb +1 -1
- data/examples/chart_column.rb +5 -2
- data/examples/chart_combined.rb +1 -1
- data/examples/chart_data_table.rb +9 -3
- data/examples/chart_data_tools.rb +25 -7
- data/examples/chart_doughnut.rb +17 -5
- data/examples/chart_gauge.rb +73 -0
- data/examples/chart_line.rb +5 -2
- data/examples/chart_pareto.rb +1 -1
- data/examples/chart_pie.rb +9 -3
- data/examples/chart_radar.rb +13 -4
- data/examples/chart_scatter.rb +5 -2
- data/examples/chart_secondary_axis.rb +5 -2
- data/examples/chart_stock.rb +1 -1
- data/examples/chart_styles.rb +1 -1
- data/examples/colors.rb +1 -1
- data/examples/conditional_format.rb +73 -46
- data/examples/data_validate.rb +1 -1
- data/examples/date_time.rb +1 -1
- data/examples/demo.rb +5 -8
- data/examples/formats.rb +1 -1
- data/examples/headers.rb +1 -1
- data/examples/hide_row_col.rb +1 -1
- data/examples/hide_sheet.rb +1 -1
- data/examples/hyperlink1.rb +5 -12
- data/examples/indent.rb +1 -1
- data/examples/macros.rb +1 -1
- data/examples/merge1.rb +1 -1
- data/examples/merge2.rb +1 -1
- data/examples/merge3.rb +1 -1
- data/examples/merge4.rb +1 -1
- data/examples/merge5.rb +1 -1
- data/examples/merge6.rb +1 -1
- data/examples/outline.rb +1 -1
- data/examples/outline_collapsed.rb +1 -1
- data/examples/panes.rb +1 -1
- data/examples/properties.rb +1 -1
- data/examples/regions.rb +1 -1
- data/examples/rich_strings.rb +1 -1
- data/examples/right_to_left.rb +1 -1
- data/examples/shape1.rb +1 -1
- data/examples/shape2.rb +1 -1
- data/examples/shape3.rb +1 -1
- data/examples/shape4.rb +1 -1
- data/examples/shape5.rb +1 -1
- data/examples/shape6.rb +1 -1
- data/examples/shape7.rb +1 -1
- data/examples/shape8.rb +1 -1
- data/examples/shape_all.rb +1 -1
- data/examples/sparklines1.rb +1 -1
- data/examples/sparklines2.rb +1 -1
- data/examples/stats.rb +1 -1
- data/examples/stats_ext.rb +1 -1
- data/examples/stocks.rb +1 -1
- data/examples/tab_colors.rb +1 -1
- data/examples/tables.rb +1 -1
- data/lib/write_xlsx/chart.rb +124 -240
- data/lib/write_xlsx/chart/area.rb +1 -1
- data/lib/write_xlsx/chart/axis.rb +4 -4
- data/lib/write_xlsx/chart/bar.rb +1 -1
- data/lib/write_xlsx/chart/caption.rb +3 -1
- data/lib/write_xlsx/chart/column.rb +1 -1
- data/lib/write_xlsx/chart/doughnut.rb +1 -1
- data/lib/write_xlsx/chart/legend.rb +14 -0
- data/lib/write_xlsx/chart/line.rb +1 -1
- data/lib/write_xlsx/chart/pie.rb +32 -15
- data/lib/write_xlsx/chart/radar.rb +1 -1
- data/lib/write_xlsx/chart/scatter.rb +1 -1
- data/lib/write_xlsx/chart/series.rb +11 -7
- data/lib/write_xlsx/chart/stock.rb +1 -1
- data/lib/write_xlsx/chartsheet.rb +35 -7
- data/lib/write_xlsx/drawing.rb +28 -8
- data/lib/write_xlsx/format.rb +19 -15
- data/lib/write_xlsx/package/comments.rb +57 -54
- data/lib/write_xlsx/package/conditional_format.rb +360 -39
- data/lib/write_xlsx/package/content_types.rb +10 -0
- data/lib/write_xlsx/package/core.rb +8 -6
- data/lib/write_xlsx/package/custom.rb +125 -0
- data/lib/write_xlsx/package/packager.rb +26 -0
- data/lib/write_xlsx/package/styles.rb +53 -21
- data/lib/write_xlsx/package/table.rb +16 -4
- data/lib/write_xlsx/shape.rb +4 -3
- data/lib/write_xlsx/sheets.rb +11 -1
- data/lib/write_xlsx/sparkline.rb +1 -1
- data/lib/write_xlsx/utility.rb +305 -35
- data/lib/write_xlsx/version.rb +1 -1
- data/lib/write_xlsx/workbook.rb +132 -12
- data/lib/write_xlsx/worksheet.rb +397 -163
- data/lib/write_xlsx/worksheet/data_validation.rb +10 -14
- data/lib/write_xlsx/worksheet/hyperlink.rb +4 -13
- data/test/chart/test_write_legend_pos.rb +9 -1
- data/test/chartsheet/test_write_sheet_protection.rb +91 -0
- data/test/drawing/test_drawing_chart_01.rb +6 -2
- data/test/drawing/test_drawing_image_01.rb +12 -3
- data/test/drawing/test_drawing_shape_01.rb +8 -5
- data/test/drawing/test_drawing_shape_02.rb +12 -5
- data/test/drawing/test_drawing_shape_03.rb +8 -5
- data/test/drawing/test_drawing_shape_04.rb +8 -24
- data/test/drawing/test_drawing_shape_05.rb +8 -5
- data/test/drawing/test_drawing_shape_06.rb +11 -6
- data/test/drawing/test_drawing_shape_07.rb +11 -6
- data/test/drawing/test_write_a_graphic_frame_locks.rb +1 -1
- data/test/drawing/test_write_c_chart.rb +1 -1
- data/test/drawing/test_write_c_nv_graphic_frame_pr.rb +1 -1
- data/test/drawing/test_write_c_nv_pr.rb +1 -1
- data/test/drawing/test_write_col.rb +1 -1
- data/test/drawing/test_write_col_off.rb +1 -1
- data/test/drawing/test_write_ext.rb +1 -1
- data/test/drawing/test_write_pos.rb +1 -1
- data/test/drawing/test_write_row.rb +1 -1
- data/test/drawing/test_write_row_off.rb +1 -1
- data/test/drawing/test_write_xfrm_extension.rb +1 -1
- data/test/drawing/test_write_xfrm_offset.rb +1 -1
- data/test/helper.rb +6 -1
- data/test/package/comments/test_comments_01.rb +54 -0
- data/test/package/comments/test_comments_02.rb +54 -0
- data/test/perl_output/chart_gauge.xlsx +0 -0
- data/test/perl_output/formats.xlsx +0 -0
- data/test/regression/_test_hyperlink31.rb +26 -0
- data/test/regression/images/happy.jpg +0 -0
- data/test/regression/images/zero_dpi.jpg +0 -0
- data/test/regression/test_array_formula03.rb +36 -0
- data/test/regression/test_autofilter08.rb +110 -0
- data/test/regression/test_autofilter09.rb +110 -0
- data/test/regression/test_autofilter10.rb +110 -0
- data/test/regression/test_chart_axis26.rb +10 -8
- data/test/regression/test_chart_axis27.rb +1 -1
- data/test/regression/test_chart_axis28.rb +1 -1
- data/test/regression/test_chart_axis29.rb +1 -1
- data/test/regression/test_chart_axis33.rb +1 -1
- data/test/regression/test_chart_axis42.rb +44 -0
- data/test/regression/test_chart_axis43.rb +44 -0
- data/test/regression/test_chart_axis44.rb +54 -0
- data/test/regression/test_chart_axis45.rb +54 -0
- data/test/regression/test_chart_axis46.rb +54 -0
- data/test/regression/test_chart_bar08.rb +3 -0
- data/test/regression/test_chart_bar11.rb +3 -0
- data/test/regression/test_chart_bar14.rb +3 -0
- data/test/regression/test_chart_chartarea05.rb +16 -17
- data/test/regression/test_chart_chartarea06.rb +49 -0
- data/test/regression/test_chart_combined10.rb +43 -0
- data/test/regression/test_chart_combined11.rb +63 -0
- data/test/regression/test_chart_data_labels25.rb +61 -0
- data/test/regression/test_chart_doughnut07.rb +37 -0
- data/test/regression/test_chart_font09.rb +1 -1
- data/test/regression/test_chart_format26.rb +48 -0
- data/test/regression/test_chart_format27.rb +58 -0
- data/test/regression/test_chart_format28.rb +52 -0
- data/test/regression/test_chart_format29.rb +59 -0
- data/test/regression/test_chart_format30.rb +53 -0
- data/test/regression/test_chart_format31.rb +60 -0
- data/test/regression/test_chart_legend03.rb +41 -0
- data/test/regression/test_chart_legend04.rb +41 -0
- data/test/regression/test_chart_legend05.rb +41 -0
- data/test/regression/test_chart_legend06.rb +41 -0
- data/test/regression/test_chart_legend07.rb +38 -0
- data/test/regression/test_chart_size03.rb +4 -1
- data/test/regression/test_chart_table03.rb +56 -0
- data/test/regression/test_comment13.rb +36 -0
- data/test/regression/test_comment14.rb +29 -0
- data/test/regression/test_cond_format14.rb +42 -0
- data/test/regression/test_cond_format15.rb +53 -0
- data/test/regression/test_cond_format16.rb +53 -0
- data/test/regression/test_cond_format17.rb +37 -0
- data/test/regression/test_cond_format18.rb +136 -0
- data/test/regression/test_cond_format19.rb +64 -0
- data/test/regression/test_cond_format20.rb +43 -0
- data/test/regression/test_date_1904_01.rb +1 -1
- data/test/regression/test_escapes04.rb +3 -0
- data/test/regression/test_escapes05.rb +3 -0
- data/test/regression/test_escapes07.rb +3 -0
- data/test/regression/test_escapes08.rb +3 -0
- data/test/regression/test_format15.rb +26 -0
- data/test/regression/test_hyperlink01.rb +3 -0
- data/test/regression/test_hyperlink02.rb +3 -0
- data/test/regression/test_hyperlink03.rb +4 -0
- data/test/regression/test_hyperlink04.rb +3 -0
- data/test/regression/test_hyperlink05.rb +3 -0
- data/test/regression/test_hyperlink06.rb +3 -0
- data/test/regression/test_hyperlink07.rb +3 -0
- data/test/regression/test_hyperlink08.rb +3 -0
- data/test/regression/test_hyperlink09.rb +3 -0
- data/test/regression/test_hyperlink10.rb +3 -0
- data/test/regression/test_hyperlink11.rb +3 -0
- data/test/regression/test_hyperlink12.rb +3 -0
- data/test/regression/test_hyperlink13.rb +3 -0
- data/test/regression/test_hyperlink14.rb +3 -0
- data/test/regression/test_hyperlink15.rb +3 -0
- data/test/regression/test_hyperlink16.rb +3 -0
- data/test/regression/test_hyperlink17.rb +3 -0
- data/test/regression/test_hyperlink18.rb +3 -0
- data/test/regression/test_hyperlink20.rb +3 -0
- data/test/regression/test_hyperlink21.rb +3 -0
- data/test/regression/test_hyperlink22.rb +3 -0
- data/test/regression/test_hyperlink23.rb +3 -0
- data/test/regression/test_hyperlink24.rb +3 -0
- data/test/regression/test_hyperlink25.rb +3 -0
- data/test/regression/test_hyperlink26.rb +3 -0
- data/test/regression/test_hyperlink27.rb +27 -0
- data/test/regression/test_hyperlink28.rb +50 -0
- data/test/regression/test_hyperlink29.rb +27 -0
- data/test/regression/test_hyperlink30.rb +36 -0
- data/test/regression/test_image08.rb +5 -4
- data/test/regression/test_image15.rb +4 -2
- data/test/regression/test_image28.rb +1 -1
- data/test/regression/test_image35.rb +26 -0
- data/test/regression/test_image36.rb +26 -0
- data/test/regression/test_image44.rb +28 -0
- data/test/regression/test_image45.rb +28 -0
- data/test/regression/test_image46.rb +29 -0
- data/test/regression/test_image47.rb +28 -0
- data/test/regression/test_object_position01.rb +26 -0
- data/test/regression/test_object_position02.rb +26 -0
- data/test/regression/test_object_position03.rb +26 -0
- data/test/regression/test_object_position04.rb +44 -0
- data/test/regression/test_object_position06.rb +28 -0
- data/test/regression/test_object_position07.rb +28 -0
- data/test/regression/test_object_position08.rb +47 -0
- data/test/regression/test_object_position09.rb +50 -0
- data/test/regression/test_object_position10.rb +28 -0
- data/test/regression/test_properties01.rb +1 -4
- data/test/regression/test_properties02.rb +1 -4
- data/test/regression/test_properties03.rb +26 -0
- data/test/regression/test_properties04.rb +61 -0
- data/test/regression/test_properties05.rb +30 -0
- data/test/regression/test_shape_connect01.rb +4 -2
- data/test/regression/test_table03.rb +3 -0
- data/test/regression/test_table04.rb +3 -0
- data/test/regression/test_table05.rb +3 -0
- data/test/regression/test_table06.rb +3 -0
- data/test/regression/test_table20.rb +34 -0
- data/test/regression/test_table21.rb +36 -0
- data/test/regression/test_table22.rb +32 -0
- data/test/regression/test_table23.rb +56 -0
- data/test/regression/test_utf8_11.rb +23 -0
- data/test/regression/xlsx_files/array_formula03.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/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_axis33.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_chartarea05.xlsx +0 -0
- data/test/regression/xlsx_files/chart_chartarea06.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_data_labels25.xlsx +0 -0
- data/test/regression/xlsx_files/chart_doughnut07.xlsx +0 -0
- data/test/regression/xlsx_files/chart_font09.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_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_table03.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/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/date_1904_01.xlsx +0 -0
- data/test/regression/xlsx_files/format15.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/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/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/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/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/utf8_11.xlsx +0 -0
- data/test/test_example_match.rb +836 -771
- data/test/workbook/test_check_sheetname.rb +61 -0
- data/test/workbook/test_worksheet_by_name.rb +35 -0
- data/test/workbook/test_write_workbook_view.rb +117 -0
- data/test/worksheet/test_cond_format_22.rb +266 -0
- data/test/worksheet/test_cond_format_23.rb +242 -0
- data/test/worksheet/test_cond_format_24.rb +303 -0
- data/test/worksheet/test_data_bar_01.rb +53 -0
- data/test/worksheet/test_data_bar_02.rb +79 -0
- data/test/worksheet/test_data_bar_03.rb +147 -0
- data/test/worksheet/test_data_bar_04.rb +145 -0
- data/test/worksheet/test_data_bar_05.rb +147 -0
- data/test/worksheet/test_data_bar_06.rb +145 -0
- data/test/worksheet/test_data_bar_07.rb +146 -0
- data/test/worksheet/test_data_bar_08.rb +54 -0
- data/test/worksheet/test_data_bar_09.rb +80 -0
- data/test/worksheet/test_data_bar_10.rb +165 -0
- data/test/worksheet/test_data_bar_11.rb +167 -0
- data/test/worksheet/test_data_bar_12.rb +104 -0
- data/test/worksheet/test_write_data_validation_02.rb +44 -0
- data/test/worksheet/test_write_hyperlink.rb +0 -7
- data/test/worksheet/test_write_sheet_view.rb +19 -1
- metadata +308 -5
- data/test/package/comments/test_write_text_t.rb +0 -44
@@ -14,28 +14,29 @@ class Comment
|
|
14
14
|
DEFAULT_HEIGHT = 74
|
15
15
|
|
16
16
|
attr_reader :row, :col, :string, :color, :vertices
|
17
|
+
attr_reader :font_size, :font_family
|
17
18
|
attr_accessor :author, :visible
|
18
19
|
|
19
20
|
def initialize(workbook, worksheet, row, col, string, options = {})
|
20
21
|
options ||= {}
|
21
|
-
@workbook
|
22
|
-
@worksheet
|
23
|
-
@row, @col
|
22
|
+
@workbook = workbook
|
23
|
+
@worksheet = worksheet
|
24
|
+
@row, @col = row, col
|
24
25
|
options_parse(row, col, options)
|
25
|
-
@string
|
26
|
-
@start_row
|
27
|
-
@start_col
|
28
|
-
@visible
|
29
|
-
@x_offset
|
30
|
-
@y_offset
|
31
|
-
@x_scale
|
32
|
-
@y_scale
|
33
|
-
@width
|
34
|
-
@height
|
35
|
-
@vertices
|
36
|
-
|
37
|
-
|
38
|
-
|
26
|
+
@string = string[0, STR_MAX]
|
27
|
+
@start_row ||= default_start_row(row)
|
28
|
+
@start_col ||= default_start_col(col)
|
29
|
+
@visible = options[:visible]
|
30
|
+
@x_offset = options[:x_offset] || default_x_offset(col)
|
31
|
+
@y_offset = options[:y_offset] || default_y_offset(row)
|
32
|
+
@x_scale = options[:x_scale] || 1
|
33
|
+
@y_scale = options[:y_scale] || 1
|
34
|
+
@width = (0.5 + (options[:width] || DEFAULT_WIDTH) * @x_scale).to_i
|
35
|
+
@height = (0.5 + (options[:height] || DEFAULT_HEIGHT) * @y_scale).to_i
|
36
|
+
@vertices = @worksheet.position_object_pixels(
|
37
|
+
@start_col, @start_row, @x_offset, @y_offset,
|
38
|
+
@width, @height
|
39
|
+
) << [@width, @height]
|
39
40
|
end
|
40
41
|
|
41
42
|
def backgrount_color(color)
|
@@ -213,24 +214,31 @@ def writer=(w)
|
|
213
214
|
@writer = w
|
214
215
|
end
|
215
216
|
|
217
|
+
def font_name
|
218
|
+
@font
|
219
|
+
end
|
220
|
+
|
216
221
|
private
|
217
222
|
|
218
223
|
def options_parse(row, col, options)
|
219
|
-
@color
|
220
|
-
@author
|
221
|
-
@start_cell
|
224
|
+
@color = backgrount_color(options[:color] || DEFAULT_COLOR)
|
225
|
+
@author = options[:author]
|
226
|
+
@start_cell = options[:start_cell]
|
222
227
|
@start_row, @start_col = if @start_cell
|
223
228
|
substitute_cellref(@start_cell)
|
224
229
|
else
|
225
230
|
[ options[:start_row], options[:start_col] ]
|
226
231
|
end
|
227
|
-
@visible
|
228
|
-
@x_offset
|
229
|
-
@y_offset
|
230
|
-
@x_scale
|
231
|
-
@y_scale
|
232
|
-
@
|
233
|
-
@
|
232
|
+
@visible = options[:visible]
|
233
|
+
@x_offset = options[:x_offset] || default_x_offset(col)
|
234
|
+
@y_offset = options[:y_offset] || default_y_offset(row)
|
235
|
+
@x_scale = options[:x_scale] || 1
|
236
|
+
@y_scale = options[:y_scale] || 1
|
237
|
+
@font = options[:font] || 'Tahoma'
|
238
|
+
@font_size = options[:font_size] || 8
|
239
|
+
@font_family = options[:font_family] || 2
|
240
|
+
@width = (0.5 + (options[:width] || DEFAULT_WIDTH) * @x_scale).to_i
|
241
|
+
@height = (0.5 + (options[:height] || DEFAULT_HEIGHT) * @y_scale).to_i
|
234
242
|
end
|
235
243
|
end
|
236
244
|
|
@@ -249,13 +257,9 @@ def [](row)
|
|
249
257
|
@comments[row]
|
250
258
|
end
|
251
259
|
|
252
|
-
def add(
|
253
|
-
|
254
|
-
|
255
|
-
else
|
256
|
-
@comments[comment.row] = {}
|
257
|
-
@comments[comment.row][comment.col] = comment
|
258
|
-
end
|
260
|
+
def add(workbook, worksheet, row, col, string, options)
|
261
|
+
@comments[row] ||= {}
|
262
|
+
@comments[row][col] = [workbook, worksheet, row, col, string, options]
|
259
263
|
end
|
260
264
|
|
261
265
|
def empty?
|
@@ -285,6 +289,10 @@ def sorted_comments
|
|
285
289
|
# We sort the comments by row and column but that isn't strictly required.
|
286
290
|
@comments.keys.sort.each do |row|
|
287
291
|
@comments[row].keys.sort.each do |col|
|
292
|
+
user_options = @comments[row][col]
|
293
|
+
comment = Comment.new(*user_options)
|
294
|
+
@comments[row][col] = comment
|
295
|
+
|
288
296
|
# Set comment visibility if required and not already user defined.
|
289
297
|
@comments[row][col].visible ||= 1 if comments_visible?
|
290
298
|
|
@@ -366,36 +374,37 @@ def write_comment(comment)
|
|
366
374
|
attributes << ['authorId', author_id]
|
367
375
|
|
368
376
|
@writer.tag_elements('comment', attributes) do
|
369
|
-
write_text(comment
|
377
|
+
write_text(comment)
|
370
378
|
end
|
371
379
|
end
|
372
380
|
|
373
381
|
#
|
374
382
|
# Write the <text> element.
|
375
383
|
#
|
376
|
-
def write_text(
|
384
|
+
def write_text(comment)
|
377
385
|
@writer.tag_elements('text') do
|
378
386
|
# Write the text r element.
|
379
|
-
write_text_r(
|
387
|
+
write_text_r(comment)
|
380
388
|
end
|
381
389
|
end
|
382
390
|
|
383
391
|
#
|
384
392
|
# Write the <r> element.
|
385
393
|
#
|
386
|
-
def write_text_r(
|
394
|
+
def write_text_r(comment)
|
387
395
|
@writer.tag_elements('r') do
|
388
396
|
# Write the rPr element.
|
389
|
-
write_r_pr
|
397
|
+
write_r_pr(comment)
|
390
398
|
# Write the text r element.
|
391
|
-
write_text_t(
|
399
|
+
write_text_t(comment)
|
392
400
|
end
|
393
401
|
end
|
394
402
|
|
395
403
|
#
|
396
404
|
# Write the text <t> element.
|
397
405
|
#
|
398
|
-
def write_text_t(
|
406
|
+
def write_text_t(comment)
|
407
|
+
text = comment.string
|
399
408
|
attributes = []
|
400
409
|
|
401
410
|
attributes << ['xml:space', 'preserve'] if text =~ /^\s/ || text =~ /\s$/
|
@@ -406,25 +415,23 @@ def write_text_t(text)
|
|
406
415
|
#
|
407
416
|
# Write the <rPr> element.
|
408
417
|
#
|
409
|
-
def write_r_pr
|
418
|
+
def write_r_pr(comment)
|
410
419
|
@writer.tag_elements('rPr') do
|
411
420
|
# Write the sz element.
|
412
|
-
write_sz
|
421
|
+
write_sz(comment.font_size)
|
413
422
|
# Write the color element.
|
414
423
|
write_color
|
415
424
|
# Write the rFont element.
|
416
|
-
write_r_font
|
425
|
+
write_r_font(comment.font_name)
|
417
426
|
# Write the family element.
|
418
|
-
write_family
|
427
|
+
write_family(comment.font_family)
|
419
428
|
end
|
420
429
|
end
|
421
430
|
|
422
431
|
#
|
423
432
|
# Write the <sz> element.
|
424
433
|
#
|
425
|
-
def write_sz
|
426
|
-
val = 8
|
427
|
-
|
434
|
+
def write_sz(val)
|
428
435
|
attributes = [ ['val', val] ]
|
429
436
|
|
430
437
|
@writer.empty_tag('sz', attributes)
|
@@ -440,9 +447,7 @@ def write_color
|
|
440
447
|
#
|
441
448
|
# Write the <rFont> element.
|
442
449
|
#
|
443
|
-
def write_r_font
|
444
|
-
val = 'Tahoma'
|
445
|
-
|
450
|
+
def write_r_font(val)
|
446
451
|
attributes = [ ['val', val] ]
|
447
452
|
|
448
453
|
@writer.empty_tag('rFont', attributes)
|
@@ -451,9 +456,7 @@ def write_r_font
|
|
451
456
|
#
|
452
457
|
# Write the <family> element.
|
453
458
|
#
|
454
|
-
def write_family
|
455
|
-
val = 2
|
456
|
-
|
459
|
+
def write_family(val)
|
457
460
|
attributes = [ ['val', val] ]
|
458
461
|
|
459
462
|
@writer.empty_tag('family', attributes)
|
@@ -7,8 +7,8 @@ class ConditionalFormat
|
|
7
7
|
|
8
8
|
def self.factory(worksheet, *args)
|
9
9
|
range, param =
|
10
|
-
|
11
|
-
|
10
|
+
Package::ConditionalFormat.new(worksheet, nil, nil).
|
11
|
+
range_param_for_conditional_formatting(*args)
|
12
12
|
|
13
13
|
case param[:type]
|
14
14
|
when 'cellIs'
|
@@ -29,6 +29,8 @@ def self.factory(worksheet, *args)
|
|
29
29
|
DataBarFormat.new(worksheet, range, param)
|
30
30
|
when 'expression'
|
31
31
|
ExpressionFormat.new(worksheet, range, param)
|
32
|
+
when 'iconSet'
|
33
|
+
IconSetFormat.new(worksheet, range, param)
|
32
34
|
else # when 'duplicateValues', 'uniqueValues'
|
33
35
|
ConditionalFormat.new(worksheet, range, param)
|
34
36
|
end
|
@@ -59,11 +61,13 @@ def write_formula_tag(data) #:nodoc:
|
|
59
61
|
#
|
60
62
|
# Write the <cfvo> element.
|
61
63
|
#
|
62
|
-
def write_cfvo(type,
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
64
|
+
def write_cfvo(type, value, criteria = nil)
|
65
|
+
attributes = [ ['type', type] ]
|
66
|
+
attributes << [ 'val', value] if value
|
67
|
+
|
68
|
+
attributes << ['gte', 0] if ptrue?(criteria)
|
69
|
+
|
70
|
+
@writer.empty_tag('cfvo', attributes)
|
67
71
|
end
|
68
72
|
|
69
73
|
def attributes
|
@@ -154,6 +158,54 @@ def bar_color
|
|
154
158
|
@param[:bar_color]
|
155
159
|
end
|
156
160
|
|
161
|
+
def bar_border_color
|
162
|
+
@param[:bar_border_color]
|
163
|
+
end
|
164
|
+
|
165
|
+
def bar_negative_color
|
166
|
+
@param[:bar_negative_color]
|
167
|
+
end
|
168
|
+
|
169
|
+
def bar_negative_color_same
|
170
|
+
@param[:bar_negative_color_same]
|
171
|
+
end
|
172
|
+
|
173
|
+
def bar_no_border
|
174
|
+
@param[:bar_no_border]
|
175
|
+
end
|
176
|
+
|
177
|
+
def bar_axis_position
|
178
|
+
@param[:bar_axis_position]
|
179
|
+
end
|
180
|
+
|
181
|
+
def bar_axis_color
|
182
|
+
@param[:bar_axis_color]
|
183
|
+
end
|
184
|
+
|
185
|
+
def icon_style
|
186
|
+
@param[:icon_style]
|
187
|
+
end
|
188
|
+
|
189
|
+
def total_icons
|
190
|
+
@param[:total_icons]
|
191
|
+
end
|
192
|
+
|
193
|
+
def icons
|
194
|
+
@param[:icons]
|
195
|
+
end
|
196
|
+
|
197
|
+
def icons_only
|
198
|
+
@param[:icons_only]
|
199
|
+
end
|
200
|
+
|
201
|
+
def reverse_icons
|
202
|
+
@param[:reverse_icons]
|
203
|
+
end
|
204
|
+
|
205
|
+
def bar_only
|
206
|
+
@param[:bar_only]
|
207
|
+
end
|
208
|
+
|
157
209
|
def range_param_for_conditional_formatting(*args) # :nodoc:
|
158
210
|
range_start_cell_for_conditional_formatting(*args)
|
159
211
|
param_for_conditional_formatting(*args)
|
@@ -274,17 +326,68 @@ def handling_of_blanks_error_types
|
|
274
326
|
@param[:mid_color] = palette_color(@param[:mid_color])
|
275
327
|
@param[:min_color] = palette_color(@param[:min_color])
|
276
328
|
when 'dataBar'
|
277
|
-
#
|
329
|
+
# Excel 2007 data bars don't use any additional formatting.
|
278
330
|
@param[:format] = nil
|
279
331
|
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
332
|
+
if !@param[:min_type]
|
333
|
+
@param[:min_type] = 'min'
|
334
|
+
@param[:x14_min_type] = 'autoMin'
|
335
|
+
else
|
336
|
+
@param[:x14_min_type] = @param[:min_type]
|
337
|
+
end
|
338
|
+
if !@param[:max_type]
|
339
|
+
@param[:max_type] = 'max'
|
340
|
+
@param[:x14_max_type] = 'autoMax'
|
341
|
+
else
|
342
|
+
@param[:x14_max_type] = @param[:max_type]
|
343
|
+
end
|
344
|
+
|
345
|
+
@param[:min_value] ||= 0
|
346
|
+
@param[:max_value] ||= 0
|
347
|
+
@param[:bar_color] ||= '#638EC6'
|
348
|
+
@param[:bar_border_color] ||= @param[:bar_color]
|
349
|
+
@param[:bar_only] ||= 0
|
350
|
+
@param[:bar_no_border] ||= 0
|
351
|
+
@param[:bar_solid] ||= 0
|
352
|
+
@param[:bar_direction] ||= ''
|
353
|
+
@param[:bar_negative_color] ||= '#FF0000'
|
354
|
+
@param[:bar_negative_border_color] ||= '#FF0000'
|
355
|
+
@param[:bar_negative_color_same] ||= 0
|
356
|
+
@param[:bar_negative_border_color_same] ||= 0
|
357
|
+
@param[:bar_axis_position] ||= ''
|
358
|
+
@param[:bar_axis_color] ||= '#000000'
|
359
|
+
|
360
|
+
@param[:bar_color] =
|
361
|
+
palette_color(@param[:bar_color])
|
362
|
+
@param[:bar_border_color] =
|
363
|
+
palette_color(@param[:bar_border_color])
|
364
|
+
@param[:bar_negative_color] =
|
365
|
+
palette_color(@param[:bar_negative_color])
|
366
|
+
@param[:bar_negative_border_color] =
|
367
|
+
palette_color(@param[:bar_negative_border_color])
|
368
|
+
@param[:bar_axis_color] =
|
369
|
+
palette_color(@param[:bar_axis_color])
|
370
|
+
end
|
371
|
+
|
372
|
+
# Adjust for 2010 style data_bar parameters.
|
373
|
+
if ptrue?(@param[:is_data_bar_2010])
|
374
|
+
@worksheet.excel_version = 2010
|
285
375
|
|
286
|
-
@param[:
|
376
|
+
if @param[:min_type] == 'min' && @param[:min_value] == 0
|
377
|
+
@param[:min_value] = nil
|
378
|
+
end
|
379
|
+
if @param[:max_type] == 'max' && @param[:max_value] == 0
|
380
|
+
@param[:max_value] = nil
|
381
|
+
end
|
382
|
+
|
383
|
+
# Store range for Excel 2010 data bars.
|
384
|
+
@param[:range] = range
|
287
385
|
end
|
386
|
+
|
387
|
+
# Strip the leading = from formulas.
|
388
|
+
@param[:min_value] = @param[:min_value].to_s.sub(/^=/, '') if @param[:min_value]
|
389
|
+
@param[:mid_value] = @param[:mid_value].to_s.sub(/^=/, '') if @param[:mid_value]
|
390
|
+
@param[:max_value] = @param[:max_value].to_s.sub(/^=/, '') if @param[:max_value]
|
288
391
|
end
|
289
392
|
|
290
393
|
def palette_color(index)
|
@@ -293,7 +396,7 @@ def palette_color(index)
|
|
293
396
|
|
294
397
|
def range_start_cell_for_conditional_formatting(*args) # :nodoc:
|
295
398
|
row1, row2, col1, col2, user_range, param =
|
296
|
-
|
399
|
+
row_col_param_for_conditional_formatting(*args)
|
297
400
|
# If the first and last cell are the same write a single cell.
|
298
401
|
if row1 == row2 && col1 == col2
|
299
402
|
range = xl_rowcol_to_cell(row1, col1)
|
@@ -336,19 +439,32 @@ def row_col_param_for_conditional_formatting(*args)
|
|
336
439
|
|
337
440
|
def param_for_conditional_formatting(*args) # :nodoc:
|
338
441
|
dummy, dummy, dummy, dummy, dummy, @param =
|
339
|
-
|
442
|
+
row_col_param_for_conditional_formatting(*args)
|
340
443
|
check_conditional_formatting_parameters(@param)
|
341
444
|
|
342
445
|
@param[:format] = @param[:format].get_dxf_index if @param[:format]
|
343
446
|
@param[:priority] = @worksheet.dxf_priority
|
447
|
+
|
448
|
+
# Check for 2010 style data_bar parameters.
|
449
|
+
%i(data_bar_2010 bar_solid bar_border_color bar_negative_color
|
450
|
+
bar_negative_color_same bar_negative_border_color
|
451
|
+
bar_negative_border_color_same bar_no_border
|
452
|
+
bar_axis_position bar_axis_color bar_direction
|
453
|
+
).each do |key|
|
454
|
+
if @param[key]
|
455
|
+
@param[:is_data_bar_2010] = 1
|
456
|
+
break
|
457
|
+
end
|
458
|
+
end
|
459
|
+
|
344
460
|
@worksheet.dxf_priority += 1
|
345
461
|
end
|
346
462
|
|
347
463
|
def check_conditional_formatting_parameters(param) # :nodoc:
|
348
464
|
# Check for valid input parameters.
|
349
|
-
|
350
|
-
|
351
|
-
|
465
|
+
if !(param.keys.uniq - valid_parameter_for_conditional_formatting).empty? ||
|
466
|
+
!param.has_key?(:type) ||
|
467
|
+
!valid_type_for_conditional_formatting.has_key?(param[:type].downcase)
|
352
468
|
raise WriteXLSXOptionParameterError, "Invalid type : #{param[:type]}"
|
353
469
|
end
|
354
470
|
|
@@ -369,6 +485,32 @@ def check_conditional_formatting_parameters(param) # :nodoc:
|
|
369
485
|
param[:maximum] = convert_date_time_if_required(param[:maximum])
|
370
486
|
end
|
371
487
|
|
488
|
+
# Set properties for icon sets.
|
489
|
+
if param[:type] == 'iconSet'
|
490
|
+
if !param[:icon_style]
|
491
|
+
raise "The 'icon_style' parameter must be specified when " +
|
492
|
+
"'type' == 'icon_set' in conditional_formatting()"
|
493
|
+
end
|
494
|
+
|
495
|
+
# Check for valid icon styles.
|
496
|
+
if !icon_set_styles[param[:icon_style]]
|
497
|
+
raise "Unknown icon style '$param->{icon_style}' for parameter " +
|
498
|
+
"'icon_style' in conditional_formatting()"
|
499
|
+
else
|
500
|
+
param[:icon_style] = icon_set_styles[param[:icon_style]]
|
501
|
+
end
|
502
|
+
|
503
|
+
# Set the number of icons for the icon style.
|
504
|
+
param[:total_icons] = 3
|
505
|
+
if param[:icon_style] =~ /^4/
|
506
|
+
param[:total_icons] = 4
|
507
|
+
elsif param[:icon_style] =~ /^5/
|
508
|
+
param[:total_icons] = 5
|
509
|
+
end
|
510
|
+
|
511
|
+
param[:icons] = set_icon_properties(param[:total_icons], param[:icons])
|
512
|
+
end
|
513
|
+
|
372
514
|
# 'Between' and 'Not between' criteria require 2 values.
|
373
515
|
if param[:criteria] == 'between' || param[:criteria] == 'notBetween'
|
374
516
|
unless param.has_key?(:minimum) || param.has_key?(:maximum)
|
@@ -400,23 +542,39 @@ def convert_date_time_if_required(val)
|
|
400
542
|
# List of valid input parameters for conditional_formatting.
|
401
543
|
def valid_parameter_for_conditional_formatting
|
402
544
|
[
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
545
|
+
:type,
|
546
|
+
:format,
|
547
|
+
:criteria,
|
548
|
+
:value,
|
549
|
+
:minimum,
|
550
|
+
:maximum,
|
551
|
+
:stop_if_true,
|
552
|
+
:min_type,
|
553
|
+
:mid_type,
|
554
|
+
:max_type,
|
555
|
+
:min_value,
|
556
|
+
:mid_value,
|
557
|
+
:max_value,
|
558
|
+
:min_color,
|
559
|
+
:mid_color,
|
560
|
+
:max_color,
|
561
|
+
:bar_color,
|
562
|
+
:bar_negative_color,
|
563
|
+
:bar_negative_color_same,
|
564
|
+
:bar_solid,
|
565
|
+
:bar_border_color,
|
566
|
+
:bar_negative_border_color,
|
567
|
+
:bar_negative_border_color_same,
|
568
|
+
:bar_no_border,
|
569
|
+
:bar_direction,
|
570
|
+
:bar_axis_position,
|
571
|
+
:bar_axis_color,
|
572
|
+
:bar_only,
|
573
|
+
:icon_style,
|
574
|
+
:reverse_icons,
|
575
|
+
:icons_only,
|
576
|
+
:icons,
|
577
|
+
:data_bar_2010
|
420
578
|
]
|
421
579
|
end
|
422
580
|
|
@@ -440,7 +598,8 @@ def valid_type_for_conditional_formatting
|
|
440
598
|
'2_color_scale' => '2_color_scale',
|
441
599
|
'3_color_scale' => '3_color_scale',
|
442
600
|
'data_bar' => 'dataBar',
|
443
|
-
'formula' => 'expression'
|
601
|
+
'formula' => 'expression',
|
602
|
+
'icon_set' => 'iconSet'
|
444
603
|
}
|
445
604
|
end
|
446
605
|
|
@@ -479,6 +638,100 @@ def valid_criteria_type_for_conditional_formatting
|
|
479
638
|
}
|
480
639
|
end
|
481
640
|
|
641
|
+
# List of valid icon styles.
|
642
|
+
def icon_set_styles
|
643
|
+
{
|
644
|
+
"3_arrows" => "3Arrows", # 1
|
645
|
+
"3_flags" => "3Flags", # 2
|
646
|
+
"3_traffic_lights_rimmed" => "3TrafficLights2", # 3
|
647
|
+
"3_symbols_circled" => "3Symbols", # 4
|
648
|
+
"4_arrows" => "4Arrows", # 5
|
649
|
+
"4_red_to_black" => "4RedToBlack", # 6
|
650
|
+
"4_traffic_lights" => "4TrafficLights", # 7
|
651
|
+
"5_arrows_gray" => "5ArrowsGray", # 8
|
652
|
+
"5_quarters" => "5Quarters", # 9
|
653
|
+
"3_arrows_gray" => "3ArrowsGray", # 10
|
654
|
+
"3_traffic_lights" => "3TrafficLights", # 11
|
655
|
+
"3_signs" => "3Signs", # 12
|
656
|
+
"3_symbols" => "3Symbols2", # 13
|
657
|
+
"4_arrows_gray" => "4ArrowsGray", # 14
|
658
|
+
"4_ratings" => "4Rating", # 15
|
659
|
+
"5_arrows" => "5Arrows", # 16
|
660
|
+
"5_ratings" => "5Rating", # 17
|
661
|
+
}
|
662
|
+
end
|
663
|
+
|
664
|
+
#
|
665
|
+
# Set the sub-properites for icons.
|
666
|
+
#
|
667
|
+
def set_icon_properties(total_icons, user_props)
|
668
|
+
props = []
|
669
|
+
|
670
|
+
# Set the default icon properties.
|
671
|
+
total_icons.times do
|
672
|
+
props << {
|
673
|
+
:criteria => 0,
|
674
|
+
:value => 0,
|
675
|
+
:type => 'percent'
|
676
|
+
}
|
677
|
+
end
|
678
|
+
|
679
|
+
# Set the default icon values based on the number of icons.
|
680
|
+
if total_icons == 3
|
681
|
+
props[0][:value] = 67
|
682
|
+
props[1][:value] = 33
|
683
|
+
elsif total_icons == 4
|
684
|
+
props[0][:value] = 75
|
685
|
+
props[1][:value] = 50
|
686
|
+
props[2][:value] = 25
|
687
|
+
elsif total_icons == 5
|
688
|
+
props[0][:value] = 80
|
689
|
+
props[1][:value] = 60
|
690
|
+
props[2][:value] = 40
|
691
|
+
props[3][:value] = 20
|
692
|
+
end
|
693
|
+
|
694
|
+
# Overwrite default properties with user defined properties.
|
695
|
+
if user_props
|
696
|
+
|
697
|
+
# Ensure we don't set user properties for lowest icon.
|
698
|
+
max_data = user_props.size
|
699
|
+
max_data = total_icons -1 if max_data >= total_icons
|
700
|
+
|
701
|
+
(0..max_data - 1).each do |i|
|
702
|
+
# Set the user defined 'value' property.
|
703
|
+
if user_props[i][:value]
|
704
|
+
props[i][:value] = user_props[i][:value].to_s.sub(/^=/, '')
|
705
|
+
end
|
706
|
+
|
707
|
+
# Set the user defined 'type' property.
|
708
|
+
if user_props[i][:type]
|
709
|
+
|
710
|
+
type = user_props[i][:type]
|
711
|
+
|
712
|
+
if type != 'percent' && type != 'percentile' &&
|
713
|
+
type != 'number' && type != 'formula'
|
714
|
+
raise "Unknown icon property type '$props->{type}' for sub-" +
|
715
|
+
"property 'type' in conditional_formatting()"
|
716
|
+
else
|
717
|
+
props[i][:type] = type
|
718
|
+
|
719
|
+
if props[i][:type] == 'number'
|
720
|
+
props[i][:type] = 'num'
|
721
|
+
end
|
722
|
+
end
|
723
|
+
end
|
724
|
+
|
725
|
+
# Set the user defined 'criteria' property.
|
726
|
+
if user_props[i][:criteria] && user_props[i][:criteria] == '>'
|
727
|
+
props[i][:criteria] = 1
|
728
|
+
end
|
729
|
+
|
730
|
+
end
|
731
|
+
end
|
732
|
+
props
|
733
|
+
end
|
734
|
+
|
482
735
|
def date_1904?
|
483
736
|
@worksheet.date_1904?
|
484
737
|
end
|
@@ -496,7 +749,15 @@ def write_cf_rule
|
|
496
749
|
write_formula_tag(maximum)
|
497
750
|
end
|
498
751
|
else
|
499
|
-
|
752
|
+
quoted_value = value.to_s
|
753
|
+
numeric_regex = /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/
|
754
|
+
# String "Cell" values must be quoted, apart from ranges.
|
755
|
+
if !(quoted_value =~ /(\$?)([A-Z]{1,3})(\$?)(\d+)/) &&
|
756
|
+
!(quoted_value =~ numeric_regex) &&
|
757
|
+
!(quoted_value =~ /^".*"$/)
|
758
|
+
quoted_value = (%Q!"#{value}"!)
|
759
|
+
end
|
760
|
+
write_cf_rule_formula_tag(quoted_value)
|
500
761
|
end
|
501
762
|
end
|
502
763
|
end
|
@@ -578,6 +839,9 @@ class DataBarFormat < ConditionalFormat
|
|
578
839
|
def write_cf_rule
|
579
840
|
@writer.tag_elements('cfRule', attributes) do
|
580
841
|
write_data_bar
|
842
|
+
if ptrue?(@param[:is_data_bar_2010])
|
843
|
+
write_data_bar_ext(@param)
|
844
|
+
end
|
581
845
|
end
|
582
846
|
end
|
583
847
|
|
@@ -585,13 +849,42 @@ def write_cf_rule
|
|
585
849
|
# Write the <dataBar> element.
|
586
850
|
#
|
587
851
|
def write_data_bar
|
588
|
-
|
852
|
+
attributes = []
|
853
|
+
|
854
|
+
if ptrue?(bar_only)
|
855
|
+
attributes << ['showValue', 0]
|
856
|
+
end
|
857
|
+
@writer.tag_elements('dataBar',attributes) do
|
589
858
|
write_cfvo(min_type, min_value)
|
590
859
|
write_cfvo(max_type, max_value)
|
591
860
|
|
592
861
|
write_color(@writer, 'rgb', bar_color)
|
593
862
|
end
|
594
863
|
end
|
864
|
+
|
865
|
+
#
|
866
|
+
# Write the <extLst> dataBar extension element.
|
867
|
+
#
|
868
|
+
def write_data_bar_ext(param)
|
869
|
+
# Create a pseudo GUID for each unique Excel 2010 data bar.
|
870
|
+
worksheet_count = @worksheet.index + 1
|
871
|
+
data_bar_count = @worksheet.data_bars_2010.size + 1
|
872
|
+
|
873
|
+
guid = sprintf(
|
874
|
+
"{DA7ABA51-AAAA-BBBB-%04X-%012X}",
|
875
|
+
worksheet_count, data_bar_count
|
876
|
+
)
|
877
|
+
|
878
|
+
# Store the 2010 data bar parameters to write the extLst elements.
|
879
|
+
param[:guid] = guid
|
880
|
+
@worksheet.data_bars_2010 << param
|
881
|
+
|
882
|
+
@writer.tag_elements('extLst') do
|
883
|
+
@worksheet.write_ext('{B025F937-C7B1-47D3-B67F-A62EFF666E3E}') do
|
884
|
+
@writer.data_element('x14:id', guid)
|
885
|
+
end
|
886
|
+
end
|
887
|
+
end
|
595
888
|
end
|
596
889
|
|
597
890
|
class ExpressionFormat < ConditionalFormat
|
@@ -599,5 +892,33 @@ def write_cf_rule
|
|
599
892
|
write_cf_rule_formula_tag(criteria)
|
600
893
|
end
|
601
894
|
end
|
895
|
+
|
896
|
+
class IconSetFormat < ConditionalFormat
|
897
|
+
def write_cf_rule
|
898
|
+
@writer.tag_elements('cfRule', attributes) do
|
899
|
+
write_icon_set
|
900
|
+
end
|
901
|
+
end
|
902
|
+
|
903
|
+
#
|
904
|
+
# Write the <iconSet> element.
|
905
|
+
#
|
906
|
+
def write_icon_set
|
907
|
+
attributes = []
|
908
|
+
# Don't set attribute for default style.
|
909
|
+
attributes = [ ['iconSet', icon_style] ] if icon_style != '3TrafficLights'
|
910
|
+
attributes << ['showValue', 0] if icons_only
|
911
|
+
attributes << ['reverse', 1] if reverse_icons
|
912
|
+
|
913
|
+
@writer.tag_elements('iconSet', attributes) do
|
914
|
+
# Write the properties for different icon styles.
|
915
|
+
if icons
|
916
|
+
icons.reverse.each do |icon|
|
917
|
+
write_cfvo(icon[:type], icon[:value], icon[:criteria])
|
918
|
+
end
|
919
|
+
end
|
920
|
+
end
|
921
|
+
end
|
922
|
+
end
|
602
923
|
end
|
603
924
|
end
|