U
    rÎ·hÿ?  ã                   @   s”  d Z ddlmZ ddlmZ ddlmZ ddlmZmZ ddl	m
Z
 ddlmZmZmZ ddlmZmZ dd	lmZ dd
lmZ ddlmZmZ ddlmZmZmZ ddlmZ ddlm Z  ddl!m"Z"m#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z) ddl*m+Z+ ddl,m-Z-m.Z.m/Z/ ddl0m1Z1m2Z2 ddl3m4Z4 ddl5m6Z6 ddl7m8Z8 ddl9m:Z: ddl;m<Z< ddl=m>Z> ddl?m@Z@ ddlAmBZB de ZCd e ZDd!e ZEd"e ZFd#e ZGd$e ZHd%e ZId&e ZJd'e ZKd(e ZLd)e ZMd*e ZNd+e ZOd,e ZPd-e ZQd.e ZRd/e ZSd0e ZTd1e ZUd2e ZVd3e ZWd4e ZXd5e ZYd6e ZZd7e Z[d8e Z\d9e Z]d:e Z^d;d<„ Z_d=d>„ Z`G d?d@„ d@eaƒZbG dAdB„ dBeaƒZcdCS )DzReader for a single worksheet.é    )Úcopy)Úwarn)Ú	iterparse)ÚCellÚ
MergedCell)ÚText)ÚColumnDimensionÚRowDimensionÚSheetFormatProperties)ÚSHEET_MAIN_NSÚ	EXT_TYPES)ÚConditionalFormatting)Ú
Translator)Úget_column_letterÚcoordinate_to_tuple)Ú
from_excelÚfrom_ISO8601ÚWINDOWS_EPOCH)ÚExtensionList)ÚCellRichTexté   )ÚDataTableFormulaÚArrayFormula)Ú
AutoFilter)ÚHeaderFooter)ÚHyperlinkList)Ú
MergeCells)ÚPageMarginsÚPrintOptionsÚPrintPageSetup)ÚRowBreakÚColBreak)ÚSheetProtection)ÚScenarioList)ÚSheetViewList)ÚDataValidationList)ÚTablePartList)ÚWorksheetProperties)ÚSheetDimension)ÚRelatedz{%s}cz{%s}vz{%s}fz{%s}mergeCellsz{%s}isz{%s}colz{%s}rowz{%s}conditionalFormattingz{%s}legacyDrawingz{%s}sheetProtectionz
{%s}extLstz{%s}hyperlinksz{%s}tablePartsz{%s}printOptionsz{%s}pageMarginsz{%s}pageSetupz{%s}headerFooterz{%s}autoFilterz{%s}dataValidationsz{%s}sheetPrz{%s}sheetViewsz{%s}sheetFormatPrz{%s}rowBreaksz{%s}colBreaksz{%s}scenariosz{%s}sheetDataz{%s}dimensionz{%s}customSheetViewsc                 C   s(   d| ksd| ksd| kr t | ƒS t| ƒS )z,Convert numbers as string to an int or floatÚ.ÚEÚe)ÚfloatÚint)Úvalue© r0   ú>/tmp/pip-unpacked-wheel-49e_hfpc/openpyxl/worksheet/_reader.pyÚ_cast_numberP   s    r2   c                 C   s4   t  | ¡pd}t|ƒdkr0t|d tƒr0|d }|S )z?
    Parse inline string and preserve rich text formatting
    Ú r   r   )r   Ú	from_treeÚlenÚ
isinstanceÚstr)Úelementr/   r0   r0   r1   Úparse_richtext_stringW   s    r9   c                   @   sŒ   e Zd Zdeeƒ eƒ df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dd„ Zdd„ Zdd„ ZdS )ÚWorkSheetParserFc                 C   s–   d  | _ | _|| _|| _|| _|| _i | _d | _| _t	ƒ | _
|| _|| _i | _i | _g | _d| _tƒ | _g | _d | _d | _tƒ | _tƒ | _|| _d S )Nr   F)Zmin_rowZmin_colÚepochÚsourceÚshared_stringsÚ	data_onlyÚshared_formulaeÚrow_counterÚcol_counterr&   ÚtablesÚdate_formatsÚtimedelta_formatsÚrow_dimensionsÚcolumn_dimensionsZnumber_formatsZkeep_vbar   Ú
hyperlinksÚ
formattingÚlegacy_drawingÚmerged_cellsr    Ú
row_breaksr!   Ú
col_breaksÚ	rich_text)ÚselfÚsrcr=   r>   r;   rC   rD   rM   r0   r0   r1   Ú__init__c   s*    zWorkSheetParser.__init__c           
      c   s:  t | jt| jt| jt| jt| j	t
