B
    \                @   sV  d dl mZ d dlmZ d dlmZmZ ddlT ddlmZm	Z	 ddl
mZmZmZmZmZ ddlT d Zd ZdZG d	d
 d
eZG dd deZG dd deZG dd deZG dd deZG dd deZdd Zeeeeeee e!e"eiZ#e$de%dede!de&de'de(diZ)G dd deZ*e*e$e+d Z,G d!d" d"eZ-dZ.G d#d$ d$eZ/d%S )&    )print_function)array)calcsizeunpack   )*)Formatnearest_colour_index)FMLA_TYPE_CELLFMLA_TYPE_SHAREDdecompile_formuladump_formularangename2d))show_formulasr   )show_grid_linesr   )show_sheet_headersr   )panes_are_frozenr   )show_zero_valuesr   )automatic_grid_line_colourr   )Zcolumns_from_right_to_leftr   )Zshow_outline_symbolsr   )Z'remove_splits_if_pane_freeze_is_removedr   )Zsheet_selectedr   )Zsheet_visibler   )show_in_page_break_previewr   c               @   s  e Zd ZdZdZdZdZdZi Zi Z	g Z
g Zg Zi ZdZdZdZdZdZdZdZdZdZg Zi Zi ZdZdZdZdZdZdZg Z g 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)dFddZ*dGddZ+dHddZ,dIddZ-dJddZ.dKd d!Z/e-Z0d"d# Z1d$d% Z2d&d' Z3d(d) Z4d*d+ Z5d,d- Z6dLd.d/Z7dMd0d1Z8dNd2d3Z9d4d5 Z:d6d7 Z;d8d9 Z<d:d; Z=d<d= Z>d>d? Z?d@dA Z@dBdC ZAdDdE ZBdS )OSheetaj  
    Contains the data for one worksheet.

    In the cell access functions, ``rowx`` is a row index, counting from
    zero, and ``colx`` is a column index, counting from zero.
    Negative values for row/column indexes and slice positions are supported in
    the expected fashion.

    For information about cell types and cell values, refer to the documentation
    of the :class:`Cell` class.

    .. warning::

      You don't instantiate this class yourself. You access :class:`Sheet`
      objects via the :class:`~xlrd.book.Book` object that
      was returned when you called :func:`xlrd.open_workbook`.
     Nr   (   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   c             C   s  || _ |j| _|| _|j| _tdtg| _tddg| _|| _|| _	|j
| _
|j| _|j| _| jrl| j| _n| j| _|j| _d| _d| _d| _d| _d| _d| _g | _g | _g | _d | _d | _d | _d| _d| _d| _d| _ i | _!i | _"g | _#g | _$g | _%i | _&g | _'g | _(ddddg| _)|j*| | _+xt,D ]\}}t-| || q,W d| _.d| _/d| _0d | _1g | _2i | _3i | _4d| _5d| _6d| _7d| _8d | _9d | _:i | _;| jdkrd	| _<nd
| _<d| _=d| _>d S )NBhr   @   <   d   P   i   i @     )?bookbiff_version	_positionlogfiler   XL_CELL_EMPTYbtbfnamenumber	verbosityformatting_inforagged_rowsput_cell_raggedput_cellput_cell_unragged_xf_index_to_xl_type_mapnrowsncolsZ_maxdatarowxZ_maxdatacolx	_dimnrows	_dimncols_cell_values_cell_types_cell_xf_indexesdefcolwidthstandardwidthdefault_row_heightdefault_row_height_mismatchdefault_row_hiddendefault_additional_space_abovedefault_additional_space_belowcolinfo_maprowinfo_mapcol_label_rangesrow_label_rangesmerged_cellsrich_text_runlist_maphorizontal_page_breaksvertical_page_breaks_xf_index_statsZ_sheet_visibility
visibility_WINDOW2_optionssetattrfirst_visible_rowxfirst_visible_colxgridline_colour_indexgridline_colour_rgbhyperlink_listhyperlink_mapcell_note_map$cooked_page_break_preview_mag_factorcooked_normal_view_mag_factor$cached_page_break_preview_mag_factorcached_normal_view_mag_factorscl_mag_factor_ixfe_cell_attr_to_xfxutter_max_rowsutter_max_cols_first_full_rowx)selfr    Zpositionr'   r(   attrZdefval r]   )lib/python3.7/site-packages/xlrd/sheet.py__init__?  s|    
	zSheet.__init__c             C   s8   | j r| ||}nd}t| j| | | j| | |S )zC
        :class:`Cell` object in the given row and column.
        N)r*   cell_xf_indexCellr5   r4   )r[   rowxcolxxfxr]   r]   r^   cell  s    z
Sheet.cellc             C   s   | j | | S )z.Value of the cell in the given row and column.)r4   )r[   rb   rc   r]   r]   r^   
cell_value  s    zSheet.cell_valuec             C   s   | j | | S )z
        Type of the cell in the given row and column.

        Refer to the documentation of the :class:`Cell` class.
        )r5   )r[   rb   rc   r]   r]   r^   	cell_type  s    zSheet.cell_typec             C   s   |    | j| | }|dkr4| jd  d7  < |S y.| j| j}|dkr`| jd  d7  < |S W n tk
rv   Y nX y.| j| j}|dkrd}| jd  d7  < |S  tk
r   | jd  d7  < dS X dS )z
        XF index of the cell in the given row and column.
        This is an index into :attr:`~xlrd.book.Book.xf_list`.

        .. versionadded:: 0.6.1
        r   r   r            N)req_fmt_infor6   rF   r?   xf_indexKeyErrorr>   )r[   rb   rc   rd   r]   r]   r^   r`     s*     zSheet.cell_xf_indexc             C   s   t | j| S )z
        Returns the effective number of cells in the given row. For use with
        ``open_workbook(ragged_rows=True)`` which is likely to produce rows
        with fewer than :attr:`~Sheet.ncols` cells.

        .. versionadded:: 0.7.2
        )lenr4   )r[   rb   r]   r]   r^   row_len  s    zSheet.row_lenc                s"    fddt tj  D S )zS
        Returns a sequence of the :class:`Cell` objects in the given row.
        c                s   g | ]}  |qS r]   )re   ).0rc   )rb   r[   r]   r^   
<listcomp>  s   zSheet.row.<locals>.<listcomp>)xrangern   r4   )r[   rb   r]   )rb   r[   r^   row  s    z	Sheet.rowc                s    fddt  jD S )z3Returns a generator for iterating through each row.c             3   s   | ]}  |V  qd S )N)rs   )rp   index)r[   r]   r^   	<genexpr>  s    z!Sheet.get_rows.<locals>.<genexpr>)ranger0   )r[   r]   )r[   r^   get_rows  s    zSheet.get_rowsc             C   s,   |dkr| j | |d S | j | || S )zM
        Returns a slice of the types of the cells in the given row.
        N)r5   )r[   rb   
start_colxend_colxr]   r]   r^   	row_types  s    zSheet.row_typesc             C   s,   |dkr| j | |d S | j | || S )zN
        Returns a slice of the values of the cells in the given row.
        N)r4   )r[   rb   rx   ry   r]   r]   r^   
