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
@@ -16,8 +16,8 @@ module Writexlsx
16
16
  def cell_attributes #:nodoc:
17
17
  xf_index = xf ? xf.get_xf_index : 0
18
18
  attributes = [
19
- ['r', xl_rowcol_to_cell(row, col)]
20
- ]
19
+ ['r', xl_rowcol_to_cell(row, col)]
20
+ ]
21
21
 
22
22
  # Add the cell format index.
23
23
  if xf_index != 0
@@ -100,7 +100,7 @@ module Writexlsx
100
100
  elsif error_code.include?(@result)
101
101
  attributes << ['t', 'e']
102
102
  else
103
- attributes << ['t', 'str']
103
+ attributes << ['t', 'str']
104
104
  end
105
105
  end
106
106
  @worksheet.writer.tag_elements('c', attributes) do
@@ -128,6 +128,28 @@ module Writexlsx
128
128
  end
129
129
  end
130
130
 
131
+ class DynamicFormulaArrayCellData < CellData # :nodoc:
132
+ def initialize(worksheet, row, col, formula, xf, range, result)
133
+ @worksheet = worksheet
134
+ @row, @col, @token, @xf, @range, @result = row, col, formula, xf, range, result
135
+ end
136
+
137
+ def data
138
+ @result || 0
139
+ end
140
+
141
+ def write_cell
142
+ # Add metadata linkage for dynamic array formulas.
143
+ attributes = cell_attributes
144
+ attributes << ['cm', '1']
145
+
146
+ @worksheet.writer.tag_elements('c', attributes) do
147
+ @worksheet.write_cell_array_formula(token, range)
148
+ @worksheet.write_cell_value(result)
149
+ end
150
+ end
151
+ end
152
+
131
153
  class BooleanCellData < CellData # :nodoc:
132
154
  def initialize(worksheet, row, col, val, xf)
133
155
  @worksheet = worksheet
@@ -138,12 +138,7 @@ module Writexlsx
138
138
  row_first, row_last = row_last, row_first if row_first > row_last
139
139
  col_first, col_last = col_last, col_first if col_first > col_last
140
140
 
141
- # If the first and last cell are the same write a single cell.
142
- if row_first == row_last && col_first == col_last
143
- sqref += xl_rowcol_to_cell(row_first, col_first)
144
- else
145
- sqref += xl_range(row_first, row_last, col_first, col_last)
146
- end
141
+ sqref += xl_range(row_first, row_last, col_first, col_last)
147
142
  end
148
143
 
149
144
  if @validate != 'none'
@@ -186,11 +181,11 @@ module Writexlsx
186
181
  end
187
182
  unless valid_validation_type.has_key?(@validate.downcase)
188
183
  raise WriteXLSXOptionParameterError,
189
- "Unknown validation type '#{@validate}' for parameter :validate in data_validation()"
184
+ "Unknown validation type '#{@validate}' for parameter :validate in data_validation()"
190
185
  end
191
186
  if @error_type && !error_type_hash.has_key?(@error_type.downcase)
192
187
  raise WriteXLSXOptionParameterError,
193
- "Unknown criteria type '#param[:error_type}' for parameter :error_type in data_validation()"
188
+ "Unknown criteria type '#param[:error_type}' for parameter :error_type in data_validation()"
194
189
  end
195
190
  end
196
191
 
@@ -204,7 +199,7 @@ module Writexlsx
204
199
  if @criteria == 'between' || @criteria == 'notBetween'
205
200
  unless has_key?(:maximum)
206
201
  raise WriteXLSXOptionParameterError,
207
- "Parameter :maximum is required in data_validation() when using :between or :not between criteria"
202
+ "Parameter :maximum is required in data_validation() when using :between or :not between criteria"
208
203
  end
209
204
  else
210
205
  @maximum = nil
@@ -214,7 +209,7 @@ module Writexlsx
214
209
  def check_valid_citeria_types
215
210
  unless valid_criteria_type.has_key?(@criteria.downcase)
216
211
  raise WriteXLSXOptionParameterError,
217
- "Unknown criteria type '#{@criteria}' for parameter :criteria in data_validation()"
212
+ "Unknown criteria type '#{@criteria}' for parameter :criteria in data_validation()"
218
213
  end
219
214
  end
220
215
 
@@ -258,22 +253,22 @@ module Writexlsx
258
253
  # List of valid input parameters.
259
254
  def valid_validation_parameter
260
255
  [
261
- :validate,
262
- :criteria,
263
- :value,
264
- :source,
265
- :minimum,
266
- :maximum,
267
- :ignore_blank,
268
- :dropdown,
269
- :show_input,
270
- :input_title,
271
- :input_message,
272
- :show_error,
273
- :error_title,
274
- :error_message,
275
- :error_type,
276
- :other_cells
256
+ :validate,
257
+ :criteria,
258
+ :value,
259
+ :source,
260
+ :minimum,
261
+ :maximum,
262
+ :ignore_blank,
263
+ :dropdown,
264
+ :show_input,
265
+ :input_title,
266
+ :input_message,
267
+ :show_error,
268
+ :error_title,
269
+ :error_message,
270
+ :error_type,
271
+ :other_cells
277
272
  ]
278
273
  end
279
274
 
@@ -87,9 +87,9 @@ module Writexlsx
87
87
 
88
88
  def attributes(row, col, dummy = nil)
89
89
  attr = [
90
- ['ref', xl_rowcol_to_cell(row, col)],
91
- ['location', @url]
92
- ]
90
+ ['ref', xl_rowcol_to_cell(row, col)],
91
+ ['location', @url]
92
+ ]
93
93
 
94
94
  attr << ['tooltip', @tip] if @tip
95
95
  attr << ['display', @str]
@@ -116,7 +116,7 @@ module Writexlsx
116
116
 
117
117
  # Add the file:/// URI to the url if non-local.
118
118
  if url =~ %r![:]! || # Windows style "C:/" link.
119
- url =~ %r!^\\\\! # Network share.
119
+ url =~ %r!^\\\\! # Network share.
120
120
  url = "file:///#{url}"
121
121
  end
122
122
 
@@ -105,12 +105,12 @@ module Writexlsx
105
105
  attributes << ['pageOrder', "overThenDown"] if @across
106
106
  attributes << ['firstPageNumber', @page_start] if @page_start && @page_start > 1
107
107
  attributes << ['orientation',
108
- if @orientation
109
- 'portrait'
110
- else
111
- 'landscape'
112
- end
113
- ]
108
+ if @orientation
109
+ 'portrait'
110
+ else
111
+ 'landscape'
112
+ end
113
+ ]
114
114
  attributes << ['blackAndWhite', 1] if @black_white
115
115
  attributes << ['useFirstPageNumber', 1] if ptrue?(@page_start)
116
116
 
@@ -180,12 +180,12 @@ module Writexlsx
180
180
 
181
181
  def margin_attributes # :nodoc:
182
182
  [
183
- ['left', @margin_left],
184
- ['right', @margin_right],
185
- ['top', @margin_top],
186
- ['bottom', @margin_bottom],
187
- ['header', @margin_header],
188
- ['footer', @margin_footer]
183
+ ['left', @margin_left],
184
+ ['right', @margin_right],
185
+ ['top', @margin_top],
186
+ ['bottom', @margin_bottom],
187
+ ['header', @margin_header],
188
+ ['footer', @margin_footer]
189
189
  ]
190
190
  end
191
191
  end