B
    \                 @   s  d dl mZ d dl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 yd dlmZ W n  ek
rx   d dlmZ Y nX d dlZejZejZd ZdZd Zyd dlZdZW n ek
r   d ZY nX e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"x6e # D ]*\Z$Z%e&e$Z$e&e%Z%e%e"e$< e$e!e%< qW [$[%[ dej'd e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)clocki    )P   F   2   -   (             	
)ZConsolidate_AreaZ	Auto_OpenZ
Auto_CloseZExtractZDatabaseZCriteriaZ
Print_AreaZPrint_TitlesZRecorderZ	Data_FormZAuto_ActivateZAuto_DeactivateZSheet_TitleZ_FilterDatabaseFc	             C   s  t  }	trt }
|
rt  t }y:|j| ||||||||d	 t  }||	 |_|t	}|sjt
d|tkrt
dt|  ||_|dkr|rt|jd d |_}|  nT|dkr|  |rt|jd d |_}n(|  dd	 |jD |_|s|  t|j|_|dkr:|jd
kr:t|jd|j trN|
rNt  t  }|| |_W n   |   Y nX |s|  |S )N)	filenamefile_contentslogfile	verbosityuse_mmapencoding_overrideformatting_info	on_demandragged_rowsz#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*   (lib/python3.7/site-packages/xlrd/book.py
<listcomp>v   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   	TOGGLE_GCgc	isenableddisableBookbiff2_8_loadload_time_stage_1getbofXL_WORKBOOK_GLOBALS	XLRDErrorSUPPORTED_VERSIONSZbiff_text_from_numbiff_versionfprintfr#   r(   fake_globals_get_sheetparse_globals_sheet_names_sheet_list
get_sheetslennsheetsenableload_time_stage_2release_resources)r!   r#   r$   r%   r"   r&   r'   r(   r)   t0Zorig_gc_enabledZbkt1r:   Zt2r*   r*   r-   open_workbook_xlsF   sp    



rH   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 }|r|j}|j}|tkrt|dkr|d }d|j  krN|jd krn n>|j|jd kr|j	|j
d kr| j|j}||j|j	S | j| jjddd tddS )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   z=== Dump of Name object ===z======= End of dump =======)headerfooterz2Not a constant absolute reference to a single cellN)resultkindvalueoREFrA   shtxloshtxhirowxlorowxhicolxlocolxhibooksheet_by_indexcelldumpr#   r8   )selfresrQ   rR   ref3dr,   r*   r*   r-   r\      s      z	Name.cellTc             C   sF  | j }|r&|j}|j}|tkr&t|dkr&|d }d|j  krV|jd kr&n n| 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r|  kr|jksn td|	  kr|
  kr|jksn t||||	|
