o
    e                     @   sp  d dl mZ d dlZddlmZmZmZ ddlT ddlT ddl	T zd dl
mZ W n ey7   d dl
mZ Y nw d dlmZ ejZd Zd dlZd	Zed
\ZZZZZdZdddddddddddddddZi Zi Ze D ]\ZZe eZe eZeee< eee< qm[[[de!j"d dddddddf
ddZ#G dd  d e$Z%G d!d" d"e$Z&d#d$ Z'd,d&d'Z(d(d) Z)d*d+ Z*dS )-    )print_functionN   )compdoc
formattingsheet)*)perf_counter)clockunpacki    )P   F   2   -   (             	
)Consolidate_Area	Auto_Open
Auto_CloseExtractDatabaseCriteria
Print_AreaPrint_TitlesRecorder	Data_FormAuto_ActivateAuto_DeactivateSheet_Title_FilterDatabaseTFc
                 C   sP  t  }
t }z|j| |||||||||	d
 t  }||
 |_|t}|s)td|tvr5tdt|  ||_	|dkrN|rIt
|jd d |_}|  n)|dkrd|  |rct
|jd d |_}n|  dd	 |jD |_|sw|  t|j|_|dkr|jd
krt
|jd|j t  }|| |_W n   |   |s|  |S )N)
filenamefile_contentslogfile	verbosityuse_mmapencoding_overrideformatting_info	on_demandragged_rowsignore_workbook_corruptionz#Can't determine file's BIFF versionz BIFF version %s is not supportedr   z`*** WARNING: on_demand is not supported for this Excel version.
*** Setting on_demand to False.
Fr   c                 S   s   g | ]}d qS N ).0shr<   r<   </var/www/html/venv/lib/python3.10/site-packages/xlrd/book.py
<listcomp>i   s    z%open_workbook_xls.<locals>.<listcomp>r   z|*** WARNING: Excel 4.0 workbook (.XLW) file contains %d worksheets.
*** Book-level data will be that of the last worksheet.
)r   Bookbiff2_8_loadload_time_stage_1getbofXL_WORKBOOK_GLOBALS	XLRDErrorSUPPORTED_VERSIONSbiff_text_from_numbiff_versionfprintfr3   r8   fake_globals_get_sheetparse_globals_sheet_names_sheet_list
get_sheetslennsheetsload_time_stage_2release_resources)r1   r3   r4   r5   r2   r6   r7   r8   r9   r:   t0bkt1rI   t2r<   r<   r?   open_workbook_xls;   sp   	




rX   c                   @   sd   e Zd ZdZdgZdZdZdZdZdZ	dZ
dZdZdZdZedZdZdZdZdd	 ZdddZdS )Namez
    Information relating to a named reference, formula, macro, etc.

    .. note::

      Name information is **not** extracted from files older than
      Excel 5.0 (``Book.biff_version < 50``)
    stackNr        c                 C   s   | j }|rH|j}|j}|tkrHt|dkrH|d }d|j  kr'|jd krHn n|j|jd krH|j	|j
d krH| j|j}||j|j	S | j| jjddd td)a:  
        This is a convenience method for the frequent use case where the name
        refers to a single cell.

        :returns: An instance of the :class:`~xlrd.sheet.Cell` class.

        :raises xlrd.biffh.XLRDError:
          The name is not a constant absolute reference
          to a single cell.
        r   r   === Dump of Name object ========== End of dump =======headerfooterz2Not a constant absolute reference to a single cell)resultkindvalueoREFrP   shtxloshtxhirowxlorowxhicolxlocolxhibooksheet_by_indexcelldumpr3   rF   )selfresrd   re   ref3dr>   r<   r<   r?   ro      s"    z	Name.cellTc                 C   s8  | j }|r|j}|j}|tkrt|dkr|d }d|j  kr'|jd krn ne| j|j}|s=||j	|j
|j|jfS t|j	|j}t|t|j
|j}t|j|j}	t|	t|j|j}
d|  krp|  krp|jkssJ  J d|	  kr|
  kr|jksJ  J ||||	|
