o
    ˷e=                     @   sp  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" 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.    )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   )
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-   Q/var/www/ideatree/venv/lib/python3.10/site-packages/openpyxl/worksheet/_reader.py_cast_numberN   s   r/   c                   @   s   e Zd Zde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)min_rowmin_colepochsourceshared_strings	data_onlyshared_formulaearray_formulaerow_countercol_counterr#   tablesdate_formatstimedelta_formatsrow_dimensionscolumn_dimensionsnumber_formatskeep_vbar   
hyperlinks
formattinglegacy_drawingmerged_cellsr   
row_breaksr   
col_breaks)selfsrcr5   r6   r3   r<   r=   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	scenariosr;   rB   rE   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   r4   tagclear	from_treesetattrROW_TAG	parse_row)
rH   
dispatcher
propertiesit_elementtag_namepropobjrowr-   r-   r.   parseq   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   r4   rq   DIMENSION_TAGr%   rs   
boundariesDATA_TAGrr   )rH   ry   _eventr{   dimr-   r-   r.   parse_dimensions   s   





z WorkSheetParser.parse_dimensionsc              	   C   s  | dd}| d}| dd}|rt|}|dkrd }n|td p%d }|r2t|\}}|| _n|  jd7  _| j| j}}| jsR|t	d urRd}| 
|}n||d ur|dkrt|}|| jv rd	}zt|| j|| jv d
}W n[ ttfy   d| d| 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rsr   	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!bstr)r   columnr,   	data_typestyle_id)getr+   findtext	VALUE_TAGr   r:   r9   r6   findFORMULA_TAGparse_formular/   r<   r   r3   r=   OverflowError
ValueErrorr   r5   boolr   INLINE_STRINGr   rs   content)rH   r{   r   
coordinater   r,   r   r   msgchildrichtextr-   r-   r.   
parse_cell   s`   




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arraysharedsi)
r   r   r   textdictattribr8   r7   translate_formular   )rH   r{   formulaformula_typer   r,   idx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?   )rH   colattrsr   r-   r-   r.   rU     s   
z'WorkSheetParser.parse_column_dimensionsc                    s   t |j}d|v r5z	t|d  _W n) ty4   t|d }| r)t| _n	t|d  dY nw   jd7  _d _dd |D }|ddh rT| 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kr-   r-   r.   	<setcomp>  s    z,WorkSheetParser.parse_row.<locals>.<setcomp>spansc                    s   g | ]}  |qS r-   )r   )r   elrH   r-   r.   
<listcomp>  s    z-WorkSheetParser.parse_row.<locals>.<listcomp>)
r   r   r+   r9   r   r*   
is_integerr:   r>   r   )rH   r   r   valkeyscellsr-   r   r.   rv   	  s$   

zWorkSheetParser.parse_rowc              
   C   sV   zt |}| j| W d S  ty* } zd| }t| W Y d }~d S d }~ww )NzKFailed to load a conditional formatting rule. It will be discarded. Cause: )r   rs   rC   append	TypeErrorr   )rH   r{   cfr)   r   r-   r-   r.   r[   "  s   

z WorkSheetParser.parse_formattingc                 C   s2   t |}|d}|d ur||d || _d S )NpasswordT)r   rs   r   set_password
protection)rH   r{   r   r   r-   r-   r.   rW   +  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   rs   extr   r   uriupperformatr   )rH   r{   extLstr)   ext_typer   r-   r-   r.   rY   3  s   



z WorkSheetParser.parse_extensionsc                 C   s   t |}|j| _d S N)r&   rs   idrD   )rH   r{   r~   r-   r-   r.   r]   ;  s   
zWorkSheetParser.parse_legacyc                 C      t |}|| _d S r   )r   rs   rF   rH   r{   brkr-   r-   r.   r_   @     

z WorkSheetParser.parse_row_breaksc                 C   r   r   )r   rs   rG   r   r-   r-   r.   ra   E  r   z WorkSheetParser.parse_col_breaksc                 C   s   t  | _t | _d S r   )r   rF   r   rG   )rH   r{   r-   r-   r.   rc   J  s   z"WorkSheetParser.parse_custom_viewsN)__name__
__module____qualname__r   setrJ   r   r   r   r   rU   rv   r[   rW   rY   r]   r_   ra   rc   r-   r-   r-   r.   r0   U   s$    
/8	r0   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   s0   || _ t||||jj|jj|jj| _g | _d S r   )wsr0   parentr3   _date_formats_timedelta_formatsparserr;   )rH   r   
xml_sourcer5   r6   r-   r-   r.   rJ   V  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   r   r   )r   r   style_arrayr,   r   )r   r   r   r   _cell_stylesr   _valuer   _cellsr8   formula_attributesmax_row_current_row)rH   r   r   cellstylecr-   r-   r.   
bind_cells^  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   rC   rulesdxfIdr   r   _differential_stylesdxfconditional_formatting)rH   r   ruler-   r-   r.   bind_formattingk  s   

zWorksheetReader.bind_formattingc                 C   s0   | j jjD ]}| jj|j }| j|j qd S r   )r   r;   	tablePartr   _relsr   r   Target)rH   r   relr-   r-   r.   bind_tabless  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)openpyxl.worksheet.cell_ranger   openpyxl.worksheet.merger   r   rE   	mergeCellr   ref_clean_merge_ranger   )rH   r   r   rangescrmcrr-   r-   r.   bind_merged_cellsy  s   z!WorksheetReader.bind_merged_cellsc                 C   s   | j jjD ]H}|jr| jj|j }|j|_d|jv r9| j|j D ]}|D ]}zt	||_W q$ t
y6   Y q$w q q| j|j }t|trJ| |j}||_qd S )N:)r   rB   	hyperlinkr   r   r   r   targetr   r   AttributeError
isinstancer   normalize_merged_cell_linkr   )rH   linkr   r   r   r-   r-   r.   bind_hyperlinks  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   rE   r   top)rH   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   )rH   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	   )rH   r   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)rK   rL   rM   r   rN   rO   rP   rQ   rR   rF   rG   rS   rD   r   )getattrr   rt   r   )rH   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__rJ   r   r   r   r   r  r  r  r  r  r  r-   r-   r-   r.   r   Q  s    	r   N)^r  r   warningsr   openpyxl.xml.functionsr   openpyxl.cellr   r   openpyxl.cell.textr   openpyxl.worksheet.dimensionsr   r	   r
   openpyxl.xml.constantsr   r   openpyxl.formatting.formattingr   openpyxl.formula.translater   openpyxl.utilsr   r   openpyxl.utils.datetimer   r   r   openpyxl.descriptors.excelr   filtersr   header_footerr   r  r   merger   pager   r   r   	pagebreakr   r   r   r   scenarior    rQ   r!   datavalidationr"   tabler#   rx   r$   
dimensionsr%   relatedr&   CELL_TAGr   r   rp   r   rT   ru   rZ   r\   rV   rX   ro   rn   rd   re   rf   rg   rh   ri   rj   rk   rl   r^   r`   rm   r   r   rb   r/   objectr0   r   r-   r-   r-   r.   <module>   sv    }