o
    ûÐ,hu  ã                   @   s  d dl Z d dlZd dl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 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ƒZ,dS )é    N)ÚBytesIOÚStringIO)Úcopyé   )ÚApp)ÚComments)ÚContentTypes)ÚCore)ÚCustom)ÚEmptyChartSeries)ÚFeaturePropertyBag)ÚMetadata)ÚRelationships)Ú	RichValue)ÚRichValueRel)ÚRichValueStructure)ÚRichValueTypes)ÚSharedStrings)ÚStyles)ÚTable)ÚTheme)ÚVmlc                       sX  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"d@dA„ Z#dBdC„ Z$dDdE„ Z%dFdG„ Z&dHdI„ Z'dJdK„ Z(dLdM„ Z)dNdO„ Z*dPdQ„ Z+‡  Z,S )RÚ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                    sV   t ƒ  ¡  d| _d| _d| _d| _d| _d| _d| _d| _	d| _
d| _g | _g | _dS )z
        Constructor.

        Ú FNr   )ÚsuperÚ__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__© úI/var/www/html/rh/venv/lib/python3.10/site-packages/xlsxwriter/packager.pyr   V   s   

zPackager.__init__c                 C   ó
   || _ d S ©N)r   )r)   r   r,   r,   r-   Ú_set_tmpdirq   ó   
zPackager._set_tmpdirc                 C   r.   r/   )r   )r)   r   r,   r,   r-   Ú_set_in_memoryu   r1   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_workbooky   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Ú_write_rich_value_rels_filesÚ_add_image_filesÚ_add_vba_projectÚ_add_vba_project_signatureÚ_write_vba_project_rels_fileÚ_write_core_fileÚ_write_app_fileÚ_write_metadata_fileÚ_write_feature_bag_propertyÚ_write_rich_value_filesr'   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   Ú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_writerra   Ú_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   r7   r8   Úconstant_memoryÚ_opt_reopenÚ_write_single_rowrc   ra   Ústrrd   ©r)   Úindexr9   r,   r,   r-   r>   ½   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/sheetrf   )r   r7   r8   rc   ra   rj   rd   rk   r,   r,   r-   r?   Î   s   ÿ
øz Packager._write_chartsheet_filesc                 C   sd   | j jsd S d}| j jD ]#}|jstd|› dƒ‚| |  dt|ƒ d ¡¡ | ¡  |d7 }qd S )Nr   ÚChartz? must contain at least one data series. See chart.add_series().zxl/charts/chartrf   )r   r5   Úseriesr   rc   ra   rj   rd   )r)   rl   Úchartr,   r,   r-   rA   Û   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/drawingrf   )r"   r   r6   rc   ra   rj   rd   )r)   rl   Údrawingr,   r,   r-   rB   ï   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   r7   Úhas_vmlÚhas_header_vmlr   rc   ra   rj   rd   Úvml_data_idÚvml_shape_idÚcomments_listÚbuttons_listÚvml_header_idÚheader_images_listÚ_write_vml_drawing_rels_file)r)   rl   r9   Úvmlr,   r,   r-   rC   ü   s@   ÿüÿû€á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/commentsrf   )	r   r7   Úhas_commentsr   rc   ra   rj   rd   ru   )r)   rl   r9   Úcommentr,   r,   r-   rD      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Úcountrc   ra   rd   )r)   Ússtr,   r,   r-   rF   ,  s   

z#Packager._write_shared_strings_filec                 C   sê   | j j}tƒ }d}| j  ¡ D ]}|jrq|jdkr#| |j¡ |d7 }q| d|g¡ | j  ¡ D ]}|js6q0| |j¡ q0| d| j	g¡ | j
rR| dt| j
ƒg¡ | j
D ]}| |¡ qU| |¡ | j j|_| |  d¡¡ | ¡  d S )Nr   é   r   Ú
WorksheetsÚChartszNamed RangesúdocProps/app.xml)r   Údoc_propertiesr   r7   r8   ÚhiddenÚ_add_part_nameÚnameÚ_add_heading_pairr    r&   r4   Ú_set_propertiesÚ	read_onlyÚdoc_securityrc   ra   rd   )r)   Ú
propertiesÚappr   r9   Únamed_ranger,   r,   r-   rS   7  s0   
€


zPackager._write_app_filec                 C   s4   | j j}tƒ }| |¡ | |  d¡¡ | ¡  d S )NúdocProps/core.xml)r   r…   r	   rŠ   rc   ra   rd   )r)   r   Úcorer,   r,   r-   rR   a  s
   
