U
    f*                     @   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k
rt   d	ZY nX 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   sn   t | d}|s`tj| d  }|tk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 r8   9/tmp/pip-unpacked-wheel-85dym84g/openpyxl/reader/excel.py_validate_archiveC   s     	

r:   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 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   sH   | j t}|d k	rD|jdd  }| j|}t|| _W 5 Q R X 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k|_| jrtt dt|_| jD ]}|j|| j| q|| jr| 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   s,   t | jkr(t| jt }t|| j_d S rJ   )	r   rL   r(   r7   r*   r   rU   r_   Z
properties)rR   rV   r8   r8   r9   read_properties   s    
zExcelReader.read_propertiesc                 C   s   t | jkr| jt | j_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kr(t| j|}| j|d}| }W 5 Q R X t|}t	|}	| j
|	_|j|	_| j
|	 |tj}
|
D ]*}t| j|j \}}|D ]}|	| qqd 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   s  d}| j  D ]t\}}|j| jkr&qd|jkr>| || qt|j}t }|| jkrdt| j	|}| j
rt| j|j|j| j}|j|_| jj| qn<| j	|j}| j|j}||_t||| j| j}|  |tD ]}	| j	|	j}
tt|
}|jD ]`\}}z||| _ W nF t!k
rb   || }t"|t#r^t$%|&|j'|j( Y qY nX qq| jj)r|j*r||j* j|_*nd |_*|j+D ].}| j	|}
t|
}t,|}|-| q|t.j/}|D ]L}t0| j	|j\}}|D ]}|1||j2 q|D ]}|3||j2 qq|t4j5}|D ]D}	|	j6}| j	|}
t|
}t4|}| j j7|j8 |_9|:| q6|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_sheetsri   rL   Typery   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formatrk   Z
coordinaterb   Zlegacy_drawingZtablesr&   Z	add_tabler'   rl   r)   rm   anchorZ	add_imager   Zrel_typeZTargetZpivot_cachesZcacheIdcacheZ	add_pivot)rR   Zcomment_warningrn   ro   rp   rq   wsfhZ	ws_parserr-   rV   Zcomment_sheetrefr~   rx   trr   tableru   rv   rw   ZimZ	pivot_relZ
pivot_pathtreeZpivotr8   r8   r9   read_worksheets   sp    





zExcelReader.read_worksheetsc                 C   s\   |    |   |   |   |   t| j| j |   | j	
  | jsX| j  d S rJ   )rX   r[   re   rf   rh   r   r7   r_   r   r]   Zassign_namesrM   closerg   r8   r8   r9   r*     s    
zExcelReader.readN)__name__
__module____qualname____doc__r	   rT   rX   r[   re   rf   rh   ry   r   r*   r8   r8   r8   r9   rI   t   s    
HrI   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(   ru   r)   r3   r:   rH   rI   r   r8   r8   r8   r9   <module>   sH   
8! - 