fS | j| jjddd td)a  
        This is a convenience method for the use case where the name
        refers to one rectangular area in one worksheet.

        :param clipped:
          If ``True``, the default, the returned rectangle is clipped
          to fit in ``(0, sheet.nrows, 0, sheet.ncols)``.
          it is guaranteed that ``0 <= rowxlo <= rowxhi <= sheet.nrows`` and
          that the number of usable rows in the area (which may be zero) is
          ``rowxhi - rowxlo``; likewise for columns.

        :returns: a tuple ``(sheet_object, rowxlo, rowxhi, colxlo, colxhi)``.

        :raises xlrd.biffh.XLRDError:
           The name is not a constant absolute reference
           to a single area in a single sheet.
        r   r   r^   r_   r`   zDNot a constant absolute reference to a single area in a single sheet)rc   rd   re   rf   rP   rg   rh   rm   rn   ri   rj   rk   rl   minnrowsmaxncolsrp   r3   rF   )rq   clippedrr   rd   re   rs   r>   ri   rj   rk   rl   r<   r<   r?   area2d   s.    ((zName.area2dT)__name__
__module____qualname____doc___repr_theserm   hiddenfuncvbasicmacrocomplexbuiltin	funcgroupbinary
name_indexUNICODE_LITERALnameraw_formulascoperc   ro   ry   r<   r<   r<   r?   rY      s&    
rY   c                
   @   s  e Zd ZdZdZdZdZg ZdZdZ	dZ
edZg Zg Zg Zi Zi Zi Zg ZdZdZdd Zd	d
 Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Z i Z!i Z"dd Z#dde$j%dddd d d d f
d!d"Z&d#d$ Z'd%d& Z(d'd( Z)d)d* Z*dYd+d,Z+d-d. Z,d/d0 Z-d1d2 Z.d3d4 Z/d5d6 Z0d7d8 Z1d9d: Z2d;d< Z3d=d> Z4d?d@ Z5dAdB Z6dCdD Z7dEdF Z8dGdH Z9dIdJ Z:dKdL Z;dMdN Z<dOdP Z=dQdR Z>dSdT Z?dUdV Z@dWdX ZAdS )ZrA   z
    Contents of a "workbook".

    .. warning::

      You should not instantiate this class yourself. You use the :class:`Book`
      object that was returned when you called :func:`~xlrd.open_workbook`.
    r   Nr   r   r[   g      c                 C   s2   t | jD ]}| j| s| | q| jdd S )zt
        :returns: A list of all sheets in the book.

        All sheets not already loaded will be loaded.
        N)xrangerQ   rN   	get_sheetrq   sheetxr<   r<   r?   sheets  s
   

zBook.sheetsc                 C   s   | j | p	| |S )zr
        :param sheetx: Sheet index in ``range(nsheets)``
        :returns: A :class:`~xlrd.sheet.Sheet`.
        )rN   r   r   r<   r<   r?   rn     s   zBook.sheet_by_indexc                 c   s"    t | jD ]}| |V  qdS )z
        Makes iteration through sheets of a book a little more straightforward.
        Don't free resources after use since it can be called like `list(book)`
        N)rangerQ   rn   )rq   ir<   r<   r?   __iter__  s   zBook.__iter__c                 C   s6   z| j |}W n ty   td| w | |S )zp
        :param sheet_name: Name of the sheet required.
        :returns: A :class:`~xlrd.sheet.Sheet`.
        No sheet named <%r>)rM   index
ValueErrorrF   rn   )rq   
sheet_namer   r<   r<   r?   sheet_by_name  s   
zBook.sheet_by_namec                 C   s   t |tr
| |S | |S )z
        Allow indexing with sheet name or index.
        :param item: Name or index of sheet enquired upon
        :return: :class:`~xlrd.sheet.Sheet`.
        )
isinstanceintrn   r   )rq   itemr<   r<   r?   __getitem__  s   


zBook.__getitem__c                 C   s   | j dd S )z
        :returns:
          A list of the names of all the worksheets in the workbook file.
          This information is available even when no sheets have yet been
          loaded.
        N)rM   rq   r<   r<   r?   sheet_names  s   zBook.sheet_namesc                 C   sJ   t |tr|}nz| j|}W n ty   td| w t| j| S )z
        :param sheet_name_or_index: Name or index of sheet enquired upon
        :returns: ``True`` if sheet is loaded, ``False`` otherwise.

        .. versionadded:: 0.7.1
        r   )r   r   rM   r   r   rF   boolrN   rq   sheet_name_or_indexr   r<   r<   r?   sheet_loaded  s   
zBook.sheet_loadedc                 C   sJ   t |tr|}nz| j|}W n ty   td| w d| j|< dS )zu
        :param sheet_name_or_index: Name or index of sheet to be unloaded.

        .. versionadded:: 0.7.1
        r   N)r   r   rM   r   r   rF   rN   r   r<   r<   r?   unload_sheet  s   
zBook.unload_sheetc                 C   sN   d| _ t| jdr| j  d| _t| jdr| j  d| _d| _d| _dS )a_  
        This method has a dual purpose. You can call it to release
        memory-consuming objects and (possibly) a memory-mapped file
        (:class:`mmap.mmap` object) when you have finished loading sheets in
        ``on_demand`` mode, but still require the :class:`Book` object to
        examine the loaded sheets. It is also called automatically (a) when
        :func:`~xlrd.open_workbook`
        raises an exception and (b) if you are using a ``with`` statement, when
        the ``with`` block is exited. Calling this method multiple times on the
        same object has no ill effect.
        r   closeN)_resources_releasedhasattrmemr   filestr_sharedstrings_rich_text_runlist_mapr   r<   r<   r?   rS   
  s   


zBook.release_resourcesc                 C   s   | S r;   r<   r   r<   r<   r?   	__enter__!  s   zBook.__enter__c                 C   s   |    d S r;   )rS   )rq   exc_type	exc_valueexc_tbr<   r<   r?   __exit__$     zBook.__exit__c                 C   s   g | _ g | _g | _d| _g | _g | _i | _d| _d| _d| _	| 
  d| _d| _d | _d | _g | _g | _g | _i | _i | _d| _g | _d| _g | _g | _i | _g | _g | _i | _d| _d| _d S )Nr   Fr]   r\   )rN   rM   _sheet_visibilityrQ   _sh_abs_posnr   r   raw_user_name_sheethdr_countbuiltinfmtcountinitialise_format_info_all_sheets_count_supbook_count_supbook_locals_inx_supbook_addins_inx_all_sheets_map_externsheet_info_externsheet_type_b57_extnsht_name_from_num_sheet_num_from_name_extnsht_count_supbook_typesr   addin_func_namesname_obj_list
colour_mappalette_recordxf_liststyle_name_mapr   r   r   r<   r<   r?   __init__5  s>   
zBook.__init__TFc                 C   s  || _ || _|| _|| _|| _|| _|	| _|sct|d>}|dd |	 }|dd |dkr5t
d| jrHtj| |tjd| _|| _n| | _t| j| _W d    n1 s]w   Y  n|| _t|| _d| _| jd d tjkr}| j| _n:tj| j| j |
d}dD ]}|t|\| _| _| _| jr nqt
d	~| j| jurt| jd
r| j  d| _| j| _trtdt| j| j| jf | j d d S d S )Nrbr      zFile size is 0 bytes)access   )r3   r:   )WorkbookrA   z-Can't find workbook in OLE2 compound documentr   r\   zmem: %s, base: %d, len: %dfile)r3   r4   r5   r6   r7   r8   r9   openseektellrF   mmapfilenoACCESS_READr   
stream_lenreadrP   baser   	SIGNATUREr   CompDoclocate_named_streamr   r   r   	_positionDEBUGprinttype)rq   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   fsizecdqnamer<   r<   r?   rB   V  s\   	



&zBook.biff2_8_loadc                 C   s8   i | _ g | _d| _d| _dti| _d| _g | _g | _d S )Nr   )	
format_mapformat_listxfcountactualfmtcountXL_CELL_NUMBER_xf_index_to_xl_type_map_xf_epilogue_doner   	font_listr   r<   r<   r?   r     s   

zBook.initialise_format_infoc                 C   sV   | j }| j||d  }t|}|  j |7  _ |dk rtS |\}}t|d> t|B S )Nr   r   )r   r   rP   MY_EOF	BYTES_ORD)rq   posbuff_twolenbufflohir<   r<   r?   	get2bytes  s   zBook.get2bytesc                 C   sR   | j }| j}td|||d  \}}|d7 }||||  }|| | _ |||fS )N<HH   r   r   r   )rq   r   r   codelengthdatar<   r<   r?   get_record_parts  s   

zBook.get_record_partsc                 C   s^   | j }| j}td|||d  \}}||krdS |d7 }||||  }|| | _ |||fS )Nr   r   )Nr   r\   r   )rq   reqd_recordr   r   r   r   r   r<   r<   r?   get_record_parts_conditional  s   

z!Book.get_record_parts_conditionalc                 C   sX   | j rtd|r| j| | _| t t| | j| j| |}|	|  || j
|< |S )Nz,Can't load sheets after releasing resources.)r   rF   r   r   rD   XL_WORKSHEETr   SheetrM   r   rN   )rq   	sh_number
update_posr>   r<   r<   r?   r     s   


zBook.get_sheetc                 C   sX   t rtd| j| j| jd tt| jD ]}t r$td|| j| j| jd | | qd S )NzGET_SHEETS:r   zGET_SHEETS: sheetno =)r   r   rM   r   r3   r   rP   r   )rq   sheetnor<   r<   r?   rO     s
   zBook.get_sheetsc                 C   sB   t |  td}|g| _dg| _dg| _| jd  |   d S )NzSheet 1r   )	r   initialise_bookr   rM   r   r   rN   appendrO   )rq   fake_sheet_namer<   r<   r?   rK     s   
zBook.fake_globals_get_sheetc           
      C   s~  | j }|   trt| jd|| |dkr3t|d| jdd}d}t}t| j	dkr0| j
| j }n)d}n&td|dd \}}}|| j }|tk rRt|d| jdd}nt|ddd}ts`| jd	krlt| jd
| j|||| |  jd7  _|tkr| jd dddd|d}ts| jdkrt| jd||| d S d S t| j}	| j|	 | j| | j	| | j| |	| j|< d S )NzBOUNDSHEET: bv=%d data %r
r   r   r   lenlenr]   z<iBB   r   zFBOUNDSHEET: inx=%d vis=%r sheet_name=%r abs_posn=%d sheet_type=0x%02x
zMacro sheetChartzVisual Basic module)r   r   r	  UNKNOWNzANOTE *** Ignoring non-worksheet data named %r (type 0x%02x = %s)
)rI   derive_encodingr   rJ   r3   unpack_stringencodingXL_BOUNDSHEET_WORKSHEETrP   r   _sheetsoffsetr   r   BIFF_FIRST_UNICODEunpack_unicoder4   r   r   r  getrM   r   r   )
rq   r   bvr   
visibility
sheet_typeabs_posnoffsetdescrsnumr<   r<   r?   handle_boundsheet  sT   