zPackager._write_core_filec                 C   sH   | j jsd S tƒ }| j j|_t| j jjƒ|_| |  	d¡¡ | 
¡  d S )Nzxl/metadata.xml)r   Úhas_metadatar   Úhas_dynamic_functionsr4   Úembedded_imagesÚimagesÚnum_embedded_imagesrc   ra   rd   )r)   Úmetadatar,   r,   r-   rT   j  s   
zPackager._write_metadata_filec                 C   s:   | j  ¡ }|s	d S tƒ }||_| |  d¡¡ | ¡  d S )Nz,xl/featurePropertyBag/featurePropertyBag.xml)r   Ú_has_feature_property_bagsr   Úfeature_property_bagsrc   ra   rd   )r)   r™   Úproperty_bagr,   r,   r-   rU   v  s   
ÿz$Packager._write_feature_bag_propertyc                 C   s4   | j j ¡ sd S |  ¡  |  ¡  |  ¡  |  ¡  d S r/   )r   r”   Ú
has_imagesÚ_write_rich_valueÚ_write_rich_value_typesÚ_write_rich_value_structureÚ_write_rich_value_relr(   r,   r,   r-   rV   „  s   z Packager._write_rich_value_filesc                 C   s2   |   d¡}tƒ }| jjj|_| |¡ | ¡  d S )Nzxl/richData/rdrichvalue.xml)ra   r   r   r”   r•   rc   rd   ©r)   ÚfilenameÚxml_filer,   r,   r-   rœ   Ž  s
   

zPackager._write_rich_valuec                 C   s&   |   d¡}tƒ }| |¡ | ¡  d S )Nz xl/richData/rdRichValueTypes.xml)ra   r   rc   rd   r    r,   r,   r-   r   –  s   

z Packager._write_rich_value_typesc                 C   s0   |   d¡}tƒ }| jj|_| |¡ | ¡  d S )Nz$xl/richData/rdrichvaluestructure.xml)ra   r   r   Úhas_embedded_descriptionsrc   rd   r    r,   r,   r-   rž     s
   


z$Packager._write_rich_value_structurec                 C   s6   |   d¡}tƒ }t| jjjƒ|_| |¡ | ¡  d S )Nzxl/richData/richValueRel.xml)	ra   r   r4   r   r”   r•   r–   rc   rd   r    r,   r,   r-   rŸ   ¥  s
   

zPackager._write_rich_value_relc                 C   s<   | j j}tƒ }|sd S | |¡ | |  d¡¡ | ¡  d S )NúdocProps/custom.xml)r   Úcustom_propertiesr
   rŠ   rc   ra   rd   )r)   r   Úcustomr,   r,   r-   rH   ­  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°| ¡  | jjr¸| ¡  | j  ¡ rÁ| !¡  | jj" #¡ rË| $¡  | %|  &d¡¡ | '¡  d S )Nr   Úsheetro   rp   ÚtableÚcommentsz[Content_Types].xml)(r   Ú_add_image_typesr   Úimage_typesÚ_get_table_countr7   r8   Ú_add_chartsheet_namerj   Ú_add_worksheet_nameÚranger!   Ú_add_chart_namer"   Ú_add_drawing_namer$   Ú_add_vml_namer#   Ú_add_table_namer%   Ú_add_comment_namer}   r   Ú_add_shared_stringsÚvba_projectrO   Úvba_project_signaturerP   r¥   Ú_add_custom_propertiesr’   Ú_add_metadatar˜   Ú_add_feature_bag_propertyr”   r›   Ú_add_rich_valuerc   ra   rd   )r)   ÚcontentÚworksheet_indexÚchartsheet_indexr9   Úir,   r,   r-   r;   ¹  sJ   



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_formatsÚborder_countÚ
fill_countÚcustom_colorsÚdxf_formatsr{   r   Ú_set_style_propertiesrc   ra   rd   )r)   rÀ   rÁ   rÂ   rÃ   rÄ   rÅ   rÆ   rÇ   r{   Ústylesr,   r,   r-   rG   ö  s0   ÷ÿzPackager._write_styles_filec                 C   s"   t ƒ }| |  d¡¡ | ¡  d S )Nzxl/theme/theme1.xml)r   rc   ra   rd   )r)   Úthemer,   r,   r-   rI     re   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/tablerf   )	r   r7   Útablesr   rc   ra   rj   rŠ   rd   )r)   rl   r9   Útable_propsr¨   r,   r,   r-   rE     s   ÿ

ùúzPackager._write_table_filesc                 C   s.   | j  ¡ D ]}|jD ]	}|  jd7  _q
qd S r3   )r   r7   rË   r#   )r)   r9   Ú_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/officeDocumentrb   z/metadata/core-propertiesr   z/extended-propertiesr„   z/custom-propertiesr¤   z_rels/.rels)r   Ú_add_document_relationshipÚ_add_package_relationshipr   r¥   rc   ra   rd   )r)   Úrelsr,   r,   r-   r<   3  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¡ | jj ¡ rh| ¡  | j ¡ rq| ¡  | |  d¡¡ | ¡  d S )Nr   z/chartsheetzchartsheets/sheetrf   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   r7   r8   rÎ   rj   r}   r   r¶   Ú_add_ms_package_relationshipr’   r”   r›   Ú_add_rich_value_relationshipr˜   Ú_add_feature_bag_relationshiprc   ra   rd   )r)   rÐ   r½   r¾   r9   r,   r,   r-   r=   D  s6   ÿ
ÿ


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   r7   r8   Úexternal_hyper_linksÚexternal_drawing_linksÚexternal_vml_linksÚexternal_background_linksÚexternal_table_linksÚexternal_comment_linksr   rÎ   rc   ra   rj   rd   ©r)   rl   r9   Úexternal_linksrÐ   Ú	link_datar,   r,   r-   rJ   q  s6   ÿþýüûÿ	ÿ
äz$Packager._write_worksheet_rels_filesc                 C   sx   d}| j  ¡ D ]2}|jsq|d7 }|j|j }|sqtƒ }|D ]}|j|Ž  q| |  dt	|ƒ d ¡¡ | 
¡  qd S )Nr   r   zxl/chartsheets/_rels/sheetrÔ   )r   r7   r8   rÖ   r×   r   rÎ   rc   ra   rj   rd   rÛ   r,   r,   r-   rK   ’  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   r7   rp   Údrawing_linksr   rÎ   rc   ra   rj   rd   )r)   rl   r9   rÐ   Údrawing_datar,   r,   r-   rL   ®  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Î   rc   ra   rj   rd   )r)   r9   rl   rÐ   rß   r,   r,   r-   ry   Ä  s   
ÿz%Packager._write_vml_drawing_rels_filec                 C   s>   | j j}|sd S tƒ }| dd¡ | |  d¡¡ | ¡  d S )Nz/vbaProjectSignaturezvbaProjectSignature.binzxl/_rels/vbaProject.bin.rels)r   r·   r   rÑ   rc   ra   rd   )r)   r·   rÐ   r,   r,   r-   rQ   Ô  s   ÿz%Packager._write_vba_project_rels_filec                 C   st   | j j ¡ sd S tƒ }d}| j jjD ]}|j ¡ }d|› d|› }| d|¡ |d7 }q| |  	d¡¡ | 
¡  d S )Nr   z../media/imageÚ.z/imagez(/xl/richData/_rels/richValueRel.xml.rels)r   r”   r›   r   r•   Ú
image_typeÚlowerrÎ   rc   ra   rd   )r)   rÐ   rl   ÚimageÚimage_extensionÚ
image_filer,   r,   r-   rM   å  s   

