o
    ȷe`^                     @   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__ J/var/www/ideatree/venv/lib/python3.10/site-packages/xlsxwriter/packager.pyr   R   s   
zPackager.__init__c                 C   
   || _ d S N)r   )r$   r   r'   r'   r(   _set_tmpdirm      
zPackager._set_tmpdirc                 C   r)   r*   )r   )r$   r   r'   r'   r(   _set_in_memoryq   r,   zPackager._set_in_memoryc                 C   sn   || _ t|j| _t|j| _|j| _|j| _|j| _| j 	 D ]}|j
r-|  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   tempfilemkstempr   oscloser"   append)r$   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_writerrW   _assemble_xml_file)r$   r   r'   r'   r(   r;         zPackager._write_workbook_filec                 C   sb   d}| j  D ]'}|jrq|jr|  |  || dt| d  |	  |d7 }qd S )Nr   zxl/worksheets/sheet.xml)
r   r2   r3   constant_memory_opt_reopen_write_single_rowrY   rW   strrZ   r$   indexr4   r'   r'   r(   r9      s   

zPackager._write_worksheet_filesc                 C   sL   d}| j  D ]}|jsq|| dt| d  |  |d7 }qd S )Nr   zxl/chartsheets/sheetr\   )r   r2   r3   rY   rW   r`   rZ   ra   r'   r'   r(   r:      s   

z Packager._write_chartsheet_filesc                 C   s`   | j jsd S d}| j jD ]!}|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/chartr\   )r   r0   seriesr   rY   rW   r`   rZ   )r$   rb   chartr'   r'   r(   r<      s    

zPackager._write_chart_filesc                 C   sL   | j sd S d}| jjD ]}|| dt| d  |  |d7 }qd S )Nr   zxl/drawings/drawingr\   )r   r   r1   rY   rW   r`   rZ   )r$   rb   drawingr'   r'   r(   r=      s   

zPackager._write_drawing_filesc                 C   s   d}| j  D ]Y}|js|jsq|jr4t }|| 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   r2   has_vmlhas_header_vmlr   rY   rW   r`   rZ   vml_data_idvml_shape_idcomments_listbuttons_listvml_header_idheader_images_list_write_vml_drawing_rels_file)r$   rb   r4   vmlr'   r'   r(   r>      sD   

zPackager._write_vml_filesc                 C   sV   d}| j  D ]!}|jsqt }|| dt| d  ||j |d7 }qd S )Nr   zxl/commentsr\   )	r   r2   has_commentsr   rY   rW   r`   rZ   rj   )r$   rb   r4   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_tablestring_tablecountrY   rW   rZ   )r$   sstr'   r'   r(   rA     s   

z#Packager._write_shared_strings_filec                 C   s   | j j}t }|d| jg |d| jg | j  D ]}|jr"q||j	 q| j  D ]}|js4q.||j	 q.| j
rH|dt| j
g | j
D ]}|| qK|| | j j|_|| d |  d S )N
WorksheetsChartszNamed RangesdocProps/app.xml)r   doc_propertiesr   _add_heading_pairr   r   r2   r3   _add_part_namenamer!   r/   _set_properties	read_onlydoc_securityrY   rW   rZ   )r$   
propertiesappr4   named_ranger'   r'   r(   rK   $  s(   


zPackager._write_app_filec                 C   s4   | j j}t }|| || d |  d S )NdocProps/core.xml)r   ry   r   r}   rY   rW   rZ   )r$   r   corer'   r'   r(   rJ   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
   rY   rW   rZ   )r$   metadatar'   r'   r(   rL   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/   r}   rY   rW   rZ   )r$   r   customr'   r'   r(   rC   [  s   
zPackager._write_custom_filec                 C   s|  t  }|| jj |   d}d}| j D ] }|jr*|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|  qT| jrg|  t
d| jd D ]}|dt|  qot
d| jd D ]}|dt|  q| jjjr|  | jjr|  | jjr|  | jjr|  || d |   d S )Nr   sheetrd   re   tablecommentsz[Content_Types].xml)!r   _add_image_typesr   image_types_get_table_countr2   r3   _add_chartsheet_namer`   _add_worksheet_nameranger   _add_chart_namer   _add_drawing_namer   _add_vml_namer   _add_table_namer    _add_comment_namerr   rt   _add_shared_stringsvba_projectrI   r   _add_custom_propertiesr   _add_metadatarY   rW   rZ   )r$   contentworksheet_indexchartsheet_indexr4   ir'   r'   r(   r6   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_formatsrp   r   _set_style_propertiesrY   rW   rZ   )r$   r   r   r   r   r   r   r   r   rp   stylesr'   r'   r(   rB     s.   zPackager._write_styles_filec                 C   s"   t  }|| d |  d S )Nzxl/theme/theme1.xml)r   rY   rW   rZ   )r$   themer'   r'   r(   rD     r[   zPackager._write_theme_filec              	   C   sj   d}| j  D ]+}|j}|sq|D ] }t }|| dt| d  || |  |d7 }qqd S )Nr   zxl/tables/tabler\   )	r   r2   tablesr   rY   rW   r`   r}   rZ   )r$   rb   r4   table_propsr   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   r2   r   r   )r$   r4   r   r'   r'   r(   r     s
   
zPackager._get_table_countc                 C   sZ   t  }|dd |dd |dd | jjr|dd || d	 |  d S )
Nz/officeDocumentrX   z/metadata/core-propertiesr   z/extended-propertiesrx   z/custom-propertiesr   z_rels/.rels)r   _add_document_relationship_add_package_relationshipr   r   rY   rW   rZ   )r$   relsr'   r'   r(   r7     s   zPackager._write_root_rels_filec                 C   s   t  }d}d}| j D ]&}|jr"|ddt| d  |d7 }q|ddt| d  |d7 }q|dd |d	d
 | jjjrJ|dd | jjrT|	dd | jj