zBook.handle_boundsheetc                 C   s2   t d|dd d }trt| jd| || _d S )N<Hr   r   zBUILTINFMTCOUNT: %r
)r   r   rJ   r3   r   )rq   r   r   r<   r<   r?   handle_builtinfmtcount  s   
zBook.handle_builtinfmtcountc                 C   sr  | j r| j | _nh| jd u r+| jdk rt| jd d| _nTd| _| jdkr*t| jd nE| j}|tv r7t| }n$d|  krAdkrJn nd	t| }n| jdkrUd| _d
}ndt| }t	se| jrm|| jkrmt| jd|| || _| jdkrzt
d| j W n! ty } zt| jd| j| jt|jdd |  d }~ww | jrt| jd| jdd}| }|| _d| _| jS )Nr   zD*** No CODEPAGE record, no encoding_override: will use 'iso-8859-1'
z
iso-8859-1i  r   z2*** No CODEPAGE record; assuming 1200 (utf_16_le)
i,  i  cp	utf_16_leunknown_codepage_z%CODEPAGE: codepage %r -> encoding %r
s   trialz/ERROR *** codepage %r -> encoding %r -> %s: %s
.r]   r   r   r  F)r6   r  codepagerI   rJ   r3   r4   encoding_from_codepagestrr   unicodeBaseExceptionr   r{   splitr   r  	user_namerstrip)rq   r"  r  estrgr<   r<   r?   r    sR   






