write_xlsx 1.02.0 → 1.04.0

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.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/Changes +22 -0
  3. data/README.md +1 -1
  4. data/examples/chart_line.rb +85 -10
  5. data/examples/tables.rb +77 -42
  6. data/lib/write_xlsx/chart/line.rb +15 -1
  7. data/lib/write_xlsx/format.rb +5 -5
  8. data/lib/write_xlsx/package/comments.rb +4 -4
  9. data/lib/write_xlsx/package/relationships.rb +2 -2
  10. data/lib/write_xlsx/package/styles.rb +26 -8
  11. data/lib/write_xlsx/package/table.rb +8 -7
  12. data/lib/write_xlsx/package/vml.rb +20 -19
  13. data/lib/write_xlsx/sheets.rb +12 -20
  14. data/lib/write_xlsx/version.rb +1 -1
  15. data/lib/write_xlsx/workbook.rb +53 -35
  16. data/lib/write_xlsx/worksheet.rb +37 -20
  17. data/test/perl_output/chart_line.xlsx +0 -0
  18. data/test/perl_output/comments2.xlsx +0 -0
  19. data/test/perl_output/tables.xlsx +0 -0
  20. data/test/regression/images/red2.png +0 -0
  21. data/test/regression/test_chart_line05.rb +43 -0
  22. data/test/regression/test_chart_line06.rb +43 -0
  23. data/test/regression/test_comment15.rb +28 -0
  24. data/test/regression/test_comment16.rb +34 -0
  25. data/test/regression/test_header_image15.rb +36 -0
  26. data/test/regression/test_header_image16.rb +42 -0
  27. data/test/regression/test_header_image17.rb +46 -0
  28. data/test/regression/test_header_image18.rb +48 -0
  29. data/test/regression/test_header_image19.rb +36 -0
  30. data/test/regression/test_hyperlink48.rb +31 -0
  31. data/test/regression/test_hyperlink49.rb +29 -0
  32. data/test/regression/test_image45.rb +2 -1
  33. data/test/regression/test_image46.rb +1 -1
  34. data/test/regression/test_image48.rb +32 -0
  35. data/test/regression/test_image49.rb +38 -0
  36. data/test/regression/test_image50.rb +24 -0
  37. data/test/regression/test_image51.rb +30 -0
  38. data/test/regression/test_object_position12.rb +25 -0
  39. data/test/regression/test_object_position13.rb +25 -0
  40. data/test/regression/test_object_position14.rb +25 -0
  41. data/test/regression/test_object_position15.rb +29 -0
  42. data/test/regression/test_object_position16.rb +29 -0
  43. data/test/regression/test_object_position17.rb +29 -0
  44. data/test/regression/test_object_position18.rb +29 -0
  45. data/test/regression/test_object_position19.rb +29 -0
  46. data/test/regression/test_object_position20.rb +29 -0
  47. data/test/regression/test_table24.rb +27 -0
  48. data/test/regression/test_table25.rb +27 -0
  49. data/test/regression/xlsx_files/chart_line05.xlsx +0 -0
  50. data/test/regression/xlsx_files/chart_line06.xlsx +0 -0
  51. data/test/regression/xlsx_files/comment15.xlsx +0 -0
  52. data/test/regression/xlsx_files/comment16.xlsx +0 -0
  53. data/test/regression/xlsx_files/header_image15.xlsx +0 -0
  54. data/test/regression/xlsx_files/header_image16.xlsx +0 -0
  55. data/test/regression/xlsx_files/header_image17.xlsx +0 -0
  56. data/test/regression/xlsx_files/header_image18.xlsx +0 -0
  57. data/test/regression/xlsx_files/header_image19.xlsx +0 -0
  58. data/test/regression/xlsx_files/hyperlink46.xlsx +0 -0
  59. data/test/regression/xlsx_files/image45.xlsx +0 -0
  60. data/test/regression/xlsx_files/image46.xlsx +0 -0
  61. data/test/regression/xlsx_files/image48.xlsx +0 -0
  62. data/test/regression/xlsx_files/image49.xlsx +0 -0
  63. data/test/regression/xlsx_files/image50.xlsx +0 -0
  64. data/test/regression/xlsx_files/image51.xlsx +0 -0
  65. data/test/regression/xlsx_files/object_position12.xlsx +0 -0
  66. data/test/regression/xlsx_files/object_position13.xlsx +0 -0
  67. data/test/regression/xlsx_files/object_position14.xlsx +0 -0
  68. data/test/regression/xlsx_files/object_position15.xlsx +0 -0
  69. data/test/regression/xlsx_files/object_position16.xlsx +0 -0
  70. data/test/regression/xlsx_files/object_position17.xlsx +0 -0
  71. data/test/regression/xlsx_files/object_position18.xlsx +0 -0
  72. data/test/regression/xlsx_files/object_position19.xlsx +0 -0
  73. data/test/regression/xlsx_files/object_position20.xlsx +0 -0
  74. data/test/regression/xlsx_files/table24.xlsx +0 -0
  75. data/test/regression/xlsx_files/table25.xlsx +0 -0
  76. data/test/test_example_match.rb +119 -9
  77. data/test/workbook/test_check_sheetname.rb +0 -10
  78. data/write_xlsx.gemspec +1 -0
  79. metadata +120 -2
