write_xlsx 1.00.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 +15 -0
- data/examples/a_simple.rb +1 -1
- 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/data_validate.rb +1 -1
- data/examples/date_time.rb +1 -1
- data/examples/demo.rb +4 -1
- 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 +1 -1
- 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 +18 -13
- data/lib/write_xlsx/chart/area.rb +1 -1
- data/lib/write_xlsx/chart/bar.rb +1 -1
- data/lib/write_xlsx/chart/column.rb +1 -1
- data/lib/write_xlsx/chart/doughnut.rb +1 -1
- data/lib/write_xlsx/chart/line.rb +1 -1
- data/lib/write_xlsx/chart/pie.rb +21 -8
- data/lib/write_xlsx/chart/radar.rb +1 -1
- data/lib/write_xlsx/chart/scatter.rb +1 -1
- data/lib/write_xlsx/chart/stock.rb +1 -1
- data/lib/write_xlsx/chartsheet.rb +5 -5
- data/lib/write_xlsx/drawing.rb +28 -8
- data/lib/write_xlsx/package/comments.rb +7 -7
- 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 +18 -6
- data/lib/write_xlsx/version.rb +1 -1
- data/lib/write_xlsx/workbook.rb +5 -5
- data/lib/write_xlsx/worksheet.rb +113 -125
- 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/perl_output/chart_gauge.xlsx +0 -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_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_combined10.rb +43 -0
- data/test/regression/test_chart_combined11.rb +63 -0
- data/test/regression/test_chart_data_labels25.rb +1 -1
- data/test/regression/test_chart_doughnut07.rb +37 -0
- data/test/regression/test_chart_font09.rb +1 -1
- data/test/regression/test_chart_size03.rb +4 -1
- data/test/regression/test_comment14.rb +29 -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_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_shape_connect01.rb +4 -2
- 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_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_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/comment14.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/test_example_match.rb +836 -771
- data/test/workbook/test_check_sheetname.rb +61 -0
- metadata +75 -6
data/lib/write_xlsx/sheets.rb
CHANGED
@@ -230,10 +230,20 @@ def check_valid_sheetname(name)
|
|
230
230
|
raise 'Invalid character []:*?/\\ in worksheet name: ' + name
|
231
231
|
end
|
232
232
|
|
233
|
+
# Check that sheetname doesn't start or end with an apostrophe.
|
234
|
+
if name =~ /^'/ || name =~ /'$/
|
235
|
+
raise "Worksheet name #{name} cannot start or end with an "
|
236
|
+
end
|
237
|
+
|
238
|
+
# Check that sheetname isn't a reserved word.
|
239
|
+
if name =~ /history/i
|
240
|
+
raise "Worksheet name cannot be Excel reserved word 'History'"
|
241
|
+
end
|
242
|
+
|
233
243
|
# Check that the worksheet name doesn't already exist since this is a fatal
|
234
244
|
# error in Excel 97. The check must also exclude case insensitive matches.
|
235
245
|
unless is_sheetname_uniq?(name)
|
236
|
-
raise "
|
246
|
+
raise "apostropheWorksheet name '#{name}', with case ignored, is already used."
|
237
247
|
end
|
238
248
|
end
|
239
249
|
|
data/lib/write_xlsx/sparkline.rb
CHANGED
@@ -9,7 +9,7 @@ module Writexlsx
|
|
9
9
|
# Used in conjunction with WriteXLSX.
|
10
10
|
#
|
11
11
|
# Copyright 2000-2012, John McNamara, jmcnamara@cpan.org
|
12
|
-
# Converted to ruby by Hideo NAKAMURA,
|
12
|
+
# Converted to ruby by Hideo NAKAMURA, nakamura.hideo@gmail.com
|
13
13
|
#
|
14
14
|
class Sparkline
|
15
15
|
include Writexlsx::Utility
|
data/lib/write_xlsx/utility.rb
CHANGED
@@ -785,14 +785,14 @@ def params_to_font(params)
|
|
785
785
|
#
|
786
786
|
# Write the <c:txPr> element.
|
787
787
|
#
|
788
|
-
def write_tx_pr(
|
788
|
+
def write_tx_pr(is_y_axis, font) # :nodoc:
|
789
789
|
rotation = nil
|
790
790
|
if font && font[:_rotation]
|
791
791
|
rotation = font[:_rotation]
|
792
792
|
end
|
793
793
|
@writer.tag_elements('c:txPr') do
|
794
794
|
# Write the a:bodyPr element.
|
795
|
-
write_a_body_pr(rotation,
|
795
|
+
write_a_body_pr(rotation, is_y_axis)
|
796
796
|
# Write the a:lstStyle element.
|
797
797
|
write_a_lst_style
|
798
798
|
# Write the a:p element.
|
@@ -803,11 +803,23 @@ def write_tx_pr(horiz, font) # :nodoc:
|
|
803
803
|
#
|
804
804
|
# Write the <a:bodyPr> element.
|
805
805
|
#
|
806
|
-
def write_a_body_pr(rot,
|
807
|
-
rot = -5400000 if !rot && ptrue?(
|
806
|
+
def write_a_body_pr(rot, is_y_axis = nil) # :nodoc:
|
807
|
+
rot = -5400000 if !rot && ptrue?(is_y_axis)
|
808
808
|
attributes = []
|
809
|
-
|
810
|
-
|
809
|
+
if rot
|
810
|
+
if rot == 16_200_000
|
811
|
+
# 270 deg/stacked angle.
|
812
|
+
attributes << ['rot', 0]
|
813
|
+
attributes << ['vert', 'wordArtVert']
|
814
|
+
elsif rot == 16_260_000
|
815
|
+
# 271 deg/stacked angle.
|
816
|
+
attributes << ['rot', 0]
|
817
|
+
attributes << ['vert', 'eaVert']
|
818
|
+
else
|
819
|
+
attributes << ['rot', rot]
|
820
|
+
attributes << ['vert', 'horz']
|
821
|
+
end
|
822
|
+
end
|
811
823
|
|
812
824
|
@writer.empty_tag('a:bodyPr', attributes)
|
813
825
|
end
|
data/lib/write_xlsx/version.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
WriteXLSX_VERSION = "1.
|
1
|
+
WriteXLSX_VERSION = "1.01.0"
|
data/lib/write_xlsx/workbook.rb
CHANGED
@@ -1924,7 +1924,7 @@ def prepare_drawings #:nodoc:
|
|
1924
1924
|
shape_count = sheet.shapes.size
|
1925
1925
|
header_image_count = sheet.header_images.size
|
1926
1926
|
footer_image_count = sheet.footer_images.size
|
1927
|
-
|
1927
|
+
has_drawings = false
|
1928
1928
|
|
1929
1929
|
# Check that some image or drawing needs to be processed.
|
1930
1930
|
next if chart_count + image_count + shape_count + header_image_count + footer_image_count == 0
|
@@ -1932,7 +1932,7 @@ def prepare_drawings #:nodoc:
|
|
1932
1932
|
# Don't increase the drawing_id header/footer images.
|
1933
1933
|
if chart_count + image_count + shape_count > 0
|
1934
1934
|
drawing_id += 1
|
1935
|
-
|
1935
|
+
has_drawings = true
|
1936
1936
|
end
|
1937
1937
|
|
1938
1938
|
# Prepare the worksheet charts.
|
@@ -1981,9 +1981,9 @@ def prepare_drawings #:nodoc:
|
|
1981
1981
|
name, type, position, x_dpi, y_dpi)
|
1982
1982
|
end
|
1983
1983
|
|
1984
|
-
if
|
1985
|
-
|
1986
|
-
@drawings <<
|
1984
|
+
if has_drawings
|
1985
|
+
drawings = sheet.drawings
|
1986
|
+
@drawings << drawings
|
1987
1987
|
end
|
1988
1988
|
end
|
1989
1989
|
|
data/lib/write_xlsx/worksheet.rb
CHANGED
@@ -285,7 +285,7 @@ class Worksheet
|
|
285
285
|
PADDING = 5 # :nodoc:
|
286
286
|
|
287
287
|
attr_reader :index # :nodoc:
|
288
|
-
attr_reader :charts, :images, :tables, :shapes, :
|
288
|
+
attr_reader :charts, :images, :tables, :shapes, :drawings # :nodoc:
|
289
289
|
attr_reader :header_images, :footer_images # :nodoc:
|
290
290
|
attr_reader :vml_drawing_links # :nodoc:
|
291
291
|
attr_reader :vml_data_id # :nodoc:
|
@@ -365,6 +365,7 @@ def initialize(workbook, index, name) #:nodoc:
|
|
365
365
|
@original_row_height = 15
|
366
366
|
@default_row_height = 15
|
367
367
|
@default_row_pixels = 20
|
368
|
+
@default_col_width = 8.43
|
368
369
|
@default_col_pixels = 64
|
369
370
|
@default_row_rezoed = 0
|
370
371
|
|
@@ -768,10 +769,10 @@ def set_column(*args)
|
|
768
769
|
|
769
770
|
# Store the col sizes for use when calculating image vertices taking
|
770
771
|
# hidden columns into account. Also store the column formats.
|
771
|
-
width =
|
772
|
+
width = @default_col_width unless width
|
772
773
|
|
773
774
|
(firstcol .. lastcol).each do |col|
|
774
|
-
@col_sizes[col] = width
|
775
|
+
@col_sizes[col] = [width, hidden]
|
775
776
|
@col_formats[col] = format if format
|
776
777
|
end
|
777
778
|
end
|
@@ -2169,7 +2170,7 @@ def write_comment(*args)
|
|
2169
2170
|
@has_vml = true
|
2170
2171
|
|
2171
2172
|
# Process the properties of the cell comment.
|
2172
|
-
@comments.add(
|
2173
|
+
@comments.add(@workbook, self, row, col, string, options)
|
2173
2174
|
end
|
2174
2175
|
|
2175
2176
|
#
|
@@ -2781,7 +2782,7 @@ def write_url(*args)
|
|
2781
2782
|
store_hyperlink(row, col, hyperlink)
|
2782
2783
|
|
2783
2784
|
if hyperlinks_count > 65_530
|
2784
|
-
raise "URL '#{url}' added but
|
2785
|
+
raise "URL '#{url}' added but URL exceeds Excel's limit of 65,530 URLs per worksheet."
|
2785
2786
|
end
|
2786
2787
|
|
2787
2788
|
# Add the default URL format.
|
@@ -2990,13 +2991,25 @@ def write_date_time(*args)
|
|
2990
2991
|
#
|
2991
2992
|
def insert_chart(*args)
|
2992
2993
|
# Check for a cell reference in A1 notation and substitute row and column.
|
2993
|
-
row, col, chart,
|
2994
|
+
row, col, chart, *options = row_col_notation(args)
|
2994
2995
|
raise WriteXLSXInsufficientArgumentError if [row, col, chart].include?(nil)
|
2995
2996
|
|
2997
|
+
if options.first.class == Hash
|
2998
|
+
params = options.first
|
2999
|
+
x_offset = params[:x_offset]
|
3000
|
+
y_offset = params[:y_offset]
|
3001
|
+
x_scale = params[:x_scale]
|
3002
|
+
y_scale = params[:y_scale]
|
3003
|
+
anchor = params[:object_position]
|
3004
|
+
|
3005
|
+
else
|
3006
|
+
x_offset, y_offset, x_scale, y_scale, anchor = options
|
3007
|
+
end
|
2996
3008
|
x_offset ||= 0
|
2997
3009
|
y_offset ||= 0
|
2998
3010
|
x_scale ||= 1
|
2999
3011
|
y_scale ||= 1
|
3012
|
+
anchor ||= 1
|
3000
3013
|
|
3001
3014
|
raise "Not a Chart object in insert_chart()" unless chart.is_a?(Chart) || chart.is_a?(Chartsheet)
|
3002
3015
|
raise "Not a embedded style Chart object in insert_chart()" if chart.respond_to?(:embedded) && chart.embedded == 0
|
@@ -3014,61 +3027,36 @@ def insert_chart(*args)
|
|
3014
3027
|
x_offset = chart.x_offset if ptrue?(chart.x_offset)
|
3015
3028
|
y_offset = chart.y_offset if ptrue?(chart.y_offset)
|
3016
3029
|
|
3017
|
-
@charts << [row, col, chart, x_offset, y_offset, x_scale, y_scale]
|
3030
|
+
@charts << [row, col, chart, x_offset, y_offset, x_scale, y_scale, anchor]
|
3018
3031
|
end
|
3019
3032
|
|
3020
3033
|
#
|
3021
3034
|
# :call-seq:
|
3022
|
-
# insert_image(row, column, filename,
|
3023
|
-
#
|
3024
|
-
# Partially supported. Currently only works for 96 dpi images.
|
3025
|
-
#
|
3026
|
-
# This method can be used to insert a image into a worksheet. The image
|
3027
|
-
# can be in PNG, JPEG or BMP format. The x, y, x_scale and y_scale
|
3028
|
-
# parameters are optional.
|
3029
|
-
#
|
3030
|
-
# worksheet1.insert_image('A1', 'ruby.bmp')
|
3031
|
-
# worksheet2.insert_image('A1', '../images/ruby.bmp')
|
3032
|
-
# worksheet3.insert_image('A1', '.c:\images\ruby.bmp')
|
3033
|
-
#
|
3034
|
-
# The parameters +x+ and +y+ can be used to specify an offset from the top
|
3035
|
-
# left hand corner of the cell specified by +row+ and +column+. The offset
|
3036
|
-
# values are in pixels.
|
3037
|
-
#
|
3038
|
-
# worksheet1.insert_image('A1', 'ruby.bmp', 32, 10)
|
3039
|
-
#
|
3040
|
-
# The offsets can be greater than the width or height of the underlying
|
3041
|
-
# cell. This can be occasionally useful if you wish to align two or more
|
3042
|
-
# images relative to the same cell.
|
3043
|
-
#
|
3044
|
-
# The parameters +x_scale+ and +y_scale+ can be used to scale the inserted
|
3045
|
-
# image horizontally and vertically:
|
3046
|
-
#
|
3047
|
-
# # Scale the inserted image: width x 2.0, height x 0.8
|
3048
|
-
# worksheet.insert_image('A1', 'perl.bmp', 0, 0, 2, 0.8)
|
3049
|
-
#
|
3050
|
-
# Note: you must call set_row() or set_column() before insert_image()
|
3051
|
-
# if you wish to change the default dimensions of any of the rows or
|
3052
|
-
# columns that the image occupies. The height of a row can also change
|
3053
|
-
# if you use a font that is larger than the default. This in turn will
|
3054
|
-
# affect the scaling of your image. To avoid this you should explicitly
|
3055
|
-
# set the height of the row using set_row() if it contains a font size
|
3056
|
-
# that will change the row height.
|
3057
|
-
#
|
3058
|
-
# BMP images must be 24 bit, true colour, bitmaps. In general it is
|
3059
|
-
# best to avoid BMP images since they aren't compressed.
|
3035
|
+
# insert_image(row, column, filename, options)
|
3060
3036
|
#
|
3061
3037
|
def insert_image(*args)
|
3062
3038
|
# Check for a cell reference in A1 notation and substitute row and column.
|
3063
|
-
row, col, image,
|
3039
|
+
row, col, image, *options = row_col_notation(args)
|
3064
3040
|
raise WriteXLSXInsufficientArgumentError if [row, col, image].include?(nil)
|
3065
3041
|
|
3042
|
+
if options.first.class == Hash
|
3043
|
+
# Newer hash bashed options
|
3044
|
+
params = options.first
|
3045
|
+
x_offset = params[:x_offset]
|
3046
|
+
y_offset = params[:y_offset]
|
3047
|
+
x_scale = params[:x_scale]
|
3048
|
+
y_scale = params[:y_scale]
|
3049
|
+
anchor = params[:object_position]
|
3050
|
+
else
|
3051
|
+
x_offset, y_offset, x_scale, y_scale, anchor = options
|
3052
|
+
end
|
3066
3053
|
x_offset ||= 0
|
3067
3054
|
y_offset ||= 0
|
3068
3055
|
x_scale ||= 1
|
3069
3056
|
y_scale ||= 1
|
3057
|
+
anchor ||= 2
|
3070
3058
|
|
3071
|
-
@images << [row, col, image, x_offset, y_offset, x_scale, y_scale]
|
3059
|
+
@images << [row, col, image, x_offset, y_offset, x_scale, y_scale, anchor]
|
3072
3060
|
end
|
3073
3061
|
|
3074
3062
|
#
|
@@ -3306,10 +3294,8 @@ def set_row(*args)
|
|
3306
3294
|
# Store the row change to allow optimisations.
|
3307
3295
|
@row_size_changed = true
|
3308
3296
|
|
3309
|
-
height = 0 if ptrue?(hidden)
|
3310
|
-
|
3311
3297
|
# Store the row sizes for use when calculating image vertices.
|
3312
|
-
@row_sizes[row] = height
|
3298
|
+
@row_sizes[row] = [height, hidden]
|
3313
3299
|
end
|
3314
3300
|
|
3315
3301
|
#
|
@@ -5724,7 +5710,7 @@ def set_external_comment_links(comment_id) # :nodoc:
|
|
5724
5710
|
def prepare_chart(index, chart_id, drawing_id) # :nodoc:
|
5725
5711
|
drawing_type = 1
|
5726
5712
|
|
5727
|
-
row, col, chart, x_offset, y_offset, x_scale, y_scale = @charts[index]
|
5713
|
+
row, col, chart, x_offset, y_offset, x_scale, y_scale, anchor = @charts[index]
|
5728
5714
|
chart.id = chart_id - 1
|
5729
5715
|
x_scale ||= 0
|
5730
5716
|
y_scale ||= 0
|
@@ -5736,22 +5722,21 @@ def prepare_chart(index, chart_id, drawing_id) # :nodoc:
|
|
5736
5722
|
width = (0.5 + (width * x_scale)).to_i
|
5737
5723
|
height = (0.5 + (height * y_scale)).to_i
|
5738
5724
|
|
5739
|
-
dimensions = position_object_emus(col, row, x_offset, y_offset, width, height)
|
5725
|
+
dimensions = position_object_emus(col, row, x_offset, y_offset, width, height, anchor)
|
5740
5726
|
|
5741
5727
|
# Set the chart name for the embedded object if it has been specified.
|
5742
5728
|
name = chart.name
|
5743
5729
|
|
5744
5730
|
# Create a Drawing object to use with worksheet unless one already exists.
|
5745
|
-
|
5746
|
-
|
5747
|
-
|
5748
|
-
drawing
|
5749
|
-
|
5750
|
-
@drawing = drawing
|
5731
|
+
drawing = Drawing.new(drawing_type, dimensions, 0, 0, name, nil, anchor)
|
5732
|
+
if !drawings?
|
5733
|
+
@drawings = Drawings.new
|
5734
|
+
@drawings.add_drawing_object(drawing)
|
5735
|
+
@drawings.embedded = 1
|
5751
5736
|
|
5752
5737
|
@external_drawing_links << ['/drawing', "../drawings/drawing#{drawing_id}.xml" ]
|
5753
5738
|
else
|
5754
|
-
@
|
5739
|
+
@drawings.add_drawing_object(drawing)
|
5755
5740
|
end
|
5756
5741
|
@drawing_links << ['/chart', "../charts/chart#{chart_id}.xml"]
|
5757
5742
|
end
|
@@ -5822,6 +5807,10 @@ def get_range_data(row_start, col_start, row_end, col_end) # :nodoc:
|
|
5822
5807
|
# The values of col_start and row_start are passed in from the calling
|
5823
5808
|
# function. The values of col_end and row_end are calculated by subtracting
|
5824
5809
|
# the width and height of the object from the width and height of the
|
5810
|
+
# The anchor/object position defines how images are scaled for hidden rows and
|
5811
|
+
# columns. For option 1 "Move and size with cells" the size of the hidden
|
5812
|
+
# row/column is subtracted from the image.
|
5813
|
+
#
|
5825
5814
|
# underlying cells.
|
5826
5815
|
#
|
5827
5816
|
# col_start # Col containing upper left corner of object.
|
@@ -5834,7 +5823,7 @@ def get_range_data(row_start, col_start, row_end, col_end) # :nodoc:
|
|
5834
5823
|
# y2 # Distance to bottom of object.
|
5835
5824
|
# width # Width of object frame.
|
5836
5825
|
# height # Height of object frame.
|
5837
|
-
def position_object_pixels(col_start, row_start, x1, y1, width, height) #:nodoc:
|
5826
|
+
def position_object_pixels(col_start, row_start, x1, y1, width, height, anchor = nil) #:nodoc:
|
5838
5827
|
# Adjust start column for negative offsets.
|
5839
5828
|
while x1 < 0 && col_start > 0
|
5840
5829
|
x1 += size_col(col_start - 1)
|
@@ -5853,7 +5842,7 @@ def position_object_pixels(col_start, row_start, x1, y1, width, height) #:nodoc:
|
|
5853
5842
|
|
5854
5843
|
# Calculate the absolute x offset of the top-left vertex.
|
5855
5844
|
if @col_size_changed
|
5856
|
-
x_abs = (0 .. col_start-1).inject(0) {|sum, col| sum += size_col(col)}
|
5845
|
+
x_abs = (0 .. col_start-1).inject(0) {|sum, col| sum += size_col(col, anchor)}
|
5857
5846
|
else
|
5858
5847
|
# Optimisation for when the column widths haven't changed.
|
5859
5848
|
x_abs = @default_col_pixels * col_start
|
@@ -5863,7 +5852,7 @@ def position_object_pixels(col_start, row_start, x1, y1, width, height) #:nodoc:
|
|
5863
5852
|
# Calculate the absolute y offset of the top-left vertex.
|
5864
5853
|
# Store the column change to allow optimisations.
|
5865
5854
|
if @row_size_changed
|
5866
|
-
y_abs = (0 .. row_start-1).inject(0) {|sum, row| sum += size_row(row)}
|
5855
|
+
y_abs = (0 .. row_start-1).inject(0) {|sum, row| sum += size_row(row, anchor)}
|
5867
5856
|
else
|
5868
5857
|
# Optimisation for when the row heights haven't changed.
|
5869
5858
|
y_abs = @default_row_pixels * row_start
|
@@ -5872,12 +5861,18 @@ def position_object_pixels(col_start, row_start, x1, y1, width, height) #:nodoc:
|
|
5872
5861
|
|
5873
5862
|
# Adjust start column for offsets that are greater than the col width.
|
5874
5863
|
if size_col(col_start) > 0
|
5875
|
-
x1
|
5864
|
+
while x1 >= size_col(col_start)
|
5865
|
+
x1 -= size_col(col_start)
|
5866
|
+
col_start += 1
|
5867
|
+
end
|
5876
5868
|
end
|
5877
5869
|
|
5878
5870
|
# Adjust start row for offsets that are greater than the row height.
|
5879
5871
|
if size_row(row_start) > 0
|
5880
|
-
y1
|
5872
|
+
while y1 >= size_row(row_start)
|
5873
|
+
y1 -= size_row(row_start)
|
5874
|
+
row_start += 1
|
5875
|
+
end
|
5881
5876
|
end
|
5882
5877
|
|
5883
5878
|
# Initialise end cell to the same as the start cell.
|
@@ -5888,10 +5883,16 @@ def position_object_pixels(col_start, row_start, x1, y1, width, height) #:nodoc:
|
|
5888
5883
|
height += y1 if size_row(row_start) > 0
|
5889
5884
|
|
5890
5885
|
# Subtract the underlying cell widths to find the end cell of the object.
|
5891
|
-
width
|
5886
|
+
while width >= size_col(col_end, anchor)
|
5887
|
+
width -= size_col(col_end, anchor)
|
5888
|
+
col_end += 1
|
5889
|
+
end
|
5892
5890
|
|
5893
5891
|
# Subtract the underlying cell heights to find the end cell of the object.
|
5894
|
-
height
|
5892
|
+
while height >= size_row(row_end, anchor)
|
5893
|
+
height -= size_row(row_end, anchor)
|
5894
|
+
row_end += 1
|
5895
|
+
end
|
5895
5896
|
|
5896
5897
|
# The end vertices are whatever is left from the width and height.
|
5897
5898
|
x2 = width
|
@@ -6351,32 +6352,16 @@ def sort_pagebreaks(*args) #:nodoc:
|
|
6351
6352
|
end
|
6352
6353
|
end
|
6353
6354
|
|
6354
|
-
def adjust_column_offset(x, column)
|
6355
|
-
while x >= size_col(column)
|
6356
|
-
x -= size_col(column)
|
6357
|
-
column += 1
|
6358
|
-
end
|
6359
|
-
[x, column]
|
6360
|
-
end
|
6361
|
-
|
6362
|
-
def adjust_row_offset(y, row)
|
6363
|
-
while y >= size_row(row)
|
6364
|
-
y -= size_row(row)
|
6365
|
-
row += 1
|
6366
|
-
end
|
6367
|
-
[y, row]
|
6368
|
-
end
|
6369
|
-
|
6370
6355
|
#
|
6371
6356
|
# Calculate the vertices that define the position of a graphical object within
|
6372
6357
|
# the worksheet in EMUs.
|
6373
6358
|
#
|
6374
6359
|
# The vertices are expressed as English Metric Units (EMUs). There are 12,700
|
6375
|
-
# EMUs per point. Therefore, 12,700 * 3 /4 = 9,525 EMUs per
|
6360
|
+
# EMUs per point. Therefore, 12,700 * 3 /4 = 9,525 EMUs per el.
|
6376
6361
|
#
|
6377
|
-
def position_object_emus(col_start, row_start, x1, y1, width, height,
|
6362
|
+
def position_object_emus(col_start, row_start, x1, y1, width, height, anchor = nil) #:nodoc:
|
6378
6363
|
col_start, row_start, x1, y1, col_end, row_end, x2, y2, x_abs, y_abs =
|
6379
|
-
position_object_pixels(col_start, row_start, x1, y1, width, height)
|
6364
|
+
position_object_pixels(col_start, row_start, x1, y1, width, height, anchor)
|
6380
6365
|
|
6381
6366
|
# Convert the pixel values to EMUs. See above.
|
6382
6367
|
x1 = (0.5 + 9_525 * x1).to_i
|
@@ -6392,15 +6377,16 @@ def position_object_emus(col_start, row_start, x1, y1, width, height, x_dpi = 96
|
|
6392
6377
|
#
|
6393
6378
|
# Convert the width of a cell from user's units to pixels. Excel rounds the
|
6394
6379
|
# column width to the nearest pixel. If the width hasn't been set by the user
|
6395
|
-
# we use the default value.
|
6380
|
+
# we use the default value. A hidden column is treated as having a width of
|
6381
|
+
# zero unless it has the special "object_position" of 4 (size with cells).
|
6396
6382
|
#
|
6397
|
-
def size_col(col) #:nodoc:
|
6383
|
+
def size_col(col, anchor = 0) #:nodoc:
|
6398
6384
|
# Look up the cell value to see if it has been changed.
|
6399
6385
|
if @col_sizes[col]
|
6400
|
-
width = @col_sizes[col]
|
6386
|
+
width, hidden = @col_sizes[col]
|
6401
6387
|
|
6402
6388
|
# Convert to pixels.
|
6403
|
-
if
|
6389
|
+
if hidden == 1 && anchor != 4
|
6404
6390
|
pixels = 0
|
6405
6391
|
elsif width < 1
|
6406
6392
|
pixels = (width * (MAX_DIGIT_WIDTH + PADDING) + 0.5).to_i
|
@@ -6415,15 +6401,16 @@ def size_col(col) #:nodoc:
|
|
6415
6401
|
|
6416
6402
|
#
|
6417
6403
|
# Convert the height of a cell from user's units to pixels. If the height
|
6418
|
-
# hasn't been set by the user we use the default value.
|
6419
|
-
#
|
6404
|
+
# hasn't been set by the user we use the default value. A hidden row is
|
6405
|
+
# treated as having a height of zero unless it has the special
|
6406
|
+
# "object_position" of 4 (size with cells).
|
6420
6407
|
#
|
6421
|
-
def size_row(row) #:nodoc:
|
6408
|
+
def size_row(row, anchor = 0) #:nodoc:
|
6422
6409
|
# Look up the cell value to see if it has been changed
|
6423
6410
|
if @row_sizes[row]
|
6424
|
-
height = @row_sizes[row]
|
6411
|
+
height, hidden = @row_sizes[row]
|
6425
6412
|
|
6426
|
-
if
|
6413
|
+
if hidden == 1 && anchor != 4
|
6427
6414
|
pixels = 0
|
6428
6415
|
else
|
6429
6416
|
pixels = (4 / 3.0 * height).to_i
|
@@ -6441,9 +6428,8 @@ def prepare_image(index, image_id, drawing_id, width, height, name, image_type,
|
|
6441
6428
|
x_dpi ||= 96
|
6442
6429
|
y_dpi ||= 96
|
6443
6430
|
drawing_type = 2
|
6444
|
-
drawing
|
6445
6431
|
|
6446
|
-
row, col, image, x_offset, y_offset, x_scale, y_scale = @images[index]
|
6432
|
+
row, col, image, x_offset, y_offset, x_scale, y_scale, anchor = @images[index]
|
6447
6433
|
|
6448
6434
|
width *= x_scale
|
6449
6435
|
height *= y_scale
|
@@ -6451,24 +6437,25 @@ def prepare_image(index, image_id, drawing_id, width, height, name, image_type,
|
|
6451
6437
|
width *= 96.0 / x_dpi
|
6452
6438
|
height *= 96.0 / y_dpi
|
6453
6439
|
|
6454
|
-
dimensions = position_object_emus(col, row, x_offset, y_offset, width, height)
|
6440
|
+
dimensions = position_object_emus(col, row, x_offset, y_offset, width, height, anchor)
|
6455
6441
|
|
6456
6442
|
# Convert from pixels to emus.
|
6457
6443
|
width = (0.5 + (width * 9_525)).to_i
|
6458
6444
|
height = (0.5 + (height * 9_525)).to_i
|
6459
6445
|
|
6460
6446
|
# Create a Drawing object to use with worksheet unless one already exists.
|
6461
|
-
|
6462
|
-
|
6463
|
-
|
6447
|
+
drawing = Drawing.new(drawing_type, dimensions, width, height, name, nil, anchor)
|
6448
|
+
if !drawings?
|
6449
|
+
drawings = Drawings.new
|
6450
|
+
drawings.embedded = 1
|
6464
6451
|
|
6465
|
-
@
|
6452
|
+
@drawings = drawings
|
6466
6453
|
|
6467
6454
|
@external_drawing_links << ['/drawing', "../drawings/drawing#{drawing_id}.xml"]
|
6468
6455
|
else
|
6469
|
-
|
6456
|
+
drawings = @drawings
|
6470
6457
|
end
|
6471
|
-
|
6458
|
+
drawings.add_drawing_object(drawing)
|
6472
6459
|
|
6473
6460
|
@drawing_links << ['/image', "../media/image#{image_id}.#{image_type}"]
|
6474
6461
|
end
|
@@ -6523,16 +6510,16 @@ def prepare_header_image(image_id, width, height, name, image_type, position, x_
|
|
6523
6510
|
#
|
6524
6511
|
def insert_shape(*args)
|
6525
6512
|
# Check for a cell reference in A1 notation and substitute row and column.
|
6526
|
-
row_start, column_start, shape, x_offset, y_offset, x_scale, y_scale =
|
6513
|
+
row_start, column_start, shape, x_offset, y_offset, x_scale, y_scale, anchor =
|
6527
6514
|
row_col_notation(args)
|
6528
6515
|
if [row_start, column_start, shape].include?(nil)
|
6529
6516
|
raise "Insufficient arguments in insert_shape()"
|
6530
6517
|
end
|
6531
6518
|
|
6532
6519
|
shape.set_position(
|
6533
|
-
|
6534
|
-
|
6535
|
-
|
6520
|
+
row_start, column_start, x_offset, y_offset,
|
6521
|
+
x_scale, y_scale, anchor
|
6522
|
+
)
|
6536
6523
|
# Assign a shape ID.
|
6537
6524
|
while true
|
6538
6525
|
id = shape.id || 0
|
@@ -6576,9 +6563,9 @@ def prepare_shape(index, drawing_id)
|
|
6576
6563
|
shape = @shapes[index]
|
6577
6564
|
|
6578
6565
|
# Create a Drawing object to use with worksheet unless one already exists.
|
6579
|
-
unless
|
6580
|
-
@
|
6581
|
-
@
|
6566
|
+
unless drawings?
|
6567
|
+
@drawings = Drawings.new
|
6568
|
+
@drawings.embedded = 1
|
6582
6569
|
@external_drawing_links << ['/drawing', "../drawings/drawing#{drawing_id}.xml"]
|
6583
6570
|
@has_shapes = true
|
6584
6571
|
end
|
@@ -6588,13 +6575,14 @@ def prepare_shape(index, drawing_id)
|
|
6588
6575
|
shape.calc_position_emus(self)
|
6589
6576
|
|
6590
6577
|
drawing_type = 3
|
6591
|
-
drawing.
|
6578
|
+
drawing = Drawing.new(drawing_type, shape.dimensions, shape.width_emu, shape.height_emu, shape.name, shape, shape.anchor)
|
6579
|
+
drawings.add_drawing_object(drawing)
|
6592
6580
|
end
|
6593
6581
|
public :prepare_shape
|
6594
6582
|
|
6595
6583
|
#
|
6596
6584
|
# This method handles the parameters passed to insert_button as well as
|
6597
|
-
# calculating the
|
6585
|
+
# calculating the button object position and vertices.
|
6598
6586
|
#
|
6599
6587
|
def button_params(row, col, params)
|
6600
6588
|
button = Writexlsx::Package::Button.new
|
@@ -6623,7 +6611,7 @@ def button_params(row, col, params)
|
|
6623
6611
|
params[:x_offset] = 0 if !params[:x_offset]
|
6624
6612
|
params[:y_offset] = 0 if !params[:y_offset]
|
6625
6613
|
|
6626
|
-
# Scale the size of the
|
6614
|
+
# Scale the size of the button box if required.
|
6627
6615
|
if params[:x_scale]
|
6628
6616
|
params[:width] = params[:width] * params[:x_scale]
|
6629
6617
|
end
|
@@ -6638,15 +6626,15 @@ def button_params(row, col, params)
|
|
6638
6626
|
params[:start_row] = row
|
6639
6627
|
params[:start_col] = col
|
6640
6628
|
|
6641
|
-
# Calculate the positions of
|
6629
|
+
# Calculate the positions of button object.
|
6642
6630
|
vertices = position_object_pixels(
|
6643
|
-
|
6644
|
-
|
6645
|
-
|
6646
|
-
|
6647
|
-
|
6648
|
-
|
6649
|
-
|
6631
|
+
params[:start_col],
|
6632
|
+
params[:start_row],
|
6633
|
+
params[:x_offset],
|
6634
|
+
params[:y_offset],
|
6635
|
+
params[:width],
|
6636
|
+
params[:height]
|
6637
|
+
)
|
6650
6638
|
|
6651
6639
|
# Add the width and height for VML.
|
6652
6640
|
vertices << [params[:width], params[:height]]
|
@@ -6886,7 +6874,7 @@ def col_info_attributes(args)
|
|
6886
6874
|
custom_width = false if width.nil? && hidden == 0
|
6887
6875
|
custom_width = false if width == 8.43
|
6888
6876
|
|
6889
|
-
width = hidden == 0 ?
|
6877
|
+
width = hidden == 0 ? @default_col_width : 0 unless width
|
6890
6878
|
|
6891
6879
|
# Convert column width from user units to character width.
|
6892
6880
|
if width && width < 1
|
@@ -7496,7 +7484,7 @@ def write_sheet_protection #:nodoc:
|
|
7496
7484
|
# Write the <drawing> elements.
|
7497
7485
|
#
|
7498
7486
|
def write_drawings #:nodoc:
|
7499
|
-
increment_rel_id_and_write_r_id('drawing') if
|
7487
|
+
increment_rel_id_and_write_r_id('drawing') if drawings?
|
7500
7488
|
end
|
7501
7489
|
|
7502
7490
|
#
|
@@ -7974,8 +7962,8 @@ def autofilter_ref? #:nodoc:
|
|
7974
7962
|
!!@autofilter_ref
|
7975
7963
|
end
|
7976
7964
|
|
7977
|
-
def
|
7978
|
-
!!@
|
7965
|
+
def drawings? #:nodoc:
|
7966
|
+
!!@drawings
|
7979
7967
|
end
|
7980
7968
|
|
7981
7969
|
def remove_white_space(margin) #:nodoc:
|