o
    bo;                     @   sl  d Z ddl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" ddl#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l0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7 ddl8m9Z9 ddl:m;Z; ddl<m=Z= de Z>de Z?de Z@d e ZAd!e ZBd"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 ZPd0e ZQd1e ZRd2e ZSd3e ZTd4e ZUd5e ZVd6e ZWd7e ZXd8e ZYd9d: ZZG d;d< d<e[Z\G d=d> d>e[Z]dS )?zReader for a single worksheet.    N)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   )
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| v sd| v sd| v rt | S t| S )z,Convert numbers as string to an int or float.Ee)floatint)value r,   Y/var/www/secure340b-portal/env/lib/python3.10/site-packages/openpyxl/worksheet/_reader.py_cast_numberN   s   r.   c                   @   s   e Zd Zdee 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 | _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array_formulaerow_countercol_counterr"   tablesdate_formatsrow_dimensionscolumn_dimensionsZnumber_formatsZkeep_vbar   
hyperlinks
formattinglegacy_drawingmerged_cellsr   
row_breaksr   
col_breaks)selfsrcr2   r3   r0   r9   r,   r,   r-   __init__W   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 ]B\}}|j,}||v rn|| | |-  qX||v r|| }|d .|}t/| |d | |-  qX|t0kr| 1|}	|-  |	V  qXd S )Nprint_optionspage_margins
page_setupr   auto_filterdata_validationssheet_propertiesviewssheet_format	scenariosr8   r<   r?   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   r1   tagclear	from_treesetattrROW_TAG	parse_row)
rB   
dispatcher
propertiesit_elementZtag_namepropobjrowr,   r,   r-   parseo   sR   



zWorkSheetParser.parsec                 C   sR   t | j}|D ]\}}|jtkrt|}|j  S |jtkr" dS |  qdS )z@
        Get worksheet dimensions if they are provided.
        N)	r   r1   rk   DIMENSION_TAGr$   rm   Z
boundariesDATA_TAGrl   )rB   rs   Z_eventru   dimr,   r,   r-   parse_dimensions   s   





z WorkSheetParser.parse_dimensionsc                 C   s  | dd}| d}|  jd7  _| dd}|rt|}|dkr%d }n|td p,d }|r6t|\}}n| j| j}}| jsO|t	d urOd}| 
|}nr|d ur|dkrt|}|| jv rd	}zt|| j}W nV ty   d
||}t| d}d}Y n@w n>|dkr| jt| }n2|dkrtt|}n'|dkrd}n |d	krt|}n|dkr|t}	|	d urd}t|	}
|
j}|||||dS )Ntnrr   sr   Z	inlineStrfdz|Cell {0} is marked as a date but the serial value {1} is outside the limits for dates. The cell will be treated as an error.r(   z#VALUE!bstr)rx   columnr+   	data_typestyle_id)getr7   r*   findtext	VALUE_TAGr   r6   r3   findFORMULA_TAGparse_formular.   r9   r   r0   
ValueErrorformatr   r2   boolr   INLINE_STRINGr   rm   content)rB   ru   r   
coordinater   r+   rx   r   msgchildZrichtextr,   r,   r-   
parse_cell   sZ   

	

zWorkSheetParser.parse_cellc                 C   s   | t}|d}|d}d}|jdur||j7 }|dkr)t|j| j|< |S |dkrO|d}|| jv rC| j| }||}|S |dkrOt	||| j|< |S )zC
        possible formulae types: shared, array, datatable
        r~   r   =NarrayZsharedsi)
r   r   r   textdictattribr5   r4   Ztranslate_formular   )rB   ru   ZformulaZformula_typer   r+   idxZtransr,   r,   r-   r      s$   









zWorkSheetParser.parse_formulac                 C   s0   t |j}tt|d }||d< || j|< d S )Nminindex)r   r   r   r*   r;   )rB   colattrsr   r,   r,   r-   rO      s   
z'WorkSheetParser.parse_column_dimensionsc                    s|   t |j}d|v rt|d  _n  jd7  _d _dd |D }|ddh r0| jt j<  fdd|D } j|fS )	Nr   r   r   c                 S   s   h | ]	}| d s|qS ){)
startswith).0kr,   r,   r-   	<setcomp>  s    z,WorkSheetParser.parse_row.<locals>.<setcomp>spansc                    s   g | ]}  |qS r,   )r   )r   elrB   r,   r-   
<listcomp>  s    z-WorkSheetParser.parse_row.<locals>.<listcomp>)r   r   r*   r6   r7   r:   r   )rB   rx   r   keyscellsr,   r   r-   rp     s   

zWorkSheetParser.parse_rowc                 C   sH   zt |}| j| W d S  ty#   dt  }t| Y d S w )NzKFailed to load a conditional formatting rule. It will be discarded. Cause: )r   rm   r=   append	TypeError	traceback
format_excr   )rB   ru   cfr   r,   r,   r-   rU     s   
z WorkSheetParser.parse_formattingc                 C   s2   t |}|d}|d ur||d || _d S )NpasswordT)r   rm   r   set_password
protection)rB   ru   r   r   r,   r,   r-   rQ     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   rm   extr   r   uriupperr   r   )rB   ru   ZextLstr(   Zext_typer   r,   r,   r-   rS   '  s   



z WorkSheetParser.parse_extensionsc                 C   s   t |}|j| _d S N)r%   rm   idr>   )rB   ru   rw   r,   r,   r-   rW   /  s   
zWorkSheetParser.parse_legacyc                 C      t |}|| _d S r   )r   rm   r@   rB   ru   Zbrkr,   r,   r-   rY   4     

