embulk-parser-poi_excel 0.1.4 → 0.1.10

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 (36) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +52 -5
  3. data/build.gradle +18 -8
  4. data/src/main/java/org/embulk/parser/poi_excel/PoiExcelColumnValueType.java +4 -0
  5. data/src/main/java/org/embulk/parser/poi_excel/PoiExcelParserPlugin.java +80 -3
  6. data/src/main/java/org/embulk/parser/poi_excel/bean/PoiExcelColumnBean.java +103 -6
  7. data/src/main/java/org/embulk/parser/poi_excel/bean/PoiExcelColumnIndex.java +74 -37
  8. data/src/main/java/org/embulk/parser/poi_excel/bean/util/PoiExcelCellAddress.java +50 -0
  9. data/src/main/java/org/embulk/parser/poi_excel/visitor/PoiExcelCellFontVisitor.java +0 -6
  10. data/src/main/java/org/embulk/parser/poi_excel/visitor/PoiExcelCellStyleVisitor.java +11 -11
  11. data/src/main/java/org/embulk/parser/poi_excel/visitor/PoiExcelCellTypeVisitor.java +52 -0
  12. data/src/main/java/org/embulk/parser/poi_excel/visitor/PoiExcelCellValueVisitor.java +106 -37
  13. data/src/main/java/org/embulk/parser/poi_excel/visitor/PoiExcelClientAnchorVisitor.java +1 -1
  14. data/src/main/java/org/embulk/parser/poi_excel/visitor/PoiExcelColumnVisitor.java +64 -4
  15. data/src/main/java/org/embulk/parser/poi_excel/visitor/PoiExcelVisitorFactory.java +14 -0
  16. data/src/main/java/org/embulk/parser/poi_excel/visitor/embulk/BooleanCellVisitor.java +5 -0
  17. data/src/main/java/org/embulk/parser/poi_excel/visitor/embulk/CellVisitor.java +3 -0
  18. data/src/main/java/org/embulk/parser/poi_excel/visitor/embulk/DoubleCellVisitor.java +5 -0
  19. data/src/main/java/org/embulk/parser/poi_excel/visitor/embulk/LongCellVisitor.java +5 -0
  20. data/src/main/java/org/embulk/parser/poi_excel/visitor/embulk/StringCellVisitor.java +30 -2
  21. data/src/main/java/org/embulk/parser/poi_excel/visitor/embulk/TimestampCellVisitor.java +5 -0
  22. data/src/main/java/org/embulk/parser/poi_excel/visitor/util/MergedRegionMap.java +51 -0
  23. data/src/test/java/org/embulk/parser/poi_excel/TestPoiExcelParserPlugin.java +27 -79
  24. data/src/test/java/org/embulk/parser/poi_excel/TestPoiExcelParserPlugin_cellAddress.java +69 -0
  25. data/src/test/java/org/embulk/parser/poi_excel/TestPoiExcelParserPlugin_cellComment.java +1 -1
  26. data/src/test/java/org/embulk/parser/poi_excel/TestPoiExcelParserPlugin_cellError.java +1 -1
  27. data/src/test/java/org/embulk/parser/poi_excel/TestPoiExcelParserPlugin_cellFont.java +1 -1
  28. data/src/test/java/org/embulk/parser/poi_excel/TestPoiExcelParserPlugin_cellStyle.java +14 -14
  29. data/src/test/java/org/embulk/parser/poi_excel/TestPoiExcelParserPlugin_cellType.java +79 -0
  30. data/src/test/java/org/embulk/parser/poi_excel/TestPoiExcelParserPlugin_columnNumber.java +1 -1
  31. data/src/test/java/org/embulk/parser/poi_excel/TestPoiExcelParserPlugin_constant.java +1 -1
  32. data/src/test/java/org/embulk/parser/poi_excel/TestPoiExcelParserPlugin_convertError.java +1 -1
  33. data/src/test/java/org/embulk/parser/poi_excel/TestPoiExcelParserPlugin_formula.java +90 -0
  34. data/src/test/java/org/embulk/parser/poi_excel/TestPoiExcelParserPlugin_mergedCell.java +89 -0
  35. data/src/test/java/org/embulk/parser/poi_excel/TestPoiExcelParserPlugin_sheets.java +35 -1
  36. metadata +26 -18
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: be106894c6b2167dd2f275cf8696003cc82195c3
4
- data.tar.gz: c6f3718249f56278a0a29dd50521216765838c51
3
+ metadata.gz: '058cae76dc2aff62982491ddd1d29f0bc707d030'
4
+ data.tar.gz: 4b7652888f66faa0b3b3653cda9c3ba4b9d49887
5
5
  SHA512:
