
    ddb=                        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  Z>dez  Z?dez  Z@d ez  ZAd!ez  ZBd"ez  ZCd#ez  ZDd$ez  ZEd%ez  ZFd&ez  ZGd'ez  ZHd(ez  ZId)ez  ZJd*ez  ZKd+ez  ZLd,ez  ZMd-ez  ZNd.ez  ZOd/ez  ZPd0ez  ZQd1ez  ZRd2ez  ZSd3ez  ZTd4ez  ZUd5ez  ZVd6ez  ZWd7ez  ZXd8ez  ZYd9 ZZ G d: d;e[          Z\ G 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                 V    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)values    :lib/python3.11/site-packages/openpyxl/worksheet/_reader.py_cast_numberr0   N   s<    
e| se| se| U||u::    c                       e Zd Zde e             e            fdZd Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zd Zd ZdS )WorkSheetParserFc                    d x| _         | _        || _        || _        || _        || _        i | _        i | _        dx| _        | _	        t                      | _        || _        || _        i | _        i | _        g | _        d| _        t%                      | _        g | _        d | _        d | _        t/                      | _        t3                      | _        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srcr9   r:   r7   r@   rA   s          r/   __init__zWorkSheetParser.__init__W   s     '+*t|
,"! .//4+#oo(!2 !# '//" "**"**r1   c              #     K   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t0          dt2          ft4          dt6          ft8          dt:          ft<          dt>          ft@          d	tB          ftD          d
tF          ftH          dtJ          ftL          dtN          ftP          dtR          fi}tU          | j+                  }|D ]\  }}|j,        }||v r& ||         |           |-                                 6||v rO||         }|d         .                    |          }t_          | |d         |           |-                                 |t`          k    r-| 1                    |          }	|-                                 |	V  d S )Nprint_optionspage_margins
page_setupr   auto_filterdata_validationssheet_propertiesviewssheet_format	scenariosr?   rF   rI   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   r8   tagclear	from_treesetattrROW_TAG	parse_row)
rL   
dispatcher
propertiesit_elementtag_namepropobjrows
             r/   parsezWorkSheetParser.parseq   s     T1d1T*D))4040d5	
 6.+6|^46
3/1CD/1DE/)>?K6-0L-8
3

" t{## 	 	JAw{H:% $
8$W---Z' !(+1g''00d1gs+++W$ nnW--				 	r1   c                     t          | j                  }|D ]Y\  }}|j        t          k    rt	          j        |          }|j        c S |j        t          k    r dS |                                 ZdS )z@
        Get worksheet dimensions if they are provided.
        N)	r   r8   rv   DIMENSION_TAGr&   rx   
boundariesDATA_TAGrw   )rL   r~   _eventr   dims        r/   parse_dimensionsz WorkSheetParser.parse_dimensions   s     t{##! 	 	OFG{m+ $.w77~%%%( MMOOOO	 	r1   c                    |                     dd          }|                     d          }|                     dd          }|rt          |          }|dk    rd }n|                    t          d           pd }|rt	          |          \  }}|| _        n| xj        dz  c_        | j        | j        }}| j        s3|                    t                    d}| 
                    |          }n||dk    rnt          |          }|| j        v rUd	}	 t          || j        || j        v 
          }n# t           t"          f$ r d| d| d}t%          |           d}d}Y nw xY wn|dk    r| j        t          |                   }n|dk    rt)          t          |                    }n^|dk    rd}nU|d	k    rt+          |          }n?|dk    r9|                    t,                    }	|	d}t/          j        |	          }
|
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>   r=   r:   findFORMULA_TAGparse_formular0   r@   r   r7   rA   OverflowError
ValueErrorr   r9   boolr   INLINE_STRINGr   rx   content)rL   r   r   
coordinater   r.   r   r   msgchildrichtexts              r/   
parse_cellzWorkSheetParser.parse_cell   s   KKS))	[[%%
;;sA&& 	%8}}H# 	>EE$$Y55=E 	=-j99KC%D!*D,<C~  	-',,{";";  	-I&&w//EE 	-C ,$U++t00 
* #I* *!4:TE[9[! ! ! *:6 * * * o
  o  o^c  o  o  oS			$'	 )	*
* c! ,+CJJ7c! ,SZZ((e# ,		c! ,$U+++% 	-]33 - #I#~e44H$,EFEy]efffs   D/ /-EEc                    |                     t                    }|                    d          }|                    d          }d}|j        
||j        z  }|dk    rt	          |j                  | j        |<   ne|dk    r_|                    d          }|| j        v r#| j        |         }|                    |          }n|dk    rt          ||          | j        |<   |S )zC
        possible formulae types: shared, array, datatable
        r   r   =Narraysharedsi)
r   r   r   textdictattribr<   r;   translate_formular   )rL   r   formulaformula_typer   r.   idxtranss           r/   r   zWorkSheetParser.parse_formula   s     ,,{++{{3''[[%%
< 	"W\!E7" 		J.27>.B.BD
++X% 	J++d##Cd** J,S1//
;;# J,6uj,I,I$S)r1   c                     t          |j                  }t          t          |d                             }||d<   || j        |<   d S )Nminindex)r   r   r   r-   rC   )rL   colattrsr   s       r/   rZ   z'WorkSheetParser.parse_column_dimensions  sF    SZ  "3uU|#4#455g).v&&&r1   c                     t          |j                  }d|v r	 t          |d                    _        nv# t          $ rY t          |d                   }|                                rt          |           _        nt	          |d          d          Y nw xY w xj        dz  c_        d _        d |D             }|ddhz
  r| j        t           j                  <    fd|D             } j        |fS )Nr   z is not a valid row numberr   r   c                 <    h | ]}|                     d           |S ){)
startswith).0ks     r/   	<setcomp>z,WorkSheetParser.parse_row.<locals>.<setcomp>  s)    :::aS(9(9::::r1   spansc                 :    g | ]}                     |          S  )r   )r   elrL   s     r/   
<listcomp>z-WorkSheetParser.parse_row.<locals>.<listcomp>  s%    333$$333r1   )
r   r   r-   r=   r   r,   
is_integerr>   rB   r   )rL   r   r   valkeyscellss   `     r/   r{   zWorkSheetParser.parse_row	  s1   SZ  %< 
	"P#&uSz??   P P PE#J''>>## P'*3xxD$$$c
%N%N%NOOO %$P !::5:::3.  	?9>DD$4 5 563333s333&&s   6 A BBc                     	 t          j        |          }| j                            |           d S # t          $ r}d| }t          |           Y d }~d S d }~ww xY w)NzKFailed to load a conditional formatting rule. It will be discarded. Cause: )r   rx   rG   append	TypeErrorr   )rL   r   cfr+   r   s        r/   r`   z WorkSheetParser.parse_formatting"  sw    	&099BO""2&&&&& 	 	 	c`accCIIIIIIIII	s   .2 
AAAc                     t          j        |          }|                    d          }||                    |d           || _        d S )NpasswordT)r    rx   r   set_password
protection)rL   r   r   r   s       r/   r\   z&WorkSheetParser.parse_sheet_protection+  sL    $.w77
;;z** 	4##Hd333$r1   c                     t          j        |          }|j        D ]R}t          j        |j                                        d          }d                    |          }t          |           Sd S )NUnknownz2{0} extension is not supported and will be removed)	r   rx   extr   r   uriupperformatr   )rL   r   extLstr+   ext_typer   s         r/   r^   z WorkSheetParser.parse_extensions3  sh    (11 	 	A }QU[[]]I>>HFMMhWWCIIII	 	r1   c                 F    t          j        |          }|j        | _        d S N)r'   rx   idrH   )rL   r   r   s      r/   rb   zWorkSheetParser.parse_legacy;  s"    ((!fr1   c                 <    t          j        |          }|| _        d S r   )r   rx   rJ   rL   r   brks      r/   rd   z WorkSheetParser.parse_row_breaks@       ))r1   c                 <    t          j        |          }|| _        d S r   )r   rx   rK   r   s      r/   rf   z WorkSheetParser.parse_col_breaksE  r   r1   c                 R    t                      | _        t                      | _        d S r   )r   rJ   r   rK   )rL   r   s     r/   rh   z"WorkSheetParser.parse_custom_viewsJ  s     #**"**r1   N)__name__
__module____qualname__r   setrN   r   r   r   r   rZ   r{   r`   r\   r^   rb   rd   rf   rh   r   r1   r/   r3   r3   U   s       6;$3355#&355% % % %4, , ,^  "5g 5g 5gp  2/ / /' ' '2  % % %  % % %
  
  
% % % % %r1   r3   c                   T    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd ZdS )WorksheetReaderz4
    Create a parser and apply it to a workbook
    c                     || _         t          ||||j        j        |j        j        |j        j                  | _        g | _        d S r   )wsr3   parentr7   _date_formats_timedelta_formatsparserr?   )rL   r   
xml_sourcer9   r:   s        r/   rN   zWorksheetReader.__init__V  sC    %j.29?BI,C	,. . r1   c                    | j                                         D ]\  }}|D ]z}| j        j        j        |d                  }t          | j        |d         |d         |          }|d         |_        |d         |_        || j        j        |d         |d         f<   {| j         j	        | j        _
        | j        j        r| j        j        | j        _        d S d S )Nr   r   r   )r   r   style_arrayr.   r   )r   r   r   r   _cell_stylesr   _valuer   _cellsr<   formula_attributesmax_row_current_row)rL   r   r   cellstylecs         r/   
bind_cellszWorksheetReader.bind_cells^  s    ))++ 	B 	BHC B B3D4DEd5k$x.V[\\\=";/@AUT(^<==B &*[%?"7> 	3#'7?DG   	3 	3r1   c                     | j         j        D ]C}|j        D ]9}|j        !| j        j        j        |j                 |_        || j        j        |<   :Dd S r   )	r   rG   rulesdxfIdr   r   _differential_stylesdxfconditional_formatting)rL   r   rules      r/   bind_formattingzWorksheetReader.bind_formattingk  sh    +( 	: 	:B : :: O#w~B4:NDH59.r22:	: 	:r1   c                     | j         j        j        D ]8}| j        j        |j                 }| j                            |j                   9d S r   )r   r?   	tablePartr   _relsr   r   Target)rL   r   rels      r/   bind_tableszWorksheetReader.bind_tabless  sN    #- 	+ 	+A'-%CKsz****	+ 	+r1   c                    ddl m} ddlm} | j        j        sd S g }| j        j        j        D ]G} || j        |j                  }| j        	                    |           |
                    |           H ||          | j        _        d S )Nr   )MultiCellRange)MergedCellRange)openpyxl.worksheet.cell_ranger  openpyxl.worksheet.merger  r   rI   	mergeCellr   ref_clean_merge_ranger   )rL   r  r  rangescrmcrs         r/   bind_merged_cellsz!WorksheetReader.bind_merged_cellsy  s    @@@@@@<<<<<<{' 	F+*4 	 	B!/$'2622CG&&s+++MM#-~f55r1   c                    | j         j        j        D ]}|j        r#| j        j        |j                 }|j        |_        d|j        v r@| j        |j                 D ],}|D ]'}	 t          |          |_        # t          $ r Y $w xY w-u| j        |j                 }t          |t                    r|                     |j                  }||_        d S )N:)r   rF   	hyperlinkr   r   r	  r
  targetr  r   AttributeError
isinstancer   normalize_merged_cell_linkr   )rL   linkr  r   r   s        r/   bind_hyperlinkszWorksheetReader.bind_hyperlinks  s    K*4 	& 	&Dw )gmDG,!jdh &748, ! !C # ! !!-1$ZZDNN- ! ! ! D!!! wtx(dJ// L::4?KKD!%!	& 	&s    A55
B	B	c                 d    | j         j        D ]"}||v r | j         j        |j        d          c S #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   rI   r   top)rL   coordrngs      r/   r  z*WorksheetReader.normalize_merged_cell_link  sP    
 7' 	1 	1C| 1#tw|SWQZ00001	1 	1r1   c                     | j         j                                        D ]W\  }}d|v r/t          |d                   }| j        j        j        |         |d<   t          | j        fi || j        j        |<   Xd S )Nr   )r   rC   itemsr-   r   r   r   r	   )rL   r   cdkeys       r/   bind_col_dimensionsz#WorksheetReader.bind_col_dimensions  s    {4::<< 	L 	LGC"} ?"W+&&"gn9#>7-<TW-K-K-K-KDG%c**		L 	Lr1   c                    | j         j                                        D ]d\  }}d|v r/t          |d                   }| j        j        j        |         |d<   t          | j        fi || j        j        t          |          <   ed S )Nr   )r   rB   r'  r-   r   r   r   r
   )rL   r   rdr)  s       r/   bind_row_dimensionsz#WorksheetReader.bind_row_dimensions  s    {17799 	K 	KGCby ;"S'll'.5c:3/;DG/J/Jr/J/JDG"3s88,,		K 	Kr1   c                 l    dD ]0}t          | j        |d           }|t          | j        ||           1d S )N)rP   rQ   rR   r   rS   rT   rU   rV   rW   rJ   rK   rX   rH   r   )getattrr   ry   r   )rL   r   vs      r/   bind_propertieszWorksheetReader.bind_properties  sO     	' 	'A Q--A 'A&&&	' 	'r1   c                 F   |                                   |                                  |                                  |                                  |                                  |                                  |                                  |                                  d S r   )r   r  r!  r  r*  r-  r  r1  )rL   s    r/   bind_allzWorksheetReader.bind_all  s         """  """r1   N)r   r   r   __doc__rN   r   r  r  r  r!  r  r*  r-  r1  r3  r   r1   r/   r   r   Q  s           
3 
3 
3: : :+ + +6 6 6& & &&1 1 1L L LK K K	' 	' 	'    r1   r   N)^r4  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!   rV   r"   datavalidationr#   tabler$   r}   r%   
dimensionsr&   relatedr'   CELL_TAGr   r   ru   r   rY   rz   r_   ra   r[   r]   rt   rs   ri   rj   rk   rl   rm   rn   ro   rp   rq   rc   re   rr   r   r   rg   r0   objectr3   r   r   r1   r/   <module>rL     s   % $             - , , , , , + * * * * * * * # # # # # #                 A @ @ @ @ @ 1 1 1 1 1 1        L K K K K K K K K K 4 4 4 4 4 4       ' ' ' ' ' ' $ $ $ $ $ $       ; ; ; ; ; ; ; ; ; ; ) ) ) ) ) ) ) ) ' ' ' ' ' ' " " " " " "             . . . . . .             + + + + + + & & & & & &       ]"m#	%},	=(
m
#
m
#	$}	4 =0
 =0

& =0},	.	-/]*-/
-
&6.},	 =0
-/-/-/]*-/)M9   y% y% y% y% y%f y% y% y%xv v v v vf v v v v vr1   