@@ -398,13 +398,14 @@ def write_table_column(col_data)
398
398
  # Write the <tableStyleInfo> element.
399
399
  #
400
400
  def write_table_style_info
401
- attributes = [
402
- ['name', @style],
403
- ['showFirstColumn', @show_first_col],
404
- ['showLastColumn', @show_last_col],
405
- ['showRowStripes', @show_row_stripes],
406
- ['showColumnStripes', @show_col_stripes]
407
- ]
401
+ attributes = []
402
+ if @style && @style != '' && @style != 'None'
403
+ attributes << ['name', @style]
404
+ end
405
+ attributes << ['showFirstColumn', @show_first_col]
406
+ attributes << ['showLastColumn', @show_last_col]
407
+ attributes << ['showRowStripes', @show_row_stripes]
408
+ attributes << ['showColumnStripes', @show_col_stripes]
408
409
 
409
410
  @writer.empty_tag('tableStyleInfo', attributes)
410
411
  end
@@ -17,9 +17,9 @@ def set_xml_writer(filename)
17
17
  end
18
18
 
19
19
  def assemble_xml_file(
20
- data_id, vml_shape_id, comments_data,
21
- buttons_data, header_images_data = []
22
- )
20
+ data_id, vml_shape_id, comments_data,
21
+ buttons_data, header_images_data = []
22
+ )
23
23
  return unless @writer
24
24
 
25
25
  write_xml_namespace do
@@ -29,9 +29,9 @@ def assemble_xml_file(
29
29
  z_index = 1
30
30
  unless buttons_data.empty?
31
31
  vml_shape_id, z_index =
32
- write_shape_type_and_shape(
33
- buttons_data,
34
- vml_shape_id, z_index) do
32
+ write_shape_type_and_shape(
33
+ buttons_data,
34
+ vml_shape_id, z_index) do
35
35
  write_button_shapetype
36
36
  end
37
37
  end
@@ -277,6 +277,7 @@ def write_image_shape(id, index, image_data)
277
277
  position = image_data[3]
278
278
  x_dpi = image_data[4]
279
279
  y_dpi = image_data[5]
280
+ ref_id = image_data[6]
280
281
 
281
282
  # Scale the height/width by the resolution, relative to 72dpi.
282
283
  width = width * 72.0 / x_dpi
@@ -294,20 +295,20 @@ def write_image_shape(id, index, image_data)
294
295
  end
295
296
 
296
297
  style = [
297
- "position:absolute", "margin-left:0", "margin-top:0",
298
- "width:#{width}pt", "height:#{height}pt",
299
- "z-index:#{index}"
300
- ].join(';')
298
+ "position:absolute", "margin-left:0", "margin-top:0",
299
+ "width:#{width}pt", "height:#{height}pt",
300
+ "z-index:#{index}"
301
+ ].join(';')
301
302
  attributes = [
302
- ['id', position],
303
- ['o:spid', "_x0000_s#{id}"],
304
- ['type', type],
305
- ['style', style]
306
- ]
303
+ ['id', position],
304
+ ['o:spid', "_x0000_s#{id}"],
305
+ ['type', type],
306
+ ['style', style]
307
+ ]
307
308
 
308
309
  @writer.tag_elements('v:shape', attributes) do
309
310
  # Write the v:imagedata element.
