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
@@ -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