zBook.derive_encodingc                 C   s(   t d|dd d }|| _|   d S )Nr  r   r   )r   r"  r  )rq   r   r"  r<   r<   r?   handle_codepageE  s   zBook.handle_codepagec                 C   sJ   t d|dd }| jrtd|| jd | jdks | j|ks J || _d S )Nr   r   r   z
Countries:r   r   )r   r4   r   r3   	countries)rq   r   r-  r<   r<   r?   handle_countryK  s   
zBook.handle_countryc                 C   sD   t d|dd d }ts| jrt| jd| |dv sJ || _d S )Nr  r   r   zDATEMODE: datemode %r
)r   r   )r   r   r4   rJ   r3   datemode)rq   r   r/  r<   r<   r?   handle_datemodeR  s
   

zBook.handle_datemodec                 C   s   t p| jdk}| jdkrGtd|d d \}}d}t||dd\}}||d  }| jd tkr5| j| |rIt	| j
d| jd |||| d S d S d S )	Nr   r   <HIr	  r   r  r]   zCEXTERNNAME: sbktype=%d oflags=0x%04x oinfo=0x%08x name=%r extra=%r
)r   r4   rI   r   unpack_unicode_update_posr   SUPBOOK_ADDINr   r  rJ   r3   )rq   r   blahoption_flags
other_infor   r   extrar<   r<   r?   handle_externnameY  s   
zBook.handle_externnamec                 C   s  |    |  jd7  _tp| jdk}tp| jdk}| jdkrtd|dd d }|d d }t||k rZ|rAt| jd|t| | 	 \}}}|t
krPtd||7 }t||k s5d}	t|D ](}
td	||	|	d  }|\}}}| j| |	d7 }	|rt| jd
|
||| q`d S td|d d \}}|rtd| jd t|dt|| jd ddddd|d}td|||f | jd |dkrt|d|d  | j}|| j| j< |rt| j| jd d|  krdksn d}| j| d S )Nr   r   r   r  r   r	  z*INFO: EXTERNSHEET needs %d bytes, have %d
z)Missing CONTINUE after EXTERNSHEET recordz<HHHzLEXTERNSHEET(b8): k = %2d, record = %2d, first_sheet = %5d, last sheet = %5d
z<BBzEXTERNSHEET(b7-):r   foutzEncoded URLzCurrent sheet!!zSpecific sheet in own doc'tz Nonspecific sheet in own doc't!!)r   r      r   zNot encodedz   %3d chars, type is %d (%s)r;  r   )r  r   r   r4   rI   r   rP   rJ   r3   r   XL_CONTINUErF   r   r   r  r   hex_char_dumpr  r%  r  r   r   )rq   r   blah1blah2num_refs
bytes_reqdcode2length2data2r   kinforef_recordxref_first_sheetxref_last_sheetxnctymsgr   r<   r<   r?   handle_externsheetg  sh   

zBook.handle_externsheetc                 C   s   | j dkre| j}t|d t|dt|d|d | jdkretd|d d \}|dkrAtd|dd  \}}t|d|| td|d	kretd|d
d \}|d	krVd}n	|dkr]d}nd}t|d| td)Nr   z
FILEPASS:
r   )r   r:  r   r  r   z!weak XOR: key=0x%04x hash=0x%04x
r   r   r	  z	BIFF8 stdzBIFF8 strongz** UNKNOWN ENCRYPTION METHOD **z%s
zWorkbook is encrypted)r4   r3   rJ   r=  rP   rI   r   rF   )rq   r   logfkind1key
hash_valuekind2captionr<   r<   r?   handle_filepass  s,   


zBook.handle_filepassc                 C   s  t p| jdk}| j}|dk rd S |   td|dd \
}}}}}}	}
}}}t }| |_t| j}||_	| j
| ||_g d}|D ]\}}}t||||@ |?  qDd|j }|dk rit|d| j|d	\}}n	t|d|d	\}}||_|	|_d |_|rt| jd
|||||||	|
 |}|jrt|d}|rtd| | jd ||_||d  |_||_d|_|r|j| jd| dd d S d S )Nr   r   z	<HBBHHH4Br      ))r   r   r   )r   r   r   )r   r   r   )r   r   r;  )r      r   )r       r   )r   i  r	  )r   i      z Mr   )	known_lenzZNAME[%d]:%s oflags=%d, name_len=%d, fmla_len=%d, extsht_index=%d, sheet_index=%d, name=%r
z??Unknown??z    builtin: %sr   z--- handle_name: name[%d] ---z-------------------r`   )r   r4   rI   r  r   rY   rm   rP   r   r   r  r5  setattrr   unpack_string_update_posr  r2  extn_sheet_numexcel_sheet_indexr   rJ   r3   r   builtin_name_from_coder  r   r   r   basic_formula_len	evaluatedrp   )rq   r   r4  r  r5  kb_shortcutname_lenfmla_lenextsht_indexsheet_indexmenu_text_lendescription_text_lenhelp_topic_text_lenstatus_bar_text_lennobjr   attrsattrmasknshift
macro_flaginternal_namer   r   r<   r<   r?   handle_name  s^   



