U
    ‰dN(  ã                   @   sú   d dl Z d dlmZ d dlm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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mZ ddlmZ d dl m!Z! g Z"e j#dd„ ƒZ$ddd„Z%G dd„ dƒZ&dS )é    N)Údefaultdict)ÚBytesIO)ÚNamedTemporaryFile)Úwarn)Úxmlfile)ÚSHEET_MAIN_NS)ÚCommentRecord)ÚRelationshipÚRelationshipList)ÚDifferentialStyleé   )ÚSheetDimension)ÚHyperlinkList)Ú	MergeCellÚ
MergeCells)ÚRelated)ÚTablePartList)Ú
write_cellc                  C   s$   t D ]} tj | ¡rt | ¡ qd S ©N)ÚALL_TEMP_FILESÚosÚpathÚexistsÚremove)r   © r   ú>/tmp/pip-unpacked-wheel-rwywncvq/openpyxl/worksheet/_writer.pyÚ_openpyxl_shutdown   s    r   Ú c                 C   s,   t d| ddd}|j}| ¡  t |¡ |S )Nzw+z	openpyxl.F)ÚmodeÚsuffixÚprefixÚdelete)r   ÚnameÚcloser   Úappend)r   ZfobjÚfilenamer   r   r   Úcreate_temporary_file#   s     ÿ
r&   c                   @   s  e Zd ZdBd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"dS )CÚWorksheetWriterNc                 C   sJ   || _ g | j _g | j _|d kr$tƒ }|| _tƒ | _|  ¡ | _t	| jƒ d S r   )
ÚwsÚ_hyperlinksÚ	_commentsr&   Úoutr
   Ú_relsÚ
get_streamÚxfÚnext)Úselfr(   r+   r   r   r   Ú__init__/   s    
zWorksheetWriter.__init__c                 C   s   | j j}| j | ¡ ¡ d S r   )r(   Zsheet_propertiesr.   ÚsendÚto_tree)r0   Úpropsr   r   r   Úwrite_properties;   s    z WorksheetWriter.write_propertiesc                 C   s0   t | jddƒ}|r,t|ƒ ƒ}| j | ¡ ¡ dS )z/
        Write worksheet size if known
        Zcalculate_dimensionN)Úgetattrr(   r   r.   r2   r3   )r0   ÚrefZdimr   r   r   Úwrite_dimensions@   s    
z WorksheetWriter.write_dimensionsc                 C   s,   | j jj| j j_| j j}| j | ¡ ¡ d S r   )r(   Úcolumn_dimensionsZmax_outlineZsheet_formatZoutlineLevelColr.   r2   r3   )r0   Úfmtr   r   r   Úwrite_formatJ   s    zWorksheetWriter.write_formatc                 C   s   | j j}| j | ¡ ¡ d S r   )r(   Úviewsr.   r2   r3   )r0   r<   r   r   r   Úwrite_viewsP   s    zWorksheetWriter.write_viewsc                 C   s   | j j}| j | ¡ ¡ d S r   )r(   r9   r.   r2   r3   )r0   Úcolsr   r   r   Ú
write_colsU   s    zWorksheetWriter.write_colsc                 C   s,   |   ¡  |  ¡  |  ¡  |  ¡  |  ¡  dS )z€
        Write all elements up to rows:
        properties
        dimensions
        views
        format
        cols
        N)r5   r8   r=   r;   r?   ©r0   r   r   r   Ú	write_topZ   s
    	zWorksheetWriter.write_topc                 C   sb   t tƒ}t| jj ¡ ƒD ]\\}}}||  |¡ q| jj ¡ | ¡  D ]}g ||< qHt| ¡ ƒS )z0Return all rows, and any cells that they contain)	r   ÚlistÚsortedr(   Z_cellsÚitemsr$   Úrow_dimensionsÚkeys)r0   ÚrowsÚrowÚcolÚcellr   r   r   rG   j   s    
zWorksheetWriter.rowsc              	   C   sR   | j  d¡}| d¡& |  ¡ D ]\}}|  |||¡ q W 5 Q R X | j  d ¡ d S )NTZ	sheetData)r.   r2   ÚelementrG   Ú	write_row)r0   r.   Úrow_idxrH   r   r   r   Ú
write_rowsx   s
    zWorksheetWriter.write_rowsc              	   C   s–   d|› i}| j j}| | |i ¡¡ | d|¡\ |D ]P}|jd k	r\t |¡}| j j 	|¡ |j
