a
    èÞJb`^  ã                   @   sì   d dl Z d dlZd dl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 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 ddlmZ ddl m!Z! G dd„ de"ƒZ#dS )é    N)Úcopy)ÚStringIO)ÚBytesIOé   )ÚApp)ÚContentTypes)ÚCore)ÚCustom)ÚMetadata)ÚRelationships)ÚSharedStrings)ÚStyles)ÚTheme)ÚVml)ÚTable)ÚComments)ÚEmptyChartSeriesc                       s  e Zd ZdZ‡ 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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*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Z d<d=„ Z!d>d?„ Z"‡  Z#S )@ÚPackagera~  
    A class for writing the Excel XLSX Packager file.

    This module is used in conjunction with XlsxWriter to create an
    Excel XLSX container file.

    From Wikipedia: The Open Packaging Conventions (OPC) is a
    container-file technology initially created by Microsoft to store
    a combination of XML and non-XML files that together form a single
    entity such as an Open XML Paper Specification (OpenXPS)
    document. http://en.wikipedia.org/wiki/Open_Packaging_Conventions.

    At its simplest an Excel XLSX file contains the following elements::

         ____ [Content_Types].xml
        |
        |____ docProps
        | |____ app.xml
        | |____ core.xml
        |
        |____ xl
        | |____ workbook.xml
        | |____ worksheets
        | | |____ sheet1.xml
        | |
        | |____ styles.xml
        | |
        | |____ theme
        | | |____ theme1.xml
        | |
        | |_____rels
        | |____ workbook.xml.rels
        |
        |_____rels
          |____ .rels

    The Packager class coordinates the classes that represent the
    elements of the package and writes them into the XLSX file.

    c                    sZ   t t| ƒ ¡  d| _d| _d| _d| _d| _d| _d| _	d| _
d| _d| _g | _g | _dS )z
        Constructor.

        Ú FNr   )Úsuperr   Ú__init__ÚtmpdirÚ	in_memoryÚworkbookÚworksheet_countÚchartsheet_countÚchart_countÚdrawing_countÚtable_countÚnum_vml_filesÚnum_comment_filesÚnamed_rangesÚ	filenames©Úself©Ú	__class__© ú2lib/python3.9/site-packages/xlsxwriter/packager.pyr   R   s    zPackager.__init__c                 C   s
   || _ d S ©N)r   )r$   r   r'   r'   r(   Ú_set_tmpdirm   s    zPackager._set_tmpdirc                 C   s
   || _ d S r)   )r   )r$   r   r'   r'   r(   Ú_set_in_memoryq   s    zPackager._set_in_memoryc                 C   sn   || _ t|jƒ| _t|jƒ| _|j| _|j| _|j| _| j  	¡ D ](}|j
rZ|  jd7  _q@|  jd7  _q@d S ©Nr   )r   ÚlenÚchartsr   Údrawingsr   r   r    r!   Ú
worksheetsÚis_chartsheetr   r   )r$   r   Ú	worksheetr'   r'   r(   Ú_add_workbooku   s    zPackager._add_workbookc                 C   s¾   |   ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  	¡  |  
¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  | jS r)   )Ú_write_content_types_fileÚ_write_root_rels_fileÚ_write_workbook_rels_fileÚ_write_worksheet_filesÚ_write_chartsheet_filesÚ_write_workbook_fileÚ_write_chart_filesÚ_write_drawing_filesÚ_write_vml_filesÚ_write_comment_filesÚ_write_table_filesÚ_write_shared_strings_fileÚ_write_styles_fileÚ_write_custom_fileÚ_write_theme_fileÚ_write_worksheet_rels_filesÚ_write_chartsheet_rels_filesÚ_write_drawing_rels_filesÚ_add_image_filesÚ_add_vba_projectÚ_write_core_fileÚ_write_app_fileÚ_write_metadata_filer"   r#   r'   r'   r(   Ú_create_package„   s0    zPackager._create_packagec                 C   s@   | j rtƒ }ntj| jd\}}t |¡ | j ||df¡ |S )N)ÚdirF)	r   r   ÚtempfileZmkstempr   ÚosÚcloser"   Úappend)r$   Zxml_filenameÚos_filenameÚfdr'   r'   r(   Ú	_filename    s    
zPackager._filenamec                 C   s"   | j }| |  d¡¡ | ¡  d S )Núxl/workbook.xml)r   Ú_set_xml_writerrS   Ú_assemble_xml_file)r$   r   r'   r'   r(   r9   ­   s    zPackager._write_workbook_filec                 C   sb   d}| j  ¡ D ]N}|jrq|jr0| ¡  | ¡  | |  dt|ƒ d ¡¡ | 	¡  |d7 }qd S )Nr   zxl/worksheets/sheetú.xml)
r   r0   r1   Zconstant_memoryZ_opt_reopenZ_write_single_rowrU   rS   ÚstrrV   ©r$   Úindexr2   r'   r'   r(   r7   ´   s    
ÿÿzPackager._write_worksheet_filesc                 C   sL   d}| j  ¡ D ]8}|jsq| |  dt|ƒ d ¡¡ | ¡  |d7 }qd S )Nr   zxl/chartsheets/sheetrW   )r   r0   r1   rU   rS   rX   rV   rY   r'   r'   r(   r8   Ä   s    
ÿÿz Packager._write_chartsheet_filesc                 C   s`   | j jsd S d}| j jD ]B}|js.td| ƒ‚| |  dt|ƒ d ¡¡ | ¡  |d7 }qd S )Nr   zFChart%d must contain at least one data series. See chart.add_series().zxl/charts/chartrW   )r   r.   Zseriesr   rU   rS   rX   rV   )r$   rZ   Úchartr'   r'   r(   r:   Ð   s    þ
ÿÿzPackager._write_chart_filesc                 C   sL   | j s
d S d}| jjD ]0}| |  dt|ƒ d ¡¡ | ¡  |d7 }qd S )Nr   zxl/drawings/drawingrW   )r   r   r/   rU   rS   rX   rV   )r$   rZ   Údrawingr'   r'   r(   r;   â   s    
ÿÿzPackager._write_drawing_filesc                 C   sÆ   d}| j  ¡ D ]²}|js |js q|jrhtƒ }| |  dt|ƒ d ¡¡ | |j	|j
|j|j¡ |d7 }|jrtƒ }| |  dt|ƒ d ¡¡ | |j|jd d d |j¡ |  ||¡ |d7 }qd S )Nr   zxl/drawings/vmlDrawingz.vmli   )r   r0   Zhas_vmlZhas_header_vmlr   rU   rS   rX   rV   Zvml_data_idZvml_shape_idÚcomments_listZbuttons_listZvml_header_idZheader_images_listÚ_write_vml_drawing_rels_file)r$   rZ   r2   Úvmlr'   r'   r(   r<   î   s@    
ÿÿý
ÿÿüzPackager._write_vml_filesc                 C   sV   d}| j  ¡ D ]B}|jsqtƒ }| |  dt|ƒ d ¡¡ | |j¡ |d7 }qd S )Nr   zxl/commentsrW   )	r   r0   Úhas_commentsr   rU   rS   rX   rV   r]   )r$   rZ   r2   Zcommentr'   r'   r(   r=     s    
ÿÿzPackager._write_comment_filesc                 C   s:   t ƒ }| jj|_| jjjsd S | |  d¡¡ | ¡  d S )Nzxl/sharedStrings.xml)r   r   Ú	str_tableZstring_tableÚcountrU   rS   rV   )r$   Zsstr'   r'   r(   r?     s    

z#Packager._write_shared_strings_filec                 C   sÖ   | j j}tƒ }| d| jg¡ | d| jg¡ | j  ¡ D ]}|jrDq8| |j	¡ q8| j  ¡ D ]}|jshq\| |j	¡ q\| j
r| dt| j
ƒg¡ | j
D ]}| |¡ q–| |¡ | j j|_| |  d¡¡ | ¡  d S )NZ
WorksheetsZChartszNamed RangesúdocProps/app.xml)r   Údoc_propertiesr   Z_add_heading_pairr   r   r0   r1   Z_add_part_nameÚnamer!   r-   Ú_set_propertiesZ	read_onlyZdoc_securityrU   rS   rV   )r$   Ú
propertiesÚappr2   Znamed_ranger'   r'   r(   rI   $  s(    


zPackager._write_app_filec                 C   s4   | j j}tƒ }| |¡ | |  d¡¡ | ¡  d S )NúdocProps/core.xml)r   rd   r   rf   rU   rS   rV   )r$   rg   Úcorer'   r'   r(   rH   I  s
    
zPackager._write_core_filec                 C   s.   | j jsd S tƒ }| |  d¡¡ | ¡  d S )Nzxl/metadata.xml)r   Úhas_metadatar
   rU   rS   rV   )r$   Úmetadatar'   r'   r(   rJ   R  s
    zPackager._write_metadata_filec                 C   s@   | j j}tƒ }t|ƒsd S | |¡ | |  d¡¡ | ¡  d S )NúdocProps/custom.xml)r   Úcustom_propertiesr	   r-   rf   rU   rS   rV   )r$   rg   Úcustomr'   r'   r(   rA   [  s    
zPackager._write_custom_filec                 C   s†  t ƒ }| | jj¡ |  ¡  d}d}| j ¡ D ]@}|jrT| dt|ƒ ¡ |d7 }q.| 	dt|ƒ ¡ |d7 }q.t
d| jd ƒD ]}| dt|ƒ ¡ q€t
d| jd ƒD ]}| dt|ƒ ¡ q¨| jrÎ| ¡  t
d| jd ƒD ]}| dt|ƒ ¡ qÞt
d| jd ƒD ]}| dt|ƒ ¡ q| jjjr4| ¡  | jjrF| ¡  | jjrX| ¡  | jjrj| ¡  | |  d¡¡ |  ¡  d S )Nr   Zsheetr[   r\   ÚtableÚcommentsz[Content_Types].xml)!r   Z_add_image_typesr   Zimage_typesÚ_get_table_countr0   r1   Z_add_chartsheet_namerX   Z_add_worksheet_nameÚranger   Z_add_chart_namer   Z_add_drawing_namer   Z_add_vml_namer   Z_add_table_namer    Z_add_comment_namera   rb   Z_add_shared_stringsÚvba_projectrG   rn   Z_add_custom_propertiesrk   Z_add_metadatarU   rS   rV   )r$   ZcontentÚworksheet_indexÚchartsheet_indexr2   Úir'   r'   r(   r4   g  s>    




z"Packager._write_content_types_filec                 C   s†   | j j}| j j}| j j}| j j}| j j}| j j}| j j}| j j}| j j	}	t
ƒ }
|
 |||||||||	g	¡ |
 |  d¡¡ |
 ¡  d S )Nzxl/styles.xml)r   Ú