fS | j| jjddd tddS )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   z=== Dump of Name object ===z======= End of dump =======)rN   rO   zDNot a constant absolute reference to a single area in a single sheetN)rP   rQ   rR   rS   rA   rT   rU   rZ   r[   rV   rW   rX   rY   minZnrowsmaxZncolsAssertionErrorr]   r#   r8   )r^   Zclippedr_   rQ   rR   r`   r,   rV   rW   rX   rY   r*   r*   r-   area2d   s,    "&,zName.area2d)T)__name__
__module____qualname____doc__Z_repr_theserZ   hiddenfuncvbasicmacrocomplexbuiltin	funcgroupbinary
name_indexUNICODE_LITERALnameraw_formulascoperP   r\   rd   r*   r*   r*   r-   rI      s$   
rI   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i Zi Z dd Z!dde"j#de$ddddf	ddZ%dd Z&d d! Z'd"d# Z(d$d% Z)dUd'd(Z*d)d* Z+d+d, Z,d-d. Z-d/d0 Z.d1d2 Z/d3d4 Z0d5d6 Z1d7d8 Z2d9d: Z3d;d< Z4d=d> Z5d?d@ Z6dAdB Z7dCdD Z8dEdF Z9dGdH Z:dIdJ Z;dKdL Z<dMdN Z=dOdP Z>dQdR Z?dSdT Z@dS )Vr3   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   rK   g      c             C   s6   x&t | jD ]}| j| s| | qW | jdd S )zt
        :returns: A list of all sheets in the book.

        All sheets not already loaded will be loaded.
        N)xrangerB   r?   	get_sheet)r^   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`.
        )r?   rw   )r^   rx   r*   r*   r-   r[     s    zBook.sheet_by_indexc             C   s<   y| j |}W n  tk
r0   td| Y nX | |S )zp
        :param sheet_name: Name of the sheet required.
        :returns: A :class:`~xlrd.sheet.Sheet`.
        zNo sheet named <%r>)r>   index
ValueErrorr8   r[   )r^   
sheet_namerx   r*   r*   r-   sheet_by_name  s
    zBook.sheet_by_namec             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)r>   )r^   r*   r*   r-   sheet_names  s    zBook.sheet_namesc             C   sP   t |tr|}n2y| j|}W n  tk
r@   td| Y nX 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
        zNo sheet named <%r>)
isinstanceintr>   rz   r{   r8   boolr?   )r^   sheet_name_or_indexrx   r*   r*   r-   sheet_loaded  s    
zBook.sheet_loadedc             C   sP   t |tr|}n2y| j|}W n  tk
r@   td| Y nX d| j|< dS )zu
        :param sheet_name_or_index: Name or index of sheet to be unloaded.

        .. versionadded:: 0.7.1
        zNo sheet named <%r>N)r   r   r>   rz   r{   r8   r?   )r^   r   rx   r*   r*   r-   unload_sheet  s    
zBook.unload_sheetc             C   sN   d| _ t| jdr| j  d| _t| jdr8| 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_map)r^   r*   r*   r-   rE     s    

zBook.release_resourcesc             C   s   | S )Nr*   )r^   r*   r*   r-   	__enter__  s    zBook.__enter__c             C   s   |    d S )N)rE   )r^   exc_type	exc_valueZexc_tbr*   r*   r-   __exit__!  s    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   FrM   rL   )r?   r>   _sheet_visibilityrB   _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__2  s>    zBook.__init__Fc
          	   C   s  || _ || _|ot| _|| _|| _|| _|	| _|st|dr}
|
	dd |

 }|
	dd |dkrntd| jrtj|
 |tjd| _|| _n|
 | _t| j| _W d Q R X n|| _t|| _d| _| jd d tjkr| j| _ntj| j| j d}tr@xzdD ]*}|t|\| _| _| _| jrP qW td	n>x0dD ] }|t|| _| jrFP qFW td	t| j| _~| j| jk	rt| jd
r| j  d| _| j| _trt dt!| j| j| jf | j d d S )Nrbr      zFile size is 0 bytes)access   )r#   )ZWorkbookr3   z-Can't find workbook in OLE2 compound documentr   rL   zmem: %s, base: %d, len: %d)file)"r#   r$   MMAP_AVAILABLEr%   r&   r'   r(   r)   openseektellr8   mmapfilenoZACCESS_READr   Z
stream_lenreadrA   baser   Z	SIGNATUREr   ZCompDocUSE_FANCY_CDZlocate_named_streamrr   Zget_named_streamr   r   	_positionDEBUGprinttype)r^   r!   r"   r#   r$   r%   r&   r'   r(   r)   fsizeZcdZqnamer*   r*   r-   r4   S  sZ    




 

 
zBook.biff2_8_loadc             C   s8   i | _ g | _d| _d| _dti| _d| _g | _g | _d S )Nr   )	
format_mapformat_listZxfcountZactualfmtcountZXL_CELL_NUMBERZ_xf_index_to_xl_type_map_xf_epilogue_doner   	font_list)r^   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   rA   MY_EOF	BYTES_ORD)r^   posZbuff_twoZlenbufflohir*   r*   r-   	get2bytes  s    zBook.get2bytesc             C   sR   | j }| j}td|||d  \}}|d7 }||||  }|| | _ |||fS )Nz<HH   )r   r   unpack)r^   r   r   codelengthdatar*   r*   r-   get_record_parts  s    
zBook.get_record_partsc             C   s^   | j }| j}td|||d  \}}||kr2dS |d7 }||||  }|| | _ |||fS )Nz<HHr   )Nr   rL   )r   r   r   )r^   Zreqd_recordr   r   r   r   r   r*   r*   r-   get_record_parts_conditional  s    
z!Book.get_record_parts_conditionalTc             C   sX   | j rtd|r| j| | _| t t| | j| j| |}|	|  || j
|< |S )Nz,Can't load sheets after releasing resources.)r   r8   r   r   r6   XL_WORKSHEETr   ZSheetr>   r   r?   )r^   Z	sh_number
update_posr,   r*   r*   r-   rw     s    


zBook.get_sheetc             C   s\   t rtd| j| j| jd x<tt| jD ]*}t rJtd|| j| j| jd | | q*W d S )NzGET_SHEETS:)r   zGET_SHEETS: sheetno =)r   r   r>   r   r#   rv   rA   rw   )r^   sheetnor*   r*   r-   r@     s      zBook.get_sheetsc             C   sB   t |  td}|g| _dg| _dg| _| jd  |   d S )NzSheet 1r   )	r   initialise_bookrr   r>   r   r   r?   appendr@   )r^   Zfake_sheet_namer*   r*   r-   r<     s    
zBook.fake_globals_get_sheetc       
      C   s~  | j }|   tr"t| jd|| |dkrft|d| jdd}d}t}t| j	dkr`| j
