o
    ˷e*                     @   s  d Z ddlmZmZmZ ddlmZ ddlmZ ddl	Z
ddlZddlmZ zddlmZ W n ey9   d	ZY nw dd
lmZ ddlmZmZmZmZmZmZmZmZmZ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+ ddl,m-Z-m.Z. ddl/m0Z0m1Z1m2Z2 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ZAdd ZBdd  ZCG d!d" d"ZDd	ed	d#fd$d%ZEdS )&zRead an xlsx file into Python    )ZipFileZIP_DEFLATED
BadZipfile)exc_info)BytesION)TableDefinition   )KEEP_VBAF)InvalidFileException)ARC_SHARED_STRINGSARC_COREARC_CONTENT_TYPESARC_WORKBOOK	ARC_THEMECOMMENTS_NSSHARED_STRINGSEXTERNAL_LINKXLTMXLTXXLSMXLSX)
MergedCell)CommentSheet   )read_string_table)WorkbookParser)apply_stylesheet)DocumentProperties)ManifestOverride)RelationshipListget_dependentsget_rels_path)ReadOnlyWorksheet)WorksheetReader)
Chartsheet)Table)SpreadsheetDrawing)
fromstring)find_images)z.xlsxz.xlsmz.xltxz.xltmc                 C   sz   t | d}|s6tj| d  }|tvr6|dkrd}t||dkr)d}t|d|dtf }t|t| d	}|S )
a  
    Does a first check whether filename is a string or a file-like
    object. If it is a string representing a filename, a check is done
    for supported formats by checking the given file-extension. If the
    file-extension is not in SUPPORTED_FORMATS an InvalidFileException
    will raised. Otherwise the filename (resp. file-like object) will
    forwarded to zipfile.ZipFile returning a ZipFile-Instance.
    readz.xlszopenpyxl does not support the old .xls file format, please use xlrd to read this file, or convert it to the more recent .xlsx file format.z.xlsbz|openpyxl does not support binary format .xlsb, please convert this file to .xlsx format if you want to open it with openpyxlzropenpyxl does not support %s file format, please check you can open it with Excel first. Supported formats are: %s,r)	hasattrospathsplitextlowerSUPPORTED_FORMATSjoinr
   r   )filenameis_file_likefile_formatmsgarchive r:   L/var/www/ideatree/venv/lib/python3.10/site-packages/openpyxl/reader/excel.py_validate_archiveC   s$   
		
r<   c                 C   sf   t tttg}|D ]}| |}|r|  S qdd | jD }|t|@ }|r/tdt |	 S t
d)Nc                 S   s   h | ]}|j qS r:   )ContentType).0pr:   r:   r;   	<setcomp>l   s    z&_find_workbook_part.<locals>.<setcomp>/z$File contains no valid workbook part)r   r   r   r   findDefaultsetr   r   popIOError)packageworkbook_typesctpartdefaultsworkbook_typer:   r:   r;   _find_workbook_partd   s   
rM   c                   @   sb   e Zd ZdZded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S )ExcelReaderzQ
    Read an Excel package and dispatch the contents to the relevant modules
    FTc                 C   s8   t || _| j | _|| _|| _|| _|| _g | _d S N)	r<   r9   namelistvalid_files	read_onlykeep_vba	data_only
keep_linksshared_strings)selffnrR   rS   rT   rU   r:   r:   r;   __init__z   s   

zExcelReader.__init__c                 C   s$   | j t}t|}t|| _d S rO   )r9   r*   r   r(   r   	from_treerG   )rW   srcrootr:   r:   r;   read_manifest   s   zExcelReader.read_manifestc                 C   sb   | j t}|d ur/|jdd  }| j|}t|| _W d    d S 1 s(w   Y  d S d S )Nr   )rG   rB   r   PartNamer9   openr   rV   )rW   rI   strings_pathr[   r:   r:   r;   read_strings   s   "zExcelReader.read_stringsc                 C   s   t | j}t| j|jdd  | jd| _| j  | jj}g |_	| j
|_| j|_|jttfv |_| jrLtt dt|_| jD ]}|j|| j| q>| jrS| j|_|| _d S )Nr   )rU   a)rM   rG   r   r9   r^   rU   parserparsewb_sheetsrT   
_data_onlyrR   
_read_onlyr=   r   r   templaterS   r   r   r   vba_archiverQ   writestrr*   _archive)rW   wb_partre   namer:   r:   r;   read_workbook   s   