xf_formatsÚpaletteÚ
font_countÚnum_format_countÚborder_countÚ
fill_countÚcustom_colorsÚdxf_formatsr`   r   Z_set_style_propertiesrU   rS   rV   )r$   rx   ry   rz   r{   r|   r}   r~   r   r`   Ústylesr'   r'   r(   r@   š  s.    ÷zPackager._write_styles_filec                 C   s"   t ƒ }| |  d¡¡ | ¡  d S )Nzxl/theme/theme1.xml)r   rU   rS   rV   )r$   Úthemer'   r'   r(   rB   µ  s    zPackager._write_theme_filec              	   C   sj   d}| j  ¡ D ]V}|j}|sq|D ]@}tƒ }| |  dt|ƒ d ¡¡ | |¡ | ¡  |d7 }q"qd S )Nr   zxl/tables/tablerW   )	r   r0   Útablesr   rU   rS   rX   rf   rV   )r$   rZ   r2   Útable_propsrp   r'   r'   r(   r>   ¼  s    
ÿÿ
zPackager._write_table_filesc                 C   s.   | j  ¡ D ]}|jD ]}|  jd7  _qq
d S r,   )r   r0   r‚   r   )r$   r2   rƒ   r'   r'   r(   rr   Í  s    
zPackager._get_table_countc                 C   sZ   t ƒ }| dd¡ | dd¡ | dd¡ | jjr>| dd¡ | |  d	¡¡ | ¡  d S )
Nz/officeDocumentrT   z/metadata/core-propertiesri   z/extended-propertiesrc   z/custom-propertiesrm   z_rels/.rels)r   Ú_add_document_relationshipZ_add_package_relationshipr   rn   rU   rS   rV   )r$   Úrelsr'   r'   r(   r5   Ó  s    ÿÿÿzPackager._write_root_rels_filec                 C   sØ   t ƒ }d}d}| j ¡ D ]L}|jrD| ddt|ƒ d ¡ |d7 }q| ddt|ƒ d ¡ |d7 }q| dd¡ | d	d
¡ | jjjr”| dd¡ | jjr¨| 	dd¡ | jj
r¼| dd¡ | |  d¡¡ | ¡  d S )Nr   z/chartsheetzchartsheets/sheetrW   z
/worksheetzworksheets/sheetz/themeztheme/theme1.xmlz/stylesz
styles.xmlz/sharedStringszsharedStrings.xmlz/vbaProjectzvbaProject.binz/sheetMetadatazmetadata.xmlzxl/_rels/workbook.xml.rels)r   r   r0   r1   r„   rX   ra   rb   rt   Z_add_ms_package_relationshiprk   rU   rS   rV   )r$   r…   ru   rv   r2   r'   r'   r(   r6   ç  sB    ÿþÿ
ÿþÿ

ÿz"Packager._write_workbook_rels_filec                 C   s   d}| j  ¡ D ]|}|jrq|d7 }|j|j |j |j |j |j }|sLqt	ƒ }|D ]}|j
|Ž  qV| |  dt|ƒ d ¡¡ | ¡  qd S )Nr   r   zxl/worksheets/_rels/sheetú	.xml.rels)r   r0   r1   Zexternal_hyper_linksÚexternal_drawing_linksZexternal_vml_linksZexternal_table_linksZexternal_background_linksZexternal_comment_linksr   Ú_add_worksheet_relationshiprU   rS   rX   rV   ©r$   rZ   r2   Zexternal_linksr…   Z	link_datar'   r'   r(   rC     s6    ÿþýüû
ÿÿz$Packager._write_worksheet_rels_filesc                 C   sr   d}| j  ¡ D ]^}|jsq|d7 }|j}|s.qtƒ }|D ]}|j|Ž  q8| |  dt|ƒ d ¡¡ | 	¡  qd S )Nr   r   zxl/chartsheets/_rels/sheetr†   )
r   r0   r1   r‡   r   rˆ   rU   rS   rX   rV   r‰   r'   r'   r(   rD   .  s"    
ÿÿz%Packager._write_chartsheet_rels_filesc                 C   sn   d}| j  ¡ D ]Z}|jr |d7 }|js(qtƒ }|jD ]}|j|Ž  q4| |  dt|ƒ d ¡¡ | 	¡  qd S )Nr   r   zxl/drawings/_rels/drawingr†   )
r   r0   r\   Zdrawing_linksr   r„   rU   rS   rX   rV   )r$   rZ   r2   r…   Údrawing_datar'   r'   r(   rE   H  s    

ÿÿz"Packager._write_drawing_rels_filesc                 C   sD   t ƒ }|jD ]}|j|Ž  q| |  dt|ƒ d ¡¡ | ¡  d S )Nzxl/drawings/_rels/vmlDrawingz	.vml.rels)r   Zvml_drawing_linksr„   rU   rS   rX   rV   )r$   r2   rZ   r…   rŠ   r'   r'   r(   r^   ]  s    

ÿþz%Packager._write_vml_drawing_rels_filec              	   C   s  | j }d}|jD ]î}|d }d|d  }|d }dt|ƒ | }| js¶|  |¡}|rxt|dd}	|	 | ¡ ¡ |	 ¡  qöt	||ƒ zt
 |t
 |¡jtjB ¡ W qö ty²   Y qö0 n@|rÀ|}n$t|dd}