6
- metadata.gz: 6c88d6b4604a07b40681a44290bdf75c7f8c10e6e857da5ed254fe7828fc796e54f84e0f37de1e5c9f0089c934dd91283783b95849180b620cf1180a70d8a419
7
- data.tar.gz: 772b8d21d4e1587acd97886a79b284a1db42d8a12ac30660a0d2eba9db61292839ceeef39f65d8756e0ee4aea58c7a3c9e3785fcda31c51f01708b116497c6d7
6
+ metadata.gz: b700c88e34a05edd16d1d7444053540fae8f8ef7d596c709505f070ca4d3d0582e9c69da6cc253b97a595cbe5d3aad60f1a1bbb75b90110e573575ba32c4d752
7
+ data.tar.gz: a36bc92ebd495a908f98c53cb92ebd3c84c294df3cde9d2ea926f0c452c9a6d2fcce7646f9f906a6ed25b21fb14de1a2ecc6ea5ee6e8aeec10c8b46346efd070
data/README.md CHANGED
@@ -28,12 +28,12 @@ in:
28
28
  ```
29
29
 
30
30
  if omit **value**, specified `cell_value`.
31
- if omit **column_number** when **valus** is `cell_value`, specified next column.
31
+ if omit **column_number** when **value** is `cell_value`, specified next column.
32
32
 
33
33
 
34
34
  ## Configuration
35
35
 
36
- * **sheets**: sheet name. (list of string, required)
36
+ * **sheets**: sheet name. can use wildcards `*`, `?`. (list of string, required)
37
37
  * **skip_header_lines**: skip rows. (integer, default: `0`)
38
38
  * **columns**: column definition. see below. (hash, required)
39
39
  * **sheet_options**: sheet option. see below. (hash, default: null)
@@ -44,9 +44,15 @@ if omit **column_number** when **valus** is `cell_value`, specified next column.
44
44
  * **type**: Embulk column type. (string, required)
45
45
  * **value**: value type. see below. (string, defualt: `cell_value`)
46
46
  * **column_number**: Excel column number. see below. (string, default: next column)
47
+ * **cell_address**: Excel cell address such as `A1`, `Sheet1!B3`. only one of `column_number`, `cell_address` can be specified. (string, not required)
48
+ * **numeric_format**: format of numeric(double) to string such as `%4.2f`. (default: Java's Double.toString())
47
49
  * **attribute_name**: use with value `cell_style`, `cell_font`, etc. see below. (list of string)
48
50
  * **on_cell_error**: processing method of Cell error. see below. (string, default: `constant`)
51
+ * **formula_handling**: processing method of formula. see below. (`evaluate` or `cashed_value`. default: `evaluate`)
52
+ * **on_evaluate_error**: processing method of evaluate formula error. see below. (string, default: `exception`)
53
+ * **formula_replace**: replace formula before evaluate. see below.
49
54
  * **on_convert_error**: processing method of convert error. see below. (string, default: `exception`)
55
+ * **search_merged_cell**: search merged cell when cell is BLANK. one of `none`, `linear_search`, `tree_search`. (string, default: `tree_search`)
50
56
 
51
57
  ### value
52
58
 
@@ -55,6 +61,8 @@ if omit **column_number** when **valus** is `cell_value`, specified next column.
55
61
  * `cell_style`: all cell style attributes. returned json string. see **attribute_name**. (**type** required `string`)
56
62
  * `cell_font`: all cell font attributes. returned json string. see **attribute_name**. (**type** required `string`)
57
63
  * `cell_comment`: all cell comment attributes. returned json string. see **attribute_name**. (**type** required `string`)
64
+ * `cell_type`: cell type. returned Cell.getCellType() of POI.
65
+ * `cell_cached_type`: cell cached formula result type. returned Cell.getCachedFormulaResultType() of POI when CellType==FORMULA, otherwise same as `cell_type` (returned Cell.getCellType()).
58
66
  * `sheet_name`: sheet name.
59
67
  * `row_number`: row number(1 origin).
60
68
  * `column_number`: column number(1 origin).
@@ -120,11 +128,50 @@ Processing method of Cell error (`#DIV/0!`, `#REF!`, etc).
120
128
  ```
121
129
 
122
130
  * `constant`: set null. (default)
123
- * `constant.`*value*: set value.
131
+ * `constant.`*value*: set specified value.
124
132
  * `error_code`: set error code.
125
133
  * `exception`: throw exception.
126
134
 
127
135
 
136
+ ### formula_handling
137
+
138
+ Processing method of formula.
139
+
140
+ ```yaml
141
+ columns:
142
+ - {name: foo, type: string, column_number: A, value: cell_value, formula_handling: cashed_value}
143
+ ```
144
+
145
+ * `evaluate`: evaluate formula. (default)
146
+ * `cashed_value`: cashed value in cell.
147
+
148
+
149
+ ### on_evaluate_error
150
+
151
+ Processing method of evaluate formula error.
152
+
153
+ ```yaml
154
+ columns:
155
+ - {name: foo, type: string, column_number: A, value: cell_value, on_evaluate_error: constant}
156
+ ```
157
+
158
+ * `constant`: set null.
159
+ * `constant.`*value*: set value.
160
+ * `exception`: throw exception. (default)
161
+
162
+
163
+ ### formula_replace
164
+
165
+ Replace formula before evaluate.
166
+
167
+ ```yaml
168
+ columns:
169
+ - {name: foo, type: string, column_number: A, value: cell_value, formula_replace: [{regex: aaa, to: "A${row}"}, {regex: bbb, to: "B${row}"}]}
170
+ ```
171
+
172
+ `${row}` is replaced with the current row number.
173
+
174
+
128
175
  ### on_convert_error
129
176
 
130
177
  Processing method of convert error. ex) Excel boolean to Embulk timestamp
@@ -141,7 +188,7 @@ Processing method of convert error. ex) Excel boolean to Embulk timestamp
141
188
 
142
189
  ### sheet_options
143
190
 
144
- Options of indivisual sheet.
191
+ Options of individual sheet.
145
192
 
146
193
  ```yaml