| j }qd}nLtd|dd \}}}|| j }|tk rt|d| jdd}nt|ddd}ts| jd	krt| jd
| j|||| |  jd7  _|tkr6| jd dddd|d}ts"| jdkrzt| jd||| nDt| j}	| j|	 | j| | j	| | j| |	| j|< d S )NzBOUNDSHEET: bv=%d data %r
r   r   r   )lenlenrM   z<iBB   r   zFBOUNDSHEET: inx=%d vis=%r sheet_name=%r abs_posn=%d sheet_type=0x%02x
zMacro sheetZChartzVisual Basic module)r   r   r   ZUNKNOWNzANOTE *** Ignoring non-worksheet data named %r (type 0x%02x = %s)
)r:   derive_encodingr   r;   r#   unpack_stringencodingZXL_BOUNDSHEET_WORKSHEETrA   r   _sheetsoffsetr   r   ZBIFF_FIRST_UNICODEunpack_unicoder$   r   r   r   getr>   r   r   )
r^   r   bvr|   Z
visibilityZ
sheet_typeZabs_posnoffsetZdescrZsnumr*   r*   r-   handle_boundsheet  sJ    


zBook.handle_boundsheetc             C   s2   t d|dd d }tr(t| jd| || _d S )Nz<Hr   r   zBUILTINFMTCOUNT: %r
)r   r   r;   r#   r   )r^   r   r   r*   r*   r-   handle_builtinfmtcount  s     zBook.handle_builtinfmtcountc             C   sl  | j r| j | _n| jd krV| jdk r8t| jd d| _qd| _| jdkrt| jd nt| j}|tkrnt| }n2d|  krdkrn nd	t| }nd
t| }t	s| jr|| jkrt| jd|| || _| jdkr6yt
d| j W nN tk
r4 } z.t| jd| j| jt|jdd |  W d d }~X Y nX | jrft| jd| jdd}| }|| _d| _| jS )Nr   z?*** No CODEPAGE record, no encoding_override: will use 'ascii'
asciii  r   z2*** No CODEPAGE record; assuming 1200 (utf_16_le)
i,  i  ZcpZunknown_codepage_z%CODEPAGE: codepage %r -> encoding %r
s   trialz/ERROR *** codepage %r -> encoding %r -> %s: %s
.rM   r   r   )r   F)r&   r   codepager:   r;   r#   r$   Zencoding_from_codepagestrr   unicodeBaseExceptionr   re   splitr   r   	user_namerstrip)r^   r   r   estrgr*   r*   r-   r     sB    




 zBook.derive_encodingc             C   s(   t d|dd d }|| _|   d S )Nz<Hr   r   )r   r   r   )r^   r   r   r*   r*   r-   handle_codepageC  s    zBook.handle_codepagec             C   sJ   t d|dd }| jr(td|| jd | jdks@| j|ks@t|| _d S )Nz<HHr   r   z