zBook.handle_namec                 C   sz  | j dk}| j}|r.td|d tdt| j|d tdt| j|d tdt| j|d t| j}t	|D ]\}| j| }| j
dkrm|j}|dkrMd	}nCd
|  krZt| jkrjn n| j|d
  }|d	krid}n&d}n#d| j
  krxdkrn n|j}|dkrd	}n| j| }| j|d}||_q7t	|D ]}| j| }|js|jrq|jrqt| |||d q| j dkrtd|d t	|D ]}| j| }|j|d| d qtd|d i }	i }
t	|D ]:}| j| }|j }||jf}||	v r| j rt|d| ||	|< |j||f}||
v r|
| | q|g|
|< q|
 D ]}|
| }|  dd |D |
|< q |	| _|
| _d S )Nr   z+++++ names_epilogue +++++r   r   r   r   r   r   r]   r   r   r   )r4  z&---------- name object dump ----------z--- name[%d] ---)ra   z&--------------------------------------z)Duplicate entry %r in name_and_scope_map
c                 S   s   g | ]}|d  qS )r   r<   )r=   xr<   r<   r?   r@   3  s    z'Book.names_epilogue.<locals>.<listcomp>)r4   r3   r   REPRr   r   r   rP   r   r   rI   r]  r\  r  r   r   r   r`  evaluate_name_formularp   r   lowerrJ   r  keyssortname_and_scope_mapname_map)rq   r4  r   	num_namesnamexrj  re  intl_sheet_indexr   rz  r{  
name_lcaserP  	sort_dataalistr<   r<   r?   names_epilogue  sr   












