write_xlsx 1.07.0 → 1.09.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (130) hide show
  1. checksums.yaml +4 -4
  2. data/Changes +40 -0
  3. data/README.md +1 -1
  4. data/examples/background.rb +19 -0
  5. data/examples/ignore_errors.rb +39 -0
  6. data/ignore_errors.xlsx +0 -0
  7. data/lib/write_xlsx/chart/axis.rb +3 -3
  8. data/lib/write_xlsx/chart/scatter.rb +0 -15
  9. data/lib/write_xlsx/chart/series.rb +1 -1
  10. data/lib/write_xlsx/chart.rb +31 -33
  11. data/lib/write_xlsx/chartsheet.rb +3 -3
  12. data/lib/write_xlsx/drawing.rb +118 -55
  13. data/lib/write_xlsx/format.rb +11 -179
  14. data/lib/write_xlsx/package/app.rb +5 -5
  15. data/lib/write_xlsx/package/button.rb +8 -8
  16. data/lib/write_xlsx/package/comments.rb +8 -8
  17. data/lib/write_xlsx/package/conditional_format.rb +2 -8
  18. data/lib/write_xlsx/package/content_types.rb +18 -9
  19. data/lib/write_xlsx/package/core.rb +5 -5
  20. data/lib/write_xlsx/package/custom.rb +2 -2
  21. data/lib/write_xlsx/package/metadata.rb +159 -0
  22. data/lib/write_xlsx/package/packager.rb +22 -0
  23. data/lib/write_xlsx/package/shared_strings.rb +6 -6
  24. data/lib/write_xlsx/package/styles.rb +27 -14
  25. data/lib/write_xlsx/package/table.rb +31 -23
  26. data/lib/write_xlsx/package/theme.rb +1 -1
  27. data/lib/write_xlsx/package/vml.rb +43 -43
  28. data/lib/write_xlsx/shape.rb +17 -15
  29. data/lib/write_xlsx/sparkline.rb +340 -340
  30. data/lib/write_xlsx/utility.rb +9 -24
  31. data/lib/write_xlsx/version.rb +1 -1
  32. data/lib/write_xlsx/workbook.rb +193 -643
  33. data/lib/write_xlsx/worksheet/cell_data.rb +25 -3
  34. data/lib/write_xlsx/worksheet/data_validation.rb +21 -26
  35. data/lib/write_xlsx/worksheet/hyperlink.rb +4 -4
  36. data/lib/write_xlsx/worksheet/page_setup.rb +12 -12
  37. data/lib/write_xlsx/worksheet.rb +461 -4233
  38. data/test/drawing/{test_write_ext.rb → test_write_xdr_ext.rb} +2 -2
  39. data/test/perl_output/background.xlsx +0 -0
  40. data/test/perl_output/ignore_errors.xlsx +0 -0
  41. data/test/regression/images/logo.gif +0 -0
  42. data/test/regression/images/logo.jpg +0 -0
  43. data/test/regression/images/red.gif +0 -0
  44. data/test/regression/test_background01.rb +23 -0
  45. data/test/regression/test_background02.rb +23 -0
  46. data/test/regression/test_background03.rb +24 -0
  47. data/test/regression/test_background04.rb +25 -0
  48. data/test/regression/test_background05.rb +25 -0
  49. data/test/regression/test_background06.rb +31 -0
  50. data/test/regression/test_background07.rb +37 -0
  51. data/test/regression/test_chart_axis47.rb +52 -0
  52. data/test/regression/test_chart_axis48.rb +53 -0
  53. data/test/regression/test_chart_crossing01.rb +1 -1
  54. data/test/regression/test_chart_crossing05.rb +46 -0
  55. data/test/regression/test_chart_crossing06.rb +46 -0
  56. data/test/regression/test_chart_data_labels48.rb +55 -0
  57. data/test/regression/test_chart_data_labels49.rb +55 -0
  58. data/test/regression/test_chart_data_labels50.rb +57 -0
  59. data/test/regression/test_dynamic_array01.rb +25 -0
  60. data/test/regression/test_format16.rb +24 -0
  61. data/test/regression/test_format17.rb +24 -0
  62. data/test/regression/test_header04.rb +30 -0
  63. data/test/regression/test_hyperlink50.rb +27 -0
  64. data/test/regression/test_hyperlink51.rb +27 -0
  65. data/test/regression/test_ignore_error01.rb +23 -0
  66. data/test/regression/test_ignore_error02.rb +24 -0
  67. data/test/regression/test_ignore_error03.rb +26 -0
  68. data/test/regression/test_ignore_error04.rb +26 -0
  69. data/test/regression/test_ignore_error05.rb +32 -0
  70. data/test/regression/test_ignore_error06.rb +32 -0
  71. data/test/regression/test_image52.rb +26 -0
  72. data/test/regression/test_image53.rb +26 -0
  73. data/test/regression/test_image54.rb +26 -0
  74. data/test/regression/test_image55.rb +27 -0
  75. data/test/regression/test_image56.rb +23 -0
  76. data/test/regression/test_image57.rb +23 -0
  77. data/test/regression/test_protect04.rb +32 -0
  78. data/test/regression/test_protect05.rb +35 -0
  79. data/test/regression/test_protect06.rb +35 -0
  80. data/test/regression/test_protect07.rb +23 -0
  81. data/test/regression/test_set_column10.rb +55 -0
  82. data/test/regression/test_set_column11.rb +48 -0
  83. data/test/regression/test_set_row01.rb +35 -0
  84. data/test/regression/test_set_row02.rb +35 -0
  85. data/test/regression/test_set_row03.rb +35 -0
  86. data/test/regression/test_set_row04.rb +35 -0
  87. data/test/regression/test_table26.rb +38 -0
  88. data/test/regression/xlsx_files/background01.xlsx +0 -0
  89. data/test/regression/xlsx_files/background02.xlsx +0 -0
  90. data/test/regression/xlsx_files/background03.xlsx +0 -0
  91. data/test/regression/xlsx_files/background04.xlsx +0 -0
  92. data/test/regression/xlsx_files/background05.xlsx +0 -0
  93. data/test/regression/xlsx_files/background06.xlsx +0 -0
  94. data/test/regression/xlsx_files/background07.xlsx +0 -0
  95. data/test/regression/xlsx_files/chart_axis47.xlsx +0 -0
  96. data/test/regression/xlsx_files/chart_axis48.xlsx +0 -0
  97. data/test/regression/xlsx_files/chart_crossing05.xlsx +0 -0
  98. data/test/regression/xlsx_files/chart_crossing06.xlsx +0 -0
  99. data/test/regression/xlsx_files/chart_data_labels48.xlsx +0 -0
  100. data/test/regression/xlsx_files/chart_data_labels49.xlsx +0 -0
  101. data/test/regression/xlsx_files/chart_data_labels50.xlsx +0 -0
  102. data/test/regression/xlsx_files/dynamic_array01.xlsx +0 -0
  103. data/test/regression/xlsx_files/format16.xlsx +0 -0
  104. data/test/regression/xlsx_files/format17.xlsx +0 -0
  105. data/test/regression/xlsx_files/header04.xlsx +0 -0
  106. data/test/regression/xlsx_files/hyperlink50.xlsx +0 -0
  107. data/test/regression/xlsx_files/hyperlink51.xlsx +0 -0
  108. data/test/regression/xlsx_files/ignore_error01.xlsx +0 -0
  109. data/test/regression/xlsx_files/ignore_error02.xlsx +0 -0
  110. data/test/regression/xlsx_files/ignore_error03.xlsx +0 -0
  111. data/test/regression/xlsx_files/ignore_error04.xlsx +0 -0
  112. data/test/regression/xlsx_files/ignore_error05.xlsx +0 -0
  113. data/test/regression/xlsx_files/ignore_error06.xlsx +0 -0
  114. data/test/regression/xlsx_files/image52.xlsx +0 -0
  115. data/test/regression/xlsx_files/image53.xlsx +0 -0
  116. data/test/regression/xlsx_files/image54.xlsx +0 -0
  117. data/test/regression/xlsx_files/image55.xlsx +0 -0
  118. data/test/regression/xlsx_files/image56.xlsx +0 -0
  119. data/test/regression/xlsx_files/image57.xlsx +0 -0
  120. data/test/regression/xlsx_files/protect04.xlsx +0 -0
  121. data/test/regression/xlsx_files/protect05.xlsx +0 -0
  122. data/test/regression/xlsx_files/protect06.xlsx +0 -0
  123. data/test/regression/xlsx_files/protect07.xlsx +0 -0
  124. data/test/regression/xlsx_files/set_row01.xlsx +0 -0
  125. data/test/regression/xlsx_files/set_row03.xlsx +0 -0
  126. data/test/regression/xlsx_files/table26.xlsx +0 -0
  127. data/test/test_example_match.rb +43 -0
  128. data/test/utility/test_range.rb +20 -0
  129. data/test/worksheet/test_pixels_to_row_col.rb +46 -0
  130. metadata +190 -8