147
194
  parser:
@@ -165,7 +212,7 @@ Options of indivisual sheet.
165
212
  ```
166
213
 
167
214
  **sheet_options** is map of sheet name.
168
- Map values are **skip_header_lines**, **colums**.
215
+ Map values are **skip_header_lines**, **columns**.
169
216
 
170
217
  **columns** is map of column name.
171
218
  Map values are same **columns** in **parser** (excluding `name`, `type`).
@@ -1,6 +1,6 @@
1
1
  plugins {
2
2
  id "com.jfrog.bintray" version "1.1"
3
- id "com.github.jruby-gradle.base" version "0.1.5"
3
+ id "com.github.jruby-gradle.base" version "1.5.0"
4
4
  id "java"
5
5
  id "eclipse"
6
6
  }
@@ -13,7 +13,7 @@ configurations {
13
13
  provided
14
14
  }
15
15
 
16
- version = "0.1.4"
16
+ version = "0.1.10"
17
17
 
18
18
  sourceCompatibility = 1.7
19
19
  targetCompatibility = 1.7
@@ -23,8 +23,10 @@ dependencies {
23
23
  provided "org.embulk:embulk-core:0.7.5"
24
24
  compile "org.embulk:embulk-standards:0.7.5"
25
25
  // compile "YOUR_JAR_DEPENDENCY_GROUP:YOUR_JAR_DEPENDENCY_MODULE:YOUR_JAR_DEPENDENCY_VERSION"
26
- compile group: 'org.apache.poi', name : 'poi', version: '3.13'
27
- compile group: 'org.apache.poi', name : 'poi-ooxml', version: '3.13'
26
+ compile group: 'org.apache.poi', name : 'poi', version: '3.17'
27
+ compile(group: 'org.apache.poi', name : 'poi-ooxml', version: '3.17') {
28
+ exclude group: 'stax', module: 'stax-api'
29
+ }
28
30
  testCompile "junit:junit:4.+"
29
31
  }
30
32
 
@@ -36,14 +38,22 @@ task classpath(type: Copy, dependsOn: ["jar"]) {
36
38
  clean { delete "classpath" }
37
39
 
38
40
  task gem(type: JRubyExec, dependsOn: ["gemspec", "classpath"]) {
39
- jrubyArgs "-rrubygems/gem_runner", "-eGem::GemRunner.new.run(ARGV)", "build"
40
- script "${project.name}.gemspec"
41
+ jrubyArgs "-S"
42
+ script "gem"
43
+ scriptArgs "build", "${project.name}.gemspec"
41
44
  doLast { ant.move(file: "${project.name}-${project.version}.gem", todir: "pkg") }
42
45
  }
43
46
 
44
47
  task gemPush(type: JRubyExec, dependsOn: ["gem"]) {
45
- jrubyArgs "-rrubygems/gem_runner", "-eGem::GemRunner.new.run(ARGV)", "push"
46
- script "pkg/${project.name}-${project.version}.gem"
48
+ jrubyArgs "-S"
49
+ script "gem"
50
+ scriptArgs "push", "pkg/${project.name}-${project.version}.gem"
51
+ }
52
+
53
+ task gemUnpack(type: JRubyExec) {
54
+ jrubyArgs "-S"
55
+ script "gem"
56
+ scriptArgs "unpack", "pkg/${project.name}-${project.version}.gem"
47
57
  }
48
58
 
49
59
  task "package"(dependsOn: ["gemspec", "classpath"]) << {
@@ -11,6 +11,10 @@ public enum PoiExcelColumnValueType {
11
11
  CELL_FONT(true, false),
12
12
  /** cell comment */
13
13
  CELL_COMMENT(true, false),
14
+ /** cell type */
15
+ CELL_TYPE(true, false),
16
+ /** cell CachedFormulaResultType */
17
+ CELL_CACHED_TYPE(true, false),
14
18
  /** sheet name */
15
19
  SHEET_NAME(false, false),
16
20
  /** row number (1 origin) */
@@ -2,8 +2,11 @@ package org.embulk.parser.poi_excel;
2
2
 
3
3
  import java.io.IOException;
4
4
  import java.util.ArrayList;
5
+ import java.util.LinkedHashSet;
5
6
  import java.util.List;
6
7
  import java.util.Map;
8
+ import java.util.Set;
9
+ import java.util.regex.Pattern;
7
10
 
8
11
  import org.apache.poi.EncryptedDocumentException;
9
12
  import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
@@ -93,6 +96,11 @@ public class PoiExcelParserPlugin implements ParserPlugin {
93
96
  @ConfigDefault("null")
94
97
  public Optional<String> getColumnNumber();
95
98
 
99
+ // A1,B2,... or Sheet1!A1
100
+ @Config("cell_address")
101
+ @ConfigDefault("null")
102
+ public Optional<String> getCellAddress();
103
+
96
104
  // use when value_type=cell_style, cell_font, ...
97
105
  @Config("attribute_name")
98
106
  @ConfigDefault("null")
@@ -100,11 +108,19 @@ public class PoiExcelParserPlugin implements ParserPlugin {
100
108
  }
101
109
 
102
110
  public interface ColumnCommonOptionTask extends Task {
111
+ // format of numeric(double) to string
112
+ @Config("numeric_format")
113
+ @ConfigDefault("null")
114
+ public Optional<String> getNumericFormat();
103
115
 
104
116
  // search merged cell if cellType=BLANK
105
117
  @Config("search_merged_cell")
106
118
  @ConfigDefault("null")
107
- public Optional<Boolean> getSearchMergedCell();
119
+ public Optional<String> getSearchMergedCell();
120
+
121
+ @Config("formula_handling")
122
+ @ConfigDefault("null")
123
+ public Optional<String> getFormulaHandling();
108
124
 
109
125
  @Config("formula_replace")
110
126
  @ConfigDefault("null")
@@ -166,9 +182,60 @@ public class PoiExcelParserPlugin implements ParserPlugin {
166
182
  throw new RuntimeException(e);
167
183
  }
168
184
 
169
- run(task, schema, workbook, sheetNames, output);
185
+ List<String> list = resolveSheetName(workbook, sheetNames);
186
+ if (log.isDebugEnabled()) {
187
+ log.debug("resolved sheet names={}", list);
188
+ }
189
+ run(task, schema, workbook, list, output);
190
+ }
191
+ }
192
+ }
193
+
194
+ private List<String> resolveSheetName(Workbook workbook, List<String> sheetNames) {
195
+ Set<String> set = new LinkedHashSet<>();
196
+ for (String s : sheetNames) {
197
+ if (s.contains("*") || s.contains("?")) {
198
+ int length = s.length();
199
+ StringBuilder sb = new StringBuilder(length * 2);
200
+ StringBuilder buf = new StringBuilder(32);
201
+ for (int i = 0; i < length;) {
202
+ int c = s.codePointAt(i);
203
+ switch (c) {
204
+ case '*':
205
+ if (buf.length() > 0) {
206
+ sb.append(Pattern.quote(buf.toString()));
207
+ buf.setLength(0);
208
+ }
209
+ sb.append(".*");
210
+ break;
211
+ case '?':
212
+ if (buf.length() > 0) {
213
+ sb.append(Pattern.quote(buf.toString()));
214
+ buf.setLength(0);
215
+ }
216
+ sb.append(".");
217
+ break;
218
+ default:
219
+ buf.appendCodePoint(c);
220
+ break;
221
+ }
222
+ i += Character.charCount(c);
223
+ }
224
+ if (buf.length() > 0) {
225
+ sb.append(Pattern.quote(buf.toString()));
226
+ }
227
+ String regex = sb.toString();
228
+ for (Sheet sheet : workbook) {
229
+ String name = sheet.getSheetName();
230
+ if (name.matches(regex)) {
231
+ set.add(name);
232
+ }
233
+ }
234
+ } else {
235
+ set.add(s);
170
236
  }
171
237
  }
238
+ return new ArrayList<>(set);
172
239
  }
173
240
 
174
241
  protected void run(PluginTask task, Schema schema, Workbook workbook, List<String> sheetNames, PageOutput output) {
@@ -193,18 +260,28 @@ public class PoiExcelParserPlugin implements ParserPlugin {
193
260
 
194
261
  int count = 0;
195
262
  for (Row row : sheet) {
196
- if (row.getRowNum() < skipHeaderLines) {
263
+ int rowIndex = row.getRowNum();
264
+ if (rowIndex < skipHeaderLines) {
265
+ log.debug("row({}) skipped", rowIndex);
197
266
  continue;
198
267
  }
268
+ if (log.isDebugEnabled()) {
269
+ log.debug("row({}) start", rowIndex);
270
+ }
199
271
 
200
272
  visitor.setRow(row);
201
273
  schema.visitColumns(visitor);
202
274
  pageBuilder.addRecord();
203
275
 
204
276
  if (++count >= flushCount) {
277
+ log.trace("flush");
205
278
  pageBuilder.flush();
206
279
  count = 0;
207
280
  }
281
+
282
+ if (log.isDebugEnabled()) {
283
+ log.debug("row({}) end", rowIndex);
284
+ }
208
285
  }
209
286
  pageBuilder.flush();
210
287
  }
@@ -11,6 +11,7 @@ import org.embulk.parser.poi_excel.PoiExcelParserPlugin.ColumnCommonOptionTask;
11
11
  import org.embulk.parser.poi_excel.PoiExcelParserPlugin.ColumnOptionTask;
12
12
  import org.embulk.parser.poi_excel.PoiExcelParserPlugin.FormulaReplaceTask;
13
13
  import org.embulk.parser.poi_excel.bean.PoiExcelColumnBean.ErrorStrategy.Strategy;
14
+ import org.embulk.parser.poi_excel.bean.util.PoiExcelCellAddress;
14
15
  import org.embulk.spi.Column;
15
16
 
16
17
  import com.google.common.base.Optional;
@@ -107,6 +108,25 @@ public class PoiExcelColumnBean {
107
108
  return Optional.absent();
108
109
  }
109
110
 
111
+ private Optional<PoiExcelCellAddress> cellAddress;
112
+
113
+ public PoiExcelCellAddress getCellAddress() {
114
+ if (cellAddress == null) {
115
+ this.cellAddress = initializeCellAddress();
116
+ }
117
+ return cellAddress.orNull();
118
+ }
119
+
120
+ protected Optional<PoiExcelCellAddress> initializeCellAddress() {
121
+ for (ColumnOptionTask task : columnTaskList) {
122
+ Optional<String> option = task.getCellAddress();
123
+ if (option.isPresent()) {
124
+ return Optional.of(new PoiExcelCellAddress(option.get()));
125
+ }
126
+ }
127
+ return Optional.absent();
128
+ }
129
+
110
130
  protected abstract class CacheValue<T> {
111
131
  private T value;
112
132
 
@@ -231,23 +251,100 @@ public class PoiExcelColumnBean {
231
251
  return attributeName.get();
232
252
  }
233
253
 
234
- private CacheValue<Boolean> searchMergedCell = new CacheValue<Boolean>() {
254
+ private CacheValue<String> numericFormat = new CacheValue<String>() {
235
255
 
236
256
  @Override
237
- protected Optional<Boolean> getTaskValue(ColumnCommonOptionTask task) {
238
- return task.getSearchMergedCell();
257
+ protected Optional<String> getTaskValue(ColumnCommonOptionTask task) {
258
+ return task.getNumericFormat();
239
259
  }
240
260
 
241
261
  @Override
242
- protected Boolean getDefaultValue() {
243
- return true;
262
+ protected String getDefaultValue() {
263
+ return "";
244
264
  }
245
265
  };
246
266
 
247
- public boolean getSearchMergedCell() {
267
+ public String getNumericFormat() {
268
+ return numericFormat.get();
269
+ }
270
+
271
+ public enum SearchMergedCell {
272
+ NONE, LINEAR_SEARCH, TREE_SEARCH
273
+ }
274
+
275
+ private CacheValue<SearchMergedCell> searchMergedCell = new CacheValue<SearchMergedCell>() {
276
+
277
+ @Override
278
+ protected Optional<SearchMergedCell> getTaskValue(ColumnCommonOptionTask task) {
279
+ Optional<String> option = task.getSearchMergedCell();
280
+ String value = option.or("null").trim();
281
+ switch (value.toLowerCase()) {
282
+ case "null":
283
+ return Optional.absent();
284
+ case "true": // compatibility ver 0.1.7
285
+ return Optional.of(getDefaultValue());
286
+ case "false": // compatibility ver 0.1.7
287
+ return Optional.of(SearchMergedCell.NONE);
288
+ default:
289
+ break;
290
+ }
291
+ try {
292
+ return Optional.of(SearchMergedCell.valueOf(value.toUpperCase()));
293
+ } catch (Exception e) {
294
+ List<String> list = new ArrayList<>();
295
+ for (SearchMergedCell s : SearchMergedCell.values()) {
296
+ list.add(s.name().toLowerCase());
297
+ }
298
+ throw new ConfigException(MessageFormat.format("illegal search_merged_cell={0}. expected={1}", value,
299
+ list), e);
300
+ }
301
+ }
302
+
303
+ @Override
304
+ protected SearchMergedCell getDefaultValue() {
305
+ return SearchMergedCell.TREE_SEARCH;
306
+ }
307
+ };
308
+
309
+ public SearchMergedCell getSearchMergedCell() {
248
310
  return searchMergedCell.get();
249
311
  }
250
312
 
313
+ public enum FormulaHandling {
314
+ EVALUATE, CASHED_VALUE
315
+ }
316
+
317
+ private CacheValue<FormulaHandling> formulaHandling = new CacheValue<FormulaHandling>() {
318
+
319
+ @Override
320
+ protected Optional<FormulaHandling> getTaskValue(ColumnCommonOptionTask task) {
321
+ Optional<String> option = task.getFormulaHandling();
322
+ String value = option.or("null");
323
+ if ("null".equalsIgnoreCase(value)) {
324
+ return Optional.absent();
325
+ }
326
+ try {
327
+ return Optional.of(FormulaHandling.valueOf(value.trim().toUpperCase()));
328
+ } catch (Exception e) {
329
+ List<String> list = new ArrayList<>();
330
+ for (FormulaHandling s : FormulaHandling.values()) {
331
+ list.add(s.name().toLowerCase());
332
+ }
333
+ throw new ConfigException(MessageFormat.format("illegal formula_handling={0}. expected={1}", value,
334
+ list), e);
335
+ }
336
+ }
337
+
338
+ @Override
339
+ protected FormulaHandling getDefaultValue() {
340
+ return FormulaHandling.EVALUATE;
341
+ }
342
+ };
343
+
344
+ public FormulaHandling getFormulaHandling() {
345
+ return formulaHandling.get();
346
+ }
347
+
251
348
  private CacheValue<List<FormulaReplaceTask>> formulaReplace = new CacheValue<List<FormulaReplaceTask>>() {
252
349
 
253
350
  @Override