def load(self):
import xlrd<EOL>self._validate()<EOL>self._logger.logging_load()<EOL>try:<EOL><INDENT>workbook = xlrd.open_workbook(self.source)<EOL><DEDENT>except xlrd.biffh.XLRDError as e:<EOL><INDENT>raise OpenError(e)<EOL><DEDENT>for worksheet in workbook.sheets():<EOL><INDENT>self._worksheet = worksheet<EOL>if self._is_empty_sheet():<EOL><INDENT>continue<EOL><DEDENT>self.__extract_not_empty_col_idx()<EOL>try:<EOL><INDENT>start_row_idx = self._get_start_row_idx()<EOL><DEDENT>except DataError:<EOL><INDENT>continue<EOL><DEDENT>rows = [<EOL>self.__get_row_values(row_idx)<EOL>for row_idx in range(start_row_idx + <NUM_LIT:1>, self._row_count)<EOL>]<EOL>self.inc_table_count()<EOL>headers = self.__get_row_values(start_row_idx)<EOL>yield TableData(<EOL>self._make_table_name(),<EOL>headers,<EOL>rows,<EOL>dp_extractor=self.dp_extractor,<EOL>type_hints=self._extract_type_hints(headers),<EOL>)<EOL><DEDENT>
Extract tabular data as |TableData| instances from an Excel file.
|spreadsheet_load_desc|

:return:
    Loaded |TableData| iterator.
    |TableData| created for each sheet in the workbook.
    |load_table_name_desc|

    ===================  ====================================
    Format specifier     Value after the replacement
    ===================  ====================================
    ``%(filename)s``     Filename of the workbook
    ``%(sheet)s``        Name of the sheet
    ``%(format_name)s``  ``"spreadsheet"``
    ``%(format_id)s``    |format_id_desc|
    ``%(global_id)s``    |global_id|
    ===================  ====================================
:rtype: |TableData| iterator
:raises pytablereader.DataError:
    If the header row is not found.
:raises pytablereader.error.OpenError:
    If failed to open the source file.