310
- write_imagedata(index, name)
311
+ write_imagedata(ref_id, name)
311
312
 
312
313
  # Write the o:lock element.
313
314
  write_rotation_lock
@@ -319,9 +320,9 @@ def write_image_shape(id, index, image_data)
319
320
  #
320
321
  def write_imagedata(index, o_title)
321
322
  attributes = [
322
- ['o:relid', "rId#{index}"],
323
- ['o:title', o_title]
324
- ]
323
+ ['o:relid', "rId#{index}"],
324
+ ['o:title', o_title]
325
+ ]
325
326
 
326
327
  @writer.empty_tag('v:imagedata', attributes)
327
328
  end
@@ -67,18 +67,18 @@ def write_vml_files(package_dir)
67
67
  vml = Package::Vml.new
68
68
  vml.set_xml_writer("#{dir}/vmlDrawing#{index}.vml")
69
69
  vml.assemble_xml_file(
70
- sheet.vml_data_id, sheet.vml_shape_id,
71
- sheet.sorted_comments, sheet.buttons_data
72
- )
70
+ sheet.vml_data_id, sheet.vml_shape_id,
71
+ sheet.sorted_comments, sheet.buttons_data
72
+ )
73
73
  index += 1
74
74
  end
75
75
  if sheet.has_header_vml?
76
76
  vml = Package::Vml.new
77
77
  vml.set_xml_writer("#{dir}/vmlDrawing#{index}.vml")
78
78
  vml.assemble_xml_file(
79
- sheet.vml_header_id, sheet.vml_header_id * 1024,
80
- [], [], sheet.header_images_data
81
- )
79
+ sheet.vml_header_id, sheet.vml_header_id * 1024,
80
+ [], [], sheet.header_images_data
81
+ )
82
82
  write_vml_drawing_rels_files(package_dir, sheet, index)
83
83
  index += 1
84
84
  end
@@ -106,16 +106,12 @@ def write_table_files(package_dir)
106
106
  end
107
107
 
108
108
  def write_chartsheet_rels_files(package_dir)
109
- write_sheet_rels_files_base(chartsheets, "#{package_dir}/xl/chartsheets/_rels",
110
- 'sheet')
109
+ write_sheet_rels_files_base(
110
+ chartsheets, "#{package_dir}/xl/chartsheets/_rels", 'sheet'
111
+ )
111
112
  end
112
113
 
113
114
  def write_drawing_rels_files(package_dir)
114
- # write_rels_files_base(
115
- # self.reject { |sheet| sheet.drawing_links[0].empty? },
116
- # "#{package_dir}/xl/drawings/_rels",
117
-
118
- # )
119
115
  dir = "#{package_dir}/xl/drawings/_rels"
120
116
 
121
117
  index = 0
@@ -159,8 +155,9 @@ def write_vml_drawing_rels_files(package_dir, worksheet, index)
159
155
  end
160
156
 
161
157
  def write_worksheet_rels_files(package_dir)
162
- write_sheet_rels_files_base(worksheets, "#{package_dir}/xl/worksheets/_rels",
163
- 'sheet')
158
+ write_sheet_rels_files_base(
159
+ worksheets, "#{package_dir}/xl/worksheets/_rels", 'sheet'
160
+ )
164
161
  end
165
162
 
166
163
  def write_sheet_rels_files_base(sheets, dir, body)
@@ -235,11 +232,6 @@ def check_valid_sheetname(name)
235
232
  raise "Worksheet name #{name} cannot start or end with an "
236
233
  end
237
234
 
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
-
243
235
  # Check that the worksheet name doesn't already exist since this is a fatal
244
236
  # error in Excel 97. The check must also exclude case insensitive matches.
245
237
  unless is_sheetname_uniq?(name)
@@ -1 +1 @@
1
- WriteXLSX_VERSION = "1.02.0"
1
+ WriteXLSX_VERSION = "1.04.0"
@@ -132,6 +132,7 @@ def initialize(file, *option_params)
132
132
  @strings_to_urls = (options[:strings_to_urls].nil? || options[:strings_to_urls]) ? true : false
133
133
 
134
134
  @max_url_length = 2079
135
+ @has_comments = false
135
136
  if options[:max_url_length]
136
137
  @max_url_length = options[:max_url_length]
137
138
 
@@ -1115,7 +1116,8 @@ def style_properties
1115
1116
  @border_count,
