title: Exception reading XLSB File Apache POI java.io.CharConversionException
body: <p>Im developing a Java aplication that reads an excel xlsb file using Apache POI, but I got an exception while reading it, my code is as follows:</p>
  
  <pre><code>import java.io.IOException;
  import java.io.InputStream;
  
  import org.apache.poi.xssf.eventusermodel.XSSFReader;
  import org.apache.poi.xssf.model.SharedStringsTable;
  import org.apache.poi.xssf.usermodel.XSSFRichTextString;
  import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
  import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
  import org.apache.poi.openxml4j.opc.Package;
  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;
  
  import java.util.Iterator;
  
  public class Prueba {
  
      public static void main (String [] args){
  
          String direccion = "C:/Documents and Settings/RSalasL/My Documents/New Folder/masstigeoct12.xlsb";
  
          Package pkg;
          try {
              pkg = Package.open(direccion);
              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("");
              }
  
          } catch (InvalidFormatException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          } catch (IOException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          } catch (OpenXML4JException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          } catch (SAXException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }
  
      }
  
      public void processAllSheets(String filename) throws Exception {
          Package pkg = Package.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 static XMLReader fetchSheetParser(SharedStringsTable sst) throws SAXException {
          XMLReader parser =
              XMLReaderFactory.createXMLReader(
                      "org.apache.xerces.parsers.SAXParser"
              );
          ContentHandler handler = new SheetHandler(sst);
          parser.setContentHandler(handler);
          return parser;
      }
  
      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);
          }
      }
  
  }
  </code></pre>
  
  <p>And the exception is this:</p>
  
  <pre><code>java.io.CharConversionException: Characters larger than 4 bytes are not supported: byte 0x83 implies a length of more than 4 bytes
      at org.apache.xmlbeans.impl.piccolo.xml.UTF8XMLDecoder.decode(UTF8XMLDecoder.java:162)
      at org.apache.xmlbeans.impl.piccolo.xml.XMLStreamReader$FastStreamDecoder.read(XMLStreamReader.java:762)
      at org.apache.xmlbeans.impl.piccolo.xml.XMLStreamReader.read(XMLStreamReader.java:162)
      at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.yy_refill(PiccoloLexer.java:3474)
      at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.yylex(PiccoloLexer.java:3958)
      at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.yylex(Piccolo.java:1290)
      at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.yyparse(Piccolo.java:1400)
      at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.parse(Piccolo.java:714)
      at org.apache.xmlbeans.impl.store.Locale$SaxLoader.load(Locale.java:3439)
      at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1270)
      at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1257)
      at org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse(SchemaTypeLoaderBase.java:345)
      at org.openxmlformats.schemas.spreadsheetml.x2006.main.WorkbookDocument$Factory.parse(Unknown Source)
      at org.apache.poi.xssf.eventusermodel.XSSFReader$SheetIterator.&lt;init&gt;(XSSFReader.java:207)
      at org.apache.poi.xssf.eventusermodel.XSSFReader$SheetIterator.&lt;init&gt;(XSSFReader.java:166)
      at org.apache.poi.xssf.eventusermodel.XSSFReader.getSheetsData(XSSFReader.java:160)
      at EDManager.Prueba.main(Prueba.java:36)
  </code></pre>
  
  <p>The file has 2 sheets, one with 329 rows and 3 columns and the other with 566 rows and 3 columns, I just want to read the file to find if a value is in the second sheet.</p>