B
    ±ªt\ Z  ã               @   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  G dd„ de!ƒZ"dS )é    N)Úcopyé   )ÚStringIO)ÚBytesIO)ÚApp)ÚContentTypes)ÚCore)ÚCustom)Ú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 ‡  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.7/site-packages/xlsxwriter/packager.pyr   P   s    zPackager.__init__c             C   s
   || _ d S )N)r   )r"   r   r$   r$   r%   Ú_set_tmpdirk   s    zPackager._set_tmpdirc             C   s
   || _ d S )N)r   )r"   r   r$   r$   r%   Ú_set_in_memoryo   s    zPackager._set_in_memoryc             C   sr   || _ t|jƒ| _t|jƒ| _|j| _|j| _|j| _x6| j  	¡ D ](}|j
r\|  jd7  _qB|  jd7  _qBW d S )Nr   )r   ÚlenÚchartsr   Údrawingsr   r   r   r    Ú
worksheetsÚis_chartsheetr   r   )r"   r   Ú	worksheetr$   r$   r%   Ú_add_workbooks   s    zPackager._add_workbookc             C   s¶   |   ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  	¡  |  
¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  | jS )N)Ú_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_app_fileÚ_write_core_fileÚ_write_custom_fileÚ_write_content_types_fileÚ_write_styles_fileÚ_write_theme_fileÚ_write_root_rels_fileÚ_write_workbook_rels_fileÚ_write_worksheet_rels_filesÚ_write_chartsheet_rels_filesÚ_write_drawing_rels_filesÚ_add_image_filesÚ_add_vba_projectr!   )r"   r$   r$   r%   Ú_create_package‚   s.    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 )Nzxl/workbook.xml)r   Ú_set_xml_writerrM   Ú_assemble_xml_file)r"   r   r$   r$   r%   r1   ª   s    zPackager._write_workbook_filec             C   sf   d}x\| j  ¡ D ]N}|jrq|jr2| ¡  | ¡  | |  dt|ƒ d ¡¡ | 	¡  |d7 }qW d S )Nr   zxl/worksheets/sheetz.xml)
r   r+   r,   Zconstant_memoryZ_opt_reopenZ_write_single_rowrN   rM   ÚstrrO   )r"   Úindexr-   r$   r$   r%   r/   ±   s    zPackager._write_worksheet_filesc             C   sP   d}xF| j  ¡ D ]8}|jsq| |  dt|ƒ d ¡¡ | ¡  |d7 }qW d S )Nr   zxl/chartsheets/sheetz.xml)r   r+   r,   rN   rM   rP   rO   )r"   rQ   r-   r$   r$   r%   r0   Á   s    z Packager._write_chartsheet_filesc             C   sd   | j jsd S d}xN| j jD ]B}|js0td| ƒ‚| |  dt|ƒ d ¡¡ | ¡  |d7 }qW d S )Nr   zFChart%d must contain at least one data series. See chart.add_series().zxl/charts/chartz.xml)r   r)   Zseriesr   rN   rM   rP   rO   )r"   rQ   Úchartr$   r$   r%   r2   Í   s    zPackager._write_chart_filesc             C   sP   | j s
d S d}x<| jjD ]0}| |  dt|ƒ d ¡¡ | ¡  |d7 }qW d S )Nr   zxl/drawings/drawingz.xml)r   r   r*   rN   rM   rP   rO   )r"   rQ   Údrawingr$   r$   r%   r3   ß   s    zPackager._write_drawing_filesc             C   sÊ   d}xÀ| j  ¡ D ]²}|js"|js"q|jrjtƒ }| |  dt|ƒ d ¡¡ | |j	|j
|j|j¡ |d7 }|jrtƒ }| |  dt|ƒ d ¡¡ | |j|jd d d |j¡ |  ||¡ |d7 }qW d S )Nr   zxl/drawings/vmlDrawingz.vmli   )r   r+   Zhas_vmlZhas_header_vmlr   rN   rM   rP   rO   Zvml_data_idZvml_shape_idÚcomments_listZbuttons_listZvml_header_idZheader_images_listÚ_write_vml_drawing_rels_file)r"   rQ   r-   Úvmlr$   r$   r%   r4   ë   s0    zPackager._write_vml_filesc             C   sZ   d}xP| j  ¡ D ]B}|jsqtƒ }| |  dt|ƒ d ¡¡ | |j¡ |d7 }qW d S )Nr   zxl/commentsz.xml)	r   r+   Zhas_commentsr   rN   rM   rP   rO   rT   )r"   rQ   r-   Úcommentr$   r$   r%   r5   	  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ÚcountrN   rM   rO   )r"   Zsstr$   r$   r%   r7     s    