1116
1117
  @fill_count,
1117
1118
  @custom_colors,
1118
- @dxf_formats
1119
+ @dxf_formats,
1120
+ @has_comments
1119
1121
  ]
1120
1122
  end
1121
1123
 
@@ -1711,11 +1713,14 @@ def prepare_vml_objects #:nodoc:
1711
1713
  if sheet.has_comments?
1712
1714
  comment_files += 1
1713
1715
  comment_id += 1
1716
+ @has_comments = true
1714
1717
  end
1715
1718
  vml_drawing_id += 1
1716
1719
 
1717
- sheet.prepare_vml_objects(vml_data_id, vml_shape_id,
1718
- vml_drawing_id, comment_id)
1720
+ sheet.prepare_vml_objects(
1721
+ vml_data_id, vml_shape_id,
1722
+ vml_drawing_id, comment_id
1723
+ )
1719
1724
 
1720
1725
  # Each VML file should start with a shape id incremented by 1024.
1721
1726
  vml_data_id += 1 * ( 1 + sheet.num_comments_block )
@@ -1738,8 +1743,6 @@ def prepare_vml_objects #:nodoc:
1738
1743
  end
1739
1744
  end
1740
1745
 
1741
- add_font_format_for_cell_comments if num_comment_files > 0
1742
-
1743
1746
  # Set the workbook vba_codename if one of the sheets has a button and
1744
1747
  # the workbook has a vbaProject binary.
1745
1748
  if has_button && @vba_project && !@vba_codename
@@ -1759,19 +1762,6 @@ def prepare_tables
1759
1762
  end
1760
1763
  end
1761
1764
 
1762
- def add_font_format_for_cell_comments
1763
- format = Format.new(
1764
- @formats,
1765
- :font => 'Tahoma',
1766
- :size => 8,
1767
- :color_indexed => 81,
1768
- :font_only => 1
1769
- )
1770
-
1771
- format.get_xf_index
1772
- @formats.formats << format
1773
- end
1774
-
1775
1765
  #
1776
1766
  # Add "cached" data to charts to provide the numCache and strCache data for
1777
1767
  # series and title/axis ranges.
@@ -1922,9 +1912,12 @@ def extract_named_ranges(defined_names) #:nodoc:
1922
1912
  # Iterate through the worksheets and set up any chart or image drawings.
1923
1913
  #
1924
1914
  def prepare_drawings #:nodoc:
1925
- chart_ref_id = 0
1926
- image_ref_id = 0
1927
- drawing_id = 0
1915
+ chart_ref_id = 0
1916
+ image_ref_id = 0
1917
+ drawing_id = 0
1918
+ ref_id = 0
1919
+ image_ids = {}
1920
+ header_image_ids = {}
1928
1921
  @worksheets.each do |sheet|
1929
1922
  chart_count = sheet.charts.size
1930
1923
  image_count = sheet.images.size
@@ -1944,9 +1937,19 @@ def prepare_drawings #:nodoc:
1944
1937
 
1945
1938
  # Prepare the worksheet images.
1946
1939
  sheet.images.each_with_index do |image, index|
1947
- type, width, height, name, x_dpi, y_dpi = get_image_properties(image[2])
1948
- image_ref_id += 1
1949
- sheet.prepare_image(index, image_ref_id, drawing_id, width, height, name, type, x_dpi, y_dpi)
1940
+ filename = image[2]
1941
+ type, width, height, name, x_dpi, y_dpi, md5 = get_image_properties(image[2])
1942
+ if image_ids[md5]
1943
+ ref_id = image_ids[md5]
1944
+ else
1945
+ image_ref_id += 1
1946
+ image_ids[md5] = ref_id = image_ref_id
1947
+ @images << [filename, type]
1948
+ end
1949
+ sheet.prepare_image(
1950
+ index, ref_id, drawing_id, width, height,
1951
+ name, type, x_dpi, y_dpi, md5
1952
+ )
1950
1953
  end
1951
1954
 
1952
1955
  # Prepare the worksheet charts.
@@ -1965,13 +1968,21 @@ def prepare_drawings #:nodoc:
1965
1968
  filename = sheet.header_images[index][0]
1966
1969
  position = sheet.header_images[index][1]
1967
1970
 