zBook.names_epiloguec                 C   s   t d|dd \}}d S )Nr1  r   
   r
   )rq   r   obj_typeobj_idr<   r<   r?   
handle_obj7  s   zBook.handle_objc           
   	   C   s  | j d  tp| jdk}|r!td| jd t|dt|| jd td|dd d }|r7td| | jd | j	}|  j	d7  _	|dd	 d
krlt
| j d< | j	d | _|rjtd||f | jd td| j| jd d S |dd	 dkrt| j d< | j	d | _|rtd| | jd d S t|ddd\}}|dkrt| j d< |rt| jd|| d S t| j d< |rt| jd|| g }t|D ]<}zt||dd\}	}W n tjy   | jrtd|||f | jd Y  d S w ||	 |rt| jd|t|	|	| qd S )Nr   zSUPBOOK:r   r   r9  r  znum_sheets = %dr   r   s   r]   z(SUPBOOK[%d]: internal 3D refs; %d sheetsz    _all_sheets_maps    :zSUPBOOK[%d]: add-in functionsr  z#SUPBOOK[%d]: DDE/OLE document = %r
zSUPBOOK[%d]: url = %r
zK*** WARNING: unpack failure in sheet %d of %d in SUPBOOK record for file %rz-  sheetx=%d namelen=%d name=%r (next pos=%d)
)r   r  r   r4   r   r3   r=  rP   r   r   SUPBOOK_INTERNALr   r   r3  r   r2  SUPBOOK_DDEOLErJ   SUPBOOK_EXTERNALr   structerror)
rq   r   r4  
num_sheetssbnurlr   r   rt  shnamer<   r<   r?   handle_supbook>  s\   





zBook.handle_supbookc                 C   s   |    td|d d d }t|d| jdd}| j}|| j| ks$J |  jd7  _| j}|d t| }trBt	| j
d|||| |   trRtd| j | j
d | jd  | j|d	d
 trjtd| j| j