d krt|jst|jstq6t|| j ||jƒ q6W 5 Q R X d S )NÚrrH   )r(   rE   ÚupdateÚgetrK   Ú_commentr   Z	from_cellr*   r$   Ú_valueZ	has_styler   )r0   r.   rH   rM   ÚattrsZdimsrJ   Úcommentr   r   r   rL   ‚   s     


ÿþýzWorksheetWriter.write_rowc                 C   s    | j j}|r| j | ¡ ¡ d S r   )r(   Z
protectionr.   r2   r3   )r0   Zprotr   r   r   Úwrite_protection–   s    z WorksheetWriter.write_protectionc                 C   s    | j j}|r| j | ¡ ¡ d S r   )r(   Ú	scenariosr.   r2   r3   )r0   rW   r   r   r   Úwrite_scenariosœ   s    zWorksheetWriter.write_scenariosc                 C   s    | j j}|r| j | ¡ ¡ d S r   )r(   Zauto_filterr.   r2   r3   )r0   Zfltr   r   r   Úwrite_filter¢   s    zWorksheetWriter.write_filterc                 C   s   dS )z–
        As per discusion with the OOXML Working Group global sort state is not required.
        openpyxl never reads it from existing files
        Nr   r@   r   r   r   Ú
write_sort¨   s    zWorksheetWriter.write_sortc                 C   s8   | j j}|r4dd„ | j jD ƒ}| j t|d ¡ ¡ d S )Nc                 S   s   g | ]}t t|ƒƒ‘qS r   )r   Ústr)Ú.0r7   r   r   r   Ú
<listcomp>³   s     z6WorksheetWriter.write_merged_cells.<locals>.<listcomp>)Z	mergeCell)r(   Zmerged_cellsr.   r2   r   r3   )r0   ÚmergedÚcellsr   r   r   Úwrite_merged_cells°   s    z"WorksheetWriter.write_merged_cellsc                 C   s\   t ƒ }| jj}| jjD ]@}|jD ]$}|jr |j|kr |j |j¡|_q | j	 
| ¡ ¡ qd S r   )r   r(   ÚparentZconditional_formattingÚrulesZdxfZ_differential_stylesÚaddZdxfIdr.   r2   r3   )r0   ZdfÚwbÚcfZruler   r   r   Úwrite_formatting·   s    
z WorksheetWriter.write_formattingc                 C   s    | j j}|r| j | ¡ ¡ d S r   )r(   Zdata_validationsr.   r2   r3   )r0   Zdvr   r   r   Úwrite_validationsÁ   s    z!WorksheetWriter.write_validationsc                 C   sb   t ƒ }| jjD ]:}|jr<tdd|jd}| j |¡ |j|_|j |¡ q|r^| j	 
| ¡ ¡ d S )NÚ	hyperlinkZExternal)ÚtypeZ
TargetModeÚTarget)r   r(   r)   Útargetr	   r,   r$   Úidrh   r.   r2   r3   )r0   ÚlinksÚlinkÚrelr   r   r   Úwrite_hyperlinksÇ   s    z WorksheetWriter.write_hyperlinksc                 C   s    | j j}|r| j | ¡ ¡ d S r   )r(   Úprint_optionsr.   r2   r3   )r0   rq   r   r   r   Úwrite_printÕ   s    zWorksheetWriter.write_printc                 C   s    | j j}|r| j | ¡ ¡ d S r   )r(   Zpage_marginsr.   r2   r3   )r0   Zmarginsr   r   r   Úwrite_marginsÛ   s    zWorksheetWriter.write_marginsc                 C   s    | j j}|r| j | ¡ ¡ d S r   )r(   Z
page_setupr.   r2   r3   )r0   Úsetupr   r   r   Ú
write_pageá   s    zWorksheetWriter.write_pagec                 C   s    | j j}|r| j | ¡ ¡ d S r   )r(   ZHeaderFooterr.   r2   r3   )r0   Zhfr   r   r   Úwrite_headerç   s    zWorksheetWriter.write_headerc                 C   s2   | j j| j jf}|D ]}|r| j | ¡ ¡ qd S r   )r(   Z
row_breaksZ
col_breaksr.   r2   r3   )r0   ZbrksZbrkr   r   r   Úwrite_breaksí   s    zWorksheetWriter.write_breaksc                 C   sL   | j js| j jrHtddd}| j |¡ tƒ }|j|_| j 	| 
d¡¡ d S )NÚdrawingr   )ri   rj   )r(   Z_chartsZ_imagesr	   r,   r$   r   rl   r.   r2   r3   )r0   ro   rx   r   r   r   Úwrite_drawingsô   s    zWorksheetWriter.write_drawingsc                 C   s4   | j jdk	s| j jr0tdd}| j | d¡¡ dS )zƒ
        Comments & VBA controls use VML and require an additional element
        that is no longer in the specification.
        NZanysvml©rl   ZlegacyDrawing)r(   Zlegacy_drawingr*   r   r.   r2   r3   )r0   Úlegacyr   r   r   Úwrite_legacyý   s    