1968
- type, width, height, name, x_dpi, y_dpi =
1971
+ type, width, height, name, x_dpi, y_dpi, md5 =
1969
1972
  get_image_properties(filename)
1970
1973
 
1971
- image_ref_id += 1
1974
+ if header_image_ids[md5]
1975
+ ref_id = header_image_ids[md5]
1976
+ else
1977
+ image_ref_id += 1
1978
+ header_image_ids[md5] = ref_id = image_ref_id
1979
+ @images << [filename, type]
1980
+ end
1972
1981
 
1973
- sheet.prepare_header_image(image_ref_id, width, height,
1974
- name, type, position, x_dpi, y_dpi)
1982
+ sheet.prepare_header_image(
1983
+ ref_id, width, height, name, type,
1984
+ position, x_dpi, y_dpi, md5
1985
+ )
1975
1986
  end
1976
1987
 
1977
1988
  # Prepare the footer images.
@@ -1979,13 +1990,21 @@ def prepare_drawings #:nodoc:
1979
1990
  filename = sheet.footer_images[index][0]
1980
1991
  position = sheet.footer_images[index][1]
1981
1992
 
1982
- type, width, height, name, x_dpi, y_dpi =
1993
+ type, width, height, name, x_dpi, y_dpi, md5 =
1983
1994
  get_image_properties(filename)
1984
1995
 
1985
- image_ref_id += 1
1996
+ if header_image_ids[md5]
1997
+ ref_id = header_image_ids[md5]
1998
+ else
1999
+ image_ref_id += 1
2000
+ header_image_ids[md5] = ref_id = image_ref_id
2001
+ @images << [filename, type]
2002
+ end
1986
2003
 
1987
- sheet.prepare_header_image(image_ref_id, width, height,
1988
- name, type, position, x_dpi, y_dpi)
2004
+ sheet.prepare_header_image(
2005
+ ref_id, width, height, name, type,
2006
+ position, x_dpi, y_dpi, md5
2007
+ )
1989
2008
  end
1990
2009
 
1991
2010
  if has_drawings
@@ -2014,6 +2033,7 @@ def get_image_properties(filename)
2014
2033
 
2015
2034
  # Open the image file and import the data.
2016
2035
  data = File.binread(filename)
2036
+ md5 = Digest::MD5.hexdigest(data)
2017
2037
  if data.unpack('x A3')[0] == 'PNG'
2018
2038
  # Test for PNGs.
2019
2039
  type, width, height, x_dpi, y_dpi = process_png(data)
@@ -2031,13 +2051,11 @@ def get_image_properties(filename)
2031
2051
  raise "Unsupported image format for file: #{filename}\n"
2032
2052
  end
2033
2053
 
2034
- @images << [filename, type]
2035
-
2036
2054
  # Set a default dpi for images with 0 dpi.
2037
2055
  x_dpi = 96 if x_dpi == 0
2038
2056
  y_dpi = 96 if y_dpi == 0
2039
2057
 
2040
- [type, width, height, File.basename(filename), x_dpi, y_dpi]
2058
+ [type, width, height, File.basename(filename), x_dpi, y_dpi, md5]
2041
2059
  end
2042
2060
 
2043
2061
  #
@@ -359,6 +359,8 @@ def initialize(workbook, index, name) #:nodoc:
359
359
  @shape_hash = {}
360
360
  @drawing_rels = {}
361
361
  @drawing_rels_id = 0
362
+ @vml_drawing_rels = {}
363
+ @vml_drawing_rels_id = 0
362
364
  @header_images = []
363
365
  @footer_images = []
364
366
 