row_values  s    zSheet.row_valuesc                sj   t j  }|dk r*||7 }|dk r*d}|dks:||kr@|}n|dk rP||7 } fddt||D S )zP
        Returns a slice of the :class:`Cell` objects in the given row.
        r   Nc                s   g | ]}  |qS r]   )re   )rp   rc   )rb   r[   r]   r^   rq     s   z#Sheet.row_slice.<locals>.<listcomp>)rn   r4   rr   )r[   rb   rx   ry   ncr]   )rb   r[   r^   	row_slice  s    zSheet.row_slicec                sb   j }|dk r"||7 }|dk r"d}|dks2||kr8|}n|dk rH||7 } fddt||D S )zS
        Returns a slice of the :class:`Cell` objects in the given column.
        r   Nc                s   g | ]} | qS r]   )re   )rp   rb   )rc   r[   r]   r^   rq     s   z#Sheet.col_slice.<locals>.<listcomp>)r0   rr   )r[   rc   
start_rowxend_rowxnrr]   )rc   r[   r^   	col_slice  s    zSheet.col_slicec                sb   j }|dk r"||7 }|dk r"d}|dks2||kr8|}n|dk rH||7 } fddt||D S )zQ
        Returns a slice of the values of the cells in the given column.
        r   Nc                s   g | ]}j |   qS r]   )r4   )rp   rb   )rc   r[   r]   r^   rq   %  s   z$Sheet.col_values.<locals>.<listcomp>)r0   rr   )r[   rc   r~   r   r   r]   )rc   r[   r^   
col_values  s    zSheet.col_valuesc                sb   j }|dk r"||7 }|dk r"d}|dks2||kr8|}n|dk rH||7 } fddt||D S )zP
        Returns a slice of the types of the cells in the given column.
        r   Nc                s   g | ]}j |   qS r]   )r5   )rp   rb   )rc   r[   r]   r^   rq   7  s   z#Sheet.col_types.<locals>.<listcomp>)r0   rr   )r[   rc   r~   r   r   r]   )rc   r[   r^   	col_types)  s    zSheet.col_typesc          	   C   s  | j dkrt| jd| j| j | jrd }}| j}| j}x| jD ]}|\}}}}	d|  krp|  k rp|krn n d|  kr|	  k r|ksn t| jd| j| j	| ||kr|}|	|krB|	}qBW || jkr|| _d| _
|| jkr| |d dttdd | j dkrN| j| jks*| j| jkrNt| jd	| j| j	| j| j| j| j | js| j}
| j}| j}| j}| j}| j
dkr| j}n| j
}x|t|D ]p}|| }t|}|
| }|dkrtdg| || |d < | j| ||d < |r| j| || |d < qW d S )
Nrj   z$tidy_dimensions: nrows=%d ncols=%d 
r   r   z6*** WARNING: sheet #%d (%r), MERGEDCELLS bad range %r
r   r   z?NOTE *** sheet %d (%r): DIMENSIONS R,C = %d,%d should be %d,%d
)r)   fprintfr#   r0   r1   rB   rX   rY   r(   r'   rZ   r-   r$   UNICODE_LITERALr2   r3   r+   r5   r4   r6   r*   rr   rn   r%   r&   )r[   r   r|   ZumaxrowsZumaxcolsZcrangeZrloZrhiZcloZchir1   Zs_cell_typesZs_cell_valuesZs_cell_xf_indexesZ
s_fmt_infoZuboundrb   trowZrlennextrar]   r]   r^   tidy_dimensions@  sj    
B  

zSheet.tidy_dimensionsc          	   C   s  |d kr| j | }d|  kr(| jk s.n td|  krD| jk sJn t| j}y`|d }| j|k r| jj}| jj}	| j	j}
| j
}| j}x8t| j|D ](}||d  |	g  |r|
|d  qW || _| j| }| j| }|r| j	| }t|}|| jkr
|d | _|| }|s@|| || |r<|| d S |dkr|d7 }| j
| ||d < tdg| ||d < |r| j| ||d < |||< |||< |r|||< W n    td||| jd  Y nX d S )Nr   r   r   r-   )file)r/   rY   AssertionErrorrX   r*   r0   r5   appendr4   r6   r%   r&   rr   rn   r1   r   printr#   )r[   rb   rc   ctypevaluerl   fmt_infor   sctascvascxar%   r&   _unusedZ	types_rowZ
values_rowZfmt_rowZltrZ	num_emptyr]   r]   r^   r,   }  s\    









zSheet.put_cell_raggedc             C   sZ  |d kr| j | }y6|| j| |< || j| |< | jrD|| j| |< W n tk
r6   |d }|d }d|  kr| jksn td|  kr| jksn t|| j	kr|| _	|| j
k rd| _n || j  krdkrn n|| _|| j
kr\| j| }| j	t| }	|	dkr|| j|	  | jr@| j| | j|	  | j| tdg|	  n~| jj}
| jj}| jj}| j}| j	}| j}| j}xFt| j
|D ]6}|
||  |tdg|  |r|||  qW || _
y6|| j| |< || j| |< | jr|| j| |< W n    td||| jd  Y nX Y n    td||| jd  Y nX d S )Nr   r   r   r   r-   )r   )r/   r5   r4   r*   r6   
IndexErrorrY   r   rX   r1   r0   rZ   rn   extendr%   r&   r   r   rr   r   r#   )r[   rb   rc   r   r   rl   r   r|   r   r   r   r   r   r   r%   r&   r   r]   r]   r^   r.     sd    




zSheet.put_cell_unraggedc       t      C   s  d}|p| j dk}|p| j dk}do&|}d}|j}| j|_ttttttf}| j}	t	}
|j
}| j}| j}|on|j}i }i }d}x| \}}}|tkr|
d|d d \}}}}|	||d || q|tkr|
d|\}}}}|	||t|j| | |rj|j|}|rj|| j||f< q|tkr|
d|dd \}}}|tk rdt|d|jpZ| dd	}nt|ddd	}|	||t|| q|tkr|
d|dd \}}}|tk r4t|d|jp| dd	\}}t|| }|d
7 }g }x6t|D ]*}|t	d|||d   |d7 }qW |t|kst nt!|ddd	\}}t	d|||d  d }|d7 }g }x6t|D ]*}|t	d|||d   |d7 }qvW |t|kst |	||t|| || j||f< q|t"kr|
d|d d \}}}t#|dd }|	||d || q|t$kr|
d|dd \}} |
d|dd  \}!d}x`t| |!d
 D ]N}|
