o
    g?                     @   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@ZaG dAdB dBZbdCS )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| 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 r0   T/var/www/html/api-tag/env/lib/python3.10/site-packages/openpyxl/worksheet/_reader.py_cast_numberP   s   r2   c                 C   s4   t | pd}t|dkrt|d tr|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)min_rowmin_colepochsourceshared_strings	data_onlyshared_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	rich_text)selfsrcr?   r@   r=   rE   rF   rQ   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 ]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	scenariosrD   rK   rN   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)
rR   
dispatcher
propertiesit_r8   tag_namepropobjrowr0   r0   r1   parse}   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   r>   r{   DIMENSION_TAGr(   r4   
boundariesDATA_TAGr|   )rR   r   _eventr8   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 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 na ttfy   d| d| d}t| d}d}Y nFw nD|dkr| jt| }n8|dkrtt|}n-|dkrd}n&|d	krt|}n|dkr|t}	|	d urd}| jrt|	}n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!br7   )r   columnr/   	data_typestyle_id)getr.   findtext	VALUE_TAGr   rC   rB   r@   findFORMULA_TAGparse_formular2   rE   r   r=   rF   OverflowError
ValueErrorr   r?   boolr   INLINE_STRINGrQ   r9   r   r4   content)
rR   r8   r   
coordinater   r/   r   r   msgchildr0   r0   r1   
parse_cell   sb   




zWorkSheetParser.parse_cellc                 C   s   | t}|d}|d}d}|jdur||j7 }|dkr*t|d|d}|S |dkrR|d	}|| jv rD| j| }||}|S |dkrPt||| j|< |S |d
kr^tdi |j	}|S )zC
        possible formulae types: shared, array, datatable
        r   r   =Narrayref)r   textsharedsi	dataTabler0   )
r   r   r   r   r   rA   translate_formular   r   attrib)rR   r8   formulaformula_typer   r/   idx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.   rH   )rR   colattrsr   r0   r0   r1   r_     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kr0   r0   r1   	<setcomp>*  s    z,WorkSheetParser.parse_row.<locals>.<setcomp>spansc                    s   g | ]}  |qS r0   )r   )r   elrR   r0   r1   
<listcomp>/  s    z-WorkSheetParser.parse_row.<locals>.<listcomp>)
r   r   r.   rB   r   r-   
is_integerrC   rG   r7   )rR   r   r   valkeyscellsr0   r   r1   r     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   r4   rL   append	TypeErrorr   )rR   r8   cfr,   r   r0   r0   r1   re   3  s   

z WorkSheetParser.parse_formattingc                 C   s2   t |}|d}|d ur||d || _d S )NpasswordT)r"   r4   r   set_password
protection)rR   r8   r   r   r0   r0   r1   ra   <  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   )rR   r8   extLstr,   ext_typer   r0   r0   r1   rc   D  s   



z WorkSheetParser.parse_extensionsc                 C   s   t |}|j| _d S N)r)   r4   idrM   )rR   r8   r   r0   r0   r1   rg   L  s   
zWorkSheetParser.parse_legacyc                 C      t |}|| _d S r   )r    r4   rO   rR   r8   brkr0   r0   r1   ri   Q     

z WorkSheetParser.parse_row_breaksc                 C   r   r   )r!   r4   rP   r   r0   r0   r1   rk   V  r   z WorkSheetParser.parse_col_breaksc                 C   s   t  | _t | _d S r   )r    rO   r!   rP   )rR   r8   r0   r0   r1   rm   [  s   z"WorkSheetParser.parse_custom_viewsN)__name__
__module____qualname__r   setrT   r   r   r   r   r_   r   re   ra   rc   rg   ri   rk   rm   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=   _date_formats_timedelta_formatsparserrD   )rR   r   
xml_sourcer?   r@   rQ   r0   r0   r1   rT   g  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rG| jj	| j_
d S d S )Nr   r   r   )r   r   style_arrayr/   r   )r   r   r   r   _cell_stylesr   _valuer   _cellsmax_row_current_row)rR   r   r   cellstylecr0   r0   r1   
bind_cellso  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   rL   rulesdxfIdr   r   _differential_stylesdxfconditional_formatting)rR   r   ruler0   r0   r1   bind_formatting|  s   

zWorksheetReader.bind_formattingc                 C   s2   | j jjD ]}| jj|j}| j|j qd S r   )	r   rD   	tablePartr   _relsr   r   r   Target)rR   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	| |
| q||| j_d S )Nr   )MultiCellRange)MergedCellRange)openpyxl.worksheet.cell_ranger   openpyxl.worksheet.merger   r   rN   	mergeCellr   r   _clean_merge_ranger   )rR   r   r   rangescrmcrr0   r0   r1   bind_merged_cells  s   z!WorksheetReader.bind_merged_cellsc                 C   s   | j jjD ]I}|jr| jj|j}|j|_d|j	v r:| j|j	 D ]}|D ]}zt
||_W q% ty7   Y q%w q!q| j|j	 }t|trK| |j}||_qd S )N:)r   rK   	hyperlinkr   r   r   r   r   targetr   r   AttributeErrorr6   r   normalize_merged_cell_linkr   )rR   linkr   r   r   r0   r0   r1   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   rN   r   top)rR   coordrngr0   r0   r1   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   rH   itemsr.   r   r   r   r   )rR   r   cdkeyr0   r0   r1   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   rG   r  r.   r   r   r   r	   )rR   r   rdr  r0   r0   r1   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)rU   rV   rW   r   rX   rY   rZ   r[   r\   rO   rP   r]   rM   r   )getattrr   r}   r   )rR   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__rT   r   r   r   r  r  r  r  r  r  r  r0   r0   r0   r1   r   b  s    	r   N)cr  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   openpyxl.cell.rich_textr   r   r   r   filtersr   header_footerr   r  r   merger   pager   r   r   	pagebreakr    r!   r   r"   scenarior#   r[   r$   datavalidationr%   tabler&   r   r'   
dimensionsr(   relatedr)   CELL_TAGr   r   rz   r   r^   r~   rd   rf   r`   rb   ry   rx   rn   ro   rp   rq   rr   rs   rt   ru   rv   rh   rj   rw   r   r   rl   r2   r9   r:   r   r0   r0   r0   r1   <module>   s~   
  