| jt| jt| ji}tdtftdtftdtftdtftdtftdtftdtftdtft d	t!ft"d
t#ft$dt%ft&dt'ft(dt)fi}t*| j+ƒ}|D ]†\}}|j,}||krÚ|| |ƒ | -¡  q®||k�r|| }|d  .|¡}t/| |d |ƒ | -¡  q®|t0kr®|  1|¡}	| -¡  |	V  q®d S )NÚprint_optionsÚpage_marginsÚ
page_setupr   Úauto_filterÚdata_validationsÚsheet_propertiesÚviewsÚsheet_formatÚ	scenariosrB   rG   rJ   r   r   )2ÚCOL_TAGÚparse_column_dimensionsÚPROT_TAGÚparse_sheet_protectionÚEXT_TAGÚparse_extensionsÚCF_TAGÚparse_formattingÚ
LEGACY_TAGÚparse_legacyÚROW_BREAK_TAGÚparse_row_breaksÚCOL_BREAK_TAGÚparse_col_breaksÚCUSTOM_VIEWS_TAGÚparse_custom_viewsÚ	PRINT_TAGr   ÚMARGINS_TAGr   ÚPAGE_TAGr   Ú
HEADER_TAGr   Ú
FILTER_TAGr   ÚVALIDATION_TAGr%   ÚPROPERTIES_TAGr'   Ú	VIEWS_TAGr$   Ú
FORMAT_TAGr
   ÚSCENARIOS_TAGr#   Ú	TABLE_TAGr&   ÚHYPERLINK_TAGr   Ú	MERGE_TAGr   r   r<   ÚtagÚclearr4   ÚsetattrÚROW_TAGÚ	parse_row)
rN   Ú
dispatcherÚ
propertiesÚitÚ_r8   Ztag_nameÚpropÚobjÚrowr0   r0   r1   Úparse}   sv            ø             ó




zWorkSheetParser.parsec                 C   sP   t | jƒ}|D ]<\}}|jtkr4t |¡}|j  S |jtkrB qL| ¡  qdS )z@
        Get worksheet dimensions if they are provided.
        N)	r   r<   rw   ÚDIMENSION_TAGr(   r4   Z
boundariesÚDATA_TAGrx   )rN   r~   Z_eventr8   Zdimr0   r0   r1   Úparse_dimensions¬   s    




z WorkSheetParser.parse_dimensionsc           
   	   C   sÒ  |  dd¡}|  d¡}|  dd¡}|r.t|ƒ}|dkr<d }n| td ¡pJd }|rdt|ƒ\}}|| _n|  jd7  _| j| j }}| js¦| t	¡d k	r¦d}|  
|¡}�n|d k	�r‚|dk�r,t|ƒ}|| jk�r€d	}zt|| j|| jkd
�}W n< ttfk
�r(   d|› d|› d�}t|ƒ d}d}Y nX nT|dk�rF| jt|ƒ }n:|dk�r^tt|ƒƒ}n"|dk�rnd}n|d	k�rÂt|ƒ}n@|dk�rÂ| t¡}	|	d k	�rÂd}| j�r¶t|	ƒ}nt |	¡j}|||||dœS )NÚtÚnÚrÚsr   Z	inlineStrr   ÚfÚd)Ú	timedeltazCell z* is marked as a date but the serial value zG is outside the limits for dates. The cell will be treated as an error.r,   z#VALUE!Úbr7   )r‚   Úcolumnr/   Ú	data_typeÚstyle_id)Úgetr.   ÚfindtextÚ	VALUE_TAGr   rA   r@   r>   ÚfindÚFORMULA_TAGÚparse_formular2   rC   r   r;   rD   ÚOverflowErrorÚ
ValueErrorr   r=   Úboolr   ÚINLINE_STRINGrM   r9   r   r4   Úcontent)
rN   r8   r�   Ú
coordinater‘   r/   r‚   r�   ÚmsgÚchildr0   r0   r1   Ú
parse_cell½   s`    


  ÿ









zWorkSheetParser.parse_cellc                 C   s¶   |  t¡}| d¡}| d¡}d}|jdk	r6||j7 }|dkrRt| d¡|d�}n`|dkrž| d	¡}|| jkr„| j| }| |¡}q²|dkr²t||ƒ| j|< n|d
kr²tf |j	Ž}|S )zC
        possible formulae types: shared, array, datatable
        r‡   r‰   ú=NÚarrayÚref)r£   ÚtextZsharedÚsiZ	dataTable)
r•   r–   r’   r¤   r   r?   Ztranslate_formular   r   Úattrib)rN   r8   ÚformulaZformula_typer�   r/   ÚidxZtransr0   r0   r1   r—   ÷   s$    