d|||d  \}t#||d |d  }|d7 }|	||d || qbW q|t%kr:|sq|
d|dd \}}"}#d|  kr| j&k sn t'd|| j&f | j(d q|"|#f}$||$}%|%d krt)  ||$< }%|"d@ |%_*|"d? d
@ |%_+|#d@ |%_,|#d? d
@ |%_-|#d? d
@ |%_.|#d? d
@ |%_/|#d? d
@ |%_0|#d? d@ |%_1|#d? d
@ |%_2|#d? d
@ |%_3|%j0sd|%_1|%| j4|< dr|%j1dkrt5| j(d| j6||%j1 |rjt'd||"|#| j(d |%j7| j(d| j6|f d q|t8kr|d krl|
d!|dd \}}}}&}'nR|d"kr|
d!|dd \}}}}&}'n*|
d#|dd \}}}(}&}'| 9|(||}|r
t5| j(d$|| |
d|d%d& d })t:||d&d  |)t;||d
|d' |&dd( d)krt|&d }*|*dkrld}+|
 \},}-}.|,t<ksX|,t=kr^d
}+n|,tkr|
d*|.d d \}/}0}1}2}3}4|r t5| j(d+|/|0|1|2|3 n||,tkr
|
d,|.d d \}/}0}1}2}5}4|r t5| j(d-|/|0|1|2|5 t:||.dd  |4t>d
|||d. n|,|kr t?d/|, |+sN|
 \},}6}.|,t<t=fkrNt?d0|, | @|.}| ||t|| nx|*d
krt|&d }7|	||tA|7| nP|*dkrt|&d }7|	||tB|7| n(|*d1kr|	||td2| nt?d3|* n|
d4|&d }|	||d || q|tCkrJ|
d5|d d( \}}}}7}8tAtBf|8 }9|	|||9|7| q|tDk	r4|s\qtE }:|
d6|d d \};}<|:_F|:_1}'d|;  kr|<  krd7ksn t'd8|;|<f | j(d ~:qtG|:|'d9 x.t|;|<d
 D ]}|d:krP |:| jH|< qW |rjt5| j(d;| j6|;|<|:jF|:j1|' |:j7| j(d<d q|tIk	rV|
d|d d \| _Jq|tKk	r|dk	rt'd=|tL|| j(d |
d|d d \| _Mq|tNk
r*|	sq|d>k	st |dd d?k	st t	d@|dd> }=g }>x8|=D ]0}?x(tdAD ]}@|>|?d
@  |?d
L }?	qW 	qW tO|>| _Pq|tQk
rf|
s<q|
d|d d \}}}|	||tRd2| q|tSk
r|
sxq|d
? }A|
dB|A |}B|Bd d \}}C|Bd }D|A|Dd |C k
st d}x4t|C|Dd
 D ]"}|	||tRd2|B|  |d
7 }
qW q|tTks|tUkr|dkrq|dCk r6|
dD|dd( }En|
dE|ddF }EdG\| _V| _W|E\| _X| _Y|dHkr| jZj[r| jZj\s| jZ]  |rjt5| j(dI| j6| j^| jY| jX q|t_kr| `| q|takr| b| q|tckrd}|rt'dJ| j(d d
}P q|tdkr*| e|}F|Fr$|Fjf}Gnd }Gq|tgkrD| h||| q|tikrr| j|}H|Hrj|Grj|H||G< d }Gq|tkkr| l|| q|tmkr| n| q|tokr&|
d|dd \}I}J|JdAkrt'dK||j| d |I|Jf | j(d x |
 \}K}}|KtckrP qW |rjt'dL| j(d q|tpkr<|q| q|trkrd}ts| jt|||d(dM}ts| ju|||d(dM}||ksjt q|tkr|
d*|d d \}/}0}1}2}3}4|rjt'dN|/|0|1|2|3| j(d q|tkr2|
d,|d d \}/}0}1}2}5}4|rjt'dO|/|0|1|2|5| j(d t:||dd  |4t>d
|||d. q|tvkr|sDq|dCksRt t	dP|ddF \}L}M}N}O}P}Q| j d
krt5| j(dQ| j6| j^|L|Mtw|N|Od
 |P|Qd
  g }Rts|R|dF|d(dM}| j d
krjt5| j(dRt|RdSxdTdU |RD  q|tykr|sqt	dV|dd \}S}T}U}V}'|'dW? d
@ }W|'d? d
@ }X|'d? d
@ }Y| j d
krjt5| j(dX|S|T|U|V|'|W|X|Y
 dF}|Wrt	dY|||dZ  \	}Z}[}\}]}^}_}`}a}b|`d
kd
@ }c|[d
kd
@ }d|`dkd
@ }e|[dkd
@ }f| j d
krt5| j(d[|Z|\|]|^|_|a|b|c|d|e|f |dZ7 }|Xr|d(7 }|Yr|d7 }||||U  }g||U7 }|rb|Urbt5| j(d\ tz||g|U|dd
d] ||||V  }h||V7 }||kst |rj|Vrjt5| j(d^ tz||h|V|dd
d] q|t{krV|dkrt	d|d d \}?| _|n<|dkrt	d|\| _|d}?t5| j(d_ nd}?t5| j(d`| |?d
@ | _}|?d
? d
@ | _~|?d? d
@ | _|?d1? d
@ | _q|tkr|shqts| j|d|d(dM}|rt5| j(da|d d(  ||ksjt db||f q|tkr~|dCkr|dkrt	dc|d d \}i| _| _| _| _| _nT|d"ks
t t	d|d d \}i| _| _t	dd|dde | _t| jZj| jddf| _x*tD ]"\}j}kt| |j|id
@  |id
L }iqVW q|tkrt	d|\}l}md}B|mr|ldg |m }Bd|B  krdhksn |s| j dkrt'di| j6|l|mf | j(d dg}B|B| _q|tkr6t	dj|d de \| _| _| _| _| _d
| _q|tkr
|sHq|
d|d d \}n|ndd|dCk   d |ks~t d}|dCk rxz||k r| j|
d|||d  d dd:f |d7 }qW n8x6||k r| j|
d|||d   |d7 }qW q|tkr|sq|
d|d d \}n|ndd|dCk   d |ksRt d}|dCk rxz||k r| j|
d|||d  d ddkf |d7 }qbW n8x6||k r| j|
d|||d   |d7 }qW q|dlkr|tks|tkr
||| qj|tks|tkr,|| qj|tkrX| jZj\sJ| jZ]  || qj|tkrp|| qj|tkr|| qj|tks|tks|tkr|| qj|tkr|| qj|tkr|| qj|tkr|| qj|tkr|| qj|tkr2|
d|d | _qj|tkrl|
dm|\}}}(}|	||d || 9|(|| qj|tkr|
dn|\}}}(}|	||d t|| 9|(|| qj|tkr|
do|dd \}}}(t|d|jp| d
d	}|	||t|| 9|(|| qj|tkrN|
dp|\}}}(}7}8tAtBf|8 }9|	|||9|7| 9|(|| qj|tkr|s`q|
do|d d \}}}(|	||tRd2| 9|(|| qj|tkr|| qj|tkr*|sq|
dq|ddr \}}"}#d|  kr| j&k sn t'ds|| j&f | j(d q|#d
@ sd}nP|dtkrR|
d|ddt d }o| j9d |d|odu}n|dvd }(| j9|(|ddw}|"|#|f}$||$}%|%d krt)  ||$< }%|"d@ |%_*|"d? d
@ |%_+|#d
@ |%_0||%_1|%| j4|< dr|%j1dkrt5| j(d| j6||%j1 |rht'dx||"| j(d |%j7| j(d| j6|f d qj|tkr|s<q|
dy|d d \};}<}p|;|<ksvt'dz|;|<f | j(d qxFt|;|<d
 D ]4}|| jHkr| jH| }:ntE }:|:| jH|< |p|:_FqW |rht5| j(d{| j6|;|<|p qj|tkr|sq|
d|d d \};}<|r t5| j(d|| j6|;|< d|;  krD|<  k rDd7ksfn t'd}|;|<f | j(d t|<d7}<xrt|;|<D ]d}dd1||;   }q||q|qd1  }(| j9|(d|d~}|| jHkr| jH| }:ntE }:|:| jH|< ||:_1qrW n|tkrjd}rx4t|r|dd D ]\}j}st| |jt|sdk qW t	d|dd \| _| _| _t	dd|ddv | _t| jZj| jddf| _qqW |st?d| j6| j^f | š  | ơ  ||_d
S )Nr   ri      z<HHHd   z<HHHiz<HHH   )lenlenr   z<BBz<Hz<HH
   r   z<H4xH4xi   zT*** NOTE: ROW record has row index %d; should have 0 <= rowx < %d -- record ignored!)r   i  rh         i        r   z**ROW %d %d %d
