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>&lt;></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

Reply via email to