z%Packager._write_rich_value_rels_filesc           
   	   C   s  | j }d}|jj|j }|D ]q}dt|ƒ d |j }| jsX|  |¡}|jr9t|dd}| 	|j 
¡ ¡ | ¡  nBt|j|ƒ zt |t |¡jtjB ¡ W n, tyW   Y n$w |jr_|j}nt|jdd}| ¡ }	t|	ƒ}| ¡  | j ||df¡ |d7 }qd S )Nr   zxl/media/imagerá   Úwb©ÚmodeÚrbT)r   r”   r•   rj   Ú_image_extensionr   ra   Ú
image_dataÚopenÚwriteÚgetvaluer\   r   r¡   r[   ÚchmodÚstatÚst_modeÚS_IWRITEÚOSErrorÚreadr   r'   r]   )
r)   r   rl   r•   rä   Úxml_image_namer_   Úos_fileræ   rì   r,   r,   r-   rN   ù  s:   ÿ

ÿÿ
ÛzPackager._add_image_filesc                 C   ó¨   | 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/vbaProjectSignature.binrç   rè   rê   T)r   r·   Úvba_project_signature_is_streamr   ra   rí   rî   rï   r\   r   rõ   r   r'   r]   )r)   r·   rù   Úxml_vba_signature_namer_   r÷   Úvba_fileÚvba_datar,   r,   r-   rP   (  ó&   
z#Packager._add_vba_project_signaturec                 C   rø   )Nzxl/vbaProject.binrç   rè   rê   T)r   r¶   Úvba_project_is_streamr   ra   rí   rî   rï   r\   r   rõ   r   r'   r]   )r)   r¶   rþ   Úxml_vba_namer_   r÷   rû   rü   r,   r,   r-   rO   L  rý   zPackager._add_vba_project)-Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r0   r2   r:   rW   ra   r@   r>   r?   rA   rB   rC   rD   rF   rS   rR   rT   rU   rV   rœ   r   rž   rŸ   rH   r;   rG   rI   rE   r¬   r<   r=   rJ   rK   rL   ry   rQ   rM   rN   rP   rO   Ú__classcell__r,   r,   r*   r-   r   &   sT    /!$*	
=-!/$r   )-r[   rñ   rY   Úior   r   Úshutilr   rŽ   r   r©   r   Úcontenttypesr   r‘   r	   r¦   r
   Ú
exceptionsr   Úfeature_property_bagr   r—   r   Úrelationshipsr   Ú
rich_valuer   Úrich_value_relr   Úrich_value_structurer   Úrich_value_typesr   Úsharedstringsr   rÉ   r   r¨   r   rÊ   r   rz   r   r   r,   r,   r,   r-   Ú<module>   s0   
