a
    CgE0                     @   s  d Z ddlmZ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yb   dZY n0 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 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- ddl.m/Z/m0Z0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7 ddl8m9Z9 ddl:m;Z; ddl<m=Z= ddl>m?Z? dZ@dd ZAdd  ZBG d!d" d"ZCdedd#dfd$d%ZDdS )&zRead an xlsx file into Python    )ZipFileZIP_DEFLATED)BytesION)TableDefinition   )KEEP_VBAF)InvalidFileException)ARC_CORE
ARC_CUSTOMARC_CONTENT_TYPESARC_WORKBOOK	ARC_THEMECOMMENTS_NSSHARED_STRINGSXLTMXLTXXLSMXLSX)
MergedCell)CommentSheet   )read_string_tableread_rich_text)WorkbookParser)apply_stylesheet)DocumentProperties)CustomPropertyList)ManifestOverride)RelationshipListget_dependentsget_rels_path)ReadOnlyWorksheet)WorksheetReader)
Chartsheet)Table)SpreadsheetDrawing)
fromstring)find_images)z.xlsxz.xlsmz.xltxz.xltmc                 C   sn   t | d}|s`tj| d  }|tvr`|dkr8d}n |dkrFd}n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 r7   T/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/openpyxl/reader/excel.py_validate_archiveB   s     	

r9   c                 C   sj   t tttg}|D ]}| |}|r|  S qdd | jD }|t|@ }|r^tdt |	 S t
dd S )Nc                 S   s   h | ]
}|j qS r7   )ContentType).0pr7   r7   r8   	<setcomp>k       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_typer7   r7   r8   _find_workbook_partc   s    

rH   c                   @   sl   e Zd ZdZded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d ZdS )ExcelReaderzQ
    Read an Excel package and dispatch the contents to the relevant modules
    FTc                 C   s>   t || _| j | _|| _|| _|| _|| _|| _g | _	d S N)
r9   r6   namelistvalid_files	read_onlykeep_vba	data_only
keep_links	rich_textshared_strings)selffnrM   rN   rO   rP   rQ   r7   r7   r8   __init__y   s    
zExcelReader.__init__c                 C   s$   | j t}t|}t|| _d S rJ   )r6   r)   r   r'   r   	from_treerD   )rS   srcrootr7   r7   r8   read_manifest   s    zExcelReader.read_manifestc                 C   sj   | j t}t}| jrt}|d urf|jdd  }| j|}||| _	W d    n1 s\0    Y  d S )Nr   )
rD   r@   r   r   rQ   r   PartNamer6   openrR   )rS   rE   readerZstrings_pathrW   r7   r7   r8   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rtt dt|_| jD ]}|j|| j| q|| jr| j|_|| _d S )Nr   )rP   a)rH   rD   r   r6   rZ   rP   parserparsewb_sheetsrO   Z
_data_onlyrM   Z
_read_onlyr:   r   r   templaterN   r   r   r   vba_archiverL   writestrr)   Z_archive)rS   Zwb_partra   namer7   r7   r8   read_workbook   s    


zExcelReader.read_workbookc                 C   s,   t | jv r(t| jt }t|| j_d S rJ   )	r	   rL   r'   r6   r)   r   rV   ra   Z
propertiesrS   rW   r7   r7   r8   read_properties   s    
zExcelReader.read_propertiesc                 C   s,   t | jv r(t| jt }t|| j_d S rJ   )	r
   rL   r'   r6   r)   r   rV   ra   Zcustom_doc_propsrh   r7   r7   r8   read_custom   s    