d || | _d S )N<ir   r   r   r  z'SHEETHDR %d at posn %d: len=%d name=%r
z SHEETHDR: xf epilogue flag is %dr   F)r  z"SHEETHDR: posn after get_sheet() =)r  r   r  r  r   rM   r   rP   r   rJ   r3   r   r   r   rN   r  r   )rq   r   	sheet_lenr   r  BOF_posnposnr<   r<   r?   handle_sheethdrm  s   zBook.handle_sheethdrc                 C   s,   t d|d }trtd|| jd || _d S )Nr  r   zSHEETSOFFSET:r   )r   r   r   r3   r  )rq   r   r  r<   r<   r?   handle_sheetsoffset  s   
zBook.handle_sheetsoffsetc           
      C   s   t rtd| jd t }t|}|g}td|dd d }t s%| jdkr,t| jd| 	 | t	\}}}|d u r:n||7 }t dkrJt| jd
|| |
| q-t||\| _}| jr^|| _t rqt }	td|	| f | jd d S d S )NzSST Processingr   r  r   r   r   r   zSST: unique strings: %d
r   z'CONTINUE: adding %d bytes to SST -> %d
z SST processing took %.2f seconds)r   r   r3   r   rP   r   r4   rJ   r   r<  r  unpack_SST_tabler   r7   r   )
rq   r   rT   nbtstrlistuniquestringsr   nb
rt_runlistrV   r<   r<   r?   
handle_sst  s0   
zBook.handle_sstc                 C   s   d}| j dk r| jsd| _|| _d S t|d| jdd}nz	t|ddd}W n ty7   t| ddd}Y nw |rFt| j	dt
|| j| | }|| _d S )Nr   r   Tr   r  r   z!WRITEACCESS: %d bytes; raw=%s %r
)rI   r  r   r(  r  r  UnicodeDecodeErrorstriprJ   r3   rP   r)  )rq   r   r   r+  r<   r<   r?   handle_writeaccess  s   

zBook.handle_writeaccessc                 C   s0  t |  	 |  \}}}trtd| | jd |tkr"| | n|tks*|t	kr0| 
| n|tkr:| | n|tkrD| | n|tkrN| | n|tkrX| | n|tkrb| | n|tkrl| | n|tkrv| | n|tkr| | n|tkr| | n|tkr| | n|tkr|  | ny|t!kr| "| no|t#kr| $| ne|t%kr| &| n[|t'kr| (| nQ|t)kr| *| nG|d@ dkr| j+rt,| jd| j-| d ||| n.|t.kr| /  | 0  | 1  | j2s| 3  | j4dkrtrtd	| j-| jd d S 	 q)
Nr   z$parse_globals: record code is 0x%04xr      	   z5*** Unexpected BOF at posn %d: 0x%04x len=%d data=%r
r   r   zglobal EOF: position)5r   r  r   r   r   r3   XL_SSTr  XL_FONTXL_FONT_B3B4handle_font	XL_FORMAThandle_formatXL_XF	handle_xfXL_BOUNDSHEETr  XL_DATEMODEr0  XL_CODEPAGEr,  
XL_COUNTRYr.  XL_EXTERNNAMEr8  XL_EXTERNSHEETrM  XL_FILEPASSrT  XL_WRITEACCESSr  XL_SHEETSOFFSETr  XL_SHEETHDRr  
XL_SUPBOOKr  XL_NAMErq  
XL_PALETTEhandle_paletteXL_STYLEhandle_styler4   rJ   r   XL_EOFxf_epiloguer  palette_epiloguer  r  rI   )rq   rcr   r   r<   r<   r?   rL     sn   