z#Packager._write_shared_strings_filec             C   sØ   | j j}tƒ }| d| jg¡ | d| jg¡ x&| j  ¡ D ]}|jrFq:| |j	¡ q:W x&| j  ¡ D ]}|jsnqb| |j	¡ qbW | j
r˜| dt| j
ƒg¡ x| j
D ]}| |¡ q W | |¡ | |  d¡¡ | ¡  d S )NZ
WorksheetsZChartszNamed RangeszdocProps/app.xml)r   Údoc_propertiesr   Z_add_heading_pairr   r   r+   r,   Z_add_part_nameÚnamer    r(   Ú_set_propertiesrN   rM   rO   )r"   Ú
propertiesÚappr-   Znamed_ranger$   r$   r%   r8   !  s&    
zPackager._write_app_filec             C   s4   | j j}tƒ }| |¡ | |  d¡¡ | ¡  d S )NzdocProps/core.xml)r   rZ   r   r\   rN   rM   rO   )r"   r]   Úcorer$   r$   r%   r9   E  s
    
zPackager._write_core_filec             C   s@   | j j}tƒ }t|ƒsd S | |¡ | |  d¡¡ | ¡  d S )NzdocProps/custom.xml)r   Úcustom_propertiesr	   r(   r\   rN   rM   rO   )r"   r]   Úcustomr$   r$   r%   r:   N  s    
zPackager._write_custom_filec             C   s€  t ƒ }| | jj¡ d}d}xN| j ¡ D ]@}|jrN| dt|ƒ ¡ |d7 }q(| dt|ƒ ¡ |d7 }q(W x*t	d| j
d ƒD ]}| dt|ƒ ¡ q~W x*t	d| jd ƒD ]}| dt|ƒ ¡ qªW | jrÒ| ¡  x*t	d| jd ƒD ]}| dt|ƒ ¡ qäW x,t	d| jd ƒD ]}| dt|ƒ ¡ qW | jjjr@| ¡  | jjrR| ¡  | jjrd| ¡  | |  d¡¡ | ¡  d S )Nr   ZsheetrR   rS   ÚtableÚcommentsz[Content_Types].xml)r   Z_add_image_typesr   Zimage_typesr+   r,   Z_add_chartsheet_namerP   Z_add_worksheet_nameÚranger   Z_add_chart_namer   Z_add_drawing_namer   Z_add_vml_namer   Z_add_table_namer   Z_add_comment_namerX   rY   Z_add_shared_stringsÚvba_projectrD   r`   Z_add_custom_propertiesrN   rM   rO   )r"   ZcontentÚworksheet_indexÚchartsheet_indexr-   Úir$   r$   r%   r;   Z  s8    


z"Packager._write_content_types_filec       
   
   C   s|   | 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   Z_set_style_propertiesrN   rM   rO   )
r"   ri   rj   rk   rl   rm   rn   ro   rp   Ústylesr$   r$   r%   r<   ‡  s(    zPackager._write_styles_filec             C   s"   t ƒ }| |  d¡¡ | ¡  d S )Nzxl/theme/theme1.xml)r   rN   rM   rO   )r"   Úthemer$   r$   r%   r=      s    zPackager._write_theme_filec          	   C   s€   d}xv| j  ¡ D ]h}|j}|s qxV|D ]N}tƒ }| |  dt|ƒ d ¡¡ | |¡ | ¡  |  j	d7  _	|d7 }q&W qW d S )Nr   zxl/tables/tablez.xml)
r   r+   Ztablesr   rN   rM   rP   r\   rO   r   )r"   rQ   r-   Ztable_propsrb   r$   r$   r%   r6   §  s    

zPackager._write_table_filesc             C   sZ   t ƒ }| dd¡ | dd¡ | dd¡ | jjr>| dd¡ | |  d	¡¡ | ¡  d S )
Nz/officeDocumentzxl/workbook.xmlz/metadata/core-propertieszdocProps/core.xmlz/extended-propertieszdocProps/app.xmlz/custom-propertieszdocProps/custom.xmlz_rels/.rels)r
   Ú_add_document_relationshipZ_add_package_relationshipr   r`   rN   rM   rO   )r"   Úrelsr$   r$   r%   r>   ¹  s    zPackager._write_root_rels_filec             C   sÈ   t ƒ }d}d}xZ| j ¡ D ]L}|jrF| ddt|ƒ d ¡ |d7 }q| ddt|ƒ d ¡ |d7 }qW | dd¡ | d	d