Countries:)r   )r   r   )r   r$   r   r#   	countriesrc   )r^   r   r   r*   r*   r-   handle_countryI  s
     zBook.handle_countryc             C   sD   t d|dd d }ts | jr.t| jd| |dks:t|| _d S )Nz<Hr   r   zDATEMODE: datemode %r
)r   r   )r   r   r$   r;   r#   rc   datemode)r^   r   r   r*   r*   r-   handle_datemodeP  s
    
zBook.handle_datemodec             C   s   t p| jdk}| jdkrtd|d d \}}d}t||dd\}}||d  }| jd tkrj| j| |rt	| j
d| jd |||| d S )	Nr   r   z<HIr   r   )r   rM   zCEXTERNNAME: sbktype=%d oflags=0x%04x oinfo=0x%08x name=%r extra=%r
)r   r$   r:   r   unpack_unicode_update_posr   SUPBOOK_ADDINr   r   r;   r#   )r^   r   blahoption_flagsZ
other_infor   rs   Zextrar*   r*   r-   handle_externnameW  s    
zBook.handle_externnamec             C   s  |    |  jd7  _tp"| jdk}tp0| jdk}| jdkrtd|dd d }|d d }xNt||k r|rt| jd|t| | 	 \}}}|t
krtd||7 }qbW d}	x\t|D ]P}
td	||	|	d  }|\}}}| j| |	d7 }	|rt| jd
|
||| qW nt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   z<Hr   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   r$   r:   r   rA   r;   r#   r   XL_CONTINUEr8   rv   r   r   r   hex_char_dumpr   r   r   r   r   )r^   r   Zblah1Zblah2Znum_refsZ
bytes_reqdcode2Zlength2Zdata2r   kinfoZref_recordxZref_first_sheetxZref_last_sheetxZncZtymsgr|   r*   r*   r-   handle_externsheete  s\    

 zBook.handle_externsheetc             C   s   | j dkr| j}t|d t|dt|d|d | jdkrtd|d d \}|dkr|td|dd  \}}t|d|| nH|d	krtd|d
d \}|d	krd}n|dkrd}nd}t|d| tdd S )Nr   z
FILEPASS:
r   )r   r   r   z<Hz<HHz!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)r$   r#   r;   r   rA   r:   r   r8   )r^   r   ZlogfZkind1keyZ
hash_valueZkind2Z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
| ||_dddd	d
dddg}x&|D ]\}}}t||||@ |?  qW d|j }|dk rt|d| j|d\}}nt|d|d\}}||_|	|_d |_|r(t| jd|||||||	|
 |}|jrXt|d}|rXtd| | jd ||_||d  |_||_d|_|r|j| jd| dd d S )Nr   r   z	<HBBHHH4Br      )ri   r   r   )rj   r   r   )rk   r   r   )rl   r   r   )rm      r   )rn       r
   )ro   i  r   )rp   i      z Mr   )Z	known_lenzZNAME[%d]:%s oflags=%d, name_len=%d, fmla_len=%d, extsht_index=%d, sheet_index=%d, name=%r