ZROWz--- sh #%d, rowx=%d ---)header2   z<HHH8sH   z<HH3s8sBzFORMULA: rowx=%d colx=%d
      )browxbcolxblahr1c1   s   z<HHBBBxxxxxHzARRAY: %d %d %d %d %d
z<HHBBxBHzSHRFMLA (sub): %d %d %d %d %d
)r   r   r   r   z@Expected SHRFMLA, ARRAY, TABLEOP* or STRING record; found 0x%04xz$Expected STRING record; found 0x%04xrj   r   z+unexpected special case (0x%02x) in FORMULAz<dz<HHHBBz<HHHHHr   zr*** NOTE: COLINFO record has first col index %d, last %d; should have 0 <= first <= last <= 255 -- record ignored!))r   r   hidden)r   ri   	bit1_flag)r   i   outline_level)   i   	collapsed   z>COLINFO sheet #%d cols %d-%d: wid=%d xf_index=%d flags=0x%04x
z===z*** ERROR *** STANDARDWIDTH"   s     z<8i    z<%dHr   z<HxxHz<ixxHr   )r   r   )   r   (   z+sheet %d(%r) DIMENSIONS: ncols=%d nrows=%d
zSHEET.READ: EOFzM*** Unexpected embedded BOF (0x%04x) at offset %d: version=0x%04x type=0x%04xz---> found EOF)Z	addr_sizezARRAY:zSHRFMLA (main):z<6Hz
*** WARNING: Ignoring CONDFMT (conditional formatting) record
*** in Sheet %d (%r).
*** %d CF record(s); needs_recalc_or_redraw = %d
*** Bounding box is %s
z#*** %d individual range(s):
*** %s
z, c             s   s   | ]}t | V  qd S )N)r   )rp   Zcoordsr]   r]   r^   ru     s    zSheet.read.<locals>.<genexpr>z<BBHHi   z
*** WARNING: Ignoring CF (conditional formatting) sub-record.
*** cf_type=%d, cmp_op=%d, sz1=%d, sz2=%d, flags=0x%08x
*** optional data blocks: font=%d, border=%d, pattern=%d
z <64x i i H H B 3x i 4x i i i 18xv   z*** Font info: height=%d, weight=%d, escapement=%d,
*** underline=%d, colour_index=%d, esc=%d, underl=%d,
*** style=%d, posture=%d, canc=%d, cancellation=%d
z*** formula 1:
)Zreldeltar   z*** formula 2:
zR*** WARNING: DEFAULTROWHEIGHT record len is 2, should be 4; assuming BIFF2 format
zR*** WARNING: DEFAULTROWHEIGHT record len is %d, should be 4; ignoring this record
zMERGEDCELLS: %d ranges
zMERGEDCELLS: pos=%d data_len=%dz	<HHHHxxHHz<BBB	   )debugr   i  zHWARNING *** SCL rcd sheet %d: should have 0.1 <= num/den <= 4; got %d/%dz<HHHHBi  -   z<HH3sdz<HH3sHz<HH3sz<HH3sBBz<H4xH2xB   zW*** NOTE: ROW_B2 record has row index %d; should have 0 <= rowx < %d -- record ignored!   )	cell_attrrb   rc   true_xfx   )rc   ZROW_B2z<BBHzg*** NOTE: COLWIDTH record has first col index %d, last %d; should have first <= last -- record ignored!z&COLWIDTH sheet #%d cols %d-%d: wid=%d
z.COLUMNDEFAULT sheet #%d cols in range(%d, %d)
zd*** NOTE: COLUMNDEFAULT record has first col index %d, last %d; should have 0 <= first < last <= 256)rb   rc   )r   r   r   r   r       z<HHBz Sheet %d (%r) missing EOF record)r)   r"   Z
XL_SHRFMLAZXL_ARRAYZ
XL_TABLEOPZXL_TABLEOP2Z	XL_ARRAY2ZXL_TABLEOP_B2r-   r   get_record_partsr!   r*   Z_rich_text_runlist_mapZ	XL_NUMBERZXL_LABELSSTXL_CELL_TEXTZ_sharedstringsgetrC   ZXL_LABELZBIFF_FIRST_UNICODEZunpack_stringencodingderive_encodingZunpack_unicodeZ
XL_RSTRINGZunpack_string_update_pos	BYTES_ORDrr   r   rn   r   unpack_unicode_update_posZXL_RK	unpack_RKZXL_MULRKZXL_ROWrX   r   r#   Rowinfoheighthas_default_heightr   outline_group_starts_endsr   height_mismatchhas_default_xf_indexrl   additional_space_aboveadditional_space_belowr?   r   r(   dumpZXL_FORMULA_OPCODESfixed_BIFF2_xfindexr   r
   Z	XL_STRINGZXL_STRING_B2r   	XLRDErrorstring_record_contentsXL_CELL_BOOLEANXL_CELL_ERRORZ