@@ -63,9 +63,9 @@ module Writexlsx
63
63
 
64
64
  attributes =
65
65
  [
66
- ['xmlns', schema + '/spreadsheetml/2006/main'],
67
- ['count', total_count],
68
- ['uniqueCount', unique_count]
66
+ ['xmlns', schema + '/spreadsheetml/2006/main'],
67
+ ['count', total_count],
68
+ ['uniqueCount', unique_count]
69
69
  ]
70
70
 
71
71
  @writer.tag_elements('sst', attributes) { yield }
@@ -94,9 +94,9 @@ module Writexlsx
94
94
 
95
95
  # Convert control character to the _xHHHH_ escape.
96
96
  string = string.gsub(
97
- /([\x00-\x08\x0B-\x1F])/,
98
- sprintf("_x%04X_", $1.ord)
99
- ) if string =~ /([\x00-\x08\x0B-\x1F])/
97
+ /([\x00-\x08\x0B-\x1F])/,
98
+ sprintf("_x%04X_", $1.ord)
99
+ ) if string =~ /([\x00-\x08\x0B-\x1F])/
100
100
 
101
101
  # Convert character to \xC2\xxx or \xC3\xxx
102
102
  if string.bytesize == 1 && 0x80 <= string.ord && string.ord <= 0xFF