zWorkSheetParser.parse_formulac                 C   s0   t |jƒ}tt|d ƒƒ}||d< || j|< d S )NÚminÚindex)Údictr¦   r   r.   rF   )rN   ÚcolÚattrsr�   r0   r0   r1   r[     s    
z'WorkSheetParser.parse_column_dimensionsc                    sÈ   t |jƒ}d|krnzt|d ƒˆ _W q| tk
rj   t|d ƒ}| ¡ rTt|ƒˆ _nt|d › d�ƒ‚Y q|X nˆ  jd7  _dˆ _dd„ |D ƒ}|ddh r¬|ˆ jt	ˆ jƒ< ‡ fdd	„|D ƒ}ˆ j|fS )
Nr‰   z is not a valid row numberr   r   c                 S   s   h | ]}|  d ¡s|’qS )Ú{)Ú
startswith)Ú.0Úkr0   r0   r1   Ú	<setcomp>*  s     
 z,WorkSheetParser.parse_row.<locals>.<setcomp>Zspansc                    s   g | ]}ˆ   |¡‘qS r0   )r    )r°   Úel©rN   r0   r1   Ú
<listcomp>/  s     z-WorkSheetParser.parse_row.<locals>.<listcomp>)
r«   r¦   r.   r@   r™   r-   Ú
is_integerrA   rE   r7   )rN   r‚   r­   ÚvalÚkeysÚcellsr0   r´   r1   r{     s     
zWorkSheetParser.parse_rowc              
   C   sT   zt  |¡}| j |¡ W n4 tk
rN } zd|› �}t|ƒ W 5 d }~X Y nX d S )NzKFailed to load a conditional formatting rule. It will be discarded. Cause: )r   r4   rH   ÚappendÚ	TypeErrorr   )rN   r8   Úcfr,   rž   r0   r0   r1   ra   3  s    

z WorkSheetParser.parse_formattingc                 C   s2   t  |¡}| d¡}|d k	r(| |d¡ || _d S )NÚpasswordT)r"   r4   r’   Úset_passwordÚ
protection)rN   r8   r¿   r½   r0   r0   r1   r]   <  s
    

z&WorkSheetParser.parse_sheet_protectionc                 C   s>   t  |¡}|jD ](}t |j ¡ d¡}d |¡}t|ƒ qd S )NÚUnknownz2{0} extension is not supported and will be removed)	r   r4   Úextr   r’   ÚuriÚupperÚformatr   )rN   r8   ZextLstr,   Zext_typerž   r0   r0   r1   r_   D  s
    


z WorkSheetParser.parse_extensionsc                 C   s   t  |¡}|j| _d S ©N)r)   r4   ÚidrI   )rN   r8   r�   r0   r0   r1   rc   L  s    
zWorkSheetParser.parse_legacyc                 C   s   t  |¡}|| _d S rÅ   )r    r4   rK   ©rN   r8   Zbrkr0   r0   r1   re   Q  s    
z WorkSheetParser.parse_row_breaksc                 C   s   t  |¡}|| _d S rÅ   )r!   r4   rL   rÇ   r0   r0   r1   rg   V  s    
z WorkSheetParser.parse_col_breaksc                 C   s   t ƒ | _tƒ | _d S rÅ   )r    rK   r!   rL   )rN   r8   r0   r0   r1   ri   [  s    z"WorkSheetParser.parse_custom_viewsN)Ú__name__Ú
__module__Ú__qualname__r   ÚsetrP   rƒ   r†   r    r—   r[   r{   ra   r]   r_   rc   re   rg   ri   r0   r0   r0   r1   r:   a   s&     þ
/:	r:   c                   @   sh   e 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dS )ÚWorksheetReaderz4
    Create a parser and apply it to a workbook
    c                 C   s2   || _ t||||jj|jj|jj|ƒ| _g | _d S rÅ   )Úwsr:   Úparentr;   Z_date_formatsZ_timedelta_formatsÚparserrB   )rN   rÍ   Z
xml_sourcer=   r>   rM   r0   r0   r1   rP   g  s       þzWorksheetReader.__init__c                 C   sŽ   | j  ¡ D ]j\}}|D ]\}| jjj|d  }t| j|d |d |d�}|d |_|d |_|| jj|d |d f< qq
| jjrŠ| jj	| j_
d S )Nr‘   r‚   r�   )r‚   r�   Zstyle_arrayr/   r�   )rÏ   rƒ   rÍ   rÎ   Ú_cell_stylesr   Ú_valuer�   Z_cellsZmax_rowZ_current_row)rN   r¨   r‚   ÚcellÚstyleÚcr0   r0   r1   Ú
bind_cellso  s    

zWorksheetReader.bind_cellsc                 C   sF   | j jD ]8}|jD ],}|jd k	r2| jjj|j |_|| jj|< qqd S rÅ   )	rÏ   rH   ÚrulesZdxfIdrÍ   rÎ   Z_differential_stylesZdxfZconditional_formatting)rN   r¼   Zruler0   r0   r1   Úbind_formatting|  s
    