XL_BOOLERRZ
XL_COLINFOColinfowidthupkbitsr>   ZXL_DEFCOLWIDTHr7   ZXL_STANDARDWIDTHreprr8   ZXL_GCWtuplegcwZXL_BLANKXL_CELL_BLANKZXL_MULBLANKZXL_DIMENSIONZXL_DIMENSION2r0   r1   r2   r3   r    xf_listZ_xf_epilogue_doneZxf_epiloguer'   ZXL_HLINKhandle_hlinkXL_QUICKTIPhandle_quicktipZXL_EOFZXL_OBJ
handle_objidZXL_MSO_DRAWINGhandle_msodrawingetcZXL_TXO
handle_txoXL_NOTEhandle_noteZ	XL_FEAT11handle_feat11ZbofcodesZ
XL_COUNTRYZhandle_countryZXL_LABELRANGESZ)unpack_cell_range_address_list_update_posrA   r@   Z
XL_CONDFMTr   joinZXL_CFr   ZXL_DEFAULTROWHEIGHTr9   r:   r;   r<   r=   ZXL_MERGEDCELLSrB   Z
XL_WINDOW2rJ   rK   rL   rS   rT   rM   r	   Z
colour_maprH   rI   ZXL_SCLrU   ZXL_PANEvert_split_poshorz_split_poshorz_split_first_visiblevert_split_first_visiblesplit_active_panehas_pane_recordZXL_HORIZONTALPAGEBREAKSrD   ZXL_VERTICALPAGEBREAKSrE   Z	XL_FORMATZ
XL_FORMAT2Zhandle_formatZXL_FONTZXL_FONT_B3B4Zhandle_fontZXL_STYLEZhandle_styleZ
XL_PALETTEZhandle_paletteZXL_BUILTINFMTCOUNTZhandle_builtinfmtcountZXL_XF4ZXL_XF3ZXL_XF2Z	handle_xfZXL_DATEMODEZhandle_datemodeZXL_CODEPAGEZhandle_codepageZXL_FILEPASSZhandle_filepassZXL_WRITEACCESSZhandle_writeaccessZXL_IXFErV   ZXL_NUMBER_B2Z
XL_INTEGERfloatZXL_LABEL_B2ZXL_BOOLERR_B2ZXL_BLANK_B2ZXL_EFONTZhandle_efontZ	XL_ROW_B2ZXL_COLWIDTHZXL_COLUMNDEFAULTminZXL_WINDOW2_B2zipintr   r   update_cooked_mag_factors)tr[   bkDEBUGr   Z	blah_rowsZblah_formulasr   ZoldposZXL_SHRFMLA_ETC_ETCZself_put_cellZlocal_unpackZbk_get_record_partsbvr   Zdo_sst_rich_textZrowinfo_sharing_dicttxosZ	eof_foundrcdata_lendatarb   rc   rl   dZsstindexZrunlistZstrgposZnrtr   Z	mulrk_rowZmulrk_firstZ
mulrk_lastZbits1Zbits2keyrZ
result_strflagsr   ZfmlalenZ
first_byteZ	gotstringrc2	data2_lendata2Zrow1xZrownxZcol1xZcolnxZarray_flagsZtokslenZnfmlas_unused_lenr   Zis_errcelltycZ
first_colxZ	last_colxZiguffr   bitsjZnitemsresultZ	mul_firstZmul_lastZ	dim_tupleZ	saved_objZsaved_obj_idtxoversionZboftypecodeZnum_CFsZneeds_recalcZbrowx1Zbrowx2Zbcolx1Zbcolx2ZolistZcf_typeZcmp_opZsz1Zsz2Z
font_blockZ
bord_blockZ
patt_blockZfont_heightZfont_optionsZweightZ
escapementZ	underlineZfont_colour_indexZtwo_bitsZfont_escZfont_underlZ
font_styleZpostureZ	font_cancZcancellationZfmla1Zfmla2optionsr\   Z_unused_defvalZnumZdenZ
num_breaksrd   r   offsetZ
attr_namescharr]   r]   r^   read  sn   





 


 


















  &
 




 


 
 





 

 






 
 




 
 

(




 
*


&
 "
(
 "
(











"


 

 








 


 &


z
Sheet.readc             C   s  | j }| j}|dkd }tdd|d   |d | d }|}|dk rT|jpR| }d}td}	x|dkrt|| d@ }
d|
 }|d7 }t||d  |}|	|7 }	|t|7 }||kr|	S ||krd	||f }t	||
 \}}}|tkrt	d
| d}qbW d S )Nr   r   <ZBHr   r   r   )latin_1	utf_16_lez,STRING/CONTINUE: expected %d chars, found %dz2Expected CONTINUE record; found record-type 0x%04X)r!   r    r   r   r   r   r   unicodern   r   r   XL_CONTINUE)r[   r   r   r   r   Znchars_expectedr  encZnchars_foundr  flagchunkmsgr   r  r]   r]   r^   r     s8    "

zSheet.string_record_contentsc             C   s   t p| jdk}| jrv| jd kr&d| _n| j| _| j}d|  krHdksnn |rhtd| j| jf | jd | j}|| _	nj| jd krd| _	n| j| _	| j
}|sd}n:d|  krdksn |rtd| j| j
f | jd | j	}|| _d S )	Nr   r   r   i  zGWARNING *** WINDOW2 rcd sheet %d: Bad cached_normal_view_mag_factor: %d)r   r   zNWARNING *** WINDOW2 rcd sheet %r: Bad cached_page_break_preview_mag_factor: %r)r   r)   r   rU   rQ   rT   r   r(   r#   rR   rS   )r[   r   Zzoomr]   r]   r^   r     s8    	



zSheet.update_cooked_mag_factorsc       	      C   s   d}|p| j dk}| jdkrt| jjrf|d k	r2|}nt|d d@ }|dkrb| jd kr\td| j}|S d | _| j_t|d d@ }|dkst| j	|}|d k	r|S |rt
| jd||| | jjsx"tdD ]}| jd	|d
k d qW | j|d}|S )Nr   ri   r   ?   z?BIFF2 cell record has XF index 63 but no preceding IXFE record.r   zNew cell_attr %r at (%r, %r)
r   s   @  rh   )r   style)r   )r)   r!   r    r   r   rV   r   r   rW   r   r   r#   rr   insert_new_BIFF20_xf)	r[   r   rb   rc   r   r   r   rd   Zxfx_slotr]   r]   r^   r     s2    

zSheet.fixed_BIFF2_xfindexc          
   C   s   d}|p| j dk}| j}t|j}| ||}||_|j| |rZ|j| jd| dd |j	|j
kr|j	rd}t| j||j|j	|j	 t|j	ttd}	|	|j
|j	< |j|	 tttttttttti}
|j
|j	 }	|
|	j }|| j|j< || j|< |S )Nr   ri   z=== Faked XF %d ===z======)r   footerz1ERROR *** XF[%d] unknown format key (%d, 0x%04x)
ZGeneral)r)   r    rn   r   fake_XF_from_BIFF20_cell_attrrl   r   r   r#   
format_key
format_mapr   r   FUNr   format_listFNUXL_CELL_NUMBERFGEFDTXL_CELL_DATEFTXtyper/   rW   )r[   r   r  r   r   r    rd   xfr  fmtcellty_from_fmttyr  r]   r]   r^   r  A  s6    