z??Unknown??z    builtin: %s)r   z--- handle_name: name[%d] ---z-------------------)rN   rO   )r   r$   r:   r   r   rI   rZ   rA   r   rq   r   r   setattrrl   Zunpack_string_update_posr   r   extn_sheet_numexcel_sheet_indexru   r;   r#   rn   builtin_name_from_coder   r   rs   rt   Zbasic_formula_len	evaluatedr]   )r^   r   r   r   r   Zkb_shortcutZname_lenZfmla_lenZextsht_indexsheet_indexZmenu_text_lenZdescription_text_lenZhelp_topic_text_lenZstatus_bar_text_lennobjrq   ZattrsattrmaskZnshiftZ
macro_flagZinternal_namer   rs   r*   r*   r-   handle_name  sb    &

 zBook.handle_namec             C   s  | 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}xt	|D ]}| j| }| j
dkr|j}|dkrd	}n>d
|  krt| jkrn n| j|d
  }|d	krd}nd}nJd| j
  krdkr&n n.|j}|dkrd	}n| j| }| j|d}||_qpW xLt	|D ]@}| j| }|js:|jr\q:|jrhq:t| |||d q:W | j dkrtd|d x.t	|D ]"}| j| }|j|d| d qW td|d i }	i }
xt	|D ]z}| j| }|j }||jf}||	kr$| j r$t|d| ||	|< |j||f}||
krR|
| | n
|g|
|< qW x4|
 D ](}|
| }|  dd |D |
|< qlW |	| _|
| _d S )Nr   z+++++ names_epilogue +++++)r   r   r   r   r   r   rM   r   r   r   )r   z&---------- name object dump ----------z--- name[%d] ---)rN   z&--------------------------------------z)Duplicate entry %r in name_and_scope_map
c             S   s   g | ]}|d  qS )r   r*   )r+   xr*   r*   r-   r.   1  s    z'Book.names_epilogue.<locals>.<listcomp>)r$   r#   r   ZREPRr   r   r   rA   r   ranger:   r  r  r   ru   rl   rp   r  Zevaluate_name_formular]   rs   lowerr;   r   keyssortname_and_scope_mapname_map)r^   r   r   Z	num_namesZnamexr  r  Zintl_sheet_indexr|   r  r  Z
name_lcaser   Z	sort_dataZalistr*   r*   r-   names_epilogue  st    







  




zBook.names_epiloguec             C   s   t d|dd \}}d S )Nz<HIr   
   )r   )r^   r   Zobj_typeZobj_idr*   r*   r-   
handle_obj5  s    zBook.handle_objc       
   	   C   s  | j d  tp| jdk}|rBtd| jd t|dt|| jd td|dd d }|rntd| | jd | j	}|  j	d7  _	|dd	 d
krt
| j d< | j	d | _|rtd||f | jd td| j| jd d S |dd	 dkrt| j d< | j	d | _|rtd| | jd d S t|ddd\}}|dkr\t| j d< |rXt| jd|| d S t| j d< |r|t| jd|| g }xt|D ]}yt||dd\}	}W n: tjk
r   | jrtd|||f | jd P Y nX ||	 |rt| jd|t|	|	| qW d S )Nr   zSUPBOOK:)r   r   )r   z<Hznum_sheets = %dr   r   s   rM   z(SUPBOOK[%d]: internal 3D refs; %d sheetsz    _all_sheets_maps    :zSUPBOOK[%d]: add-in functions)r   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   r$   r   r#   r   rA   r   r   SUPBOOK_INTERNALr   r   r   r   r   SUPBOOK_DDEOLEr;   SUPBOOK_EXTERNALr  structerror)
r^   r   r   Z
num_sheetsZsbnZurlr   r~   r  Z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sHt|  jd7  _| j}|d t| }t	rt
| jd|||| |   t	rtd| j | jd | jd  | j|d	d
 t	rtd| j| jd || | _d S )Nz<ir   r   r   )r   z'SHEETHDR %d at posn %d: len=%d name=%r