zWorksheetReader.bind_formattingc                 C   s0   | j jjD ] }| jj|j }| j |j¡ q
d S rÅ   )rÏ   rB   Z	tablePartrÍ   Ú_relsrÆ   rº   ÚTarget)rN   r‡   Úrelr0   r0   r1   Úbind_tables„  s    zWorksheetReader.bind_tablesc                 C   sl   ddl m} ddlm} | jjs$d S g }| jjjD ](}|| j|jƒ}| j 	|¡ | 
|¡ q2||ƒ| j_d S )Nr   )ÚMultiCellRange)ÚMergedCellRange)Zopenpyxl.worksheet.cell_rangerÜ   Zopenpyxl.worksheet.mergerÝ   rÏ   rJ   Z	mergeCellrÍ   r£   Z_clean_merge_rangerº   )rN   rÜ   rÝ   ÚrangesZcrZmcrr0   r0   r1   Úbind_merged_cellsŠ  s    z!WorksheetReader.bind_merged_cellsc                 C   s¤   | j jjD ]”}|jr*| jj|j }|j|_d|jkrv| j|j D ]2}|D ](}zt	|ƒ|_W qH t
k
rn   Y qHX qHq@q
| j|j }t|tƒr˜|  |j¡}||_q
d S )Nú:)rÏ   rG   Ú	hyperlinkrÆ   rÍ   rØ   rÙ   Útargetr£   r   ÚAttributeErrorr6   r   Únormalize_merged_cell_linkr�   )rN   ÚlinkrÚ   r‚   rÒ   r0   r0   r1   Úbind_hyperlinks˜  s    

zWorksheetReader.bind_hyperlinksc                 C   s0   | j jD ]"}||kr| j j|jd Ž   S qdS )zš
        Returns the appropriate cell to which a hyperlink, which references a merged cell at the specified coordinates,
        should be bound.
        r   N)rÍ   rJ   rÒ   Útop)rN   ZcoordÚrngr0   r0   r1   rä   «  s    z*WorksheetReader.normalize_merged_cell_linkc                 C   sV   | j j ¡ D ]D\}}d|kr:t|d ƒ}| jjj| |d< t| jf|Ž| jj|< qd S )NrÓ   )rÏ   rF   Úitemsr.   rÍ   rÎ   rÐ   r   )rN   r¬   ZcdÚkeyr0   r0   r1   Úbind_col_dimensions´  s
    z#WorksheetReader.bind_col_dimensionsc                 C   sZ   | j j ¡ D ]H\}}d|kr:t|d ƒ}| jjj| |d< t| jf|Ž| jjt|ƒ< qd S )NrŠ   )rÏ   rE   ré   r.   rÍ   rÎ   rÐ   r	   )rN   r‚   Úrdrê   r0   r0   r1   Úbind_row_dimensions¼  s
    z#WorksheetReader.bind_row_dimensionsc                 C   s2   dD ](}t | j|d ƒ}|d k	rt| j||ƒ qd S )N)rQ   rR   rS   r   rT   rU   rV   rW   rX   rK   rL   rY   rI   r¿   )ÚgetattrrÏ   ry   rÍ   )rN   r±   Úvr0   r0   r1   Úbind_propertiesÄ  s    zWorksheetReader.bind_propertiesc                 C   sD   |   ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  d S rÅ   )rÕ   rß   ræ   r×   rë   rí   rÛ   rð   r´   r0   r0   r1   Úbind_allÐ  s    zWorksheetReader.bind_allN)rÈ   rÉ   rÊ   Ú__doc__rP   rÕ   r×   rÛ   rß   ræ   rä   rë   rí   rð   rñ   r0   r0   r0   r1   rÌ   b  s   	rÌ   N)drò   r   Úwarningsr   Zopenpyxl.xml.functionsr   Zopenpyxl.cellr   r   Zopenpyxl.cell.textr   Zopenpyxl.worksheet.dimensionsr   r	   r
   Zopenpyxl.xml.constantsr   r   Zopenpyxl.formatting.formattingr   Zopenpyxl.formula.translater   Zopenpyxl.utilsr   r   Zopenpyxl.utils.datetimer   r   r   Zopenpyxl.descriptors.excelr   Zopenpyxl.cell.rich_textr   r§   r   r   Úfiltersr   Zheader_footerr   rá   r   Úmerger   Úpager   r   r   Z	pagebreakr    r!   r¿   r"   Zscenarior#   rW   r$   Zdatavalidationr%   Útabler&   r}   r'   Z
dimensionsr(   Úrelatedr)   ZCELL_TAGr”   r–   rv   r›   rZ   rz   r`   rb   r\   r^   ru   rt   rj   rk   rl   rm   rn   ro   rp   rq   rr   rd   rf   rs   r…   r„   rh   r2   r9   Úobjectr:   rÌ   r0   r0   r0   r1   Ú<module>   s|   
  