zSheet.insert_new_BIFF20_xfc             C   s  ddl m}m}m}m}m} | }| |_d|j_d|j_d|j_	| |_
d|j
_d|j
_d|j
_d|j
_| |_| |_td|\}	}
}|
d@ |_|
d@ d? |_t|j|	d |d	@ |j_xNd
D ]F\}}||@ rd\}}nd\}}t|j
|d | t|j
|d | qW |j}|d@ r$d|_nd|_d|_d|_d| |_d|j_d|j_ddddddg}x&|D ]}d| d }t||d qfW |S )Nr   )XFXFAlignmentXFBorderXFBackgroundXFProtectionr   z<BBBr     r   ))r   r   Zcell_locked)r      Zformula_hiddenr   ))r   left)r   right)r   top)r   Zbottom)r   r   )r   r   Z_colour_indexZ_line_styler2     r   r   )i  r   ri   formatZfont	alignmentborder
background
protection_Z_flag)
formattingr,  r-  r.  r/  r0  r8  Zindent_levelZshrink_to_fitZtext_directionr9  Zdiag_upZ	diag_downZdiag_colour_indexZdiag_line_styler:  r;  r   r  Z
font_indexr   Z	hor_alignrI   Zfill_patternZbackground_colour_indexZpattern_colour_indexZparent_style_index
vert_alignZrotation)r[   r   r  r,  r-  r.  r/  r0  r)  Z	prot_bitsZfont_and_formatZ
halign_etcmaskZsideZcolour_indexZ
line_styleZbgZ
attr_stemsZ	attr_stemr\   r]   r]   r^   r  `  sX    




z#Sheet.fake_XF_from_BIFF20_cell_attrc             C   s   | j stdd S )Nz9Feature requires open_workbook(..., formatting_info=True))r*   r   )r[   r]   r]   r^   rk     s    zSheet.req_fmt_infoc             C   s   |    | jdkr@| j|d}|dk	r.|jS | jdk	r| jS nj| jdkr| j| rf| jdk	r| jS q| j|d}|dk	r|jS n&| jdkr| j|d}|dk	r|jS | jdk	r| jd S dS )a  
        Determine column display width.

        :param colx:
          Index of the queried column, range 0 to 255.
          Note that it is possible to find out the width that will be used to
          display columns with no cell information e.g. column IV (colx=255).

        :return:
          The column width that will be used for displaying
          the given column by Excel, in units of 1/256th of the width of a
          standard character (the digit zero in the first font).

        .. versionadded:: 0.6.1
        r   Nr   r   r   i   )rk   r!   r>   r   r   r8   r   r7   )r[   rc   Zcolinfor]   r]   r^   computed_column_width  s*    







zSheet.computed_column_widthc          
   C   sT  t rtd| jd t|}t }td|d d \|_|_|_|_	}}}|dksTt
|dks`t
t rvtd| | jd d}dd	 }|d
@ r|||\|_}|d@ r|||\|_}|d@ r|d@ std|||d  \}	t rt| jd|	 |d7 }|	dkrtd|_td|||d  d }
|d7 }t||||
  d|_t rdt| jd|jt|j |jd}t rtd| | jd |jd | |_d|d  }||7 }|
| }||||  }||7 }t rt| jd|j||
|| |dkst
qj|	dkrtd|_td|||d   \}}
|d 7 }d!| ||||
 d   }t rdt| jd"|| ||
7 }|d#7 }td$|||d  d }t rtd%| | jd |d7 }|rtd$|||d  d }|d7 }|d7 }t||||  d}||7 }||_n||_nt| jd&|	 nN|d'@ d(krFtd)|_|||\|_}n$|d*@ d+kr`td,|_n
td-|_|d+@ r|||\|_}t r|jd.d/ td0||f  || }|dkrt| jd1|jd |jd |t|| d   n|dk rtd2| j| xHt|j|jd D ]2}x*t|j|j	d D ]}|| j||f< q2W qW d S )3Nz
=== hyperlink ===)r   z<HHHH16s4sir   s   y  Ks      zoptions: %08Xc             S   sT   t d| ||d  d d }|d7 }t| |||  dd d }||7 }||fS )Nz<Lr   r   ri   zUTF-16ler   )r   r  )ZbufZofsnbZucr]   r]   r^   get_nul_terminated_unicode  s
    z6Sheet.handle_hlink.<locals>.get_nul_terminated_unicoder   r2  r   r   z<16sr   z	clsid=%r
s   y  KZurlz<Lr   r   zUTF-16lezinitial url=%r len=%d
 z	endpos=%dri   z9url=%r
