title: How to read specific columns using Apache POI Event API?
body: <p>I want to read large xls or xlsx file i.e. 70 MB file having 1,50,000+ rows. 
  I am able to load the entire excel file using below code, but I would like to fetch specific columns only like column C only or some other column.</p>
  
  <pre><code>import java.io.InputStream;
  import java.util.Iterator;
  import org.apache.poi.openxml4j.opc.OPCPackage;
  import org.apache.poi.xssf.eventusermodel.XSSFReader;
  import org.apache.poi.xssf.model.SharedStringsTable;
  import org.apache.poi.xssf.usermodel.XSSFRichTextString;
  import org.xml.sax.Attributes;
  import org.xml.sax.ContentHandler;
  import org.xml.sax.InputSource;
  import org.xml.sax.SAXException;
  import org.xml.sax.XMLReader;
  import org.xml.sax.helpers.DefaultHandler;
  import org.xml.sax.helpers.XMLReaderFactory;
  
  
  public class testclass {
  
      public void processOneSheet(String filename) throws Exception {
          OPCPackage pkg = OPCPackage.open(filename);
          XSSFReader r = new XSSFReader( pkg );
          SharedStringsTable sst = r.getSharedStringsTable();
  
          XMLReader parser = fetchSheetParser(sst);
  
          // To look up the Sheet Name / Sheet Order / rID,
          //  you need to process the core Workbook stream.
          // Normally it's of the form rId# or rSheet#
          InputStream sheet2 = r.getSheet("rId2");
          InputSource sheetSource = new InputSource(sheet2);
          parser.parse(sheetSource);
          sheet2.close();
      }
  
      public void processAllSheets(String filename) throws Exception {
          OPCPackage pkg = OPCPackage.open(filename);
          XSSFReader r = new XSSFReader( pkg );
          SharedStringsTable sst = r.getSharedStringsTable();
  
          XMLReader parser = fetchSheetParser(sst);
  
          Iterator&lt;InputStream&gt; sheets = r.getSheetsData();
          while(sheets.hasNext()) {
              System.out.println("Processing new sheet:\n");
              InputStream sheet = sheets.next();
              InputSource sheetSource = new InputSource(sheet);
              parser.parse(sheetSource);
              sheet.close();
              System.out.println("");
          }
      }
  
      public XMLReader fetchSheetParser(SharedStringsTable sst) throws SAXException {
          XMLReader parser = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
          ContentHandler handler = (ContentHandler) new SheetHandler(sst);
          parser.setContentHandler(handler);
          return parser;
      }
  
      /** 
       * See org.xml.sax.helpers.DefaultHandler javadocs 
       */
      private static class SheetHandler extends DefaultHandler {
          private SharedStringsTable sst;
          private String lastContents;
          private boolean nextIsString;
  
          private SheetHandler(SharedStringsTable sst) {
              this.sst = sst;
          }
  
          public void startElement(String uri, String localName, String name,
                  Attributes attributes) throws SAXException {
              // c =&gt; cell
              if(name.equals("c")) {
                  // Print the cell reference
                  //System.out.print(attributes.getValue("r") + " - ");
                  // Figure out if the value is an index in the SST
                  String cellType = attributes.getValue("t");
                  if(cellType != null &amp;&amp; cellType.equals("s")) {
                      nextIsString = true;
                  } else {
                      nextIsString = false;
                  }
              }
              // Clear contents cache
              lastContents = "";
          }
  
          public void endElement(String uri, String localName, String name)
                  throws SAXException {
              // Process the last contents as required.
              // Do now, as characters() may be called more than once
              if(nextIsString) {
                  int idx = Integer.parseInt(lastContents);
                  lastContents = new XSSFRichTextString(sst.getEntryAt(idx)).toString();
                  nextIsString = false;
              }
  
              // v =&gt; contents of a cell
              // Output after we've seen the string contents
              if(name.equals("v")) {
                  System.out.println(lastContents);
              }
          }
  
          public void characters(char[] ch, int start, int length)
                  throws SAXException {
              lastContents += new String(ch, start, length);
          }
      }
  
      public static void main(String[] args) throws Exception {
          String file_path = "D:/Data/Finance/Finance.xlsx";
          testclass example = new testclass();
          example.processAllSheets(file_path);
      }
   }
  </code></pre>