write_xlsx 1.07.0 → 1.09.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 (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