r^|dd || d |  d S )Nr   z/chartsheetzchartsheets/sheetr\   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   r2   r3   r   r`   rr   rt   r   _add_ms_package_relationshipr   rY   rW   rZ   )r$   r   r   r   r4   r'   r'   r(   r8     sB   


z"Packager._write_workbook_rels_filec                 C   s   d}| j  D ]>}|jrq|d7 }|j|j |j |j |j |j }|s&qt	 }|D ]}|j
|  q+|| dt| d  |  qd S )Nr   r   zxl/worksheets/_rels/sheet	.xml.rels)r   r2   r3   external_hyper_linksexternal_drawing_linksexternal_vml_linksexternal_table_linksexternal_background_linksexternal_comment_linksr   _add_worksheet_relationshiprY   rW   r`   rZ   r$   rb   r4   external_linksr   	link_datar'   r'   r(   rE     s8   

z$Packager._write_worksheet_rels_filesc                 C   sr   d}| j  D ]/}|jsq|d7 }|j}|sqt }|D ]}|j|  q|| dt| d  |	  qd S )Nr   r   zxl/chartsheets/_rels/sheetr   )
r   r2   r3   r   r   r   rY   rW   r`   rZ   r   r'   r'   r(   rF   .  s$   

z%Packager._write_chartsheet_rels_filesc                 C   sn   d}| j  D ]-}|jr|d7 }|jsqt }|jD ]}|j|  q|| dt| d  |	  qd S )Nr   r   zxl/drawings/_rels/drawingr   )
r   r2   re   drawing_linksr   r   rY   rW   r`   rZ   )r$   rb   r4   r   drawing_datar'   r'   r(   rG   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   vml_drawing_linksr   rY   rW   r`   rZ   )r$   r4   rb   r   r   r'   r'   r(   rn   ]  s   

z%Packager._write_vml_drawing_rels_filec              	   C   s  | j }d}|jD ]v}|d }d|d  }|d }dt| | }| jsZ| |}|r<t|dd}	|	|  |	  n>t	|| zt
|t
|jtjB  W n) tyY   Y n!w |r_|}nt|dd}
|
 }t|}|
  | j||d	f |d7 }qd S )
Nr   r   .   zxl/media/imagewbmoderbT)r   imagesr`   r   rW   openwritegetvaluerR   r   rQ   chmodstatst_modeS_IWRITEOSErrorreadr   r"   rS   )r$   r   rb   imagefilenameext
image_dataxml_image_namerU   os_file
image_filer'   r'   r(   rH   m  s<   




zPackager._add_image_filesc                 C   s   | j j}| j j}|sd S d}| js2| |}|r+t|dd}||  |  d S t	|| d S |r7|}nt|dd}|
 }t|}|  | j||df d S )Nzxl/vbaProject.binr   r   r   T)r   r   vba_is_streamr   rW   r   r   r   rR   r   r   r   r"   rS   )r$   r   r   xml_vba_namerU   r   vba_filevba_datar'   r'   r(   rI     s&   
zPackager._add_vba_project)$__name__
__module____qualname____doc__r   r+   r-   r5   rM   rW   r;   r9   r:   r<   r=   r>   r?   rA   rK   rJ   rL   rC   r6   rB   rD   r@   r   r7   r8   rE   rF   rG   rn   rH   rI   __classcell__r'   r'   r%   r(   r   "   sB    /%		3(-r   )$rQ   r   rO   shutilr   ior   r   r   r   contenttypesr   r   r   r   r	   r   r
   relationshipsr   sharedstringsr   r   r   r   r   ro   r   r   r   r   r   
exceptionsr   objectr   r'   r'   r'   r(   <module>   s(   	