o
    b*                     @   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   )filenameZis_file_likeZfile_formatmsgarchive r8   T/var/www/secure340b-portal/env/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 r8   )ContentType).0pr8   r8   r9   	<setcomp>l   s    z&_find_workbook_part.<locals>.<setcomp>/z$File contains no valid workbook part)r   r   r   r   findZDefaultsetr   r   popIOError)packageZworkbook_typesctpartdefaultsZworkbook_typer8   r8   r9   _find_workbook_partd   s   
rH   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:   r7   namelistvalid_files	read_onlykeep_vba	data_only
keep_linksshared_strings)selffnrM   rN   rO   rP   r8   r8   r9   __init__z   s   

zExcelReader.__init__c                 C   s$   | j t}t|}t|| _d S rJ   )r7   r*   r   r(   r   	from_treerD   )rR   srcrootr8   r8   r9   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   )rD   r@   r   PartNamer7   openr   rQ   )rR   rE   Zstrings_pathrV   r8   r8   r9   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   )rP   a)rH   rD   r   r7   rY   rP   parserparsewb_sheetsrO   Z
_data_onlyrM   Z
_read_onlyr;   r   r   templaterN   r   r   r   vba_archiverL   writestrr*   Z_archive)rR   Zwb_partr_   namer8   r8   r9   read_workbook   s   



zExcelReader.read_workbookc                 C   s0   t | jv rt| jt }t|| j_d S d S rJ   )	r   rL   r(   r7   r*   r   rU   r_   
properties)rR   rV   r8   r8   r9   read_properties   s   
zExcelReader.read_propertiesc                 C   s"   t | jv r| jt | j_d S d S rJ   )r   rL   r7   r*   r_   Zloaded_themerR   r8   r8   r9   
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"   rL   r!   r7   rZ   r*   r(   r%   rU   r_   _parentrd   titleZ
_add_sheetr@   r'   	_rel_typer)   	add_chart)rR   sheetrelZ
sheet_path	rels_pathrelsrV   xmlnodecsdrawingschartsimagescr8   r8   r9   read_chartsheet   s(   


zExcelReader.read_chartsheetc                 C   sh  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|_*|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.Z
chartsheet);r]   Zfind_sheetsrj   rL   Typerz   r"   r    r!   r7   rM   r#   r_   rd   rQ   stateZsheet_stater`   appendrZ   Zcreate_sheetZ_relsr$   rO   Zbind_allr@   r   r*   r   rU   r(   commentscommentAttributeError
isinstancer   warningswarnformatrl   Z
coordinaterb   Zlegacy_drawingZtablesr&   Z	add_tabler'   rm   r)   rn   anchorZ	add_imager   Zrel_typeZTargetZpivot_cachesZcacheIdcacheZ	add_pivot)rR   Zcomment_warningro   rp   rq   rr   wsfhZ	ws_parserr-   rV   Zcomment_sheetrefr   ry   trs   tablerv   rw   rx   ZimZ	pivot_relZ
pivot_pathtreeZpivotr8   r8   r9   read_worksheets   sx   








zExcelReader.read_worksheetsc                 C   s`   |    |   |   |   |   t| j| j |   | j	
  | js.| j  d S d S rJ   )rX   r[   re   rg   ri   r   r7   r_   r   r]   Zassign_namesrM   closerh   r8   r8   r9   r*     s   
zExcelReader.readN)__name__
__module____qualname____doc__r	   rT   rX   r[   re   rg   ri   rz   r   r*   r8   r8   r8   r9   rI   t   s    
FrI   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.

    )rI   r*   r_   )r5   rM   rN   rO   rP   readerr8   r8   r9   load_workbook  s
   r   )Fr   zipfiler   r   r   sysr   ior   os.pathr/   r   Zopenpyxl.pivot.tabler   testsr	   ImportErrorZopenpyxl.utils.exceptionsr
   Zopenpyxl.xml.constantsr   r   r   r   r   r   r   r   r   r   r   r   Zopenpyxl.cellr   Zopenpyxl.comments.comment_sheetr   stringsr   Zworkbookr   Zopenpyxl.styles.stylesheetr   Zopenpyxl.packaging.corer   Zopenpyxl.packaging.manifestr   r   Zopenpyxl.packaging.relationshipr    r!   r"   Zopenpyxl.worksheet._read_onlyr#   Zopenpyxl.worksheet._readerr$   Zopenpyxl.chartsheetr%   Zopenpyxl.worksheet.tabler&   Z$openpyxl.drawing.spreadsheet_drawingr'   Zopenpyxl.xml.functionsr(   rv   r)   r3   r:   rH   rI   r   r8   r8   r8   r9   <module>   sJ   8! +