@@ -5868,27 +5870,24 @@ def position_object_pixels(col_start, row_start, x1, y1, width, height, anchor =
5868
5870
  y_abs += y1
5869
5871
 
5870
5872
  # Adjust start column for offsets that are greater than the col width.
5871
- if size_col(col_start) > 0
5872
- while x1 >= size_col(col_start)
5873
- x1 -= size_col(col_start)
5874
- col_start += 1
5875
- end
5873
+ while x1 >= size_col(col_start, anchor)
5874
+ x1 -= size_col(col_start)
5875
+ col_start += 1
5876
5876
  end
5877
5877
 
5878
5878
  # Adjust start row for offsets that are greater than the row height.
5879
- if size_row(row_start) > 0
5880
- while y1 >= size_row(row_start)
5881
- y1 -= size_row(row_start)
5882
- row_start += 1
5883
- end
5879
+ while y1 >= size_row(row_start, anchor)
5880
+ y1 -= size_row(row_start)
5881
+ row_start += 1
5884
5882
  end
5885
5883
 
5886
5884
  # Initialise end cell to the same as the start cell.
5887
5885
  col_end = col_start
5888
5886
  row_end = row_start
5889
5887
 
5890
- width += x1 if size_col(col_start) > 0
5891
- height += y1 if size_row(row_start) > 0
5888
+ # Only offset the image in the cell if the row/col isn't hidden.
5889
+ width += x1 if size_col(col_start, anchor) > 0
5890
+ height += y1 if size_row(row_start, anchor) > 0
5892
5891
 
5893
5892
  # Subtract the underlying cell widths to find the end cell of the object.
5894
5893
  while width >= size_col(col_end, anchor)
@@ -6100,6 +6099,18 @@ def drawing_rel_index(target = nil)
6100
6099
  end
6101
6100
  end
6102
6101
 
6102
+ #
6103
+ # Get the index used to address a vml_drawing rel link.
6104
+ #
6105
+ def get_vml_drawing_rel_index(target)
6106
+ if @vml_drawing_rels[target]
6107
+ @vml_drawing_rels[target]
6108
+ else
6109
+ @vml_drawing_rels_id += 1
6110
+ @vml_drawing_rels[target] = @vml_drawing_rels_id
6111
+ end
6112
+ end
6113
+
6103
6114
  def hyperlinks_count
6104
6115
  @hyperlinks.keys.inject(0) { |s, n| s += @hyperlinks[n].keys.size }
6105
6116
  end
@@ -6447,7 +6458,7 @@ def size_row(row, anchor = 0) #:nodoc:
6447
6458
  #
6448
6459
  # Set up image/drawings.
6449
6460
  #
6450
- def prepare_image(index, image_id, drawing_id, width, height, name, image_type, x_dpi = 96, y_dpi = 96) #:nodoc:
6461
+ def prepare_image(index, image_id, drawing_id, width, height, name, image_type, x_dpi = 96, y_dpi = 96, md5 = nil) #:nodoc:
6451
6462
  x_dpi ||= 96
6452
6463
  y_dpi ||= 96
6453
6464
  drawing_type = 2
@@ -6503,24 +6514,30 @@ def prepare_image(index, image_id, drawing_id, width, height, name, image_type,
6503
6514
  EOS
6504
6515
  end
6505
6516
 
6506
- if target
6517
+ if target && !@drawing_rels[url]
6507
6518
  @drawing_links << [rel_type, target, target_mode]
6508
6519
  end
6509
- drawing.url_rel_index = drawing_rel_index
6520
+ drawing.url_rel_index = drawing_rel_index(url)
6510
6521
  end
6511
6522
 
6512
- drawing.rel_index = drawing_rel_index
6513
- @drawing_links << ['/image', "../media/image#{image_id}.#{image_type}"]
6523
+ if !@drawing_rels[md5]
6524
+ @drawing_links << ['/image', "../media/image#{image_id}.#{image_type}"]
6525
+ end
6526
+ drawing.rel_index = drawing_rel_index(md5)
6514
6527
  end
6515
6528
  public :prepare_image
6516
6529
 
6517
- def prepare_header_image(image_id, width, height, name, image_type, position, x_dpi, y_dpi)
6530
+ def prepare_header_image(image_id, width, height, name, image_type, position, x_dpi, y_dpi, md5)
6518
6531
  # Strip the extension from the filename.
6519
6532
  body = name.dup
6520
6533
  body[/\.[^\.]+$/, 0] = ''
6521
6534
 
6522
- @header_images_array << [width, height, body, position, x_dpi, y_dpi]
6523
- @vml_drawing_links << ['/image', "../media/image#{image_id}.#{image_type}" ]
6535
+ if !@vml_drawing_rels[md5]
6536
+ @vml_drawing_links << ['/image', "../media/image#{image_id}.#{image_type}" ]
6537
+ end
6538
+
6539
+ ref_id = get_vml_drawing_rel_index(md5)
6540
+ @header_images_array << [width, height, body, position, x_dpi, y_dpi, ref_id]
6524
6541
  end
6525
6542
  public :prepare_header_image
6526
6543