@@ -56,11 +56,11 @@ module Writexlsx
56
56
  # based on the default or user defined values in the Workbook palette.
57
57
  #
58
58
  def palette_color(index)
59
- if index.to_s =~ /^#([0-9A-F]{6})$/i
60
- "FF#{$1.upcase}"
61
- else
62
- "FF#{super(index)}"
63
- end
59
+ if index.to_s =~ /^#([0-9A-F]{6})$/i
60
+ "FF#{$1.upcase}"
61
+ else
62
+ "FF#{super(index)}"
63
+ end
64
64
  end
65
65
 
66
66
  #
@@ -253,11 +253,22 @@ module Writexlsx
253
253
  # Write the <fill> element.
254
254
  #
255
255
  def write_fill(format, dxf_format = nil)
256
- @writer.tag_elements('fill' ) do
257
- write_fill_base(format, dxf_format)
256
+ # Special handling for pattern only case.
257
+ if pattern_only_case?(format, dxf_format)
258
+ write_default_fill(PATTERNS[format.pattern])
259
+ else
260
+ @writer.tag_elements('fill' ) do
261
+ write_fill_base(format, dxf_format)
262
+ end
258
263
  end
259
264
  end
260
265
 
266
+ def pattern_only_case?(format, dxf_format)
267
+ bg_color, fg_color = bg_and_fg_color(format, dxf_format)
268
+
269
+ !ptrue?(fg_color) && !ptrue?(bg_color) && ptrue?(format.pattern)
270
+ end
271
+
261
272
  def write_fill_base(format, dxf_format)
262
273
  # The "none" pattern is handled differently for dxf formats.
263
274
  if dxf_format && format.pattern <= 1
@@ -281,7 +292,9 @@ module Writexlsx
281
292
  if bg_color && bg_color != 0