zBook.parse_globalsc                 C   s$   | j |||  }|t| | _|S r;   )r   rP   r   )rq   r   r   r   r<   r<   r?   r     s   z	Book.readc                 C   s  t rtd| | jd dd }| j}|  }|tkr|d |tvr/|d| j||d    |  }|tkr;|d d	|  krEd
ksNn |d||f  dtdt	| |  }| 
| j|}t rit| jd| t||k rs|d ||7 }|d? }td|dd	 \}	}
t rtd||	|
f | jd | jd	 | }t rtd||f | jd d } }}|dkrtd|d	d \}}|	dkrd}n+|	dkr|dk s|dv rd}nd}ndddddd|	d}n|dv rdddd| }|dkr|
tkrd}t s| jd krtd!||	|
|||f | jd |
tkp|dko|
tk}|tkr'|s,|
|kr.|S |dk r:|
tkr:|S |dkrH|
d"krH|d# |d$||	|
|||f  d S )%Nzreqd: 0x%04xr   c                 S   s   t d|  )Nz%Unsupported format, or corrupt file: )rF   )rL  r<   r<   r?   	bof_error  r   zBook.getbof.<locals>.bof_errorz$Expected BOF record; met end of filezExpected BOF record; found %rr   z)Incomplete BOF record[1]; met end of filer   r   z.Invalid length (%d) for BOF record type 0x%04x    r   z
getbof(): data=%r
z)Incomplete BOF record[2]; met end of filer   z5getbof(): op=0x%04x version2=0x%04x streamtype=0x%04xz+getbof(): BOF found at offset %d; savpos=%di   r   i   i  )il	  i  i  r   r   r   r   r   )r      i   i   i   )r   r   r   r   r   zHBOF: op=0x%04x vers=0x%04x stream=0x%04x buildid=%d buildyr=%d -> BIFF%d   z%Workspace file -- no spreadsheet datazXBOF not workbook/worksheet: op=0x%04x vers=0x%04x strm=0x%04x build=%d year=%d -> BIFF%d)r   r   r3   r   r   r   bofcodesr   rv   boflenr   rJ   rP   r   r  XL_WORKBOOK_GLOBALS_4Wr4   rE   r   )rq   
rqd_streamr  savposopcoder   paddingr   version1version2
streamtype
bof_offsetversionbuildyeargot_globalsr<   r<   r?   rD     s   
zBook.getbofrz   )Br{   r|   r}   r~   rQ   r/  rI   r   r"  r  r-  r   r(  r   r   r   r   r   r   r   rC   rR   r   rn   r   r   r   r   r   r   rS   r   r   rz  r{  r   sysstdoutrB   r   r   r   r   r   rO   rK   r  r  r  r,  r.  r0  r8  rM  rT  rq  r  r  r  r  r  r  r  rL   r   rD   r<   r<   r<   r?   rA     s    	!
9
	
	4-3<J/@rA   c                 C   s\   | }|d@ r|dkr|d8 }d}nd}|d@ }|d@ r&|dkr#|d8 }d}nd}||||fS )	Ni   i   r   r   r  i @     r  r<   )inrowincoloutrowrelrowoutcolrelcolr<   r<   r?   expand_cell_addressF  s   r  ABCDEFGHIJKLMNOPQRSTUVWXYZc                 C   sB   | dksJ t d}	 t| d\}}|| | }|s|S |d } q)Nr   r[   r      )r   divmod)colx_A2Zr   quotremr<   r<   r?   colnameX  s   r  c                 C   sd   |rdd| dk  t | f }nd| d f }|r(dd|dk  t |f }|| S dt| }|| S )Nz(*%s%d)z+-r   z$%dr   $)absr  )rowxr  r  r  rowpartcolpartr<   r<   r?   display_cell_addressb  s   r  c              
   C   s  d}t | }| d }t |}d}g }|j}i }	t}
t}t}d}t|D ]}|
d|||d  d }|d7 }||| }|d7 }d}d}|d@ rZ|
d|||d  d }|d7 }|d@ ro|
d|||d  d }|d7 }td	}d}	 || }|d@ r||| d? |}|||d|   }z	|t|d
7 }W n    |d| 7 }n||| |}||||  }|t||7 }||7 }||7 }||krn|d7 }| | }t |}||d }d}qv|rg }t|D ]&}||krd}|d7 }| | }t |}||
d|||d   |d7 }q||	t |< ||7 }||kr<|| }|d7 }||k r3| | }t |}n	||d ks<J || q#||	fS )zReturn list of stringsr   r   latin_1r  r   r   r   r  r[   r  r   )rP   r  r   rt   r   r   r   r%  )datatabnstringsdatainxndatasr   datalenr   strings	strappendrichtext_runslocal_unpack	local_minlocal_BYTES_ORDr  	_unused_incharsoptionsrtcountphoszaccstrgcharsgot	charsneed
charsavailrawstrgrunsrunindexr<   r<   r?   r  m  s   !




r  )r  )+
__future__r   r  r[   r   r   r   biffhformulatimemachinetimer   ImportErrorr	   r   
empty_cellr   r   r   r   SUPBOOK_UNKr  r  r3  r  rG   _code_from_builtin_namer^  code_from_builtin_nameitems_bin_bicr   r  r  rX   
BaseObjectrY   rA   r  r  r  r  r<   r<   r<   r?   <module>   s~   

D         @