¡ | jjjr˜| dd¡ | jjr¬| 	dd¡ | 
|  d¡¡ | ¡  d S )Nr   z/chartsheetzchartsheets/sheetz.xmlz
/worksheetzworksheets/sheetz/themeztheme/theme1.xmlz/stylesz
styles.xmlz/sharedStringszsharedStrings.xmlz/vbaProjectzvbaProject.binzxl/_rels/workbook.xml.rels)r
   r   r+   r,   rs   rP   rX   rY   re   Z_add_ms_package_relationshiprN   rM   rO   )r"   rt   rf   rg   r-   r$   r$   r%   r?   Í  s(    

z"Packager._write_workbook_rels_filec             C   s’   d}xˆ| j  ¡ D ]z}|jrq|d7 }|j|j |j |j |j }|sHqtƒ }x|D ]}|j	|Ž  qTW | 
|  dt|ƒ d ¡¡ | ¡  qW d S )Nr   r   zxl/worksheets/_rels/sheetz	.xml.rels)r   r+   r,   Zexternal_hyper_linksÚexternal_drawing_linksZexternal_vml_linksZexternal_table_linksZexternal_comment_linksr
   Ú_add_worksheet_relationshiprN   rM   rP   rO   )r"   rQ   r-   Úexternal_linksrt   Ú	link_datar$   r$   r%   r@   ñ  s    
z$Packager._write_worksheet_rels_filesc             C   sz   d}xp| j  ¡ D ]b}|jsq|d7 }|j}|s0qtƒ }x|D ]}|j|Ž  q<W | |  dt|ƒ d ¡¡ | 	¡  qW d S )Nr   r   zxl/chartsheets/_rels/sheetz	.xml.rels)
r   r+   r,   ru   r
   rv   rN   rM   rP   rO   )r"   rQ   r-   rw   rt   rx   r$   r$   r%   rA     s    
z%Packager._write_chartsheet_rels_filesc             C   sv   d}xl| j  ¡ D ]^}|jr"|d7 }|js*qtƒ }x|jD ]}|j|Ž  q8W | |  dt|ƒ d ¡¡ | 	¡  qW d S )Nr   r   zxl/drawings/_rels/drawingz	.xml.rels)
r   r+   rS   Zdrawing_linksr
   rs   rN   rM   rP   rO   )r"   rQ   r-   rt   Údrawing_datar$   r$   r%   rB   )  s    z"Packager._write_drawing_rels_filesc             C   sH   t ƒ }x|jD ]}|j|Ž  qW | |  dt|ƒ d ¡¡ | ¡  d S )Nzxl/drawings/_rels/vmlDrawingz	.vml.rels)r
   Zvml_drawing_linksrs   rN   rM   rP   rO   )r"   r-   rQ   rt   ry   r$   r$   r%   rU   >  s    z%Packager._write_vml_drawing_rels_filec          	   C   s
  | j }d}xú|jD ]ð}|d }d|d  }|d }dt|ƒ | }| jsº|  |¡}|rzt|dd}	|	 | ¡ ¡ |	 ¡  qút	||ƒ yt
 |t
 |¡jtjB ¡ W qú tk
r¶   Y qúX n@|rÄ|}n$t|dd}
|
 ¡ }t|ƒ}|
 ¡  | j ||d	f¡ |d7 }qW d S )
Nr   r   Ú.é   zxl/media/imageÚwb)ÚmodeÚrbT)r   ZimagesrP   r   rM   ÚopenÚwriteÚgetvaluerI   r   rH   ÚchmodÚstatÚst_modeÚS_IWRITEÚOSErrorÚreadr   r!   rJ   )r"   r   rQ   ZimageÚfilenameZextZ
image_dataZxml_image_namerK   Úos_fileZ
image_filer$   r$   r%   rC   N  s6    


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   re   Úvba_is_streamr   rM   r   r€   r   rI   r   r‡   r   r!   rJ   )r"   re   rŠ   Zxml_vba_namerK   r‰   Zvba_fileZvba_datar$   r$   r%   rD   {  s&    

zPackager._add_vba_project)"Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r&   r'   r.   rE   rM   r1   r/   r0   r2   r3   r4   r5   r7   r8   r9   r:   r;   r<   r=   r6   r>   r?   r@   rA   rB   rU   rC   rD   Ú__classcell__r$   r$   )r#   r%   r       s<   ($	-$-r   )#rH   rƒ   rG   Zshutilr   Zcompatibilityr   Úior   r^   r   Zcontenttypesr   r_   r   ra   r	   Zrelationshipsr
   Zsharedstringsr   rq   r   rr   r   rV   r   rb   r   rc   r   Ú
exceptionsr   Úobjectr   r$   r$   r$   r%   Ú<module>	   s$   