z SHEETHDR: xf epilogue flag is %d)r   F)r   z"SHEETHDR: posn after get_sheet() =)r   r   r   r   r   r>   rc   r   rA   r   r;   r#   r   r   r   r?   r   rw   )r^   r   Z	sheet_lenr|   r   ZBOF_posnposnr*   r*   r-   handle_sheethdrk  s$       zBook.handle_sheethdrc             C   s,   t d|d }tr"td|| jd || _d S )Nz<ir   zSHEETSOFFSET:)r   )r   r   r   r#   r   )r^   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 sJ| jdkrXt| jd| xH| t	\}}}|d krtP ||7 }t dkrt| jd	|| |
| qZW t||\| _}| jr|| _t rt }	td
|	| f | jd d S )NzSST Processing)r   z<ir   r   r   r   zSST: unique strings: %d
z'CONTINUE: adding %d bytes to SST -> %d
z SST processing took %.2f seconds)r   r   r#   r   rA   r   r$   r;   r   r   r   unpack_SST_tabler   r'   r   )
r^   r   rF   ZnbtZstrlistZuniquestringsr   ZnbZ
rt_runlistrG   r*   r*   r-   
handle_sst  s,    zBook.handle_sstc             C   st   d}| j dk r8| js$d| _|| _d S t|d| jdd}nt|ddd}|rbt| jdt|| j| |	 }|| _d S )Nr   r   Tr   )r   r   z!WRITEACCESS: %d bytes; raw=%s %r
)
r:   r   r   r   r   r   r;   r#   rA   r   )r^   r   r   r   r*   r*   r-   handle_writeaccess  s    
 zBook.handle_writeaccessc             C   sL  t |  x:|  \}}}tr2td| | jd |tkrF| | q|tksV|t	krb| 
| q|tkrv| | q|tkr| | q|tkr| | q|tkr| | q|tkr| | q|tkr| | q|tk r| | q|tkr| | q|tkr| | q|tkr2| | q|tkrH|  | q|t!kr^| "| q|t#krt| $| q|t%kr| &| q|t'kr| (| q|t)kr| *| q|d@ dkr| j+rt,| jd| j-| d ||| q|t.kr| /  | 0  | 1  | j2s| 3  | j4dkr@tr@td| j-| jd d S qW d S )	Nz$parse_globals: record code is 0x%04x)r      	   z5*** Unexpected BOF at posn %d: 0x%04x len=%d data=%r
r   r   zglobal EOF: position)5r   r   r   r   r   r#   ZXL_SSTr"  ZXL_FONTZXL_FONT_B3B4Zhandle_fontZ	XL_FORMATZhandle_formatZXL_XFZ	handle_xfZXL_BOUNDSHEETr   ZXL_DATEMODEr   ZXL_CODEPAGEr   Z
XL_COUNTRYr   ZXL_EXTERNNAMEr   ZXL_EXTERNSHEETr   ZXL_FILEPASSr   ZXL_WRITEACCESSr#  ZXL_SHEETSOFFSETr   ZXL_SHEETHDRr  Z
XL_SUPBOOKr  ZXL_NAMEr  Z
XL_PALETTEZhandle_paletteZXL_STYLEZhandle_styler$   r;   r   ZXL_EOFZxf_epiloguer  Zpalette_epiloguer   r   r:   )r^   Zrcr   r   r*   r*   r-   r=     sn    
 









 zBook.parse_globalsc             C   s$   | j |||  }|t| | _|S )N)r   rA   r   )r^   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kr^|d| j||d    |  }|tkrv|d d	|  krd