zWorksheetWriter.write_legacyc              	   C   sÞ   t ƒ }| jj ¡ D ]²}|js| ¡  |jrzH| j|j d }t||jƒD ]&\}}|j	dkrbt
dƒ t|jƒ|_qHW n tk
rŽ   t
dƒ Y nX t|jdd}| j |¡ |j|_| t|jd¡ q|rÚ| j | ¡ ¡ d S )Nr   Úsz:File may not be readable: column headings must be strings.z5Column headings are missing, file may not be readabler   )ÚTyperj   rz   )r   r(   ÚtablesÚvaluesZtableColumnsZ_initialise_columnsZheaderRowCountr7   ÚzipZ	data_typer   r[   Úvaluer"   Ú	TypeErrorr	   Z	_rel_typer,   r$   ZIdZ_rel_idr   r.   r2   r3   )r0   r   ÚtablerH   rJ   rI   ro   r   r   r   Úwrite_tables  s&    
zWorksheetWriter.write_tablesc              
   c   s|   t | jƒh}|jdtdN z2d V }|dkr4|V  q|d kr@qq| |¡ qW n tk
rb   Y nX W 5 Q R X W 5 Q R X d S )NZ	worksheet)ÚxmlnsT)r   r+   rK   r   ÚwriteÚGeneratorExit)r0   r.   Úelr   r   r   r-     s    zWorksheetWriter.get_streamc                 C   s|   |   ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  	¡  |  
¡  |  ¡  |  ¡  |  ¡  |  ¡  dS )aÉ  
        Write all elements after the rows
        calc properties
        protection
        protected ranges #
        scenarios
        filters
        sorts # always ignored
        data consolidation #
        custom views #
        merged cells
        phonetic properties #
        conditional formatting
        data validation
        hyperlinks
        print options
        page margins
        page setup
        header
        row breaks
        col breaks
        custom properties #
        cell watches #
        ignored errors #
        smart tags #
        drawing
        drawingHF #
        background #
        OLE objects #
        controls #
        web publishing #
        tables
        N)rV   rX   rY   r`   rf   rg   rp   rr   rs   ru   rv   rw   ry   r|   r…   r@   r   r   r   Ú
write_tail/  s    "zWorksheetWriter.write_tailc                 C   s$   |   ¡  |  ¡  |  ¡  |  ¡  dS )z
        High level
        N)rA   rN   rŠ   r#   r@   r   r   r   r‡   b  s    zWorksheetWriter.writec                 C   s   | j r| j  ¡  dS )z+
        Close the context manager
        N)r.   r#   r@   r   r   r   r#   l  s    zWorksheetWriter.closec              	   C   sB   |   ¡  t| jtƒr| j ¡ S t| jdƒ}| ¡ }W 5 Q R X |S )zE
        Close the context manager and return serialised XML
        Úrb)r#   Ú
isinstancer+   r   ÚgetvalueÚopenÚread)r0   Úsrcr+   r   r   r   r   t  s    
zWorksheetWriter.readc                 C   s   t  | j¡ t | j¡ dS )z!
        Remove tempfile
        N)r   r   r+   r   r@   r   r   r   Úcleanup  s    zWorksheetWriter.cleanup)N)#Ú__name__Ú
__module__Ú__qualname__r1   r5   r8   r;   r=   r?   rA   rG   rN   rL   rV   rX   rY   rZ   r`   rf   rg   rp   rr   rs   ru   rv   rw   ry   r|   r…   r-   rŠ   r‡   r#   r   r‘   r   r   r   r   r'   ,   s@   



	
3
r'   )r   )'ÚatexitÚcollectionsr   Úior   r   Útempfiler   Úwarningsr   Zopenpyxl.xml.functionsr   Zopenpyxl.xml.constantsr   Zopenpyxl.comments.comment_sheetr   Zopenpyxl.packaging.relationshipr	   r
   Zopenpyxl.styles.differentialr   Z
dimensionsr   rh   r   Úmerger   r   Úrelatedr   r„   r   Zopenpyxl.cell._writerr   r   Úregisterr   r&   r'   r   r   r   r   Ú<module>   s*   

	