282
293
  @writer.empty_tag('bgColor', [ ['rgb', palette_color(bg_color)] ])
283
294
  else
284
- @writer.empty_tag('bgColor', [ ['indexed', 64] ]) if !dxf_format
295
+ if !dxf_format && format.pattern <= 1
296
+ @writer.empty_tag('bgColor', [ ['indexed', 64] ])
297
+ end
285
298
  end
286
299
  end
287
300
 
@@ -513,9 +526,9 @@ module Writexlsx
513
526
  #
514
527
  def write_cell_style(name, xf_id, builtin_id)
515
528
  attributes = [
516
- ['name', name],
517
- ['xfId', xf_id],
518
- ['builtinId', builtin_id]
529
+ ['name', name],
530
+ ['xfId', xf_id],
531
+ ['builtinId', builtin_id]
519
532
  ]
520
533
 
521
534
  @writer.empty_tag('cellStyle', attributes)
@@ -557,9 +570,9 @@ module Writexlsx
557
570
  #
558
571
  def write_table_styles
559
572
  attributes = [
560
- ['count', 0],
561
- ['defaultTableStyle', 'TableStyleMedium9'],
562
- ['defaultPivotStyle', 'PivotStyleLight16']
573
+ ['count', 0],
574
+ ['defaultTableStyle', 'TableStyleMedium9'],
575
+ ['defaultPivotStyle', 'PivotStyleLight16']
563
576
  ]
564
577
 
565
578
  @writer.empty_tag('tableStyles', attributes)
@@ -117,8 +117,8 @@ module Writexlsx
117
117
  )
118
118
  elsif user_data[:total_string]
119
119
  total_label_only(
120
- @row2, col_num, col_data, user_data[:total_string], user_data[:format]
121
- )
120
+ @row2, col_num, col_data, user_data[:total_string], user_data[:format]
121
+ )
122
122
  end
123
123
 
124
124
  # Get the dxf format index.
@@ -181,7 +181,7 @@ module Writexlsx
181
181
  row1, row2 = row2, row1 if row1 > row2
182
182
  col1, col2 = col2, col1 if col1 > col2
183
183
 
184
- # The final hash contains the validation parameters.
184
+ # The final hash contains the validation parameters.
185
185
  param ||= {}
186
186
 
187
187
  # Turn on Excel's defaults.
@@ -189,6 +189,14 @@ module Writexlsx
189
189
  param[:header_row] ||= 1
190
190
  param[:autofilter] ||= 1
191
191
 
192
+ # Check that there are enough rows.
193
+ num_rows = row2 - row1
194
+ num_rows -= 1 if ptrue?(param[:header_row])
195
+
196
+ if num_rows < 0
197
+ raise "Must have at least one data row in in add_table()"
198
+ end
199
+
192
200
  # If the header row if off the default is to turn autofilter off.
193
201
  param[:autofilter] = 0 if param[:header_row] == 0
194
202
 
@@ -200,17 +208,17 @@ module Writexlsx
200
208
  # List of valid input parameters.
201
209
  def valid_table_parameter
202
210
  [
203
- :autofilter,
204
- :banded_columns,
205
- :banded_rows,
206
- :columns,
207
- :data,
208
- :first_column,
209
- :header_row,
210
- :last_column,
211
- :name,
212
- :style,
213
- :total_row
211
+ :autofilter,
212
+ :banded_columns,
213
+ :banded_rows,
214
+ :columns,
215
+ :data,
216
+ :first_column,
217
+ :header_row,
218
+ :last_column,
219
+ :name,
220
+ :style,
221
+ :total_row
214
222
  ]
215
223
  end
216
224
 
@@ -323,12 +331,12 @@ module Writexlsx
323
331
  xmlns = "#{schema}spreadsheetml/2006/main"
324
332
 
325
333
  attributes = [
326
- ['xmlns', xmlns],
327
- ['id', id],
328
- ['name', @name],
329
- ['displayName', @name],
330
- ['ref', @range]
331
- ]
334
+ ['xmlns', xmlns],
335
+ ['id', id],
336
+ ['name', @name],
337
+ ['displayName', @name],
338
+ ['ref', @range]
339
+ ]
332
340
 