ksn |d||f  dtdt	| |  }| 
| j|}t rt| jd| t||k r|d ||7 }|d? }td|dd	 \}	}
t r*td||	|
f | jd | jd	 | }t rTtd||f | jd d } }}|dkrtd|d	d \}}|	dkrd}nB|	dkr|dk s|dkrd}nd}ndddddd|	d}n|dkrdddd| }|dkr|
tkrd}t s| jd kr6td!||	|
|||f | jd |
tkpP|dkoP|
tk}|tkrb|sl|
|krp|S |dk r|
tkr|S |dkr|
d"kr|d# |d$||	|
|||f  d S )%Nzreqd: 0x%04x)r   c             S   s   t d|  d S )Nz%Unsupported format, or corrupt file: )r8   )r   r*   r*   r-   	bof_error  s    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 filez<HHz5getbof(): 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   r#   r   r   r   Zbofcodesr   rb   Zboflenr   r;   rA   r   r   ZXL_WORKBOOK_GLOBALS_4Wr$   r7   r   )r^   Z
rqd_streamr&  ZsavposZopcoder   Zpaddingr   Zversion1Zversion2Z
streamtypeZ
bof_offsetversionZbuildZyearZgot_globalsr*   r*   r-   r6     s      





zBook.getbof)T)Are   rf   rg   rh   rB   r   r:   r   r   r   r   rr   r   r   r   r   r   r   r   r   r5   rD   ry   r[   r}   r~   r   r   rE   r   r   r  r  r   sysstdoutUSE_MMAPr4   r   r   r   r   rw   r@   r<   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r   r"  r#  r=   r   r6   r*   r*   r*   r-   r3     s~   	!8
	
	4*3<J/@r3   c             C   s\   | }|d@ r"|dkr|d8 }d}nd}|d@ }|d@ rL|dkrF|d8 }d}nd}||||fS )	Ni   i   r   r   r$  i @     r)  r*   )ZinrowZincolZoutrowrelrowZoutcolrelcolr*   r*   r-   expand_cell_address@  s    r1  ABCDEFGHIJKLMNOPQRSTUVWXYZc             C   sH   | dkst td}x.t| d\}}|| | }|s8|S |d } qW d S )Nr   rK      r   )rc   rr   divmod)colxZ_A2Zrs   ZquotZremr*   r*   r-   colnameR  s    r6  c             C   s^   |rdd| dk  t | f }nd| d f }|rJdd|dk  t |f }ndt| }|| S )Nz(*%s%d)z+-r   z$%dr   $)absr6  )Zrowxr5  r/  r0  ZrowpartZcolpartr*   r*   r-   display_cell_address\  s    r9  c          
   C   s  d}t | }| d }t |}d}g }|j}i }	t}
t}t}d}xZt|D ]L}|
d|||d  d }|d7 }||| }|d7 }d}d}|d@ r|
d|||d  d }|d7 }|d@ r|
d|||d  d }|d7 }td	}d}x|| }|d@ rX||| d? |}|||d|   }y|t|d
7 }W n    Y nX |d| 7 }n4||| |}||||  }|t||7 }||7 }||7 }||krP |d7 }| | }t |}||d }d}qW |r@g }x\t|D ]P}||kr
d}|d7 }| | }t |}||
d|||d   |d7 }qW ||	t |< ||7 }||kr|| }|d7 }||k r~| | }t |}n||d kst|| qJW ||	fS )zReturn list of stringsr   r   latin_1z<Hr   r   r   z<irK   	utf_16_lez<HH)	rA   r   r   ra   r   rv   rr   r   rc   )ZdatatabZnstringsZdatainxZndatasr   Zdatalenr   ZstringsZ	strappendZrichtext_runsZlocal_unpackZ	local_minZlocal_BYTES_ORDr:  Z	_unused_iZncharsZoptionsZrtcountZphoszZaccstrgZcharsgotZ	charsneedZ
charsavailZrawstrgrunsZrunindexr*   r*   r-   r!  g  s    





r!  )r2  )0Z
__future__r   r0   r+  rK   r   r   r   ZbiffhZformulaZtimemachineZtimer   ImportErrorr	   r  r   Z
empty_cellr   r   r/   r   r   r-  r   r  ZSUPBOOK_UNKr  r  r   r  r9   Z_code_from_builtin_namer  Zcode_from_builtin_nameitemsZ_binZ_bicrr   r,  rH   Z
BaseObjectrI   r3   r1  r6  r9  r!  r*   r*   r*   r-   <module>   s    
E         *