extra=%r
nbytes=%d true_nbytes=%d extra_nbytes=%d
)   r   s               Fz
local filez<Hir   s   ..\zuplevels=%d shortpath=%r
rD  z<izsz=%dz*** unknown clsid %r
ic  i  Zuncik  r   Zworkbookunknownz... object dump ...)r   zoffset=%d record_size=%dz=*** WARNING: hyperlink at R%dC%d has %d extra data bytes: %s
z:Bug or corrupt file, send copy of input file for debugging)r   r   r#   rn   	Hyperlinkr   frowxlrowxfcolxlcolxr   desctargetr   r   r(  r  url_or_pathfindtextmarkr   ZREPRr   rN   r   rr   rO   )r[   r   Zrecord_sizer   Zguid0Zdummyr  r  rB  ZclsidnbytesendposZtrue_nbytesZextra_nbytesZ
extra_dataZuplevelsZ	shortpathZszZxlZextended_pathrb   rc   r]   r]   r^   r     s     (  

  

  




zSheet.handle_hlinkc             C   s   t d|d d \}}}}}|tks(t| js2t| jd }||||f|j|j|j|jfks`t|dd  dksttt|dd d|_	d S )Nz<5Hr   r   r   s     r  )
r   r   r   rN   rG  rH  rI  rJ  r  quicktip)r[   r   ZrcxrG  rH  rI  rJ  r   r]   r]   r^   r   0  s    

$zSheet.handle_quicktipc             C   sT  t sd S d}| jdk rd S t }d}x||k r(td|||d  \}}}	|d@ }
|d? d@ }|
dkrpd}n|	}|rt|||d d| jd	 t| jd
|||
|	|	 |dkr|dksttd||d |d |  \|_|_	|_
|_|_n,|dkr|	dkst|d |kstn ||d 7 }q(W ||ks8t|rP|j| jddd d S )Nr   r   r   z<HHIr   rh   r   i  )basefoutz.fbt:0x%04X  inst:%d  ver:0x%X  cb:%d (0x%04X)
i  r   z<Hiiiii  z=== MSODrawing === )r   r  )OBJ_MSO_DEBUGr!   
MSODrawingr   hex_char_dumpr#   r   r   Z
anchor_unkZanchor_colx_loZanchor_rowx_loZanchor_colx_hiZanchor_rowx_hir   )r[   Zrecidr   r   r   or   ZtmpZfbtcbZverZinstZndbr]   r]   r^   r   9  s:    
4
zSheet.handle_msodrawingetcc             C   s  | j dk rd S t }t|}d}tr2t| jd| x||k rtd|||d  \}}trt| jd||| t|||d d| jd |dkr|dkr|d	ks| jrt| jd
 d S |dkr|dkst	td||d |d  \|_
|_}t||d n|dkrX||| d||  kr"P d}t| jd|  t|||| d| jd t|n|dkrtd||d |d	  }	x^t|	dD ]\}
}t|d| |
 qW n4|dkrtrt| jd n|dkr|jrP n ||d 7 }q6W tr|j| jddd |S )Nr   r   z... OBJ record len=%d...
z<HHr   zpos=%d ft=0x%04X cb=%d
)rS  rT  r   r   z6*** WARNING Ignoring antique or corrupt OBJECT record
z<HHHr   ))r   r   locked)r   r   Z	printable)r   r   
autofilter)r   i   Zscrollbar_flag)r   i    Zautofill)r   i @  Zautoliner   z'Unexpected data at end of OBJECT recordz*** ERROR %s
r   z<5Hr   )r   r   maxZincZpageZ
scrollbar_r   z.*** OBJ record has ft==0x0D 'notes' structure
   z=== MSOBj ===rU  )r   r  )r!   MSObjrn   rV  r   r#   r   rX  r)   r   r(  r   r   r   r   rI   r\  r   )r[   r   rY  r   r   ZftrZ  option_flagsr  valuesr   tagr]   r]   r^   r   a  sT    
$



 
zSheet.handle_objc             C   s8  t r(t| jd t|dt|d| jd t }t|}| jdk rxtd|d d \|_|_	}t|d }||ksvt
|dd  g}||8 }xv|dkr| j \}}	}
|tkst
td|
d d \}}|dkst
||	d kst
||
dd   ||8 }qW |dkst
| jjp$| j }td	|||_d
g|_d|_d|_d|_td|_d |_|| j|j|j	f< d S td|d d \|_|_	}|_|d? d@ |_|d? d@ |_|d? d@ |_t|ddd\|_}|| dkst
t r |j| jddd ||j}|r4|j|_|j|_|| j|j|j	f< d S )Nz... NOTE record ...
r   )rS  rT  r   z<HHHr   z<H2xHi      )r   r   r   z<4Hr   r   r   ri   )r   )r   r   z=== Note ===rU  )r   r  )rV  r   r#   rX  rn   Noter!   r   rb   rc   r   r    r   r   r   r   r   r  r   textrich_text_runlistshow
row_hidden
col_hiddenr   authorZ
_object_idrP   r   r   r   )r[   r   r   rY  r   Zexpected_bytesrA  piecesr   r  r  Z
dummy_rowxr  r`  rQ  r	  r]   r]   r^   r     sV    
 zSheet.handle_notec             C   s  | j dk rd S t }d}t|}t||d | \}|_}}}|_||d  |_t||d d}	td|_	x|	|k r| j
 \}
}}|
tksttrt|d|d| jd t|d }|d }|r|d dkst|d }t|d|d	\}}||kst| j	|7  _	|	|7 }	qlW g |_d}x||k r| j
 \}}}|tksFt|d
 dksXtx@td|d
D ]0}td|||d
  }|j| |d
7 }qfW qW x*|jr|jd d |kr|jd= qW tr|j| jddd t|j| jd |S )Nr   z<HH6sHHH))rj   r   Z
horz_align)r   p   r>  )r   i   Z	lock_text)r   i @  Z	just_last)rh   i   Zsecret_editr   r   )rS  rT  r   ri   )Z	known_lenr   z<HH4xr   z=== MSTxo ===rU  )r   r  )r   )r!   MSTxor   r   ZrotZ	ifntEmptyZfmlar   r   re  r    r   r  r   rV  rX  r#   r   r   rf  rr   r   r   r   )r[   r   rY  r*  Zfmtsizer`  ZcontrolInfoZcchTextZcbRunsZtotcharsr   r  r  rA  ZncharsZutextrQ  ZtotrunsZrc3Z	data3_lenZdata3r   runr]   r]   r^   r     sR    
"
zSheet.handle_txoc             C   s   t sd S td|dd \
}}}}}}}}	}
}|dks:t|
dksFt|dksRt|dks^t|dksjt||ksvtt| jd||||	 td|dd \}}}}}}}}}}}}}}}td	|||||||||||||||f | jd
 d S )Nz<HH8sHBiHiH8sr   #   r   ir  z3FEAT11: grbitFrt=%d  Ref0=%r cref=%d cbFeatData=%d
z<iiiiiiHHiiiii16sHe   zlt=%d  idList=%d crwHeader=%d  crwTotals=%d  idFieldNext=%d cbFSData=%d
rupBuild=%d  unusedShort=%d listFlags=%04X  lPosStmCache=%d  cbStmCache=%d
cchStmCache=%d  lem=%d  rgbHashParam=%r  cchName=%d)r   )rV  r   r   r   r#   )r[   r   ZrtZgrbitFrtZRef0ZisfZfHdrZ	reserved0ZcrefZ
cbFeatDataZ	reserved1ZRef1ltZidListZ	crwHeaderZ	crwTotalsZidFieldNextZcbFSDataZrupBuildZunusedShortZ	listFlagsZlPosStmCacheZ
cbStmCacheZcchStmCacheZlemZrgbHashParamZcchNamer]   r]   r^   r     s    &0
zSheet.handle_feat11)r   N)r   N)r   N)r   N)r   N)r   N)N)r   )r   )C__name__
__module____qualname____doc__r'   r    r0   r1   r>   r?   r@   rA   rB   rC   r7   r8   r9   r:   r;   r<   r=   rG   r   rN   rO   rP   r   r   r   r   r   r   rD   rE   r_   re   rf   rg   r`   ro   rs   rw   rz   r{   r}   r   r   r   colr   r,   r.   r  r   r   r   r  r  rk   r@  r   r   r   r   r   r   r   r]   r]   r]   r^   r   2   s   		T
	





=;K     V-
"

