U
    d?                     @   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-rwywncvq/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  qd 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	rd}| 
|}n|d k	r|dkr,t|}|| jkrd	}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rt|}n@|dkr|t}	|	d k	rd}| jrt|	}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rt||| j|< n|d
krt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|   
  