zExcelReader.read_workbookc                 C   s0   t | jv rt| jt }t|| j_d S d S rO   )	r   rQ   r(   r9   r*   r   rZ   re   
properties)rW   r[   r:   r:   r;   read_properties   s   
zExcelReader.read_propertiesc                 C   s"   t | jv r| jt | j_d S d S rO   )r   rQ   r9   r*   re   loaded_themerW   r:   r:   r;   
read_theme   s   
zExcelReader.read_themec                 C   s   |j }t|}g }|| jv rt| j|}| j|d}| }W d    n1 s*w   Y  t|}t	|}	| j
|	_|j|	_| j
|	 |tj}
|
D ]}t| j|j \}}|D ]}|	| q[qNd S )Nr-   )targetr"   rQ   r!   r9   r_   r*   r(   r%   rZ   re   _parentrn   title
_add_sheetrB   r'   	_rel_typer)   	add_chart)rW   sheetrel
sheet_path	rels_pathrelsr[   xmlnodecsdrawingschartsimagescr:   r:   r;   read_chartsheet   s(   


zExcelReader.read_chartsheetc                 C   sp  d}| j  D ]-\}}|j| jvrqd|jv r| || qt|j}t }|| jv r2t| j	|}| j
rLt| j|j|j| j}|j|_| jj| q| j	|j}| j|j}||_t||| j| j}|  |tD ]>}	| j	|	j}
tt|
}|jD ]*\}}z||| _ W q t!y   || }t"|t#rt$%|&|j'|j( Y qY qw qo| jj)r|j*r||j* j|_*nd |_*|j+D ]}| j	|}
t|
}t,|}|-| q|t.j/}|D ]#}t0| j	|j\}}|D ]	}|1||j2 q|D ]	}|3||j2 qq|t4j5}|D ]"}	|	j6}| j	|}
t|
}t4|}| j j7|j8 |_9|:| q|j|_qd S )Nz~Cell '{0}':{1} is part of a merged range but has a comment which will be removed because merged cells cannot contain any data.
chartsheet);rc   find_sheetsru   rQ   Typer   r"   r    r!   r9   rR   r#   re   rn   rV   statesheet_staterf   appendr_   create_sheet_relsr$   rT   bind_allrB   r   r*   r   rZ   r(   commentscommentAttributeError
isinstancer   warningswarnformatrw   
coordinaterj   legacy_drawingtablesr&   	add_tabler'   ry   r)   rz   anchor	add_imager   rel_typeTargetpivot_cachescacheIdcache	add_pivot)rW   comment_warningr{   r|   r~   r   wsfh	ws_parserr-   r[   comment_sheetrefr   r   tr   tabler   r   r   im	pivot_rel
pivot_pathtreepivotr:   r:   r;   read_worksheets   sz   








zExcelReader.read_worksheetsc                 C   s`   |    |   |   |   |   t| j| j |   | j	
  | js.| j  d S d S rO   )r]   ra   ro   rq   rt   r   r9   re   r   rc   assign_namesrR   closers   r:   r:   r;   r*     s   
zExcelReader.readN)__name__
__module____qualname____doc__r	   rY   r]   ra   ro   rq   rt   r   r   r*   r:   r:   r:   r;   rN   t   s    
HrN   Tc                 C   s   t | ||||}|  |jS )a  Open the given filename and return the workbook

    :param filename: the path to open or a file-like object
    :type filename: string or a file-like object open in binary mode c.f., :class:`zipfile.ZipFile`

    :param read_only: optimised for reading, content cannot be edited
    :type read_only: bool

    :param keep_vba: preseve vba content (this does NOT mean you can use it)
    :type keep_vba: bool

    :param data_only: controls whether cells with formulae have either the formula (default) or the value stored the last time Excel read the sheet
    :type data_only: bool

    :param keep_links: whether links to external workbooks should be preserved. The default is True
    :type keep_links: bool

    :rtype: :class:`openpyxl.workbook.Workbook`

    .. note::

        When using lazy load, all worksheets will be :class:`openpyxl.worksheet.iter_worksheet.IterableWorksheet`
        and the returned workbook will be read-only.

    )rN   r*   re   )r5   rR   rS   rT   rU   readerr:   r:   r;   load_workbook   s
   r   )Fr   zipfiler   r   r   sysr   ior   os.pathr/   r   openpyxl.pivot.tabler   testsr	   ImportErroropenpyxl.utils.exceptionsr
   openpyxl.xml.constantsr   r   r   r   r   r   r   r   r   r   r   r   openpyxl.cellr   openpyxl.comments.comment_sheetr   stringsr   workbookr   openpyxl.styles.stylesheetr   openpyxl.packaging.corer   openpyxl.packaging.manifestr   r   openpyxl.packaging.relationshipr    r!   r"   openpyxl.worksheet._read_onlyr#   openpyxl.worksheet._readerr$   openpyxl.chartsheetr%   openpyxl.worksheet.tabler&   $openpyxl.drawing.spreadsheet_drawingr'   openpyxl.xml.functionsr(   r   r)   r3   r<   rM   rN   r   r:   r:   r:   r;   <module>   sJ   8! -