333
341
  unless ptrue?(@header_row_count)
334
342
  attributes << ['headerRowCount', 0]
@@ -370,9 +378,9 @@ module Writexlsx
370
378
  #
371
379
  def write_table_column(col_data)
372
380
  attributes = [
373
- ['id', col_data.id],
374
- ['name', col_data.name]
375
- ]
381
+ ['id', col_data.id],
382
+ ['name', col_data.name]
383
+ ]
376
384
 
377
385
  if ptrue?(col_data.total_string)
378
386
  attributes << [:totalsRowLabel, col_data.total_string]
@@ -36,7 +36,7 @@ module Writexlsx
36
36
  #
37
37
  def write_theme_file
38
38
  theme =
39
- %Q{<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
39
+ %Q{<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
40
40
  <a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme"><a:themeElements><a:clrScheme name="Office"><a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1><a:lt1><a:sysClr val="window" lastClr="FFFFFF"/></a:lt1><a:dk2><a:srgbClr val="1F497D"/></a:dk2><a:lt2><a:srgbClr val="EEECE1"/></a:lt2><a:accent1><a:srgbClr val="4F81BD"/></a:accent1><a:accent2><a:srgbClr val="C0504D"/></a:accent2><a:accent3><a:srgbClr val="9BBB59"/></a:accent3><a:accent4><a:srgbClr val="8064A2"/></a:accent4><a:accent5><a:srgbClr val="4BACC6"/></a:accent5><a:accent6><a:srgbClr val="F79646"/></a:accent6><a:hlink><a:srgbClr val="0000FF"/></a:hlink><a:folHlink><a:srgbClr val="800080"/></a:folHlink></a:clrScheme><a:fontScheme name="Office"><a:majorFont><a:latin typeface="Cambria"/><a:ea typeface=""/><a:cs typeface=""/><a:font script="Jpan" typeface="MS Pゴシック"/><a:font script="Hang" typeface="맑은 고딕"/><a:font script="Hans" typeface="宋体"/><a:font script="Hant" typeface="新細明體"/><a:font script="Arab" typeface="Times New Roman"/><a:font script="Hebr" typeface="Times New Roman"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="MoolBoran"/><a:font script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Times New Roman"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:majorFont><a:minorFont><a:latin typeface="Calibri"/><a:ea typeface=""/><a:cs typeface=""/><a:font script="Jpan" typeface="MS Pゴシック"/><a:font script="Hang" typeface="맑은 고딕"/><a:font script="Hans" typeface="宋体"/><a:font script="Hant" typeface="新細明體"/><a:font script="Arab" typeface="Arial"/><a:font script="Hebr" typeface="Arial"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="DaunPenh"/><a:font script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Arial"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:minorFont></a:fontScheme><a:fmtScheme name="Office"><a:fillStyleLst><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="50000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="35000"><a:schemeClr val="phClr"><a:tint val="37000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="15000"/><a:satMod val="350000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="1"/></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:shade val="51000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs pos="80000"><a:schemeClr val="phClr"><a:shade val="93000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="94000"/><a:satMod val="135000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="0"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w="9525" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"><a:shade val="95000"/><a:satMod val="105000"/></a:schemeClr></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="25400" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="38100" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln></a:lnStyleLst><a:effectStyleLst><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="20000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="38000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst><a:scene3d><a:camera prst="orthographicFront"><a:rot lat="0" lon="0" rev="0"/></a:camera><a:lightRig rig="threePt" dir="t"><a:rot lat="0" lon="0" rev="1200000"/></a:lightRig></a:scene3d><a:sp3d><a:bevelT w="63500" h="25400"/></a:sp3d></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="40000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="40000"><a:schemeClr val="phClr"><a:tint val="45000"/><a:shade val="99000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="20000"/><a:satMod val="255000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="-80000" r="50000" b="180000"/></a:path></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="80000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="30000"/><a:satMod val="200000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="50000" r="50000" b="50000"/></a:path></a:gradFill></a:bgFillStyleLst></a:fmtScheme></a:themeElements><a:objectDefaults/><a:extraClrSchemeLst/></a:theme>}
41
41
  @writer.write(theme)
42
42
  end
@@ -37,8 +37,8 @@ module Writexlsx
37
37
  end
38
38
  unless comments_data.empty?
39
39
  write_shape_type_and_shape(
40
- comments_data,
41
- vml_shape_id, z_index) do
40
+ comments_data,
41
+ vml_shape_id, z_index) do
42
42
  write_comment_shapetype
43
43
  end
44
44
  end
@@ -84,9 +84,9 @@ module Writexlsx
84
84
  def xml_attributes
85
85
  schema = 'urn:schemas-microsoft-com:'
86
86
  [
87
- ['xmlns:v', "#{schema}vml"],
88
- ['xmlns:o', "#{schema}office:office"],
89
- ['xmlns:x', "#{schema}office:excel"]
87
+ ['xmlns:v', "#{schema}vml"],
88
+ ['xmlns:o', "#{schema}office:office"],
89
+ ['xmlns:x', "#{schema}office:excel"]
90
90
  ]
91
91
  end
92
92
 
@@ -95,8 +95,8 @@ module Writexlsx
95
95
  #
96
96
  def write_shapelayout(data_id)
97
97
  attributes = [
98
- ['v:ext', 'edit']
99
- ]
98
+ ['v:ext', 'edit']
99
+ ]
100
100
 