4(p	(832r   c               @   s   e Zd ZdS )rW  N)rr  rs  rt  r]   r]   r]   r^   rW  /  s   rW  c               @   s   e Zd ZdS )r_  N)rr  rs  rt  r]   r]   r]   r^   r_  3  s   r_  c               @   s   e Zd ZdS )rm  N)rr  rs  rt  r]   r]   r]   r^   rm  7  s   rm  c               @   s8   e Zd ZdZedZdZdZdZdZ	dZ
dZedZdS )rd  z
    Represents a user "comment" or "note".
    Note objects are accessible through :attr:`Sheet.cell_note_map`.

    .. versionadded:: 0.7.2
    r   r   N)rr  rs  rt  ru  r   rj  ri  rc   rf  rh  rb   rg  re  r]   r]   r]   r^   rd  ;  s   rd  c               @   s8   e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZdS )rF  z
    Contains the attributes of a hyperlink.
    Hyperlink objects are accessible through :attr:`Sheet.hyperlink_list`
    and :attr:`Sheet.hyperlink_map`.

    .. versionadded:: 0.7.2
    N)rr  rs  rt  ru  rG  rH  rI  rJ  r(  rM  rK  rL  rO  rR  r]   r]   r]   r^   rF  ^  s   rF  c             C   s   t | d }|d@ r@td| \}|dL }|d@ r8|d S t|S tddtt|d@  | dd	  \}|d@ rx|d S |S d S )
Nr   ri   z<ir   g      Y@z<ds          r   )r   r   r   ZBYTES_LITERALchr)Zrk_strr   ir   r]   r]   r^   r     s    (r   emptyre  r(   ZxldateboolerrorZblankc               @   s,   e Zd ZdZdddgZd
ddZdd	 ZdS )ra   a  
    Contains the data for one cell.

    .. warning::
      You don't call this class yourself. You access :class:`Cell` objects
      via methods of the :class:`Sheet` object(s) that you found in the
      :class:`~xlrd.book.Book` object that was returned when you called
      :func:`~xlrd.open_workbook`

    Cell objects have three attributes: ``ctype`` is an int, ``value``
    (which depends on ``ctype``) and ``xf_index``.
    If ``formatting_info`` is not enabled when the workbook is opened,
    ``xf_index`` will be ``None``.

    The following table describes the types of cells and how their values
    are represented in Python.

    .. raw:: html

        <table border="1" cellpadding="7">
        <tr>
        <th>Type symbol</th>
        <th>Type number</th>
        <th>Python value</th>
        </tr>
        <tr>
        <td>XL_CELL_EMPTY</td>
        <td align="center">0</td>
        <td>empty string ''</td>
        </tr>
        <tr>
        <td>XL_CELL_TEXT</td>
        <td align="center">1</td>
        <td>a Unicode string</td>
        </tr>
        <tr>
        <td>XL_CELL_NUMBER</td>
        <td align="center">2</td>
        <td>float</td>
        </tr>
        <tr>
        <td>XL_CELL_DATE</td>
        <td align="center">3</td>
        <td>float</td>
        </tr>
        <tr>
        <td>XL_CELL_BOOLEAN</td>
        <td align="center">4</td>
        <td>int; 1 means TRUE, 0 means FALSE</td>
        </tr>
        <tr>
        <td>XL_CELL_ERROR</td>
        <td align="center">5</td>
        <td>int representing internal Excel codes; for a text representation,
        refer to the supplied dictionary error_text_from_code</td>
        </tr>
        <tr>
        <td>XL_CELL_BLANK</td>
        <td align="center">6</td>
        <td>empty string ''. Note: this type will appear only when
        open_workbook(..., formatting_info=True) is used.</td>
        </tr>
        </table>
    r   r   rl   Nc             C   s   || _ || _|| _d S )N)r   r   rl   )r[   r   r   rl   r]   r]   r^   r_     s    zCell.__init__c             C   s:   | j d krdt| j | jf S dt| j | j| j f S d S )Nz%s:%rz%s:%r (XF:%r))rl   
ctype_textr   r   )r[   r]   r]   r^   __repr__	  s    
zCell.__repr__)N)rr  rs  rt  ru  	__slots__r_   r~  r]   r]   r]   r^   ra     s   @

ra   r   c               @   s(   e Zd ZdZdZdZdZdZdZdZ	dS )r   aR  
    Width and default formatting information that applies to one or
    more columns in a sheet. Derived from ``COLINFO`` records.

    Here is the default hierarchy for width, according to the OOo docs:

      In BIFF3, if a ``COLINFO`` record is missing for a column,
      the width specified in the record ``DEFCOLWIDTH`` is used instead.

      In BIFF4-BIFF7, the width set in this ``COLINFO`` record is only used,
      if the corresponding bit for this column is cleared in the ``GCW``
      record, otherwise the column width set in the ``DEFCOLWIDTH`` record
      is used (the ``STANDARDWIDTH`` record is always ignored in this case [#f1]_).

      In BIFF8, if a ``COLINFO`` record is missing for a column,
      the width specified in the record ``STANDARDWIDTH`` is used.
      If this ``STANDARDWIDTH`` record is also missing,
      the column width of the record ``DEFCOLWIDTH`` is used instead.

    .. [#f1] The docs on the ``GCW`` record say this:

      If a bit is set, the corresponding column uses the width set in the
      ``STANDARDWIDTH`` record. If a bit is cleared, the corresponding column
      uses the width set in the ``COLINFO`` record for this column.

      If a bit is set, and the worksheet does not contain the ``STANDARDWIDTH``
      record, or if the bit is cleared, and the worksheet does not contain the
      ``COLINFO`` record, the ``DEFCOLWIDTH`` record of the worksheet will be
      used instead.

    xlrd goes with the GCW version of the story.
    Reference to the source may be useful: see
    :meth:`Sheet.computed_column_width`.

    .. versionadded:: 0.6.1
    r   r   N)
rr  rs  rt  ru  r   rl   r   r   r   r   r]   r]   r]   r^   r   	  s   $r   c               @   s0   e Zd ZdZerdZdd Zdd Zdd Zd	S )
r   z
    Height and default formatting information that applies to a row in a sheet.
    Derived from ``ROW`` records.

    .. versionadded:: 0.6.1
    )
r   r   r   r   r   r   r   rl   r   r   c             C   s@   d | _ d | _d | _d | _d | _d | _d | _d | _d | _d | _	d S )N)
r   r   r   r   r   r   r   rl   r   r   )r[   r]   r]   r^   r_   c	  s    zRowinfo.__init__c          
   C   s,   | j | j| j| j| j| j| j| j| j| j	f
S )N)
r   r   r   r   r   r   r   rl   r   r   )r[   r]   r]   r^   __getstate__	  s    zRowinfo.__getstate__c             C   s0   |\
| _ | _| _| _| _| _| _| _| _| _	d S )N)
r   r   r   r   r   r   r   rl   r   r   )r[   stater]   r]   r^   __setstate__	  s    zRowinfo.__setstate__N)	rr  rs  rt  ru  
_USE_SLOTSr  r_   r  r  r]   r]   r]   r^   r   M	  s   (r   N)0Z
__future__r   r   Zstructr   r   Zbiffhr=  r   r	   Zformular
   r   r   r   r   Ztimemachiner   rV  rH   Z
BaseObjectr   rW  r_  rm  rd  rF  r   r"  r#  r   r$  r%  r&  r'  r+  r$   r   r   r   r   r}  ra   r   Z
empty_cellr   r  r   r]   r]   r]   r^   <module>   sb                   #8O;