|
 ¡ }t|ƒ}|
 ¡  | j ||d	f¡ |d7 }qd S )
Nr   r   Ú.é   zxl/media/imageÚwb©ÚmodeÚrbT)r   ZimagesrX   r   rS   ÚopenÚwriteÚgetvaluerO   r   rN   ÚchmodÚstatÚst_modeÚS_IWRITEÚOSErrorÚreadr   r"   rP   )r$   r   rZ   ZimageÚfilenameÚextZ
image_dataZxml_image_namerQ   Úos_fileZ
image_filer'   r'   r(   rF   m  s8    



ÿzPackager._add_image_filesc                 C   s¤   | j j}| j j}|sd S d}| js`|  |¡}|rTt|dd}| | ¡ ¡ | ¡  q t	||ƒ n@|rj|}n$t|dd}| 
¡ }t|ƒ}| ¡  | j ||df¡ d S )Nzxl/vbaProject.binr   rŽ   r   T)r   rt   Úvba_is_streamr   rS   r‘   r’   r“   rO   r   r™   r   r"   rP   )r$   rt   r   Zxml_vba_namerQ   rœ   Zvba_fileZvba_datar'   r'   r(   rG   š  s&    

zPackager._add_vba_project)$Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r*   r+   r3   rK   rS   r9   r7   r8   r:   r;   r<   r=   r?   rI   rH   rJ   rA   r4   r@   rB   r>   rr   r5   r6   rC   rD   rE   r^   rF   rG   Ú__classcell__r'   r'   r%   r(   r   "   s@   /%		3(-r   )$rN   r•   rM   Úshutilr   Úior   r   rh   r   Zcontenttypesr   rj   r   ro   r	   rl   r
   Zrelationshipsr   Zsharedstringsr   r€   r   r   r   r_   r   rp   r   rq   r   Ú
exceptionsr   Úobjectr   r'   r'   r'   r(   Ú<module>
   s&   