This is an automated email from the ASF dual-hosted git repository.
hansva pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/hop.git
The following commit(s) were added to refs/heads/main by this push:
new c8bab30712 Microsoft Excel Input: allow regex patterns for sheet name
selection (#7059)
c8bab30712 is described below
commit c8bab307123a12b7552ca433dfd20f6deea87e79
Author: Wassim <[email protected]>
AuthorDate: Mon May 18 15:08:21 2026 +0200
Microsoft Excel Input: allow regex patterns for sheet name selection (#7059)
* Add regex support for sheet name matching in Excel Input
Allows users to specify a Java regex pattern as a sheet name in the
Microsoft Excel Input transform. When 'Regex?' is set to 'Yes', all
sheets whose names match the pattern are read sequentially, using the
same start row/column settings.
Changes:
- ExcelInputMeta: add isRegex field on EISheet + hasRegexSheets()
- ExcelInput: resolve regex patterns per-workbook via
resolveSheetNamesFromRegex()
- ExcelInputDialog: add Regex? column (Yes/No combo) in the Sheets tab
- messages_en_US.properties: add SHEET_IS_REGEX and IsRegex.Column keys
* Add tests
---------
Co-authored-by: Hans Van Akelyen <[email protected]>
---
.../spreadsheet/0011-read-multi-sheet-regex.hpl | 221 +++++++++++++++++++++
.../spreadsheet/files/sample-file-regex-sheets.xls | Bin 0 -> 25088 bytes
.../main-0011-excel-multi-sheet-regex.hwf | 87 ++++++++
.../pipeline/transforms/excelinput/ExcelInput.java | 62 +++++-
.../transforms/excelinput/ExcelInputDialog.java | 49 ++++-
.../transforms/excelinput/ExcelInputMeta.java | 12 ++
.../excelinput/messages/messages_en_US.properties | 3 +
7 files changed, 430 insertions(+), 4 deletions(-)
diff --git a/integration-tests/spreadsheet/0011-read-multi-sheet-regex.hpl
b/integration-tests/spreadsheet/0011-read-multi-sheet-regex.hpl
new file mode 100644
index 0000000000..5ac00acdd5
--- /dev/null
+++ b/integration-tests/spreadsheet/0011-read-multi-sheet-regex.hpl
@@ -0,0 +1,221 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements. See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+-->
+<pipeline>
+ <info>
+ <capture_transform_performance>N</capture_transform_performance>
+
<transform_performance_capturing_delay>1000</transform_performance_capturing_delay>
+
<transform_performance_capturing_size_limit>100</transform_performance_capturing_size_limit>
+ <pipeline_type>Normal</pipeline_type>
+ <pipeline_status>0</pipeline_status>
+ <parameters/>
+ <name>0010-write-google-sheet</name>
+ <name_sync_with_filename>Y</name_sync_with_filename>
+ <created_user>-</created_user>
+ <modified_user>-</modified_user>
+ <created_date>2023/03/08 16:23:08.688</created_date>
+ <modified_date>2023/03/08 16:23:08.688</modified_date>
+ </info>
+ <transform>
+ <type>ExcelInput</type>
+ <name>Microsoft Excel input</name>
+ <file>
+ <name>${PROJECT_HOME}/files/sample-file-regex-sheets.xls</name>
+ <filemask/>
+ <exclude_filemask/>
+ <file_required/>
+ <include_subfolders/>
+ </file>
+ <filefield/>
+ <sheets>
+ <sheet>
+ <name>Sheet[0-9]</name>
+ <startrow>0</startrow>
+ <startcol>0</startcol>
+ <is_regex>Y</is_regex>
+ </sheet>
+ </sheets>
+ <sheetfield/>
+ <header>Y</header>
+ <schema_definition/>
+ <ignore_fields>N</ignore_fields>
+ <stoponempty>N</stoponempty>
+ <noempty>Y</noempty>
+ <rownumfield/>
+ <sheetrownumfield/>
+ <limit>0</limit>
+ <fields>
+ <field>
+ <name>col1</name>
+ <type>String</type>
+ <length>-1</length>
+ <precision>-1</precision>
+ <trim_type>none</trim_type>
+ <format/>
+ <currency/>
+ <decimal/>
+ <group/>
+ <repeat>N</repeat>
+ </field>
+ <field>
+ <name>col2</name>
+ <type>Number</type>
+ <length>-1</length>
+ <precision>-1</precision>
+ <trim_type>none</trim_type>
+ <format/>
+ <currency/>
+ <decimal/>
+ <group/>
+ <repeat>N</repeat>
+ </field>
+ </fields>
+ <strict_types>N</strict_types>
+ <error_ignored>N</error_ignored>
+ <error_line_skipped>N</error_line_skipped>
+ <bad_line_files_destination_directory/>
+ <bad_line_files_extension>warning</bad_line_files_extension>
+ <error_line_files_destination_directory/>
+ <error_line_files_extension>error</error_line_files_extension>
+ <line_number_files_destination_directory/>
+ <line_number_files_extension>line</line_number_files_extension>
+ <accept_filenames>N</accept_filenames>
+ <accept_field/>
+ <accept_transform_name/>
+ <encoding>UTF-8</encoding>
+ <add_to_result_filenames>Y</add_to_result_filenames>
+ <shortFileFieldName/>
+ <pathFieldName/>
+ <hiddenFieldName/>
+ <lastModificationTimeFieldName/>
+ <uriNameFieldName/>
+ <rootUriNameFieldName/>
+ <extensionFieldName/>
+ <sizeFieldName/>
+ <spreadsheet_type>POI</spreadsheet_type>
+ <distribute>Y</distribute>
+ <copies>1</copies>
+ <GUI>
+ <xloc>96</xloc>
+ <yloc>96</yloc>
+ </GUI>
+ <partitioning>
+ <method>none</method>
+ <schema_name/>
+ </partitioning>
+ <attributes/>
+ </transform>
+ <transform>
+ <type>MemoryGroupBy</type>
+ <name>Memory group by</name>
+ <group/>
+ <fields>
+ <field>
+ <aggregate>counter</aggregate>
+ <subject>col1</subject>
+ <type>COUNT_ANY</type>
+ <valuefield/>
+ </field>
+ </fields>
+ <give_back_row>N</give_back_row>
+ <distribute>Y</distribute>
+ <copies>1</copies>
+ <GUI>
+ <xloc>304</xloc>
+ <yloc>96</yloc>
+ </GUI>
+ <partitioning>
+ <method>none</method>
+ <schema_name/>
+ </partitioning>
+ <attributes/>
+ </transform>
+ <transform>
+ <type>FilterRows</type>
+ <name>Filter rows</name>
+ <compare>
+ <condition>
+ <negated>N</negated>
+ <operator>-</operator>
+ <leftvalue>counter</leftvalue>
+ <function><></function>
+ <value>
+ <name>constant</name>
+ <type>Integer</type>
+ <text>18</text>
+ <length>-1</length>
+ <precision>0</precision>
+ <isnull>N</isnull>
+ <mask>####0;-####0</mask>
+ </value>
+ <conditions/>
+ </condition>
+ </compare>
+ <distribute>Y</distribute>
+ <copies>1</copies>
+ <GUI>
+ <xloc>512</xloc>
+ <yloc>96</yloc>
+ </GUI>
+ <partitioning>
+ <method>none</method>
+ <schema_name/>
+ </partitioning>
+ <attributes/>
+ </transform>
+ <transform>
+ <type>Abort</type>
+ <name>Abort</name>
+ <row_threshold>0</row_threshold>
+ <message/>
+ <always_log_rows>Y</always_log_rows>
+ <abort_option>ABORT_WITH_ERROR</abort_option>
+ <distribute>Y</distribute>
+ <copies>1</copies>
+ <GUI>
+ <xloc>688</xloc>
+ <yloc>96</yloc>
+ </GUI>
+ <partitioning>
+ <method>none</method>
+ <schema_name/>
+ </partitioning>
+ <attributes/>
+ </transform>
+ <order>
+ <hop>
+ <from>Microsoft Excel input</from>
+ <to>Memory group by</to>
+ <enabled>Y</enabled>
+ </hop>
+ <hop>
+ <from>Memory group by</from>
+ <to>Filter rows</to>
+ <enabled>Y</enabled>
+ </hop>
+ <hop>
+ <from>Filter rows</from>
+ <to>Abort</to>
+ <enabled>Y</enabled>
+ </hop>
+ </order>
+ <notepads/>
+ <attributes/>
+ <transform_error_handling/>
+</pipeline>
diff --git a/integration-tests/spreadsheet/files/sample-file-regex-sheets.xls
b/integration-tests/spreadsheet/files/sample-file-regex-sheets.xls
new file mode 100644
index 0000000000..cb6f36487f
Binary files /dev/null and
b/integration-tests/spreadsheet/files/sample-file-regex-sheets.xls differ
diff --git
a/integration-tests/spreadsheet/main-0011-excel-multi-sheet-regex.hwf
b/integration-tests/spreadsheet/main-0011-excel-multi-sheet-regex.hwf
new file mode 100644
index 0000000000..66f3d8168a
--- /dev/null
+++ b/integration-tests/spreadsheet/main-0011-excel-multi-sheet-regex.hwf
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements. See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+-->
+<workflow>
+ <name>main-0010-write-google-sheets</name>
+ <name_sync_with_filename>Y</name_sync_with_filename>
+ <created_user>-</created_user>
+ <modified_user>-</modified_user>
+ <created_date>2021/01/05 13:04:10.956</created_date>
+ <modified_date>2021/01/05 13:04:10.956</modified_date>
+ <parameters/>
+ <actions>
+ <action>
+ <repeat>N</repeat>
+ <schedulerType>0</schedulerType>
+ <intervalSeconds>0</intervalSeconds>
+ <intervalMinutes>60</intervalMinutes>
+ <DayOfMonth>1</DayOfMonth>
+ <weekDay>1</weekDay>
+ <minutes>0</minutes>
+ <hour>12</hour>
+ <doNotWaitOnFirstExecution>N</doNotWaitOnFirstExecution>
+ <name>Start</name>
+ <description/>
+ <type>SPECIAL</type>
+ <attributes/>
+ <xloc>50</xloc>
+ <yloc>50</yloc>
+ <parallel>N</parallel>
+ <attributes_hac/>
+ </action>
+ <action>
+ <filename>${PROJECT_HOME}/0011-read-multi-sheet-regex.hpl</filename>
+ <params_from_previous>N</params_from_previous>
+ <exec_per_row>N</exec_per_row>
+ <clear_rows>N</clear_rows>
+ <clear_files>N</clear_files>
+ <create_parent_folder>N</create_parent_folder>
+ <set_logfile>N</set_logfile>
+ <set_append_logfile>N</set_append_logfile>
+ <logfile/>
+ <logext/>
+ <add_date>N</add_date>
+ <add_time>N</add_time>
+ <loglevel>Basic</loglevel>
+ <wait_until_finished>Y</wait_until_finished>
+ <parameters>
+ <pass_all_parameters>Y</pass_all_parameters>
+ </parameters>
+ <run_configuration>local</run_configuration>
+ <name>0011-read-multi-sheet-regex.hpl</name>
+ <type>PIPELINE</type>
+ <attributes/>
+ <xloc>240</xloc>
+ <yloc>48</yloc>
+ <parallel>N</parallel>
+ <attributes_hac/>
+ </action>
+ </actions>
+ <hops>
+ <hop>
+ <from>Start</from>
+ <to>0011-read-multi-sheet-regex.hpl</to>
+ <evaluation>Y</evaluation>
+ <unconditional>Y</unconditional>
+ <enabled>Y</enabled>
+ </hop>
+ </hops>
+ <notepads/>
+ <attributes/>
+</workflow>
diff --git
a/plugins/transforms/excel/src/main/java/org/apache/hop/pipeline/transforms/excelinput/ExcelInput.java
b/plugins/transforms/excel/src/main/java/org/apache/hop/pipeline/transforms/excelinput/ExcelInput.java
index 52a407a86a..df76f8e381 100644
---
a/plugins/transforms/excel/src/main/java/org/apache/hop/pipeline/transforms/excelinput/ExcelInput.java
+++
b/plugins/transforms/excel/src/main/java/org/apache/hop/pipeline/transforms/excelinput/ExcelInput.java
@@ -21,6 +21,8 @@ import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.vfs2.FileObject;
import org.apache.hop.core.Const;
@@ -488,6 +490,55 @@ public class ExcelInput extends
BaseTransform<ExcelInputMeta, ExcelInputData> {
}
}
+ /**
+ * Resolves sheet entries that use regex patterns against the actual sheet
names in the workbook.
+ * Non-regex entries are kept as-is; regex entries are expanded into all
matching sheet names.
+ */
+ private void resolveSheetNamesFromRegex(ExcelInputData data) {
+ String[] allSheetNames = data.workbook.getSheetNames();
+ List<String> matchedNames = new ArrayList<>();
+ List<Integer> matchedStartRow = new ArrayList<>();
+ List<Integer> matchedStartCol = new ArrayList<>();
+
+ if (isDebug()) {
+ logDebug("resolveSheetNamesFromRegex: workbook has " +
allSheetNames.length + " sheet(s)");
+ for (String n : allSheetNames) {
+ logDebug(" available sheet: [" + n + "]");
+ }
+ }
+
+ for (ExcelInputMeta.EISheet sheet : meta.getSheets()) {
+ if (sheet.isRegex()) {
+ logBasic("Sheet regex pattern: [" + sheet.getName() + "]");
+ try {
+ Pattern pattern = Pattern.compile(sheet.getName());
+ for (String sheetName : allSheetNames) {
+ if (pattern.matcher(sheetName).matches()) {
+ logBasic(" -> matched: [" + sheetName + "]");
+ matchedNames.add(sheetName);
+ matchedStartRow.add(sheet.getStartRow());
+ matchedStartCol.add(sheet.getStartColumn());
+ }
+ }
+ } catch (PatternSyntaxException e) {
+ logError(
+ BaseMessages.getString(
+ PKG, "ExcelInput.Error.InvalidSheetRegex", sheet.getName(),
e.getMessage()));
+ }
+ } else {
+ logBasic("Sheet exact name: [" + sheet.getName() + "]");
+ matchedNames.add(sheet.getName());
+ matchedStartRow.add(sheet.getStartRow());
+ matchedStartCol.add(sheet.getStartColumn());
+ }
+ }
+
+ logBasic("resolveSheetNamesFromRegex: " + matchedNames.size() + " sheet(s)
selected");
+ data.sheetNames = matchedNames.toArray(new String[0]);
+ data.startRow =
matchedStartRow.stream().mapToInt(Integer::intValue).toArray();
+ data.startColumn =
matchedStartCol.stream().mapToInt(Integer::intValue).toArray();
+ }
+
private void handleMissingFiles() throws HopException {
List<FileObject> nonExistantFiles = data.files.getNonExistentFiles();
@@ -610,11 +661,20 @@ public class ExcelInput extends
BaseTransform<ExcelInputMeta, ExcelInputData> {
data.startColumn[i] = data.defaultStartColumn;
data.startRow[i] = data.defaultStartRow;
}
+ } else if (meta.hasRegexSheets()) {
+ resolveSheetNamesFromRegex(data);
}
}
boolean nextsheet = false;
+ // If no sheets were resolved (e.g. regex matched nothing), move to next
file
+ if (data.sheetNames == null || data.sheetNames.length == 0) {
+ logBasic("No sheets selected for file [" + data.filename + "],
skipping.");
+ jumpToNextFile();
+ return retval;
+ }
+
// What sheet were we handling?
if (isDetailed()) {
logDetailed(
@@ -890,7 +950,7 @@ public class ExcelInput extends
BaseTransform<ExcelInputMeta, ExcelInputData> {
// Determine the maximum sheet name length...
data.maxsheetlength = -1;
- if (!meta.readAllSheets()) {
+ if (!meta.readAllSheets() && !meta.hasRegexSheets()) {
data.sheetNames = meta.getSheetsNames();
data.startColumn = meta.getSheetsStartColumns();
data.startRow = meta.getSheetsStartRows();
diff --git
a/plugins/transforms/excel/src/main/java/org/apache/hop/pipeline/transforms/excelinput/ExcelInputDialog.java
b/plugins/transforms/excel/src/main/java/org/apache/hop/pipeline/transforms/excelinput/ExcelInputDialog.java
index 4260991751..a3f9a37a76 100644
---
a/plugins/transforms/excel/src/main/java/org/apache/hop/pipeline/transforms/excelinput/ExcelInputDialog.java
+++
b/plugins/transforms/excel/src/main/java/org/apache/hop/pipeline/transforms/excelinput/ExcelInputDialog.java
@@ -23,6 +23,8 @@ import static
org.apache.hop.pipeline.transforms.excelinput.ExcelInputMeta.EIShe
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
import org.apache.commons.vfs2.FileObject;
import org.apache.hop.core.Const;
import org.apache.hop.core.Props;
@@ -481,7 +483,7 @@ public class ExcelInputDialog extends BaseTransformDialog {
fdlSheetnameList.right = new FormAttachment(middle, -margin);
wlSheetnameList.setLayoutData(fdlSheetnameList);
- ColumnInfo[] shinfo = new ColumnInfo[3];
+ ColumnInfo[] shinfo = new ColumnInfo[4];
shinfo[0] =
new ColumnInfo(
BaseMessages.getString(PKG, "ExcelInputDialog.SheetName.Column"),
@@ -497,6 +499,15 @@ public class ExcelInputDialog extends BaseTransformDialog {
BaseMessages.getString(PKG, "ExcelInputDialog.StartColumn.Column"),
ColumnInfo.COLUMN_TYPE_TEXT,
false);
+ shinfo[3] =
+ new ColumnInfo(
+ BaseMessages.getString(PKG, "ExcelInputDialog.IsRegex.Column"),
+ ColumnInfo.COLUMN_TYPE_CCOMBO,
+ new String[] {
+ BaseMessages.getString(PKG, "System.Combo.No"),
+ BaseMessages.getString(PKG, "System.Combo.Yes")
+ },
+ true);
wSheetNameList =
new TableView(
@@ -1147,6 +1158,11 @@ public class ExcelInputDialog extends
BaseTransformDialog {
item.setText(1, Const.NVL(sheetname, ""));
item.setText(2, Const.NVL(startrow, ""));
item.setText(3, Const.NVL(startcol, ""));
+ item.setText(
+ 4,
+ sheet.isRegex()
+ ? BaseMessages.getString(PKG, "System.Combo.Yes")
+ : BaseMessages.getString(PKG, "System.Combo.No"));
}
wSheetNameList.optimizeTableView();
@@ -1221,6 +1237,8 @@ public class ExcelInputDialog extends BaseTransformDialog
{
sheet.setName(item.getText(1));
sheet.setStartRow(Const.toInt(item.getText(2), 0));
sheet.setStartColumn(Const.toInt(item.getText(3), 0));
+ sheet.setRegex(
+ BaseMessages.getString(PKG,
"System.Combo.Yes").equalsIgnoreCase(item.getText(4)));
meta.getSheets().add(sheet);
}
@@ -1768,18 +1786,43 @@ public class ExcelInputDialog extends
BaseTransformDialog {
* @param workbook excel workbook for processing
* @throws HopPluginException In case something goes wrong
*/
+ /**
+ * Finds the index of the first EISheet entry that matches the given sheet
name, taking regex
+ * entries into account. Returns -1 if no match found.
+ */
+ private int findMatchingSheetIndex(String sheetName, ExcelInputMeta meta) {
+ List<ExcelInputMeta.EISheet> sheets = meta.getSheets();
+ for (int i = 0; i < sheets.size(); i++) {
+ ExcelInputMeta.EISheet entry = sheets.get(i);
+ if (entry.isRegex()) {
+ try {
+ if (Pattern.compile(entry.getName()).matcher(sheetName).matches()) {
+ return i;
+ }
+ } catch (PatternSyntaxException ignored) {
+ // invalid regex — skip
+ }
+ } else {
+ if (sheetName.equals(entry.getName())) {
+ return i;
+ }
+ }
+ }
+ return -1;
+ }
+
private void processingWorkbook(IRowMeta fields, ExcelInputMeta meta,
IKWorkbook workbook)
throws HopPluginException {
int nrSheets = workbook.getNumberOfSheets();
for (int j = 0; j < nrSheets; j++) {
IKSheet sheet = workbook.getSheet(j);
- // See if it's a selected sheet:
+ // See if it's a selected sheet (supports both exact names and regex
patterns):
int sheetIndex;
if (meta.readAllSheets()) {
sheetIndex = 0;
} else {
- sheetIndex = Const.indexOfString(sheet.getName(),
meta.getSheetsNames());
+ sheetIndex = findMatchingSheetIndex(sheet.getName(), meta);
}
if (sheetIndex >= 0) {
// We suppose it's the complete range we're looking for...
diff --git
a/plugins/transforms/excel/src/main/java/org/apache/hop/pipeline/transforms/excelinput/ExcelInputMeta.java
b/plugins/transforms/excel/src/main/java/org/apache/hop/pipeline/transforms/excelinput/ExcelInputMeta.java
index 787a8c5cfb..cf73b008ed 100644
---
a/plugins/transforms/excel/src/main/java/org/apache/hop/pipeline/transforms/excelinput/ExcelInputMeta.java
+++
b/plugins/transforms/excel/src/main/java/org/apache/hop/pipeline/transforms/excelinput/ExcelInputMeta.java
@@ -830,12 +830,24 @@ public class ExcelInputMeta extends
BaseTransformMeta<ExcelInput, ExcelInputData
injectionKeyDescription = "ExcelInput.Injection.SHEET_START_COL")
private int startColumn;
+ @HopMetadataProperty(
+ key = "is_regex",
+ injectionKey = "SHEET_IS_REGEX",
+ injectionKeyDescription = "ExcelInput.Injection.SHEET_IS_REGEX")
+ private boolean regex;
+
public EISheet() {}
public EISheet(EISheet s) {
this.name = s.name;
this.startRow = s.startRow;
this.startColumn = s.startColumn;
+ this.regex = s.regex;
}
}
+
+ /** Returns true if at least one sheet entry uses a regex pattern for its
name. */
+ public boolean hasRegexSheets() {
+ return sheets.stream().anyMatch(EISheet::isRegex);
+ }
}
diff --git
a/plugins/transforms/excel/src/main/resources/org/apache/hop/pipeline/transforms/excelinput/messages/messages_en_US.properties
b/plugins/transforms/excel/src/main/resources/org/apache/hop/pipeline/transforms/excelinput/messages/messages_en_US.properties
index f01aa44746..21ba033158 100644
---
a/plugins/transforms/excel/src/main/resources/org/apache/hop/pipeline/transforms/excelinput/messages/messages_en_US.properties
+++
b/plugins/transforms/excel/src/main/resources/org/apache/hop/pipeline/transforms/excelinput/messages/messages_en_US.properties
@@ -18,6 +18,7 @@
#
ExcelInput.Description=Read data from Excel and OpenOffice Workbooks (XLS,
XLSX, ODS).
ExcelInput.Error.CouldNotCloseErrorHandler=Could not close errorHandler\: {0}
+ExcelInput.Error.InvalidSheetRegex=Invalid regular expression for sheet name
[{0}]\: {1}
ExcelInput.Error.FilenameFieldNotFound=The filename field [{0}] could not be
found in the input rows.
ExcelInput.Error.NoFileSpecified=No file(s) specified\! Stop processing.
ExcelInput.Error.NotInputFieldsDefined=No input fields defined\!
@@ -45,6 +46,7 @@ ExcelInput.Injection.LENGTH=Field length
ExcelInput.Injection.NAME=Field name
ExcelInput.Injection.PRECISION=Field precision
ExcelInput.Injection.REPEAT=Field repeat (Y/N)
+ExcelInput.Injection.SHEET_IS_REGEX=Sheet name is a regular expression (Y/N)
ExcelInput.Injection.SHEET_NAME=Sheet name
ExcelInput.Injection.SHEET_START_COL=Sheet start col
ExcelInput.Injection.SHEET_START_ROW=Sheet start row
@@ -160,6 +162,7 @@ ExcelInputDialog.SizeFieldName.Label=Size field
ExcelInputDialog.SkipErrorLines.Label=Skip error lines
ExcelInputDialog.SkipErrorLines.Tooltip=Skip error lines or use null-values on
incompatible types?
ExcelInputDialog.SpreadSheetType.Label=Spread sheet type (engine)
+ExcelInputDialog.IsRegex.Column=Regex?
ExcelInputDialog.StartColumn.Column=Start column
ExcelInputDialog.StartRow.Column=Start row
ExcelInputDialog.StopOnEmpty.Label=Stop on empty row