zExcelReader.read_customc                 C   s   t | jv r| jt | j_d S rJ   )r   rL   r6   r)   ra   Zloaded_theme)rS   r7   r7   r8   
read_theme   s    
zExcelReader.read_themec                 C   s   |j }t|}g }|| jv r(t| j|}| j|d}| }W d    n1 sT0    Y  t|}t	|}	| j
|	_|j|	_| j
|	 |tj}
|
D ]*}t| j|j \}}|D ]}|	| qqd S )Nr,   )targetr!   rL   r    r6   r[   r)   r'   r$   rV   ra   _parentrf   titleZ
_add_sheetr@   r&   	_rel_typer(   	add_chart)rS   sheetrelZ
sheet_path	rels_pathrelsrW   xmlnodecsdrawingschartsimagescr7   r7   r8   read_chartsheet   s"    
&
zExcelReader.read_chartsheetc                 C   s  d}| j  D ]\}}|j| jvr&qd|jv r>| || qt|j}t }|| jv rdt| j	|}| j
rt| j|j|j| j}|j|_| jj| qnH| j	|j}| j|j}||_t||| j| j| j}|  |  |tD ]}	| j	|	j}
tt |
}|j!D ]^\}}z||| _"W nD t#yl   || }t$|t%rht&'|(|j)|j* Y qY n0 qq| jj+r|j,r|-|j,j|_,nd |_,|j.D ].}| j	|}
t |
}t/|}|0| q|t1j2}|D ]L}t3| j	|j\}}|D ]}|4||j5 q|D ]}|6||j5 qq|t7j8}| j j9}|D ]@}	|	j:}| j	|}
t |
}t7|}||j; |_<|=| qJ|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_sheetsrl   rL   Typer|   r!   r   r    r6   rM   r"   ra   rf   rR   stateZsheet_staterb   appendr[   Zcreate_sheetZ_relsr#   rO   rQ   Zbind_allcloser@   r   r)   r   rV   r'   commentscommentAttributeError
isinstancer   warningswarnformatrn   Z
coordinaterd   Zlegacy_drawinggetZtablesr%   Z	add_tabler&   ro   r(   rp   anchorZ	add_imager   Zrel_typepivot_cachesZTargetZcacheIdcacheZ	add_pivot)rS   Zcomment_warningrq   rr   rs   rt   wsfhZ	ws_parserr,   rW   Zcomment_sheetrefr   r{   tru   tablerx   ry   rz   ZimZ	pivot_relr   Z
pivot_pathtreeZpivotr7   r7   r8   read_worksheets   st    





zExcelReader.read_worksheetsc              
   C   s   d}z|    d}|   d}|   d}|   d}|   d}|   d}t| j| j d}| 	  d	}| j
  | js| j  W n@ ty } z(td
| d| jj d|W Y d }~n
d }~0 0 d S )Nzread manifestzread stringszread workbookzread propertieszread custom propertiesz
read themezread stylesheetzread worksheetszassign namesz#Unable to read workbook: could not z from z~.
This is most probably because the workbook source files contain some invalid XML.
Please see the exception for more details.)rY   r]   rg   ri   rj   rk   r   r6   ra   r   r_   Zassign_namesrM   r   
ValueErrorr4   )rS   actioner7   r7   r8   r)     s6    
zExcelReader.readN)__name__
__module____qualname____doc__r   rU   rY   r]   rg   ri   rj   rk   r|   r   r)   r7   r7   r7   r8   rI   s   s   
JrI   Tc                 C   s    t | |||||}|  |jS )aE  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: preserve 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

    :param rich_text: if set to True openpyxl will preserve any rich text formatting in cells. The default is False
    :type rich_text: 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)   ra   )r4   rM   rN   rO   rP   rQ   r\   r7   r7   r8   load_workbook<  s
    r   )Er   zipfiler   r   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   Zopenpyxl.cellr   Zopenpyxl.comments.comment_sheetr   stringsr   r   Zworkbookr   Zopenpyxl.styles.stylesheetr   Zopenpyxl.packaging.corer   Zopenpyxl.packaging.customr   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'   rx   r(   r2   r9   rH   rI   r   r7   r7   r7   r8   <module>   sF   
4! J