z WorkSheetParser.parse_row_breaksc                 C   r   r   )r   rm   rA   r   r,   r,   r-   r[   9  r   z WorkSheetParser.parse_col_breaksc                 C   s   t  | _t | _d S r   )r   r@   r   rA   )rB   ru   r,   r,   r-   r]   >  s   z"WorkSheetParser.parse_custom_viewsN)__name__
__module____qualname__r   setrD   ry   r}   r   r   rO   rp   rU   rQ   rS   rW   rY   r[   r]   r,   r,   r,   r-   r/   U   s"    
/5	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   s*   || _ t||||jj|jj| _g | _d S r   )wsr/   parentr0   Z_date_formatsparserr8   )rB   r   Z
xml_sourcer2   r3   r,   r,   r-   rD   J  s   
zWorksheetReader.__init__c                 C   s   | j  D ]5\}}|D ].}| jjj|d  }t| j|d |d |d}|d |_|d |_|| jj|d |d f< qq| j j	| j_
| jjrM| jj| j_d S d S )Nr   rx   r   )rx   r   Zstyle_arrayr+   r   )r   ry   r   r   _cell_stylesr   _valuer   _cellsr5   Zformula_attributesZmax_rowZ_current_row)rB   r   rx   cellstylecr,   r,   r-   
bind_cellsP  s   

zWorksheetReader.bind_cellsc                 C   sF   | j jD ]}|jD ]}|jd ur| jjj|j |_|| jj|< q	qd S r   )	r   r=   rulesZdxfIdr   r   Z_differential_stylesZdxfZconditional_formatting)rB   r   ruler,   r,   r-   bind_formatting]  s   

zWorksheetReader.bind_formattingc                 C   s0   | j jjD ]}| jj|j }| j|j qd S r   )r   r8   Z	tablePartr   _relsr   r   Target)rB   r~   relr,   r,   r-   bind_tablese  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	| |
| q||| j_d S )Nr   )MultiCellRange)MergedCellRange)Zopenpyxl.worksheet.cell_ranger   Zopenpyxl.worksheet.merger   r   r?   Z	mergeCellr   refZ_clean_merge_ranger   )rB   r   r   rangescrZmcrr,   r,   r-   bind_merged_cellsk  s   z!WorksheetReader.bind_merged_cellsc                 C   s   | j jjD ]F}|jr| jj|j }|j|_d|jv r7| j|j D ]}|D ]}z||_W q$ t	y4   Y q$w q q| j|j }t
|trH| |j}||_qd S )N:)r   r<   	hyperlinkr   r   r   r   targetr   AttributeError
isinstancer   normalize_merged_cell_linkr   )rB   linkr   rx   r   r,   r,   r-   bind_hyperlinksy  s&   


zWorksheetReader.bind_hyperlinksc                 C   s0   | j jD ]}||v 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   r?   r   top)rB   Zcoordrngr,   r,   r-   r     s
   z*WorksheetReader.normalize_merged_cell_linkc                 C   sZ   | j j D ]$\}}d|v rt|d }| jjj| |d< t| jfi || jj|< qd S )Nr   )r   r;   itemsr*   r   r   r   r   )rB   r   cdkeyr,   r,   r-   bind_col_dimensions  s   z#WorksheetReader.bind_col_dimensionsc                 C   s^   | j j D ]&\}}d|v rt|d }| jjj| |d< t| jfi || jjt|< qd S )Nr   )r   r:   r   r*   r   r   r   r   )rB   rx   rdr   r,   r,   r-   bind_row_dimensions  s    z#WorksheetReader.bind_row_dimensionsc                 C   s2   dD ]}t | j|d }|d urt| j|| qd S )N)rE   rF   rG   r   rH   rI   rJ   rK   rL   r@   rA   rM   r>   r   )getattrr   rn   r   )rB   r   vr,   r,   r-   bind_properties  s   zWorksheetReader.bind_propertiesc                 C   sD   |    |   |   |   |   |   |   |   d S r   )r   r   r   r   r   r   r   r   r   r,   r,   r-   bind_all  s   zWorksheetReader.bind_allN)r   r   r   __doc__rD   r   r   r   r   r   r   r   r   r   r   r,   r,   r,   r-   r   E  s    	r   )^r   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   filtersr   Zheader_footerr   r   r   merger   pager   r   r   Z	pagebreakr   r   r   r   Zscenarior   rK   r    Zdatavalidationr!   tabler"   rr   r#   
dimensionsr$   relatedr%   ZCELL_TAGr   r   rj   r   rN   ro   rT   rV   rP   rR   ri   rh   r^   r_   r`   ra   rb   rc   rd   re   rf   rX   rZ   rg   r{   rz   r\   r.   objectr/   r   r,   r,   r,   r-   <module>   sv    q