101
101
  @writer.tag_elements('o:shapelayout', attributes) do
102
102
  # Write the o:idmap element.
@@ -121,10 +121,10 @@ module Writexlsx
121
121
  #
122
122
  def write_comment_shapetype
123
123
  attributes = [
124
- ['id', '_x0000_t202'],
125
- ['coordsize', '21600,21600'],
126
- ['o:spt', 202],
127
- ['path', 'm,l,21600r21600,l21600,xe']
124
+ ['id', '_x0000_t202'],
125
+ ['coordsize', '21600,21600'],
126
+ ['o:spt', 202],
127
+ ['path', 'm,l,21600r21600,l21600,xe']
128
128
  ]
129
129
 
130
130
  @writer.tag_elements('v:shapetype', attributes) do
@@ -140,11 +140,11 @@ module Writexlsx
140
140
  #
141
141
  def write_button_shapetype
142
142
  attributes = [
143
- ['id', '_x0000_t201'],
144
- ['coordsize', '21600,21600'],
145
- ['o:spt', 201],
146
- ['path', 'm,l,21600r21600,l21600,xe']
147
- ]
143
+ ['id', '_x0000_t201'],
144
+ ['coordsize', '21600,21600'],
145
+ ['o:spt', 201],
146
+ ['path', 'm,l,21600r21600,l21600,xe']
147
+ ]
148
148
 
149
149
  @writer.tag_elements('v:shapetype', attributes) do
150
150
  # Write the v:stroke element.
@@ -169,14 +169,14 @@ module Writexlsx
169
169
  stroked = 'f'
170
170
 
171
171
  attributes = [
172
- ['id', id],
173
- ['coordsize', coordsize],
174
- ['o:spt', spt],
175
- ['o:preferrelative', o_preferrelative],
176
- ['path', path],
177
- ['filled', filled],
178
- ['stroked', stroked]
179
- ]
172
+ ['id', id],
173
+ ['coordsize', coordsize],
174
+ ['o:spt', spt],
175
+ ['o:preferrelative', o_preferrelative],
176
+ ['path', path],
177
+ ['filled', filled],
178
+ ['stroked', stroked]
179
+ ]
180
180
 
181
181
  @writer.tag_elements('v:shapetype', attributes) do
182
182
  # Write the v:stroke element.
@@ -198,12 +198,12 @@ module Writexlsx
198
198
  #
199
199
  def write_button_path
