title: read excel by column name java POI
body: <p>Good afternoon experts have a problem and I need to read the entire excel  file by column name instead of its index,example:</p>
  
  <pre><code>Column1 | Column2 | Column3
  data1      data 2    data 3
  </code></pre>
  
  <p>POI allows me to read the column index by the method <code>getColumnIndex()</code> returning for the <code>Column1 = 0 , Column2= 1 etc,</code> but I need to read it by column name <code>Column1</code> , <code>Column2</code> etc , 
  there any way to do this??</p>
  
  <p>I need to read all fields of rows and columns by column name.
  attach the code which I read my file:</p>
  
  <p>updated code:</p>
  
  <pre><code>import org.apache.poi.ss.usermodel.Cell;
  import org.apache.poi.ss.usermodel.DataFormatter;
  import org.apache.poi.ss.usermodel.Row;
  import org.apache.poi.xssf.usermodel.XSSFSheet;
  import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  
  import java.io.File;
  import java.io.FileInputStream;
  import java.io.FileNotFoundException;
  import java.io.IOException;
  import java.util.Iterator;
  import java.util.regex.Matcher;
  import java.util.regex.Pattern;
  
  
  public class example {
  
      DataFormatter fmt = new DataFormatter();
  
      /**
       * @param args the command line arguments
       */
      public static void main(String[] args) throws FileNotFoundException, IOException {
          example softMarti = new example();
          FileInputStream file = new FileInputStream(new File("C:archive.xlsx"));
          XSSFWorkbook workbook = new XSSFWorkbook(file);
          XSSFSheet sheet = workbook.getSheetAt(0);
          Iterator&lt;Row&gt; rowIterator = sheet.iterator();
          while (rowIterator.hasNext()) {
              Row row = rowIterator.next();
              int rowIndex = row.getRowNum();
              if (rowIndex &lt; 1) {
                  continue;
              }
              Iterator&lt;Cell&gt; cellIterator = row.cellIterator();
  
              while (cellIterator.hasNext()) {
                  Cell cell = cellIterator.next();
                  int columnIndex = cell.getColumnIndex();
                  if (columnIndex != 0 &amp;&amp; columnIndex != 1 &amp;&amp; columnIndex != 4) {
                      continue;
                  }
                  String columnName = "";
                  switch (columnIndex) {
                      case 0:
                          columnName = "column1";
                          break;
                      case 1:
                          columnName = "column2";
                          break;
                      case 4:
                          columnName = "column 4";
                          break;
                  }
                  String value = example.getValue(cell);
                  boolean valid = example.isValid(columnIndex, value);
                  if (valid) {
                      continue;
                  }
                  System.out.print(columnName + rowIndex);
                  System.out.println(" -&gt; " + value);
  
              }
  
          }
  
          // TODO code application logic here
      }
  
      private String getValue(Cell cell) {
          switch (cell.getCellType()) {
              case Cell.CELL_TYPE_BLANK:
                  return null;
              case Cell.CELL_TYPE_BOOLEAN:
                  return "CELL_TYPE_BOOLEAN";
              case Cell.CELL_TYPE_ERROR:
                  return "CELL_TYPE_ERROR";
              case Cell.CELL_TYPE_FORMULA:
                  return "CELL_TYPE_FORMULA";
              case Cell.CELL_TYPE_NUMERIC:
                  return fmt.formatCellValue(cell);
              case Cell.CELL_TYPE_STRING:
                  return cell.getStringCellValue();
              default:
                  return "none";
  
          }
  
      }
  
      boolean isValid(int column, String value) {
          if (value == null) {
              return false;
          }
          String pattern = "";
          switch (column) {
              case 0:
                  pattern = "[A-Za-z0-9_\\- ]{1,20}";
                  break;
              case 1:
                  pattern = "[A-Za-z0-9_\\- ]{1,80}";
                  break;
              case 4:
                  pattern = "[0-9]{1,8}";
                  break;
          }
          Pattern pat = Pattern.compile(pattern);
          Matcher mat = pat.matcher(value);
          return mat.matches();
      }
  }
  </code></pre>
  
  <p>This code works but I need to validate column name  because for my project  columns may change position, that's my goal</p>