200
200
  attributes = [
201
- ['shadowok', 'f'],
202
- ['o:extrusionok', 'f'],
203
- ['strokeok', 'f'],
204
- ['fillok', 'f'],
205
- ['o:connecttype', 'rect']
206
- ]
201
+ ['shadowok', 'f'],
202
+ ['o:extrusionok', 'f'],
203
+ ['strokeok', 'f'],
204
+ ['fillok', 'f'],
205
+ ['o:connecttype', 'rect']
206
+ ]
207
207
  @writer.empty_tag('v:path', attributes)
208
208
  end
209
209
 
@@ -216,10 +216,10 @@ module Writexlsx
216
216
  connecttype = 'rect'
217
217
 
218
218
  attributes = [
219
- ['o:extrusionok', extrusionok],
220
- ['gradientshapeok', gradientshapeok],
221
- ['o:connecttype', connecttype]
222
- ]
219
+ ['o:extrusionok', extrusionok],
220
+ ['gradientshapeok', gradientshapeok],
221
+ ['o:connecttype', connecttype]
222
+ ]
223
223
 
224
224
  @writer.empty_tag('v:path', attributes)
225
225
  end
@@ -229,9 +229,9 @@ module Writexlsx
229
229
  #
230
230
  def write_shapetype_lock
231
231
  attributes = [
232
- ['v:ext', 'edit'],
233
- ['shapetype', 't']
234
- ]
232
+ ['v:ext', 'edit'],
233
+ ['shapetype', 't']
234
+ ]
235
235
  @writer.empty_tag('o:lock', attributes)
236
236
  end
237
237
 
@@ -240,9 +240,9 @@ module Writexlsx
240
240
  #
241
241
  def write_rotation_lock
242
242
  attributes = [
243
- ['v:ext', 'edit'],
244
- ['rotation', 't']
245
- ]
243
+ ['v:ext', 'edit'],
244
+ ['rotation', 't']
245
+ ]
246
246
  @writer.empty_tag('o:lock', attributes)
247
247
  end
248
248
 
@@ -254,9 +254,9 @@ module Writexlsx
254
254
  aspectratio = 't'
255
255
 
256
256
  attributes = [
257
- ['v:ext', ext],
258
- ['aspectratio', aspectratio]
259
- ]
257
+ ['v:ext', ext],
258
+ ['aspectratio', aspectratio]
259
+ ]
260
260
 
261
261
  @writer.empty_tag('o:lock', attributes)
262
262
  end
@@ -154,15 +154,17 @@ module Writexlsx
154
154
  # EMUs per point. Therefore, 12,700 * 3 /4 = 9,525 EMUs per pixel.
155
155
  #
156
156
  def calc_position_emus(worksheet)
157
- c_start, r_start, xx1, yy1, c_end, r_end, xx2, yy2, x_abslt, y_abslt =
158
- worksheet.position_object_pixels(
159
- @column_start,
160
- @row_start,
161
- @x_offset,
162
- @y_offset,
163
- @width * @scale_x,
164
- @height * @scale_y
165
- )
157
+ c_start, r_start,
158
+ xx1, yy1, c_end, r_end,
159
+ xx2, yy2, x_abslt, y_abslt =
160
+ worksheet.position_object_pixels(
161
+ @column_start,
162
+ @row_start,
163
+ @x_offset,
164
+ @y_offset,
165
+ @width * @scale_x,
166
+ @height * @scale_y
167
+ )
166
168
 
167
169
  # Now that x2/y2 have been calculated with a potentially negative
168
170
  # width/height we use the absolute value and convert to EMUs.
@@ -297,12 +299,12 @@ module Writexlsx
297
299
 
298
300
  def dimensions
299
301
  [
300
- @column_start, @row_start,
301
- @x1, @y1,
302
- @column_end, @row_end,
303
- @x2, @y2,
304
- @x_abs, @y_abs,
305
- @width_emu, @height_emu
302
+ @column_start, @row_start,
303
+ @x1, @y1,
304
+ @column_end, @row_end,
305
+ @x2, @y2,
306
+ @x_abs, @y_abs,
307
+ @width_emu, @height_emu
306
308
  ]
307
309
  end
308
310
  end