B
    ±ªt\W´ ã               @   s¦  d dl Z d dlZd dlZ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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„ Z&dd„ Z'dd„ Z(edd ƒZ)ed!d"ƒZ*ed#d$ƒZ+ed%d&ƒZ,ed'd(ƒZ-ed)d*ƒZ.G d+d,„ d,ejƒZ/dS )-é    N)Údefaultdict)Ú
namedtuple)Úwarné   )ÚStringIO)Úforce_unicode)Ú	num_typesÚ	str_types)Ú	xmlwriter)ÚFormat)ÚDrawing)ÚShape)Ú	XMLwriter)Úxl_rowcol_to_cell)Úxl_rowcol_to_cell_fast)Úxl_cell_to_rowcol)Úxl_col_to_name)Úxl_range)Úxl_color)Úget_sparkline_style)Úsupported_datetime)Údatetime_to_excel_datetime)Úquote_sheetname)ÚDuplicateTableNamec                s   ‡ fdd„}|S )zn
    Decorator function to convert A1 notation in cell method calls
    to the default row/col notation.

    c                sZ   yt |ƒr|d }t|ƒ W n, tk
rH   t|ƒ}||dd …  }Y nX ˆ | f|ž|ŽS )Nr   r   )ÚlenÚintÚ
ValueErrorr   )ÚselfÚargsÚkwargsZ	first_argÚnew_args)Úmethod© ú3lib/python3.7/site-packages/xlsxwriter/worksheet.pyÚcell_wrapper7   s    z'convert_cell_args.<locals>.cell_wrapperr"   )r!   r$   r"   )r!   r#   Úconvert_cell_args1   s    r%   c                s   ‡ fdd„}|S )zo
    Decorator function to convert A1 notation in range method calls
    to the default row/col notation.

    c       
         s²   yt |ƒrt|d ƒ W nˆ tk
r    d|d kr`|d  d¡\}}t|ƒ\}}t|ƒ\}}nt|d ƒ\}}|| }}||||g}	|	 |dd … ¡ |	}Y nX ˆ | f|ž|ŽS )Nr   ú:r   )r   r   r   Úsplitr   Úextend)
r   r   r   Úcell_1Úcell_2Zrow_1Úcol_1Zrow_2Úcol_2r    )r!   r"   r#   r$   N   s    

z(convert_range_args.<locals>.cell_wrapperr"   )r!   r$   r"   )r!   r#   Úconvert_range_argsH   s    r-   c                s   ‡ fdd„}|S )zq
    Decorator function to convert A1 notation in columns method calls
    to the default row/col notation.

    c       	         s   yt |ƒrt|d ƒ W nf tk
r~   dd„ |d  d¡D ƒ\}}t|ƒ\}}t|ƒ\}}||g}| |dd … ¡ |}Y nX ˆ | f|ž|ŽS )Nr   c             S   s   g | ]}|d  ‘qS )Ú1r"   )Ú.0Úcolr"   r"   r#   ú
<listcomp>u   s    z?convert_column_args.<locals>.column_wrapper.<locals>.<listcomp>r&   r   )r   r   r   r'   r   r(   )	r   r   r   r)   r*   Ú_r+   r,   r    )r!   r"   r#   Úcolumn_wrapperm   s    
z+convert_column_args.<locals>.column_wrapperr"   )r!   r3   r"   )r!   r#   Úconvert_column_argsg   s    r4   ÚStringzstring, formatÚNumberznumber, formatÚBlankÚformatÚBooleanzboolean, formatÚFormulazformula, format, valueÚArrayFormulazformula, format, value, rangec                   sD	  e Zd ZdZ‡ fdd„Zdd„ Zedd„ ƒZdd	„ Zed®dd„ƒZ	d¯dd„Z
ed°dd„ƒZd±dd„Zed²dd„ƒZd³dd„Zed´dd„ƒZdµdd„Zed¶dd„ƒZd·dd„Zed¸d d!„ƒZd¹d"d#„Zedºd$d%„ƒZd»d&d'„Zed¼d(d)„ƒZd½d*d+„Zed,d-„ ƒZd.d/„ Zed¾d0d1„ƒZed¿d2d3„ƒZedÀd4d5„ƒZedÁd6d7„ƒZedÂd8d9„ƒZ edÃd:d;„ƒZ!d<d=„ Z"d>d?„ Z#d@dA„ Z$dBdC„ Z%dDdE„ Z&dFdG„ Z'dHdI„ Z(e)dÄdJdK„ƒZ*dÅdLdM„Z+dÆdOdP„Z,edÇdQdR„ƒZ-edSdT„ ƒZ.dUdV„ Z/dWdX„ Z0edÈdYdZ„ƒZ1edÉd[d\„ƒZ2edÊd]d^„ƒZ3edËd_d`„ƒZ4edadb„ ƒZ5dÌddde„Z6edÍdfdg„ƒZ7edÎdhdi„ƒZ8dÏdkdl„Z9dmdn„ Z:dodp„ Z;dqdr„ Z<dÐdtdu„Z=edÑdvdw„ƒZ>dxdy„ Z?dzd{„ Z@d|d}„ ZAd~d„ ZBd€d„ ZCd‚dƒ„ ZDdÒd†d‡„ZEdÓdˆd‰„ZFdÔdŠd‹„ZGdÕdŒd„ZHe)dÖdŽd„ƒZId×dd‘„ZJd’d“„ ZKd”d•„ ZLed–d—„ ƒZMd˜d™„ ZNdšd›„ ZOdœd„ ZPdždŸ„ ZQd d¡„ ZRd¢d£„ ZSdØd¤d¥„ZTd¦d§„ ZUd¨d©„ ZVdÙdªd«„ZWd¬d­„ ZXd®d¯„ ZYd°d±„ ZZd²d³„ Z[d´dµ„ Z\d¶d·„ Z]d¸d¹„ Z^dºd»„ Z_d¼d½„ Z`d¾d¿„ ZadÀdÁ„ ZbdÂdÃ„ ZcdÄdÅ„ ZddÆdÇ„ ZedÈdÉ„ ZfdÊdË„ ZgdÌdÍ„ ZhdÎdÏ„ ZidÐdÑ„ ZjdÒdÓ„ ZkdÔdÕ„ ZldÖd×„ ZmdØdÙ„ ZndÚdÛ„ ZodÜdÝ„ ZpdÞdß„ Zqdàdá„ Zrdâdã„ Zsdädå„ Ztdædç„ Zudèdé„ Zvdêdë„ Zwdìdí„ Zxdîdï„ ZydÚdðdñ„Zzdò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d„Z‹dd„ ZŒdÜdd„ZdÝ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™d0d1„ Zšd2d3„ Z›dÞd4d5„Zœdßd6d7„Zd8d9„ Zžd:d;„ ZŸd<d=„ Z d>d?„ Z¡d@dA„ Z¢dBdC„ Z£dDdE„ Z¤dFdG„ Z¥dHdI„ Z¦dJdK„ Z§dLdM„ Z¨dNdO„ Z©dPdQ„ ZªdRdS„ Z«dTdU„ Z¬dVdW„ Z­dXdY„ Z®dZd[„ Z¯d\d]„ Z°d^d_„ Z±d`da„ Z²dbdc„ Z³ddde„ Z´dfdg„ Zµdàdhdi„Z¶djdk„ Z·dldm„ Z¸dndo„ Z¹dpdq„ Zºdrds„ Z»dtdu„ Z¼dvdw„ Z½dxdy„ Z¾dz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Õd¨d©„ ZÖdªd«„ Z×d¬d­„ ZØ‡  ZÙS (á  Ú	Worksheetz=
    A class for writing the Excel XLSX Worksheet file.

    c                sÊ  t t| ƒ ¡  d| _d| _d| _d| _d| _d| _d| _	g | _
d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _i | _g | _d| _d| _d| _g | _d| _d| _d| _d| _d	| _d| _ d| _!d| _"d| _#d
| _$d| _%d| _&d| _'d| _(d| _)d
| _*d
| _+g | _,g | _-g | _.d| _/d| _0d| _1d| _2d| _3d| _4d| _5d| _6d| _7d| _8d| _9d| _:d| _;d| _<d| _=d| _>d| _?g | _@g | _Ai | _Bi | _CtDtEƒ| _Fd| _Gd	| _Hd| _Id| _Jd	| _Kd| _Ld| _Md| _Nd| _Od	| _Pd	| _Qd	| _Rd| _Sd| _Td| _Ud| _Vd| _Wd| _Xi | _Yg | _ZtDtEƒ| _[g | _\i | _]d| _^d| __d| _`tDtEƒ| _ag | _bd| _cd| _dd| _eg | _fd| _gd| _hd| _ig | _jd| _ki | _li | _mi | _ni | _oi | _pd| _qd| _rd	| _sd| _td| _ug | _vg | _wg | _xg | _yg | _zg | _{g | _|g | _}g | _~g | _g | _€g | _g | _‚i | _ƒd| _„d| _…d| _†g | _‡i | _ˆg | _‰d| _Šd	| _‹d| _Œd| _d| _ŽtDtEƒ| _d| _d
| _‘d| _’d
| _“d| _”d| _•d| _–d| _—d| _˜d| _™d| _šd| _ed| _—d| _˜d| _›d| _œd| _dS )z
        Constructor.

        Nr   Fi×  i   i @  iÿ  é   r   TÚ gffffffæ?g      è?g333333Ó?éd   é   é   é@   i   )žÚsuperr<   Ú__init__ÚnameÚindexÚ	str_tableZpaletteÚconstant_memoryÚtmpdirÚis_chartsheetZ
ext_sheetsZ
fileclosedÚexcel_versionÚexcel2003_styleÚ
xls_rowmaxÚ
xls_colmaxÚ
xls_strmaxÚ
dim_rowminÚ
dim_rowmaxÚ
dim_colminÚ
dim_colmaxÚcolinfoÚ
selectionsÚhiddenZactiveÚ	tab_colorÚpanesÚactive_paneÚselectedÚpage_setup_changedÚ
paper_sizeÚorientationÚprint_options_changedÚhcenterÚvcenterÚprint_gridlinesÚscreen_gridlinesÚprint_headersÚrow_col_headersÚheader_footer_changedÚheaderÚfooterÚheader_footer_alignsÚheader_footer_scalesÚheader_imagesÚfooter_imagesÚheader_images_listÚmargin_leftÚmargin_rightÚ
margin_topÚmargin_bottomÚmargin_headerÚmargin_footerÚrepeat_row_rangeÚrepeat_col_rangeÚprint_area_rangeÚ
page_orderZblack_whiteZdraft_qualityZprint_commentsÚ
page_startÚfit_pageÚ	fit_widthÚ
fit_heightÚhbreaksÚvbreaksÚprotect_optionsZset_colsr   ÚdictÚset_rowsÚzoomÚzoom_scale_normalÚprint_scaleÚis_right_to_leftÚ
show_zerosZleading_zerosÚoutline_row_levelÚoutline_col_levelÚoutline_styleÚoutline_belowÚoutline_rightÚ
outline_onÚoutline_changedÚoriginal_row_heightÚdefault_row_heightÚdefault_row_pixelsÚdefault_col_pixelsÚdefault_row_zeroedÚnamesZwrite_matchÚtableÚmergeÚ	row_spansÚhas_vmlÚhas_header_vmlÚhas_commentsÚcommentsÚcomments_listÚcomments_authorÚcomments_visibleÚvml_shape_idÚbuttons_listÚvml_header_idÚautofilter_areaÚautofilter_refÚfilter_rangeÚ	filter_onÚfilter_colsÚfilter_typeÚ	col_sizesÚ	row_sizesÚcol_formatsÚcol_size_changedÚrow_size_changedZlast_shape_idÚ	rel_countÚhlink_countÚ
hlink_refsÚexternal_hyper_linksÚexternal_drawing_linksÚexternal_comment_linksÚexternal_vml_linksÚexternal_table_linksÚdrawing_linksÚvml_drawing_linksÚchartsÚimagesÚtablesÚ
sparklinesÚshapesZ
shape_hashÚdrawingÚrstringÚprevious_rowÚvalidationsÚcond_formatsÚdata_bars_2010Úuse_data_bars_2010Údxf_priorityÚ	page_viewÚvba_codenameÚ	date_1904Ú
hyperlinksÚstrings_to_numbersÚstrings_to_urlsÚnan_inf_to_errorsÚstrings_to_formulasÚdefault_date_formatÚdefault_url_formatÚremove_timezoneÚrow_data_filenameÚrow_data_fhÚworksheet_metaÚvml_data_idÚrow_data_fh_closedÚvertical_dpiÚhorizontal_dpi)r   )Ú	__class__r"   r#   rD       s:   



zWorksheet.__init__c             G   sf  |dkr| j ||f|žŽ S | jr<| d¡r<| j||f|žŽ S | d¡rb| d¡rb| j||f|žŽ S d|krÖ| jrŽt d|¡rŽ| j||f|žŽ S | jr²t d|¡r²| j||f|žŽ S | jrÖt d|¡rÖ| j||f|žŽ S | j	rPyHt
|ƒ}| js|  |¡s$|  |¡s$| j|||f|d	d … žŽ S W n tk
r<   Y nX | j||f|žŽ S | j||f|žŽ S d S )
Nr>   ú=z{=Ú}r&   z(ftp|http)s?://zmailto:z(in|ex)ternal:r   )Ú_write_blankrÈ   Ú
startswithÚ_write_formulaÚendswithrÆ   ÚreÚmatchÚ
_write_urlrÅ   ÚfloatrÇ   Ú_isnanÚ_isinfÚ_write_numberr   Ú_write_string)r   ÚtokenÚrowr0   r   Úfr"   r"   r#   Ú_write_token_as_stringd  s.     z Worksheet._write_token_as_stringc             G   s   | j ||f|žŽ S )aÎ  
        Write data to a worksheet cell by calling the appropriate write_*()
        method based on the type of data being passed.

        Args:
            row:   The cell row (zero indexed).
            col:   The cell column (zero indexed).
            *args: Args to pass to sub functions.

        Returns:
             0:    Success.
            -1:    Row or column is out of worksheet bounds.
            other: Return value of called method.

        )Ú_write)r   rã   r0   r   r"   r"   r#   Úwrite‡  s    zWorksheet.writec          	   G   s  t |ƒstdƒ‚|d }|d kr2| j||f|žŽ S t|ƒ}|tkrT| j||f|žŽ S |tkrn| j||f|žŽ S |tkrŠ| j	|||f|žŽ S |t
j
t
jt
jt
jfkr´| j||f|žŽ S tjdk rø|tkrøy| j	t|ƒ||f|žŽ S  ttfk
rö   Y nX t|tƒr| j||f|žŽ S t|tƒr6| j	|||f|žŽ S t|tƒrT| j||f|žŽ S t|ƒrp| j||f|žŽ S y$t|ƒ}| j|||f|dd … žŽ S  tk
rª   Y n& tk
rÎ   tdt|ƒ ƒ‚Y nX yt|ƒ | j||f|žŽ S  tk
r   tdt|ƒ ƒ‚Y nX d S )Nz,write() takes at least 4 arguments (3 given)r   )r=   r   r   r   zUnsupported type %s in write())r   Ú	TypeErrorrÖ   ÚtypeÚboolÚ_write_booleanr   rà   Ústrrå   ÚdatetimeÚdateÚtimeZ	timedeltaÚ_write_datetimeÚsysÚversion_infoZunicodeÚUnicodeEncodeErrorÚ	NameErrorÚ
isinstancer	   r   rÝ   r   rá   )r   rã   r0   r   râ   Ú
token_typerä   r"   r"   r#   ræ   ›  sX    



zWorksheet._writeNc             C   s   |   ||||¡S )a›  
        Write a string to a worksheet cell.

        Args:
            row:    The cell row (zero indexed).
            col:    The cell column (zero indexed).
            string: Cell data. Str.
            format: An optional cell Format object.

        Returns:
            0:  Success.
            -1: Row or column is out of worksheet bounds.
            -2: String truncated to 32k characters.

        )rá   )r   rã   r0   ÚstringÚcell_formatr"   r"   r#   Úwrite_stringã  s    zWorksheet.write_stringc             C   s~   d}|   ||¡rdS t|ƒ| jkr4|d | j… }d}| jsH| j |¡}n|}| jrf|| jkrf|  |¡ t||ƒ| j	| |< |S )Nr   éÿÿÿÿéþÿÿÿ)
Ú_check_dimensionsr   rO   rH   rG   Ú_get_shared_string_indexr»   Ú_write_single_rowÚcell_string_tupler’   )r   rã   r0   r÷   rø   Ú	str_errorÚstring_indexr"   r"   r#   rá   ÷  s    
zWorksheet._write_stringc             C   s   |   ||||¡S )a„  
        Write a number to a worksheet cell.

        Args:
            row:         The cell row (zero indexed).
            col:         The cell column (zero indexed).
            number:      Cell data. Int or float.
            cell_format: An optional cell Format object.

        Returns:
            0:  Success.
            -1: Row or column is out of worksheet bounds.

        )rà   )r   rã   r0   Únumberrø   r"   r"   r#   Úwrite_number  s    zWorksheet.write_numberc             C   sž   |   |¡s|  |¡r\| jrT|   |¡r6|  ||d|d¡S |  |¡r\|  ||d|d¡S ntdƒ‚|  ||¡rldS | jr†|| jkr†|  |¡ t	||ƒ| j
| |< dS )Nz#NUM!z1/0z#DIV/0!zUNAN/INF not supported in write_number() without 'nan_inf_to_errors' Workbook() optionrú   r   )rÞ   rß   rÇ   rØ   rè   rü   rH   r»   rþ   Úcell_number_tupler’   )r   rã   r0   r  rø   r"   r"   r#   rà   &  s     


zWorksheet._write_numberc             C   s   |   ||||¡S )aè  
        Write a blank cell with formatting to a worksheet cell. The blank
        token is ignored and the format only is written to the cell.

        Args:
            row:         The cell row (zero indexed).
            col:         The cell column (zero indexed).
            blank:       Any value. It is ignored.
            cell_format: An optional cell Format object.

        Returns:
            0:  Success.
            -1: Row or column is out of worksheet bounds.

        )rÖ   )r   rã   r0   Úblankrø   r"   r"   r#   Úwrite_blankB  s    zWorksheet.write_blankc             C   sL   |d krdS |   ||¡rdS | jr6|| jkr6|  |¡ t|ƒ| j| |< dS )Nr   rú   )rü   rH   r»   rþ   Úcell_blank_tupler’   )r   rã   r0   r  rø   r"   r"   r#   rÖ   V  s    
zWorksheet._write_blankr   c             C   s   |   |||||¡S )aÄ  
        Write a formula to a worksheet cell.

        Args:
            row:         The cell row (zero indexed).
            col:         The cell column (zero indexed).
            formula:     Cell formula.
            cell_format: An optional cell Format object.
            value:       An optional value for the formula. Default is 0.

        Returns:
            0:  Success.
            -1: Row or column is out of worksheet bounds.

        )rØ   )r   rã   r0   Úformularø   Úvaluer"   r"   r#   Úwrite_formulah  s    zWorksheet.write_formulac          	   C   s‚   |   ||¡rdS | d¡r:| d¡r:|  |||||||¡S | d¡rN| d¡}| jrh|| jkrh|  |¡ t|||ƒ| j	| |< dS )Nrú   Ú{rÕ   rÔ   r   )
rü   r×   rÙ   Ú_write_array_formulaÚlstriprH   r»   rþ   Úcell_formula_tupler’   )r   rã   r0   r  rø   r	  r"   r"   r#   rØ   }  s    


zWorksheet._write_formulac          	   C   s   |   |||||||¡S )ah  
        Write a formula to a worksheet cell.

        Args:
            first_row:    The first row of the cell range. (zero indexed).
            first_col:    The first column of the cell range.
            last_row:     The last row of the cell range. (zero indexed).
            last_col:     The last column of the cell range.
            formula:      Cell formula.
            cell_format:  An optional cell Format object.
            value:        An optional value for the formula. Default is 0.

        Returns:
            0:  Success.
            -1: Row or column is out of worksheet bounds.

        )r  )r   Ú	first_rowÚ	first_colÚlast_rowÚlast_colr  rø   r	  r"   r"   r#   Úwrite_array_formula“  s    
zWorksheet.write_array_formulac             C   sD  ||kr|| }}||kr$|| }}|   ||¡r4dS ||krP||krPt||ƒ}nt||ƒd t||ƒ }|d dkr€|dd … }|d dkr˜|dd … }|d dkr°|d d… }| jrÊ|| jkrÊ|  |¡ t||||ƒ| j| |< | js@xTt||d ƒD ]B}	x<t||d ƒD ]*}
|	|ks&|
|kr|  |	|
d|¡ qW qúW dS )Nrú   r&   r   r  r   rÔ   rÕ   )	rü   r   rH   r»   rþ   Úcell_arformula_tupler’   Úrangerà   )r   r  r  r  r  r  rø   r	  Ú
cell_rangerã   r0   r"   r"   r#   r  «  s6    


zWorksheet._write_array_formulac             C   s   |   ||||¡S )aŽ  
        Write a date or time to a worksheet cell.

        Args:
            row:         The cell row (zero indexed).
            col:         The cell column (zero indexed).
            date:        Date and/or time as a datetime object.
            cell_format: A cell Format object.

        Returns:
            0:  Success.
            -1: Row or column is out of worksheet bounds.

        )rð   )r   rã   r0   rî   rø   r"   r"   r#   Úwrite_datetimeÚ  s    zWorksheet.write_datetimec             C   sZ   |   ||¡rdS | jr*|| jkr*|  |¡ |  |¡}|d krB| j}t||ƒ| j| |< dS )Nrú   r   )rü   rH   r»   rþ   Ú_convert_date_timerÉ   r  r’   )r   rã   r0   rî   rø   r  r"   r"   r#   rð   í  s    

zWorksheet._write_datetimec             C   s   |   ||||¡S )aˆ  
        Write a boolean value to a worksheet cell.

        Args:
            row:         The cell row (zero indexed).
            col:         The cell column (zero indexed).
            boolean:     Cell data. bool type.
            cell_format: An optional cell Format object.

        Returns:
            0:  Success.
            -1: Row or column is out of worksheet bounds.

        )rë   )r   rã   r0   Úbooleanrø   r"   r"   r#   Úwrite_boolean  s    zWorksheet.write_booleanc             C   sP   |   ||¡rdS | jr*|| jkr*|  |¡ |r4d}nd}t||ƒ| j| |< dS )Nrú   r   r   )rü   rH   r»   rþ   Úcell_boolean_tupler’   )r   rã   r0   r  rø   r	  r"   r"   r#   rë     s    
zWorksheet._write_booleanc             C   s   |   ||||||¡S )aˆ  
        Write a hyperlink to a worksheet cell.

        Args:
            row:    The cell row (zero indexed).
            col:    The cell column (zero indexed).
            url:    Hyperlink url.
            format: An optional cell Format object.
            string: An optional display string for the hyperlink.
            tip:    An optional tooltip.
        Returns:
            0:  Success.
            -1: Row or column is out of worksheet bounds.
            -2: String longer than 32767 characters.
            -3: URL longer than Excel limit of 255 characters.
            -4: Exceeds Excel limit of 65,530 urls per worksheet.
        )rÜ   )r   rã   r0   Úurlrø   r÷   Útipr"   r"   r#   Ú	write_url2  s    zWorksheet.write_urlc             C   sò  |   ||¡rdS |d kr|}d}| d¡rF| dd¡}| dd¡}d}d}| d¡rˆ| dd¡}| dd	¡}| dd¡}| dd	¡}d
}| dd¡}d}	t|ƒ| jkr²tdƒ dS |}
|dkr0d|krÚ| dd¡\}}
nd }
|  |¡}|
d k	rþ|sþ|  |
¡}
t 	d|¡st 	d|¡r"d| }t 
dd|¡}|
p8d}t|ƒdksVt|ƒdkrjtdt|ƒ ƒ dS |  jd7  _| jdkr˜tdt|ƒ ƒ dS | jr¶|| jkr¶|  |¡ |d krÆ| j}|  ||||¡ |||
|dœ| j| |< |	S )Nrú   r   z	internal:r>   é   Fz	external:ú/ú\Tzmailto:r   zFIgnoring URL since it exceeds Excel's string limit of 32767 charactersrû   ú#z\w:z\\zfile:///z^\.\\éÿ   zgIgnoring URL '%s' with link or location/anchor > 255 characters since it exceeds Excel's limit for URLSéýÿÿÿiúÿ  zNIgnoring URL '%s' since it exceeds Excel's limit of 65,530 URLS per worksheet.éüÿÿÿ)Ú	link_typer  rì   r  )rü   r×   Úreplacer   rO   r   r'   Ú_escape_urlrÚ   rÛ   Úsubr   r«   rH   r»   rþ   rÊ   rá   rÄ   )r   rã   r0   r  rø   r÷   r  r&  Zexternalr   Zurl_strZtmp_url_strr"   r"   r#   rÜ   I  sh    







zWorksheet._write_urlc             G   s   | j ||f|žŽ S )aI  
        Write a "rich" string with multiple formats to a worksheet cell.

        Args:
            row:          The cell row (zero indexed).
            col:          The cell column (zero indexed).
            string_parts: String and format pairs.
            cell_format:  Optional Format object.

        Returns:
            0:  Success.
            -1: Row or column is out of worksheet bounds.
            -2: String truncated to 32k characters.
            -3: 2 consecutive formats used.
            -4: Empty string used.
            -5: Insufficient parameters.

        )Ú_write_rich_string)r   rã   r0   r   r"   r"   r#   Úwrite_rich_string¯  s    zWorksheet.write_rich_stringc             G   s  t |ƒ}d }d}d}|  ||¡r$dS t|d tƒr:| ¡ }tƒ }tƒ | _| j |¡ tƒ }	g }
d}d}t	|ƒdkr~t
dƒ dS x–|D ]Ž}t|tƒsà|dkr°|
 |	¡ |
 |¡ n
|
 |¡ |dkrÎt
dƒ d	S |t	|ƒ7 }d
}n*|dkrü|dkrüt
dƒ dS |
 |¡ d}|d7 }q„W t|
d tƒs2| j d¡ xx|
D ]p}t|tƒr`| j d¡ |  |¡ nFg }t d|¡s€t d|¡rŠ| d¡ | j d||¡ | j d¡ q8W | jj ¡ }|| jkrÈdS | jsÞ| j |¡}n|}| jr || jkr |  |¡ t||ƒ| j| |< dS )Nr   rú   r8   r  zfYou must specify more then 2 format/fragments for rich strings. Ignoring input in write_rich_string().éûÿÿÿr>   zYExcel doesn't allow empty strings in rich strings. Ignoring input in write_rich_string().r%  r÷   zaExcel doesn't allow 2 consecutive formats in rich strings. Ignoring input in write_rich_string().r$  r   Úrz^\sz\s$)z	xml:spaceÚpreserveÚtrû   )Úlistrü   rõ   r   Úpopr   r   rº   Z_set_filehandler   r   ÚappendÚ_xml_start_tagÚ_write_fontrÚ   ÚsearchÚ_xml_data_elementÚ_xml_end_tagÚfhÚgetvaluerO   rH   rG   rý   r»   rþ   rÿ   r’   )r   rã   r0   r   Útokensrø   Z
str_lengthr  r8  ÚdefaultZ	fragmentsZpreviousÚposrâ   Ú
attributesr÷   r"   r"   r#   r*  Ç  sp    







zWorksheet._write_rich_stringc             C   s2   x,|D ]$}|   ||||¡}|r"|S |d7 }qW dS )a†  
        Write a row of data starting from (row, col).

        Args:
            row:    The cell row (zero indexed).
            col:    The cell column (zero indexed).
            data:   A list of tokens to be written with write().
            format: An optional cell Format object.
        Returns:
            0:  Success.
            other: Return value of write() method.

        r   r   )ræ   )r   rã   r0   Údatarø   râ   Úerrorr"   r"   r#   Ú	write_row5  s    
zWorksheet.write_rowc             C   s2   x,|D ]$}|   ||||¡}|r"|S |d7 }qW dS )a‰  
        Write a column of data starting from (row, col).

        Args:
            row:    The cell row (zero indexed).
            col:    The cell column (zero indexed).
            data:   A list of tokens to be written with write().
            format: An optional cell Format object.
        Returns:
            0:  Success.
            other: Return value of write() method.

        r   r   )ræ   )r   rã   r0   r>  rø   râ   r?  r"   r"   r#   Úwrite_columnL  s    
zWorksheet.write_columnc             C   sÚ   |   ||dd¡r$td||f ƒ dS |dkr0i }| dd¡}| dd¡}| dd	¡}| d
d	¡}| dd¡}	| dd¡}
| dd¡}| dd¡}|s´tj |¡s´tdt|ƒ ƒ dS | j ||||||||	|
||g¡ dS )aÃ  
        Insert an image with its top-left corner in a worksheet cell.

        Args:
            row:      The cell row (zero indexed).
            col:      The cell column (zero indexed).
            filename: Path and filename for image in PNG, JPG or BMP format.
            options:  Position, scale, url and data stream of the image.

        Returns:
            0:  Success.
            -1: Row or column is out of worksheet bounds.

        Tz Cannot insert image at (%d, %d).rú   NÚx_offsetr   Úy_offsetÚx_scaler   Úy_scaler  r  ZpositioningÚ
image_datazImage file '%s' not found.)	rü   r   ÚgetÚosÚpathÚexistsr   rµ   r2  )r   rã   r0   ÚfilenameÚoptionsrB  rC  rD  rE  r  r  ÚanchorrF  r"   r"   r#   Úinsert_imagec  s$    zWorksheet.insert_imagec       	   
   C   s€   |   ||dd¡r$td||f ƒ dS |dkr0i }| dd¡}| dd¡}| dd	¡}| d
d	¡}| j ||||||||g¡ dS )a†  
        Insert an textbox with its top-left corner in a worksheet cell.

        Args:
            row:      The cell row (zero indexed).
            col:      The cell column (zero indexed).
            text:     The text for the textbox.
            options:  Textbox options.

        Returns:
            0:  Success.
            -1: Row or column is out of worksheet bounds.

        Tz"Cannot insert textbox at (%d, %d).rú   NrB  r   rC  rD  r   rE  )rü   r   rG  r¸   r2  )	r   rã   r0   ÚtextrL  rB  rC  rD  rE  r"   r"   r#   Úinsert_textbox‹  s    zWorksheet.insert_textboxc       	   	   C   sê   |   ||dd¡r$td||f ƒ dS |dkr0i }|jsD|jrP|jjrPtdƒ dS d|_|jrdd|j_| dd¡}| dd¡}| d	d
¡}| dd
¡}|jd
kr¤|j}|jd
kr´|j}|jrÀ|j}|jrÌ|j}| j	 
|||||||g¡ dS )a„  
        Insert an chart with its top-left corner in a worksheet cell.

        Args:
            row:     The cell row (zero indexed).
            col:     The cell column (zero indexed).
            chart:   Chart object.
            options: Position and scale of the chart.

        Returns:
            0:  Success.
            -1: Row or column is out of worksheet bounds.

        Tz Cannot insert chart at (%d, %d).rú   Nz7Chart cannot be inserted in a worksheet more than once.rB  r   rC  rD  r   rE  )rü   r   Zalready_insertedZcombinedrG  rD  rE  rB  rC  r´   r2  )	r   rã   r0   ÚchartrL  rB  rC  rD  rE  r"   r"   r#   Úinsert_chart«  s6    

zWorksheet.insert_chartc             C   sX   |dkri }|   ||¡rdS t|ƒ| jkr.dS d| _d| _|  ||||¡| j| |< dS )až  
        Write a comment to a worksheet cell.

        Args:
            row:     The cell row (zero indexed).
            col:     The cell column (zero indexed).
            comment: Cell comment. Str.
            options: Comment formatting options.

        Returns:
            0:  Success.
            -1: Row or column is out of worksheet bounds.
            -2: String longer than 32k characters.

        Nrú   rû   r   )rü   r   rO   r•   r—   Ú_comment_paramsr˜   )r   rã   r0   ÚcommentrL  r"   r"   r#   Úwrite_commentå  s    zWorksheet.write_commentc             C   s
   d| _ dS )z†
        Make any comments in the worksheet visible.

        Args:
            None.

        Returns:
            Nothing.

        r   N)r›   )r   r"   r"   r#   Úshow_comments  s    zWorksheet.show_commentsc             C   s
   || _ dS )z¦
        Set the default author of the cell comments.

        Args:
            author: Comment author name. String.

        Returns:
            Nothing.

        N)rš   )r   Úauthorr"   r"   r#   Úset_comments_author  s    zWorksheet.set_comments_authorc             C   s   | j S )zw
        Retrieve the worksheet name.

        Args:
            None.

        Returns:
            Nothing.

        )rE   )r   r"   r"   r#   Úget_name"  s    zWorksheet.get_namec             C   s   d| _ d| _| j| j_dS )a  
        Set this worksheet as the active worksheet, i.e. the worksheet that is
        displayed when the workbook is opened. Also set it as selected.

        Note: An active worksheet cannot be hidden.

        Args:
            None.

        Returns:
            Nothing.

        r   r   N)rV   rZ   rF   rÎ   Zactivesheet)r   r"   r"   r#   Úactivate0  s    zWorksheet.activatec             C   s   d| _ d| _dS )zó
        Set current worksheet as a selected worksheet, i.e. the worksheet
        has its tab highlighted.

        Note: A selected worksheet cannot be hidden.

        Args:
            None.

        Returns:
            Nothing.

        r   r   N)rZ   rV   )r   r"   r"   r#   ÚselectB  s    zWorksheet.selectc             C   s   d| _ d| _dS )zv
        Hide the current worksheet.

        Args:
            None.

        Returns:
            Nothing.

        r   r   N)rV   rZ   )r   r"   r"   r#   ÚhideS  s    zWorksheet.hidec             C   s   d| _ | j| j_dS )aJ  
        Set current worksheet as the first visible sheet. This is necessary
        when there are a large number of worksheets and the activated
        worksheet is not visible on the screen.

        Note: A selected worksheet cannot be hidden.

        Args:
            None.

        Returns:
            Nothing.

        r   N)rV   rF   rÎ   Z
firstsheet)r   r"   r"   r#   Úset_first_sheetf  s    zWorksheet.set_first_sheetc             C   s
  |dkri }||kr|| }}d}|  dd¡}|  dd¡}|  dd¡}	|sR|rX|rXd}
nd}
|  d|||
¡rpdS |  d|||
¡r„dS |	dk rd}	|	d	krœd	}	|	| jkr¬|	| _||||||	|g| jd
| < d| _|rÖd}x.t||d ƒD ]}|| j|< |ræ|| j|< qæW dS )a  
        Set the width, and other properties of a single column or a
        range of columns.

        Args:
            first_col:    First column (zero-indexed).
            last_col:     Last column (zero-indexed). Can be same as first_col.
            width:       Column width. (optional).
            cell_format: Column cell_format. (optional).
            options:     Dict of options such as hidden and level.

        Returns:
            0:  Success.
            -1: Column number is out of worksheet bounds.

        NTrV   FÚ	collapsedÚlevelr   rú   é   z%05dr   )rG  rü   r†   rT   r¨   r  r¥   r§   )r   r  r  Úwidthrø   rL  Ú
ignore_rowrV   r^  r_  Ú
ignore_colr0   r"   r"   r#   Ú
set_columnx  s@    


zWorksheet.set_columnc       	      C   sÎ   |dkri }| j dk	r| j }nd}|  ||¡r2dS |dkr@| j}| dd¡}| dd¡}| dd¡}|dkrvd}| j}|dk r‚d}|d	krŽd	}|| jkrž|| _|||||g| j|< d
| _|rÀd}|| j|< dS )a™  
        Set the width, and other properties of a row.

        Args:
            row:         Row number (zero-indexed).
            height:      Row width. (optional).
            cell_format: Row cell_format. (optional).
            options:     Dict of options such as hidden, level and collapsed.

        Returns:
            0:  Success.
            -1: Row number is out of worksheet bounds.

        Nr   rú   rV   Fr^  r_  r   r`  T)rR   rü   r   rG  r…   r   r©   r¦   )	r   rã   Úheightrø   rL  Zmin_colrV   r^  r_  r"   r"   r#   Úset_rowÄ  s4    

zWorksheet.set_rowFc             C   s2   |dkr| j }|| jkr$d| _|| _ |r.d| _dS )zý
        Set the default row properties.

        Args:
            height:           Default height. Optional, defaults to 15.
            hide_unused_rows: Hide unused rows. Optional, defaults to False.

        Returns:
            Nothing.

        NTr   )r   rŒ   r©   r   )r   re  Zhide_unused_rowsr"   r"   r#   Úset_default_row  s    
zWorksheet.set_default_rowc       	      C   sÎ   ||kr||krt dƒ dS ||kr.|| }}||kr@|| }}|  ||¡dkrTdS | j ||||g¡ |  ||||¡ xPt||d ƒD ]>}x8t||d ƒD ]&}||kr²||kr²qœ|  ||d|¡ qœW qˆW dS )a3  
        Merge a range of cells.

        Args:
            first_row:    The first row of the cell range. (zero indexed).
            first_col:    The first column of the cell range.
            last_row:     The last row of the cell range. (zero indexed).
            last_col:     The last column of the cell range.
            data:         Cell data.
            cell_format:  Cell Format object.

        Returns:
             0:    Success.
            -1:    Row or column is out of worksheet bounds.
            other: Return value of write().

        zCan't merge single cellNrú   r   r>   )r   rü   r“   r2  ræ   r  rÖ   )	r   r  r  r  r  r>  rø   rã   r0   r"   r"   r#   Úmerge_range  s     

zWorksheet.merge_rangec             C   s\   ||k r|| }}||k r$|| }}|   ||||¡}t||||ƒ}|| _|| _||g| _dS )aƒ  
        Set the autofilter area in the worksheet.

        Args:
            first_row:    The first row of the cell range. (zero indexed).
            first_col:    The first column of the cell range.
            last_row:     The last row of the cell range. (zero indexed).
            last_col:     The last column of the cell range.

        Returns:
             Nothing.

        N)Ú_convert_name_arear   rŸ   r    r¡   )r   r  r  r  r  ÚareaÚrefr"   r"   r#   Ú
autofilterL  s    

zWorksheet.autofilterc             C   sh  | j stdƒ dS yt|ƒ W nB tk
r`   |}t|d ƒ\}}|| jkr\td| ƒ dS Y nX | j\}}||k s|||kr’td|||f ƒ dS |  |¡}t|ƒdksÀt|ƒdksÀtd| ƒ |  	||¡}t|ƒd	krø|d
 d	krø|  
||d g¡ nft|ƒdkrJ|d
 d	krJ|d	 dkrJ|d d	krJ|  
||d |d g¡ n|| j|< d
| j|< d| _dS )zÆ
        Set the column filter criteria.

        Args:
            col:       Filter column (zero-indexed).
            criteria:  Filter criteria.

        Returns:
             Nothing.

        z-Must call autofilter() before filter_column()Nr.   zInvalid column '%s'z6Column '%d' outside autofilter() column range (%d, %d)r=   r`  z+Incorrect number of tokens in criteria '%s'r  r   r   é   é   )rŸ   r   r   r   r   rN   r¡   Ú_extract_filter_tokensr   Ú_parse_filter_expressionÚfilter_column_listr£   r¤   r¢   )r   r0   ÚcriteriaÚ
col_letterr2   Ú	col_firstÚcol_lastr:  r"   r"   r#   Úfilter_columnj  s8    



*

zWorksheet.filter_columnc             C   s°   | j stdƒ dS yt|ƒ W nB tk
r`   |}t|d ƒ\}}|| jkr\td| ƒ dS Y nX | j\}}||k s|||kr’td|||f ƒ dS || j|< d| j|< d| _	dS )zî
        Set the column filter criteria in Excel 2007 list style.

        Args:
            col:      Filter column (zero-indexed).
            filters:  List of filter criteria to match.

        Returns:
             Nothing.

        z-Must call autofilter() before filter_column()Nr.   zInvalid column '%s'z5Column '%d' outside autofilter() column range (%d,%d)r   )
rŸ   r   r   r   r   rN   r¡   r£   r¤   r¢   )r   r0   Úfiltersrs  r2   rt  ru  r"   r"   r#   rq  ¥  s&    




zWorksheet.filter_column_listc             C   s°  |   ||dd¡rdS |   ||dd¡r(dS |dkr6i }n| ¡ }dddddddddddddddddœ}x(| ¡ D ]}||krntd| ƒ dS qnW d|kr¢|d |d< d	|kr¶|d	 |d< d
|krÊtdƒ dS dddddddddddddœ}|d
 |kr
td|d
  ƒ dS ||d
  |d
< |d
 dkrL| d¡dkrL| d¡dkrLdS |d
 dksv|d
 dksv|d
 dkr†d|d< d|d< d|krœtdƒ dS ddddddddddd d d!d!d"d"d#œ}	|d |	krätd$|d  ƒ dS |	|d  |d< |d dks|d dkr(d|kr0td%ƒ dS nd|d< d&d'd(d)œ}
d*|krPd&|d*< n2|d* |
krrtd+|d*  ƒ dS |
|d*  |d*< |d
 dksž|d
 dkr|d rÐt|d ƒrÐ|  |d ¡}d,| |d< |d rt|d ƒr|  |d ¡}d,| |d< | d¡r8t|d ƒd-kr8td.t|d ƒ ƒ dS | d/¡rnt|d/ ƒd-krntd0t|d/ ƒ ƒ dS | d¡r¤t|d ƒd1kr¤td2t|d ƒ ƒ dS | d3¡rÚt|d3 ƒd1krÚtd4t|d3 ƒ ƒ dS |d
 dkr*t	|d ƒt
kr*| j|d Ž }t|ƒd1kr*td5t|ƒ ƒ dS d6|kr<d'|d6< d7|krNd'|d7< d8|kr`d'|d8< d9|krrd'|d9< ||||gg|d:< d;|kr |d:  |d; ¡ | j |¡ dS )<a  
        Add a data validation to a worksheet.

        Args:
            first_row:    The first row of the cell range. (zero indexed).
            first_col:    The first column of the cell range.
            last_row:     The last row of the cell range. (zero indexed).
            last_col:     The last column of the cell range.
            options:      Data validation options.

        Returns:
            0:  Success.
            -1: Row or column is out of worksheet bounds.
            -2: Incorrect parameter or option.
        Trú   N)Úvalidaterr  r	  ÚsourceÚminimumÚmaximumÚignore_blankÚdropdownÚ
show_inputÚinput_titleÚinput_messageÚ
show_errorÚerror_titleÚerror_messageÚ
error_typeÚother_cellsz+Unknown parameter '%s' in data_validation()rû   ry  r	  rz  rx  z5Parameter 'validate' is required in data_validation()ÚnoneÚwholeÚdecimalr0  rî   rï   Z
textLengthÚcustom)Úanyz	any valuezwhole numberr‡  Zintegerrˆ  r0  rî   rï   ztext lengthÚlengthr‰  zJUnknown validation type '%s' for parameter 'validate' in data_validation()r  r€  Úbetweenrr  r{  z5Parameter 'criteria' is required in data_validation()Ú
notBetweenÚequalÚnotEqualÚgreaterThanÚlessThanÚgreaterThanOrEqualÚlessThanOrEqual)rŒ  znot betweenzequal torÔ   z==znot equal toz!=z<>zgreater thanú>z	less thanú<zgreater than or equal toz>=zless than or equal toz<=zHUnknown criteria type '%s' for parameter 'criteria' in data_validation()zcParameter 'maximum' is required in data_validation() when using 'between' or 'not between' criteriar   r   r  )ÚstopÚwarningÚinformationr„  zJUnknown criteria type '%s' for parameter 'error_type' in data_validation()z%.16gé    z6Length of input title '%s' exceeds Excel's limit of 32r‚  z6Length of error title '%s' exceeds Excel's limit of 32r#  z9Length of input message '%s' exceeds Excel's limit of 255rƒ  z9Length of error message '%s' exceeds Excel's limit of 255zSLength of list items '%s' exceeds Excel's limit of 255, use a formula range insteadr|  r}  r~  r  Úcellsr…  )rü   ÚcopyÚkeysr   rG  r   r  r   r   ré   r0  Ú	_csv_joinr(   r¼   r2  )r   r  r  r  r  rL  Úvalid_parametersÚ	param_keyÚvalid_typesZcriteria_typesZerror_typesÚ	date_timer  r"   r"   r#   Údata_validationÍ  s"   





 




zWorksheet.data_validationc          %   C   s8  |   ||dd¡rdS |   ||dd¡r(dS |dkr6i }n| ¡ }dddddddddddddddddddddddddddddddddddddœ$}x(| ¡ D ]}||kr–td| ƒ dS q–W d|krÊtdƒ dS d	d
ddddddddddddddddddœ}|d |krtd|d  ƒ dS |d dkr.d|d< ||d  |d< dd d!d!d!d"d"d"d#d#d$d$d%d%d&d&d'd(d)d*d+d,d-d.d/d0d1d2d3d0d3d4œ}	d5|krª|d5 |	krª|	|d5  |d5< |d d
ksÆ|d dkrˆd	|d< d6|krt|d6 ƒsòtd7ƒ dS |  |d6 ¡}
d8|
 |d6< d9|krJt|d9 ƒs0td:ƒ dS |  |d9 ¡}
d8|
 |d9< d;|krˆt|d; ƒsntd<ƒ dS |  |d; ¡}
d8|
 |d;< d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNœ}|d dkr^| dO¡sÖtdPƒ dQS |dO |krøtdR|dO  ƒ dS ||dO  |dO< dS|dT< |dO  dU¡r*dV|dT< n|dO  dW¡rBdX|dT< |  | dT¡| dY¡¡|dY< ||krr|| }}||kr†|| }}||krª||krªt	||ƒ}|}nt
||||ƒ}t	||ƒ}dZ|krà|dZ }| d[d\¡}d]|kr|d] r|d]  ¡ |d]< | j|d^< |  jd_7  _| js¨| d`¡s¨| da¡s¨| db¡s¨| dc¡s¨| dd¡s¨| de¡s¨| df¡s¨| dg¡s¨| dh¡s¨| di¡s¨| dj¡r°d|dk< |d dkr’|d5 d'krêd'|d< dl|d6 |f |dm< n¨|d5 d(krdn|d< do|d6 |f |dm< n||d5 d)krLd)|d< dp|t|d6 ƒ|d6 f |dm< nF|d5 d*kr‚d*|d< dq|t|d6 ƒ|d6 f |dm< ntdr|d5  ƒ |d dkrî|d5 d+kr¾ds| |dm< n0|d5 d,krÜdt| |dm< n|d5 dukrødv| |dm< nö|d5 d-krdw||f |dm< nÖ|d5 d.kr8dx||f |dm< n¶|d5 d/krXdy||f |dm< n–|d5 d0krxdz||f |dm< nv|d5 d1kršd{|||f |dm< nT|d5 d2krºd|||f |dm< n4|d5 d3krÞd}||||f |dm< ntd~|d5  ƒ |d dkrd| |dm< |d dkr"d€| |dm< |d dkr<d| |dm< |d dkrVd‚| |dm< |d dkrìdƒ|d< d|d]< d|d„< d|d…< | d†d‡¡ | dˆd‰¡ | dŠd‹¡ | dŒd‹¡ | ddŽ¡ | dd¡ t|d ƒ|d< t|d ƒ|d< |d dkr¬dƒ|d< d|d]< | d†d‡¡ | d„d‘¡ | dˆd‰¡ | dŠd‹¡ | dŒd‹¡ | dd’¡ | d…d“¡ | dd”¡ t|d ƒ|d< t|d… ƒ|d…< t|d ƒ|d< d•|kr¬d–|d•< |d dk
rd|d]< | d†¡sàd‡|d†< d—|d˜< n|d† |d˜< | dˆ¡	s
d‰|dˆ< d™|dš< n|dˆ |dš< | dŠd‹¡ | dŒd‹¡ | d›dœ¡ | db|d› ¡ | ddž¡ | dgdž¡ | dadž¡ | djd\¡ | dcdŸ¡ | dedŸ¡ | dddž¡ | dfdž¡ | dhd\¡ | did ¡ t|d› ƒ|d›< t|db ƒ|db< t|di ƒ|di< t|dc ƒ|dc< t|de ƒ|de< | dk¡
rtd¡| _|d† d‡k
rH|dŠ d‹k
rHd|dŠ< |dˆ d‰k
rl|dŒ d‹k
rld|dŒ< ||d¢< y|dŠ  d£¡|dŠ< W n ttfk

r¤   Y nX y|d•  d£¡|d•< W n ttfk

rÖ   Y nX y|dŒ  d£¡|dŒ< W n ttfk
r   Y nX || jkr(| j|  |¡ n|g| j|< dS )¤a#  
        Add a conditional format to a worksheet.

        Args:
            first_row:    The first row of the cell range. (zero indexed).
            first_col:    The first column of the cell range.
            last_row:     The last row of the cell range. (zero indexed).
            last_col:     The last column of the cell range.
            options:      Conditional format options.

        Returns:
            0:  Success.
            -1: Row or column is out of worksheet bounds.
            -2: Incorrect parameter or option.
        Trú   N)$ré   r8   rr  r	  rz  r{  Ústop_if_trueÚmin_typeÚmid_typeÚmax_typeÚ	min_valueÚ	mid_valueÚ	max_valueÚ	min_colorÚ	mid_colorÚ	max_colorÚ
min_lengthÚ
max_lengthÚmulti_rangeÚ	bar_colorÚbar_negative_colorÚbar_negative_color_sameÚ	bar_solidÚbar_border_colorÚbar_negative_border_colorÚbar_negative_border_color_sameÚbar_no_borderÚbar_directionÚbar_axis_positionÚbar_axis_colorÚbar_onlyÚdata_bar_2010Ú
icon_styleÚreverse_iconsÚ
icons_onlyÚiconsz.Unknown parameter '%s' in conditional_format()rû   ré   z4Parameter 'type' is required in conditional_format()ÚcellIsrî   rï   ÚaboveAverageÚduplicateValuesÚuniqueValuesÚtop10rO  Ú
timePeriodÚcontainsBlanksÚnotContainsBlanksÚcontainsErrorsÚnotContainsErrorsÚ2_color_scaleÚ3_color_scaleÚdataBarÚ
expressionÚiconSet)Úcellrî   rï   ÚaverageZ	duplicateÚuniqueÚtopÚbottomrO  Ztime_periodÚblanksZ	no_blanksÚerrorsZ	no_errorsrË  rÌ  Údata_barr  Zicon_setz?Unknown value '%s' for parameter 'type' in conditional_format()rÔ  Ú	directionrŒ  r  rŽ  r  r  r‘  r’  r“  ÚcontainsTextZnotContainsÚ
beginsWithÚendsWithÚ	yesterdayÚtodayZ	last7DaysZlastWeekZthisWeekZnextWeekZ	lastMonthZ	thisMonthZ	nextMonth)rŒ  znot betweenzequal torÔ   z==znot equal toz!=z<>zgreater thanr”  z	less thanr•  zgreater than or equal toz>=zless than or equal toz<=Z
containingznot containingzbegins withz	ends withrÜ  rÝ  zlast 7 daysz	last weekz	this weekz	next weekz
last monthz
this monthz
next monthzcontinue weekzcontinue monthrr  r	  z5Conditional format 'value' must be a datetime object.z%.16grz  z7Conditional format 'minimum' must be a datetime object.r{  z7Conditional format 'maximum' must be a datetime object.Z3ArrowsZ3FlagsZ3TrafficLights2Z3SymbolsZ4ArrowsZ4RedToBlackZ4TrafficLightsZ5ArrowsGrayZ	5QuartersZ3ArrowsGrayÚ3TrafficLightsZ3SignsZ	3Symbols2Z4ArrowsGrayZ4RatingZ5ArrowsZ5Rating)Z3_arrowsZ3_flagsZ3_traffic_lights_rimmedZ3_symbols_circledZ4_arrowsZ4_red_to_blackZ4_traffic_lightsZ5_arrows_grayZ
5_quartersZ3_arrows_grayZ3_traffic_lightsZ3_signsZ	3_symbolsZ4_arrows_grayZ	4_ratingsZ5_arrowsZ	5_ratingsr½  z^The 'icon_style' parameter must be specified when 'type' == 'icon_set' in conditional_format()r$  z/Unknown icon_style '%s' in conditional_format()r=   Útotal_iconsÚ4rn  Ú5rm  rÀ  r¯  ú$r>   r8   Úpriorityr   r¼  r³  r´  r±  r²  rµ  r¶  r·  r¹  rº  r¸  Úis_data_bar_2010zNOT(ISERROR(SEARCH("%s",%s)))r  ÚnotContainsTextzISERROR(SEARCH("%s",%s))zLEFT(%s,%d)="%s"zRIGHT(%s,%d)="%s"z2Invalid text criteria '%s' in conditional_format()zFLOOR(%s,1)=TODAY()-1zFLOOR(%s,1)=TODAY()ZtomorrowzFLOOR(%s,1)=TODAY()+1z0AND(TODAY()-FLOOR(%s,1)<=6,FLOOR(%s,1)<=TODAY())z]AND(TODAY()-ROUNDDOWN(%s,0)>=(WEEKDAY(TODAY())),TODAY()-ROUNDDOWN(%s,0)<(WEEKDAY(TODAY())+7))z\AND(TODAY()-ROUNDDOWN(%s,0)<=WEEKDAY(TODAY())-1,ROUNDDOWN(%s,0)-TODAY()<=7-WEEKDAY(TODAY()))z_AND(ROUNDDOWN(%s,0)-TODAY()>(7-WEEKDAY(TODAY())),ROUNDDOWN(%s,0)-TODAY()<(15-WEEKDAY(TODAY())))zdAND(MONTH(%s)=MONTH(TODAY())-1,OR(YEAR(%s)=YEAR(TODAY()),AND(MONTH(%s)=1,YEAR(A1)=YEAR(TODAY())-1)))z4AND(MONTH(%s)=MONTH(TODAY()),YEAR(%s)=YEAR(TODAY()))zeAND(MONTH(%s)=MONTH(TODAY())+1,OR(YEAR(%s)=YEAR(TODAY()),AND(MONTH(%s)=12,YEAR(%s)=YEAR(TODAY())+1)))z9Invalid time_period criteria '%s' in conditional_format()zLEN(TRIM(%s))=0zLEN(TRIM(%s))>0zISERROR(%s)zNOT(ISERROR(%s))Ú
colorScaler¥  r«  r¤  Úminr¦  Úmaxr§  r   r©  rª  z#FF7128r¬  z#FFEF9CÚ
percentilez#F8696Bz#FFEB84z#63BE7Br¨  é2   ÚautoMinÚx14_min_typeÚautoMaxÚx14_max_typer°  z#638EC6r»  Fz#FF0000z#000000iÚ  r  rÔ   )rü   r›  rœ  r   r   r  rG  r×   Ú_set_icon_propsr   r   r'  Ú_get_dxf_indexrÀ   r¿   r   Ú
setdefaultr   rK   r  ÚKeyErrorÚAttributeErrorr½   r2  )r   r  r  r  r  rL  Úvalid_parameterrŸ  Z
valid_typeZcriteria_typer¡  Zvalid_iconsr  Ú
start_cellr"   r"   r#   Úconditional_format¸  sš   
















zWorksheet.conditional_formatc             C   sþ  i }i }|dkri }n|  ¡ }| jr0tdƒ dS |  ||dd¡rDdS |  ||dd¡rXdS ddddddddddddœ}x(| ¡ D ]}	|	|kr~td|	 ƒ dS q~W | d	d¡|d	< | d
d¡|d
< | dd¡|d< | dd¡|d< | dd¡|d< | d	d¡|d< | dd¡|d< | d
d¡|d< | dd¡|d< d|krì|d }
|
|d< d|
krftdt|
ƒ ƒ dS t d|
tj	¡r†t d|
¡rštdt|
ƒ ƒ dS t d|
¡r¼tdt|
ƒ ƒ dS t d |
¡sØt d!|
¡rìtd"t|
ƒ ƒ dS d#|kr|d# |d#< |d#  
dd$¡|d#< nd%|d#< ||kr4|| }}||krH|| }}|}|}| d
¡rd|d&7 }| d¡rx|d&8 }t||||ƒ|d'< t||||ƒ|d(< |d
 s®d|d< |d rÄ|d( |d< d&}g |d)< i }x\t||d& ƒD ]H}|d*t|ƒ d$d$dd$ddd+œ}d)|krö|t|d) ƒkr8|d) |d&  }nd}|rö| d,d¡}| d-¡rf|d- |d< |d }| ¡ }
|
|kr”td.t|
ƒ ƒ dS d||
< | d/¡|d0< d1|kr|d1 r|d1 }| d2¡rÜ| d2¡}| 
d3d4¡}||d1< x(t||d& ƒD ]}|  ||||¡ q W | d5¡r¢|d5 }| ¡ }| 
d6d$¡}| 
dd$¡}|d7kr\d8}|d9krjd:}||d5< |  ||d ¡}| d;d¡}|  |||||¡ n2| d<¡rÔ|d< }||d<< |  |||| d,¡¡ |dk	rê| ¡ |d,< |||d& < |d)  |¡ |d
 r&|  |||d |d0 ¡ |d&7 }qæW d=|krî|d= }d}x¢t||d& ƒD ]}d}x|t||d& ƒD ]j}|t|ƒk rÒ|t|| ƒk rÒ|| | }||krÂ|  ||||| ¡ n|  |||d¡ |d&7 }qrW |d&7 }qZW | j |¡ |S )>aY  
        Add an Excel table to a worksheet.

        Args:
            first_row:    The first row of the cell range. (zero indexed).
            first_col:    The first column of the cell range.
            last_row:     The last row of the cell range. (zero indexed).
            last_col:     The last column of the cell range.
            options:      Table format options. (Optional)

        Returns:
            0:  Success.
            -1: Not supported in constant_memory mode.
            -2: Row or column is out of worksheet bounds.
            -3: Incorrect parameter or option.
        Nz5add_table() isn't supported in 'constant_memory' moderú   Trû   )rl  Úbanded_columnsÚbanded_rowsÚcolumnsr>  Úfirst_columnÚ
header_rowÚlast_columnrE   ÚstyleÚ	total_rowz%Unknown parameter '%s' in add_table()r$  rø  rû  rl  rú  FZshow_first_colrü  Zshow_last_colZshow_row_stripesr÷  Zshow_col_stripesr   Zheader_row_countrþ  Ztotals_row_shownrE   ú z.Name '%s' in add_table() cannot contain spacesz^[\w\\][\w\\.]*$z^\dz-Invalid Excel characters in add_table(): '%s'z"^[a-zA-Z][a-zA-Z]?[a-dA-D]?[0-9]+$z0Name looks like a cell name in add_table(): '%s'z^[rcRC]$z^[rcRC]\d+[rcRC]\d+$z3Invalid name '%s' like a RC cell ref in add_table()rý  r>   ZTableStyleMedium9r   r  Za_rangerù  ZColumn)ÚidrE   Útotal_stringÚtotal_functionÚtotal_valuer  r8   Úname_formatr8   rf   z*Duplicate header name in add_table(): '%s'Zheader_formatr  r  rÔ   ú@z[#This Row],r  r2   Z	countnumsÚ	countNumsZstddevÚstdDevr  r  r>  )r›  rH   r   rü   rœ  rG  r   rÚ   rÛ   ÚUNICODEr'  r   r  rì   r   Úlowerr×   r  rØ   Ú_table_function_to_formulará   rð  r2  ræ   r¶   )r   r  r  r  r  rL  r’   r§   rô  rŸ  rE   Zfirst_data_rowZlast_data_rowÚcol_idZ
seen_namesÚcol_numZcol_dataZ	user_dataZxformatZheader_namer  rã   Úfunctionr	  r  r>  ÚiÚjr0   râ   r"   r"   r#   Ú	add_table¡	  s<   






















 
zWorksheet.add_tablec             C   s  |   ||dd¡rdS dt||ƒgi}|dkr0i }dddddddddddddddddddddddddddœ}x(| ¡ D ]}||krttd| ƒ dS qtW d|kr¨tdƒ d	S | d
d¡}|dkrÈtdƒ d	S |dkrÔd}||d
< d|krt|d ƒtkr|d |d< n|d g|d< t|d ƒtkr4|d |d< n|d g|d< t|d ƒ}t|d ƒ}	||	krptdƒ d	S t|d ƒ|d< t| j	ƒ}
g }xH|d D ]<}| 
dd¡}| d¡}d|krÈ|
d | }| |¡ q˜W ||d< g }x(|d D ]}| 
dd¡}| |¡ qîW ||d< | d¡|d< | d¡|d< | d¡|d< | d¡|d< | d ¡|d!< | d"¡|d"< | d#¡|d#< | d$¡|d$< | d%¡|d%< | d&¡|d&< | d'¡|d(< | d)¡|d)< | d*d¡}|d+krÞd,|d-< n|d.kròd/|d-< nd0|d-< | d1¡}|r d|kr |
d | }||d1< | d2d,¡}t|ƒ}|d3 |d4< |d |d5< |d" |d6< |d |d7< |d! |d8< |d |d9< |d |d:< |  ||d4¡ |  ||d5¡ |  ||d6¡ |  ||d7¡ |  ||d8¡ |  ||d9¡ |  ||d:¡ | j |¡ dS );ap  
        Add sparklines to the worksheet.

        Args:
            row:     The cell row (zero indexed).
            col:     The cell column (zero indexed).
            options: Sparkline formatting options.

        Returns:
            0:  Success.
            -1: Row or column is out of worksheet bounds.
            -2: Incorrect parameter or option.

        Trú   Ú	locationsN)Úlocationr  ré   Ú
high_pointÚ	low_pointÚnegative_pointsÚfirst_pointÚ
last_pointÚmarkersrý  Úseries_colorÚnegative_colorÚmarkers_colorÚfirst_colorÚ
last_colorÚ
high_colorÚ	low_colorrè  rç  ÚaxisÚreverseÚempty_cellsÚshow_hiddenZplot_hiddenÚ	date_axisÚweightz)Unknown parameter '%s' in add_sparkline()r  z0Parameter 'range' is required in add_sparkline()rû   ré   Úline)r&  ÚcolumnÚwin_losszJParameter 'type' must be 'line', 'column' or 'win_loss' in add_sparkline()r(  Zstackedr  ÚrangeszMMust have the same number of location and range parameters in add_sparkline()Úcountrâ  r>   rÔ   ú!r  Úhighr  Úlowr  Únegativer  Úfirstr  Úlastr  rç  rè  r   r!  r#  rV   r%  r"  Zzeror   ÚemptyZconnectÚspanZgapr$  rý  Zseriesr  r  r  r  r  r  r  )rü   r   rœ  r   rG  ré   r0  r   r   rE   r'  r  r2  r   Ú_set_spark_colorr·   )r   rã   r0   rL  Ú	sparklinerž  rŸ  Z
spark_typeZrange_countZlocation_countÚ	sheetnameZ
new_rangesÚspark_rangeZnew_locationsr  r1  Z
date_rangeZstyle_idrý  r"   r"   r#   Úadd_sparklineµ
  sÞ    









zWorksheet.add_sparklinec             C   st   d}t ||ƒ}||kr || }}||kr2|| }}||krH||krH|}nt||||ƒ}|dkrbdS |||gg| _dS )a‰  
        Set the selected cell or cells in a worksheet

        Args:
            first_row:    The first row of the cell range. (zero indexed).
            first_col:    The first column of the cell range.
            last_row:     The last row of the cell range. (zero indexed).
            last_col:     The last column of the cell range.

        Returns:
            0:  Nothing.
        NÚA1)r   r   rU   )r   r  r  r  r  ÚpaneÚactive_cellÚsqrefr"   r"   r#   Úset_selectionp  s    


zWorksheet.set_selectionr   c             C   s"   || _ || _|| _|| _d| _dS )a  
        Control outline settings.

        Args:
            visible:       Outlines are visible. Optional, defaults to True.
            symbols_below: Show row outline symbols below the outline bar.
                           Optional, defaults to True.
            symbols_right: Show column outline symbols to the right of the
                           outline bar. Optional, defaults to True.
            auto_style:    Use Automatic style. Optional, defaults to False.

        Returns:
            0:  Nothing.
        TN)rŠ   rˆ   r‰   r‡   r‹   )r   ÚvisibleZsymbols_belowZsymbols_rightZ
auto_styler"   r"   r#   Úoutline_settings—  s
    zWorksheet.outline_settingsc             C   s,   |dkr|}|dkr|}|||||g| _ dS )at  
        Create worksheet panes and mark them as frozen.

        Args:
            row:      The cell row (zero indexed).
            col:      The cell column (zero indexed).
            top_row:  Topmost visible row in scrolling region of pane.
            left_col: Leftmost visible row in scrolling region of pane.

        Returns:
            0:  Nothing.

        N)rX   )r   rã   r0   Útop_rowÚleft_colÚ	pane_typer"   r"   r#   Úfreeze_panes®  s
    zWorksheet.freeze_panesc             C   s   |   ||||d¡ dS )a‚  
        Create worksheet panes and mark them as split.

        Args:
            x:        The position for the vertical split.
            y:        The position for the horizontal split.
            top_row:  Topmost visible row in scrolling region of pane.
            left_col: Leftmost visible row in scrolling region of pane.

        Returns:
            0:  Nothing.

        r  N)rB  )r   ÚxÚyr?  r@  r"   r"   r#   Úsplit_panesÅ  s    zWorksheet.split_panesr?   c             C   s.   |dk s|dkr t d| ƒ d}t|ƒ| _dS )zš
        Set the worksheet zoom factor.

        Args:
            zoom: Scale factor: 10 <= zoom <= 400.

        Returns:
            Nothing.

        é
   i  z/Zoom factor %d outside range: 10 <= zoom <= 400r?   N)r   r   r€   )r   r€   r"   r"   r#   Úset_zoom×  s    zWorksheet.set_zoomc             C   s
   d| _ dS )zš
        Display the worksheet right to left for some versions of Excel.

        Args:
            None.

        Returns:
            Nothing.

        r   N)rƒ   )r   r"   r"   r#   Úright_to_lefté  s    zWorksheet.right_to_leftc             C   s
   d| _ dS )z
        Hide zero values in worksheet cells.

        Args:
            None.

        Returns:
            Nothing.

        r   N)r„   )r   r"   r"   r#   Ú	hide_zeroö  s    zWorksheet.hide_zeroc             C   s   t |ƒ| _dS )z“
        Set the color of the worksheet tab.

        Args:
            color: A #RGB color index.

        Returns:
            Nothing.

        N)r   rW   )r   Úcolorr"   r"   r#   Úset_tab_color  s    zWorksheet.set_tab_colorr>   c             C   sˆ   |dkr|   |¡}|si }ddddddddddddddddddœ}x2| ¡ D ]&}||krf|| ||< qLtd| ƒ qLW ||d< || _dS )zù
        Set the password and protection options of the worksheet.

        Args:
            password: An optional password string.
            options:  A dictionary of worksheet objects to protect.

        Returns:
            Nothing.

        r>   TF)ÚsheetÚcontentÚobjectsÚ	scenariosÚformat_cellsÚformat_columnsÚformat_rowsÚinsert_columnsÚinsert_rowsÚinsert_hyperlinksÚdelete_columnsÚdelete_rowsÚselect_locked_cellsÚsortrl  Úpivot_tablesÚselect_unlocked_cellszUnknown protection object: '%s'ÚpasswordN)Ú_encode_passwordrœ  r   r}   )r   r\  rL  ÚdefaultsÚkeyr"   r"   r#   Úprotect  s6    
zWorksheet.protectc             C   sT   |   ||dd¡r$td||f ƒ dS |dkr0i }|  |||¡}| j |¡ d| _dS )aM  
        Insert a button form object into the worksheet.

        Args:
            row:     The cell row (zero indexed).
            col:     The cell column (zero indexed).
            options: Button formatting options.

        Returns:
            0:  Success.
            -1: Row or column is out of worksheet bounds.

        Tz!Cannot insert button at (%d, %d).rú   Nr   )rü   r   Ú_button_paramsr   r2  r•   )r   rã   r0   rL  Úbuttonr"   r"   r#   Úinsert_buttonC  s    zWorksheet.insert_buttonc             C   s   d| _ d| _dS )z
        Set the page orientation as landscape.

        Args:
            None.

        Returns:
            Nothing.

        r   TN)r]   r[   )r   r"   r"   r#   Úset_landscapee  s    zWorksheet.set_landscapec             C   s   d| _ d| _dS )z€
        Set the page orientation as portrait.

        Args:
            None.

        Returns:
            Nothing.

        r   TN)r]   r[   )r   r"   r"   r#   Úset_portraits  s    zWorksheet.set_portraitc             C   s
   d| _ dS )zr
        Set the page view mode.

        Args:
            None.

        Returns:
            Nothing.

        r   N)rÁ   )r   r"   r"   r#   Úset_page_view  s    zWorksheet.set_page_viewc             C   s   |r|| _ d| _dS )z˜
        Set the paper type. US Letter = 1, A4 = 9.

        Args:
            paper_size: Paper index.

        Returns:
            Nothing.

        TN)r\   r[   )r   r\   r"   r"   r#   Ú	set_paperŽ  s    zWorksheet.set_paperc             C   s   d| _ d| _dS )zx
        Center the page horizontally.

        Args:
            None.

        Returns:
            Nothing.

        Tr   N)r^   r_   )r   r"   r"   r#   Úcenter_horizontally  s    zWorksheet.center_horizontallyc             C   s   d| _ d| _dS )zv
        Center the page vertically.

        Args:
            None.

        Returns:
            Nothing.

        Tr   N)r^   r`   )r   r"   r"   r#   Úcenter_vertically«  s    zWorksheet.center_verticallyçffffffæ?ç      è?c             C   s   || _ || _|| _|| _dS )zò
        Set all the page margins in inches.

        Args:
            left:   Left margin.
            right:  Right margin.
            top:    Top margin.
            bottom: Bottom margin.

        Returns:
            Nothing.

        N)rm   rn   ro   rp   )r   ÚleftÚrightrÓ  rÔ  r"   r"   r#   Úset_margins¹  s    zWorksheet.set_marginsc             C   sj  |}|  dd¡}t|ƒdkr(tdƒ dS |dk	rDt|tƒsHd|i}ni }| ¡ }|dk	r`||d< g | _| d¡rŽ| j | d¡| d¡d	g¡ | d
¡r¶| j | d
¡| d¡dg¡ | d¡rÞ| j | d¡| d¡dg¡ | 	d¡}t| jƒ}||krtd|||f ƒ g | _dS d|kr,|d | _
d|kr@|d | _|| _| dd¡| _d| _|rfd| _dS )zù
        Set the page header caption and optional margin.

        Args:
            header:  Header string.
            margin:  Header margin.
            options: Header options, mainly for images.

        Returns:
            Nothing.

        z
&[Picture]z&Gr#  z.Header string must be less than 255 charactersNÚmarginÚ
image_leftÚimage_data_leftZLHÚimage_centerÚimage_data_centerZCHÚimage_rightÚimage_data_rightZRHzONumber of header images (%s) doesn't match placeholder count (%s) in string: %sÚalign_with_marginsÚscale_with_docg333333Ó?T)r'  r   r   rõ   r~   r›  rj   rG  r2  r*  rh   ri   rf   rq   re   r–   )r   rf   rL  ro  Zheader_origÚplaceholder_countÚimage_countr"   r"   r#   Ú
set_headerÌ  sR    











zWorksheet.set_headerc             C   sj  |}|  dd¡}t|ƒdkr(tdƒ dS |dk	rDt|tƒsHd|i}ni }| ¡ }|dk	r`||d< g | _| d¡rŽ| j | d¡| d¡d	g¡ | d
¡r¶| j | d
¡| d¡dg¡ | d¡rÞ| j | d¡| d¡dg¡ | 	d¡}t| jƒ}||krtd|||f ƒ g | _dS d|kr,|d | _
d|kr@|d | _|| _| dd¡| _d| _|rfd| _dS )zù
        Set the page footer caption and optional margin.

        Args:
            footer:  Footer string.
            margin:  Footer margin.
            options: Footer options, mainly for images.

        Returns:
            Nothing.

        z
&[Picture]z&Gr#  z.Footer string must be less than 255 charactersNro  rp  rq  ZLFrr  rs  ZCFrt  ru  ZRFzONumber of footer images (%s) doesn't match placeholder count (%s) in string: %srv  rw  g333333Ó?T)r'  r   r   rõ   r~   r›  rk   rG  r2  r*  rh   ri   rg   rr   re   r–   )r   rg   rL  ro  Zfooter_origrx  ry  r"   r"   r#   Ú
set_footer  sR    











zWorksheet.set_footerc             C   sD   |dkr|}|d7 }|d7 }d||f }t | jƒ}|d | | _dS )zÕ
        Set the rows to repeat at the top of each printed page.

        Args:
            first_row: Start row for range.
            last_row: End row for range.

        Returns:
            Nothing.

        Nr   z$%d:$%dr+  )r   rE   rs   )r   r  r  rj  r5  r"   r"   r#   Úrepeat_rowsb  s    
zWorksheet.repeat_rowsc             C   sH   |dkr|}t |dƒ}t |dƒ}|d | }t| jƒ}|d | | _dS )zé
        Set the columns to repeat at the left hand side of each printed page.

        Args:
            first_col: Start column for range.
            last_col: End column for range.

        Returns:
            Nothing.

        Nr   r&   r+  )r   r   rE   rt   )r   r  r  rj  r5  r"   r"   r#   Úrepeat_columns|  s    


zWorksheet.repeat_columnsc             C   sB   |dkrd| _ d| _d| _n"|dkr2d| _ d| _nd| _ d| _dS )a1  
        Set the option to hide gridlines on the screen and the printed page.

        Args:
            option:    0 : Don't hide gridlines
                       1 : Hide printed gridlines only
                       2 : Hide screen and printed gridlines

        Returns:
            Nothing.

        r   r   TN)ra   rb   r^   )r   Zoptionr"   r"   r#   Úhide_gridlines—  s    zWorksheet.hide_gridlinesc             C   s   d| _ d| _dS )z¢
        Set the option to print the row and column headers on the printed page.

        Args:
            None.

        Returns:
            Nothing.

        TN)rc   r^   )r   r"   r"   r#   Úprint_row_col_headers¯  s    zWorksheet.print_row_col_headersc             C   s
   d| _ dS )zž
        Set the option to hide the row and column headers on the worksheet.

        Args:
            None.

        Returns:
            Nothing.

        TN)rd   )r   r"   r"   r#   Úhide_row_col_headers½  s    zWorksheet.hide_row_col_headersc             C   sJ   |dkr0|dkr0|| j d kr0|| jd kr0dS |  ||||¡}|| _dS )aÃ  
        Set the print area in the current worksheet.

        Args:
            first_row:    The first row of the cell range. (zero indexed).
            first_col:    The first column of the cell range.
            last_row:     The last row of the cell range. (zero indexed).
            last_col:     The last column of the cell range.

        Returns:
            0:  Success.
            -1: Row or column is out of worksheet bounds.

        r   r   N)rM   rN   ri  ru   )r   r  r  r  r  rj  r"   r"   r#   Ú
print_areaÊ  s    zWorksheet.print_areac             C   s   d| _ d| _dS )z„
        Set the order in which pages are printed.

        Args:
            None.

        Returns:
            Nothing.

        r   TN)rv   r[   )r   r"   r"   r#   Úprint_acrossç  s    zWorksheet.print_acrossc             C   s   d| _ || _|| _d| _dS )a  
        Fit the printed area to a specific number of pages both vertically and
        horizontally.

        Args:
            width:  Number of pages horizontally.
            height: Number of pages vertically.

        Returns:
            Nothing.

        r   TN)rx   ry   rz   r[   )r   ra  re  r"   r"   r#   Úfit_to_pagesõ  s    zWorksheet.fit_to_pagesc             C   s
   || _ dS )zœ
        Set the start page number when printing.

        Args:
            start_page: Start page number.

        Returns:
            Nothing.

        N)rw   )r   Z
start_pager"   r"   r#   Úset_start_page  s    zWorksheet.set_start_pagec             C   s:   |dk s|dkr t d| ƒ dS d| _t|ƒ| _d| _dS )z§
        Set the scale factor for the printed page.

        Args:
            scale: Print scale. 10 <= scale <= 400.

        Returns:
            Nothing.

        rF  i  z2Print scale '%d' outside range: 10 <= scale <= 400Nr   T)r   rx   r   r‚   r[   )r   Úscaler"   r"   r#   Úset_print_scale  s    
zWorksheet.set_print_scalec             C   s
   || _ dS )z¿
        Set the horizontal page breaks on a worksheet.

        Args:
            breaks: List of rows where the page breaks should be added.

        Returns:
            Nothing.

        N)r{   )r   Úbreaksr"   r"   r#   Úset_h_pagebreaks*  s    zWorksheet.set_h_pagebreaksc             C   s
   || _ dS )zÂ
        Set the horizontal page breaks on a worksheet.

        Args:
            breaks: List of columns where the page breaks should be added.

        Returns:
            Nothing.

        N)r|   )r   r‡  r"   r"   r#   Úset_v_pagebreaks7  s    zWorksheet.set_v_pagebreaksc             C   s   |dk	r|| _ n| j| _ dS )zç
        Set the VBA name for the worksheet. By default this is the
        same as the sheet name: i.e., Sheet1 etc.

        Args:
            name: The VBA name for the worksheet.

        Returns:
            Nothing.

        N)rÂ   rE   )r   rE   r"   r"   r#   Úset_vba_nameD  s    zWorksheet.set_vba_namec             C   s  |d | _ |d | _|d | _|d | _|d | _|d | _|d | _|d | _|d	 | _|d
 | _	|d | _
|d | _|d | _|d | _|d | _| jrØd| _d| _d| _d| _d| _d| _d| _d| _d| _d| _| jrtj| jd\}}t |¡ || _t |dd¡| _ | j | _!d S )NrE   rF   rG   rÎ   rH   rI   rÃ   rÅ   rÈ   rÆ   rÇ   rÉ   rÊ   rL   rË   g     €)@é   g      è?r   g      à?F)Údirzw+zutf-8)"rE   rF   rG   rÎ   rH   rI   rÃ   rÅ   rÈ   rÆ   rÇ   rÉ   rÊ   rL   rË   rŒ   r   rŽ   rm   rn   ro   rp   rq   rr   rh   ÚtempfileZmkstemprH  ÚcloserÌ   ÚcodecsÚopenrÍ   r8  )r   Z	init_dataÚfdrK  r"   r"   r#   Ú_initializeZ  s@    















zWorksheet._initializec             C   sü   |   ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  | jsH|  ¡  n|  	¡  |  
¡  | jrf|  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  d¡ |  ¡  d S )NÚ	worksheet)Z_xml_declarationÚ_write_worksheetÚ_write_sheet_prÚ_write_dimensionÚ_write_sheet_viewsÚ_write_sheet_format_prÚ_write_colsrH   Ú_write_sheet_dataÚ_write_optimized_sheet_dataÚ_write_sheet_protectionrL   Ú_write_phonetic_prÚ_write_auto_filterÚ_write_merge_cellsÚ_write_conditional_formatsÚ_write_data_validationsÚ_write_hyperlinksÚ_write_print_optionsÚ_write_page_marginsÚ_write_page_setupÚ_write_header_footerÚ_write_row_breaksÚ_write_col_breaksÚ_write_drawingsÚ_write_legacy_drawingÚ_write_legacy_drawing_hfÚ_write_table_partsÚ_write_ext_listr7  Z
_xml_close)r   r"   r"   r#   Ú_assemble_xml_fileƒ  s>    

zWorksheet._assemble_xml_filec             C   s¼   |dk s|dk rdS || j ks(|| jkr,dS |sH|sH| jrH|| jk rHdS |s€| jd ks`|| jk rf|| _| jd ksz|| jkr€|| _|s¸| jd ks˜|| jk rž|| _| jd ks²|| jkr¸|| _dS )Nr   rú   rû   )rM   rN   rH   r»   rP   rQ   rR   rS   )r   rã   r0   rb  rc  r"   r"   r#   rü   Þ  s$    
zWorksheet._check_dimensionsc             C   s   t || j| jƒS )N)r   rÃ   rË   )r   Zdt_objr"   r"   r#   r  ÿ  s    zWorksheet._convert_date_timec             C   sÔ   d}d}d}d}t |dƒ}	t |dƒ}
dt|d ƒ }dt|d ƒ }|dkrh|| jd krh|	}|
}d}n4|dkrŒ|| jd krŒ|}|}d}n|	| }|
| }||kr®|s®|}n|d | }t| jƒ}|d | }|S )Nr>   r   r   râ  r&   r+  )r   rì   rM   rN   r   rE   )r   Z	row_num_1Z	col_num_1Z	row_num_2Z	col_num_2Zrange1Zrange2rj  Zrow_col_onlyZ
col_char_1Z
col_char_2Z
row_char_1Z
row_char_2r5  r"   r"   r#   ri    s0    


zWorksheet._convert_name_areac             C   sR   |sd S t |ƒ}d|kr"| d¡ t|ƒ}| ¡  d}t|ƒ|krN|d |… }|S )Nr   iÿ  )ÚsetÚremover0  rY  r   )r   r‡  Z
breaks_setZbreaks_listZmax_num_breaksr"   r"   r#   Ú_sort_pagebreaks-  s    
zWorksheet._sort_pagebreaksc             C   st   |sg S t  d¡}| |¡}g }xN|D ]F}| d¡r@|dd … }| d¡rV|d d… }| dd¡}| |¡ q&W |S )Nz"(?:[^"]|"")*"|\S+ú"r   rú   z"")rÚ   ÚcompileÚfindallr×   rÙ   r'  r2  )r   rÎ  Ztoken_rer:  Z
new_tokensrâ   r"   r"   r#   ro  G  s    




z Worksheet._extract_filter_tokensc             C   sŽ   t |ƒdkr~|d }t d|¡r&d}n"t d|¡r8d}ntd||f ƒ |  ||dd… ¡}|  ||dd… ¡}||g | S |  ||¡S d S )	Nr`  r=   z(and|&&)r   z	(or|\|\|)r   z?Token '%s' is not a valid conditional in filter expression '%s'rn  )r   rÚ   rÛ   r   Ú_parse_filter_tokens)r   rÎ  r:  ZconditionalZexpression_1Zexpression_2r"   r"   r#   rp  h  s    z"Worksheet._parse_filter_expressionc             C   s  dddddddddddddœ}|  |d d ¡}|d }t d|d	  ¡ ¡rÔt|d ƒ}|dk sf|d
krvtd||f ƒ | ¡ }|dkrž|dkržtd||f ƒ |d	  ¡ dkr´d}nd}|d dkrÌ|d7 }t|ƒ}|sô|d	 rôtd|d	 |f ƒ t d| ¡ ¡rl|dkr.|dkr.td|d |f ƒ | ¡ }|dkrP|dkrld}n|dkrdd}d}nd}d}|dkrˆt d|¡rˆd}||gS )Nr  rm  r   r=   rn  é   )z==rÔ   z=~Úeqz!=z!~Únez<>r•  z<=r”  z>=z
top|bottomr   iô  z?The value '%d' in expression '%s' must be in the range 1 to 500Úitemsú%z>The type '%s' in expression '%s' must be either 'items' or '%'rÓ  é   r™  z<Token '%s' is not a valid operator in filter expression '%s'zblanks|nonblankszRThe operator '%s' in expression '%s' is not valid in relation to Blanks/NonBlanks'rÕ  rÿ  z[*?]é   )rG  rÚ   rÛ   r	  r   r   rì   r5  )r   rÎ  r:  Ú	operatorsÚoperatorrâ   r	  r"   r"   r#   rµ  „  s`    


zWorksheet._parse_filter_tokensc       
      C   sŽ   d}t |ƒ}g }xJ|D ]B}|d7 }t|ƒ|> }|d@ }|d@ }|dL }||B }| |¡ qW d}x|D ]}	||	N }qfW ||N }|dN }d| S )Nr   r   iÿ  i €ÿ?r@   iKÎ  z%X)r   Úordr2  )
r   Z	plaintextr  r*  ZdigitsÚcharZlow_15Zhigh_15Zpassword_hashZdigitr"   r"   r#   r]  Ö  s"    

zWorksheet._encode_passwordc
             C   s~  d}
| j | \}}}}}}}}}}}||9 }||9 }|d| 9 }|d|	 9 }|  ||||||¡}td|d  ƒ}td|d  ƒ}| js¸tƒ }d|_|| _| j ddt|ƒ d d g¡ n| j}|
g}| 	|¡ | 	|||d |||g¡ | 
|¡ |rZd	}d
}t d|¡r|}t d|¡r*| dd¡}t d|¡rH| dd¡}d }| j |||g¡ | j ddt|ƒ d | g¡ d S )Nr  g      X@g      à?i5%  r   z/drawingz../drawings/drawingz.xmlz
/hyperlinkÚExternalz(ftp|http)s?://z	external:r>   z	internal:r"  z/imagez../media/imageÚ.)rµ   Ú_position_object_emusr   r¹   r   Úembeddedr®   r2  rì   r(   Ú_add_drawing_objectrÚ   rÛ   r'  r²   )r   rF   Úimage_idÚ
drawing_idra  re  rE   Ú
image_typeÚx_dpiÚy_dpiÚdrawing_typerã   r0   r2   rB  rC  rD  rE  r  r  rM  Ú
dimensionsr¹   Údrawing_objectZrel_typeZtarget_modeÚtargetr"   r"   r#   Ú_prepare_imageð  sD     

zWorksheet._prepare_imagec          	   C   s  d}| j | \}}}}}}	}
}| d| jd ¡}| d| jd ¡}||9 }||	9 }|  ||||||¡}td|d  ƒ}td|d  ƒ}| js¾tƒ }d|_|| _| j	 
dd	t|ƒ d
 d g¡ n| j}tdd|ƒ}|
|_|g}| |¡ | ||d |d d d g¡ | |¡ d S )Nr=   ra  re  r¶  g      à?i5%  r   z/drawingz../drawings/drawingz.xmlZrectZTextBox)r¸   rG  r   rŽ   rÃ  r   r¹   r   rÄ  r®   r2  rì   r   rO  r(   rÅ  )r   rF   rÇ  rË  rã   r0   rB  rC  rD  rE  rO  rL  ra  re  rÌ  r¹   ÚshaperÍ  r"   r"   r#   Ú_prepare_shape,  s0    

zWorksheet._prepare_shapec	       	      C   sJ   t  dd|¡}| j ||||||g¡ | j ddt|ƒ d | g¡ d S )Nz\..*$r>   z/imagez../media/imagerÂ  )rÚ   r)  rl   r2  r³   rì   )	r   rÆ  ra  re  rE   rÈ  ZpositionrÉ  rÊ  r"   r"   r#   Ú_prepare_header_imageW  s
    
zWorksheet._prepare_header_imagec             C   sì   d}| j | \}}}}}	}
}|d |_td|j|
  ƒ}td|j|  ƒ}|  ||||	||¡}|j}| jsštƒ }d|_	|| _| j
 ddt|ƒ d g¡ n| j}|g}| |¡ | |||d g¡ | |¡ | j ddt|ƒ d g¡ d S )Nr   g      à?z/drawingz../drawings/drawingz.xmlz/chartz../charts/chart)r´   r   r   ra  re  rÃ  Z
chart_namer¹   r   rÄ  r®   r2  rì   r(   rÅ  r²   )r   rF   Zchart_idrÇ  rË  rã   r0   rQ  rB  rC  rD  rE  ra  re  rÌ  rE   r¹   rÍ  r"   r"   r#   Ú_prepare_chartf  s*    


zWorksheet._prepare_chartc          
   C   s    |   ||||||¡\
}}}}}}}	}
}}tdd|  ƒ}tdd|  ƒ}tdd|	  ƒ}	tdd|
  ƒ}
tdd|  ƒ}tdd|  ƒ}|||||||	|
||f
S )Ng      à?i5%  )Ú_position_object_pixelsr   )r   Ú	col_startÚ	row_startÚx1Úy1ra  re  Úcol_endÚrow_endÚx2Úy2Úx_absÚy_absr"   r"   r#   rÃ  ‘  s    
zWorksheet._position_object_emusc          
   C   sê  d}d}x.|dk r6|dkr6||   |d ¡7 }|d8 }q
W x.|dk rf|dkrf||  |d ¡7 }|d8 }q:W |dk rtd}|dk r€d}| jr¨x.t|ƒD ]}	||   |	¡7 }qW n|| j| 7 }||7 }| jræx.t|ƒD ]}
||  |
¡7 }qÎW n|| j| 7 }||7 }x*||   |¡kr&||   |¡8 }|d7 }qþW x,||  |¡krT||  |¡8 }|d7 }q*W |}|}|| }|| }x,||   |¡krš||   |¡8 }|d7 }qpW x,||  |¡krÈ||  |¡8 }|d7 }qžW |}|}||||||||||g
S )Nr   r   )Ú	_size_colÚ	_size_rowr¨   r  r   r©   rŽ   )r   rÕ  rÖ  r×  rØ  ra  re  rÝ  rÞ  r  Zrow_idrÙ  rÚ  rÛ  rÜ  r"   r"   r#   rÔ  Ë  sT    z!Worksheet._position_object_pixelsc             C   sz   d}d}d}|| j krp| j | d k	rp| j | }|dkr<d}qv|dk rZt|||  d ƒ}qvt|| d ƒ| }n| j}|S )Nr`  rm  r   r   g      à?)r¥   r   r   )r   r0   Úmax_digit_widthÚpaddingÚpixelsra  r"   r"   r#   rß  )  s    
zWorksheet._size_colc             C   sF   d}|| j kr4| j | }|dkr&d}qBtd| ƒ}ntd| j ƒ}|S )Nr   gUUUUUUõ?)r¦   r   r   )r   rã   rã  re  r"   r"   r#   rà  B  s    

zWorksheet._size_rowc             C   sj  d}d}d dd d d d ||d dd dddddœ}x|  ¡ D ]}|| ||< q6W |d	 sZ||d	< |d
 sj||d
< t|d ƒ ¡ |d< |d  ddd¡|d< |d d k	rÀt|d ƒ\}	}
|	|d< |
|d< | j}| j}|d d krL|dkrìd|d< n`||d kr|d |d< nD||d kr$|d |d< n(||d kr@|d |d< n|d |d< |d d kr¾|dkrnd|d< nP||d kr†d|d< n8||d kržd|d< n ||d kr¶d|d< nd|d< |d d kr,||d krè|d |d< nD||d kr|d |d< n(||d kr |d |d< n|d |d< |d d krŠ||d krRd|d< n8||d krjd|d< n ||d kr‚d|d< nd|d< |d r¨|d	 |d  |d	< |d rÆ|d
 |d  |d
< td |d	  ƒ|d	< td |d
  ƒ|d
< |  |d |d |d |d |d	 |d
 ¡}| 	|d	 ¡ | 	|d
 ¡ ||||d! |d" |d |d# |d$ |d% g	|g S )&Né€   éJ   z#ffffe1r   ZTahomaé   r  )rW  rJ  rõ  Ú	start_colÚ	start_rowr=  ra  re  rB  rD  rC  rE  Ú	font_nameÚ	font_sizeÚfont_familyra  re  rJ  Zffr"  rõ  rè  rç  r   r=   r`  r¶  rm  rC  é   é   rF  rn  rB  é1   r@   rD  rE  g      à?rW  r=  ré  rê  rë  )
rœ  r   r	  r'  r   rM   rN   r   rÔ  r2  )r   rã   r0   r÷   rL  Údefault_widthÚdefault_heightÚparamsr_  rè  rç  Úrow_maxÚcol_maxÚverticesr"   r"   r#   rS  U  s¤    










zWorksheet._comment_paramsc          	   C   s’  | j }| j}dt| jƒ }||i dœ}i }x| ¡ D ]}	||	 ||	< q4W | d¡}
|
d krbd| }
|
|d d< | d¡rŠd|d  |d< nd| |d< | d	|¡|d	< | d
|¡|d
< | dd¡|d< | dd¡|d< |d	 | dd¡ |d	< |d
 | dd¡ |d
< td|d	  ƒ|d	< td|d
  ƒ|d
< ||d< ||d< |  |d |d |d |d |d	 |d
 ¡}| |d	 ¡ | |d
 ¡ ||d< |S )Nr   )rã   r0   ÚfontÚcaptionz	Button %drõ  Zmacroz[0]!z[0]!Button%d_Clickra  re  rB  r   rC  rD  rE  g      à?rè  rç  rô  )	rŽ   r   r   r   rœ  rG  r   rÔ  r2  )r   rã   r0   rL  rð  rï  Zbutton_numberrb  rñ  r_  rö  rô  r"   r"   r#   ra  Ð  s>    

zWorksheet._button_paramsc             C   s<  g }t | j ¡ ƒ}x˜|D ]}t | j|  ¡ ƒ}xx|D ]p}	| jrf| j| |	 d d krfd| j| |	 d< | j| |	 d d kr| j| j| |	 d< | | j| |	 ¡ q4W qW | j ddt|ƒ d g¡ | jrð|| _	| j
 ddt|ƒ d	 g¡ t|ƒ}
|}x.tt|
d
 ƒƒD ]}d||| d f }qW || _|| _|
S )Nrn  r   r=   z/vmlDrawingz../drawings/vmlDrawingz.vmlz	/commentsz../commentsz.xmli   z%s,%d)Úsortedr˜   rœ  r›   rš   r2  r°   rì   r—   r™   r¯   r   r  r   rÏ   rœ   )r   rÏ   rœ   Úvml_drawing_idZ
comment_idr˜   Úrow_numsrã   Úcol_numsr0   r*  Zstart_data_idr  r"   r"   r#   Ú_prepare_vml_objects  s0    

zWorksheet._prepare_vml_objectsc             C   s&   || _ | j ddt|ƒ d g¡ d S )Nz/vmlDrawingz../drawings/vmlDrawingz.vml)rž   r°   r2  rì   )r   rž   rø  r"   r"   r#   Ú_prepare_header_vml_objects?  s    z%Worksheet._prepare_header_vml_objectsc             C   sŒ   x†| j D ]|}||d< | d¡d kr2dt|ƒ |d< |d  ¡ }||krXtd|d  ƒ‚nd||< | j ddt|ƒ d g¡ |d	7 }qW d S )
Nr   rE   ZTablez2Duplicate name '%s' used in worksheet.add_table().Tz/tablez../tables/tablez.xmlr   )r¶   rG  rì   r	  r   r±   r2  )r   Ztable_idÚseenr’   rE   r"   r"   r#   Ú_prepare_tablesH  s    zWorksheet._prepare_tablesc          	   C   s€   d}t  dd|¡}t  dd|¡}t  dd|¡}t  dd	|¡}d
ddddddddœ}||krp|| }d||f }ntd| ƒ |S )Nr>   ú'z''r"  z'#ú]z']z\[z'[ée   éf   ég   éh   éi   ék   ém   én   )rÑ  r  r*  rè  rç  r  ÚsumÚvarzSUBTOTAL(%s,[%s])z(Unsupported function '%s' in add_table())rÚ   r)  r   )r   r  Zcol_namer  Z	subtotalsZfunc_numr"   r"   r#   r
  b  s$    z$Worksheet._table_function_to_formulac             C   s$   ||krd S dt || ƒi||< d S )NÚrgb)r   )r   r4  rL  Z
user_colorr"   r"   r#   r3    s    zWorksheet._set_spark_colorc             C   s
  | j r
dS g }xöt||d ƒD ]ä}|| jkr8| d ¡ qxÈt||d ƒD ]¶}|| j| krô| j| | }t|ƒj}	|	dkrŒ| d|j ¡ qþ|	dkr²|j}
| j 	|
¡}| |¡ qþ|	dksÂ|	dkrà|j
}|d krÔd}| |¡ qþ|	d	krþ| d
¡ qH| d ¡ qHW qW |S )Nr"   r   r6   z%.16gr5   r:   r;   r   r7   r>   )rH   r  r’   r2  ré   Ú__name__r  r÷   rG   Z_get_shared_stringr	  )r   rÖ  rÕ  rÚ  rÙ  r>  Úrow_numr  rÐ  Útype_cell_namerF   r÷   r	  r"   r"   r#   Ú_get_range_data†  s6    


zWorksheet._get_range_datac             G   s   dd„ |D ƒ}d  |¡S )Nc             S   s"   g | ]}t |tƒst|ƒn|‘qS r"   )rõ   r	   rì   )r/   Úitemr"   r"   r#   r1   Â  s   z'Worksheet._csv_join.<locals>.<listcomp>ú,)Újoin)r   r¹  r"   r"   r#   r  ¾  s    zWorksheet._csv_joinc             C   s˜   t  d|¡r|S | dd¡}| dd¡}| dd¡}| dd	¡}| d
d¡}| dd¡}| dd¡}| dd¡}| dd¡}| dd¡}| dd¡}|S )Nz%[0-9a-fA-F]{2}rº  z%25r²  z%22rÿ  z%20r•  z%3cr”  z%3eú[z%5br   z%5dú^z%5eú`z%60r  z%7brÕ   z%7d)rÚ   r5  r'  )r   r  r"   r"   r#   r(  Ç  s    zWorksheet._escape_urlc             C   sd  | j }| d¡ |jr | d¡ |jr0| d¡ |jr@| d¡ |jrP| d¡ |jr`| d¡ |jrr|  	|j¡ |j
dkr†|  d¡ |j
d	krš|  d
¡ | dd|jfg¡ |jrÄ|  d|j¡ nB|jrÚ|  d|j¡ n,|jrú|  |j¡}|  d|¡ n|  dd¡ | dd|jfg¡ | dd|jfg¡ |jdkrV|jsV| dd|jfg¡ | d¡ d S )NZrPrÚbr  ZstrikeZoutlineZshadowr   Zsuperscriptr  Z	subscriptZszÚvalÚthemeZindexedr  ZrFontZfamilyZCalibriZscheme)rº   r3  ZboldÚ_xml_empty_tagZitalicZfont_strikeoutZfont_outlineZfont_shadowÚ	underlineÚ_write_underlineZfont_scriptÚ_write_vert_alignrê  r  Ú_write_colorZcolor_indexedZ
font_colorÚ_get_palette_colorÚ_write_rstring_colorré  rë  Ú	hyperlinkZfont_schemer7  )r   Z	xf_formatZ
xml_writerrJ  r"   r"   r#   r4  á  sB    









zWorksheet._write_fontc             C   sD   g }|dkrdg}n|dkr$dg}n|dkr2dg}| j  d|¡ d S )Nr  )r  Zdoubleé!   )r  ZsingleAccountingé"   )r  ZdoubleAccountingÚu)rº   r  )r   r  r=  r"   r"   r#   r    s    zWorksheet._write_underlinec             C   s   d|fg}| j  d|¡ d S )Nr  Z	vertAlign)rº   r  )r   r  r=  r"   r"   r#   r  #  s    
zWorksheet._write_vert_alignc             C   s   ||fg}| j  d|¡ d S )NrJ  )rº   r  )r   rE   r	  r=  r"   r"   r#   r  )  s    
zWorksheet._write_rstring_colorc             C   s$   |d dkr|dd … }d|  ¡  S )Nr   r"  r   ZFF)Úupper)r   rJ  r"   r"   r#   r  /  s    zWorksheet._get_palette_colorc             C   s   ||kS )Nr"   )r   rC  r"   r"   r#   rÞ   6  s    zWorksheet._isnanc             C   s   || dkS )Nr   r"   )r   rC  r"   r"   r#   rß   :  s    zWorksheet._isinfc             C   s   | j s| j ¡  d| _ d S )NT)rÐ   rÍ   rŽ  )r   r"   r"   r#   Ú
_opt_close>  s    
zWorksheet._opt_closec             C   s.   | j r*| j}t |dd¡| _d| _ | j| _d S )Nza+zutf-8F)rÐ   rÌ   r  r  rÍ   r8  )r   rK  r"   r"   r#   Ú_opt_reopenD  s
    zWorksheet._opt_reopenc       
      C   sÔ  g }x"t |ƒD ]}| ddddœ¡ qW |dkrHd|d d< d|d	 d< |d
krtd|d d< d|d	 d< d|d d< |dkr¬d|d d< d|d	 d< d|d d< d|d d< |rÐt|ƒ}||krÊ|d	 }xt |ƒD ]ö}||  d¡d k	r8|| d || d< || d }t|tƒr8| d¡r8| d¡|| d< ||  d¡r¦d}|| d |krttd|| d  ƒ n2|| d || d< || d dkr¦d|| d< ||  d¡}	|	rÖ|	dkrÖd|| d< qÖW |S )NFr   Úpercent)rr  r	  ré   r=   éC   r	  r!  r   rn  éK   rê  é   r  rm  éP   é<   é(   rA   rÔ   ré   )r'  ré  r  r  zOUnknown icon property type '%s' for sub-property 'type' in conditional_format()r  Znumrr  r”  T)	r  r2  r   rG  rõ   r	   r×   r  r   )
r   rß  Z
user_propsZpropsr2   Zmax_datar  Ztmpr   rr  r"   r"   r#   rï  L  sN    zWorksheet._set_icon_propsc             C   sx   d}|d }|d }|d }d}|d }d|fd|fg}| j d	krh| d
|f¡ | d|f¡ | d¡ |  d|¡ d S )Nz"http://schemas.openxmlformats.org/zspreadsheetml/2006/mainz!officeDocument/2006/relationshipszmarkup-compatibility/2006zhttp://schemas.microsoft.com/zoffice/spreadsheetml/2009/9/acÚxmlnszxmlns:riÚ  zxmlns:mczxmlns:x14ac)zmc:IgnorableZx14acr“  )rK   r2  r3  )r   Úschemar.  Zxmlns_rZxmlns_mcZ	ms_schemaZxmlns_x14acr=  r"   r"   r#   r”  —  s    


zWorksheet._write_worksheetc             C   sÔ   | j d kr| jd krd}n¤| j d krn| jd k	rn| j| jkrHtd| jƒ}q¾td| jƒ}td| jƒ}|d | }nP| j | jkr–| j| jkr–t| j | jƒ}n(t| j | jƒ}t| j| jƒ}|d | }|  dd|fg¡ d S )Nr8  r   r&   Z	dimensionrk  )rP   rR   rS   r   rQ   r  )r   rk  r)   r*   r"   r"   r#   r–  ­  s    zWorksheet._write_dimensionc             C   s    |   d¡ |  ¡  |  d¡ d S )NZ
sheetViews)r3  Ú_write_sheet_viewr7  )r   r"   r"   r#   r—  Ñ  s    
zWorksheet._write_sheet_viewsc             C   sü   g }| j s| d¡ | jr$| d¡ | js4| d¡ | jrD| d¡ | jrT| d¡ | jsd| d¡ | jrt| d¡ | jdkrª| jsª| d	| jf¡ | j	rª| d
| jf¡ | d¡ | j
sÄt| jƒrì|  d|¡ |  ¡  |  ¡  |  d¡ n|  d|¡ d S )N)ZshowGridLinesr   )ZshowRowColHeadersr   )Z	showZerosr   )ÚrightToLeftr   )ZtabSelectedr   )ÚshowOutlineSymbolsr   )ZviewZ
pageLayoutr?   Z	zoomScaleZzoomScaleNormal)ZworkbookViewIdr   Z	sheetView)rb   r2  rd   r„   rƒ   rZ   rŠ   rÁ   r€   r   rX   r   rU   r3  Ú_write_panesÚ_write_selectionsr7  r  )r   r=  r"   r"   r#   r0  Ú  s6    








zWorksheet._write_sheet_viewc             C   sŠ   | j }| j}| j}d|fg}| j | jkr2| d¡ | jrB| d¡ |rT| d|f¡ |rf| d|f¡ | jdkrz| d¡ |  d|¡ d S )	NZdefaultRowHeight)ÚcustomHeightr   )Z
zeroHeightr   ZoutlineLevelRowZoutlineLevelColiÚ  )zx14ac:dyDescentz0.25ZsheetFormatPr)r   r…   r†   rŒ   r2  r   rK   r  )r   r   Z	row_levelZ	col_levelr=  r"   r"   r#   r˜    s    




z Worksheet._write_sheet_format_prc             C   sJ   | j s
d S |  d¡ x&t| j  ¡ ƒD ]}|  | j | ¡ q$W |  d¡ d S )NZcols)rT   r3  r÷  rœ  Ú_write_col_infor7  )r   r0   r"   r"   r#   r™  #  s    
zWorksheet._write_colsc             C   s>  |\}}}}}}}d}	d}
|r&|  ¡ }
|d krB|s<d}d}	qNd}n|dkrNd}	|dkr¸d}d}|dk rtt|||  d ƒt|ƒ d ƒd }n(tt|| d ƒ| t|ƒ d ƒd }d|d fd	|d fd
d| fg}|
rì| d|
f¡ |rú| d¡ |	r
| d¡ |r| d|f¡ |r.| d¡ |  d|¡ d S )Nr   r   g\Âõ(Ü @r`  rm  g      à?g      p@rç  rè  ra  z%.16grý  )rV   r.   )ZcustomWidthr.   ÚoutlineLevel)r^  r.   r0   )Ú_get_xf_indexr   rÝ   r2  r  )r   Zcol_infoÚcol_minró  ra  rø   rV   r_  r^  Zcustom_widthÚxf_indexrá  râ  r=  r"   r"   r#   r6  1  sD    (&




zWorksheet._write_col_infoc             C   s6   | j d kr|  d¡ n|  d¡ |  ¡  |  d¡ d S )NÚ	sheetData)rP   r  r3  Ú_write_rowsr7  )r   r"   r"   r#   rš  h  s
    

zWorksheet._write_sheet_datac             C   s‚   | j d kr|  d¡ nh|  d¡ d}| j d¡ | j |¡}x |r\| j |¡ | j |¡}q>W | j ¡  t	 
| j¡ |  d¡ d S )Nr;  i   r   )rP   r  r3  rÍ   ÚseekÚreadr8  rç   rŽ  rH  ÚunlinkrÌ   r7  )r   Z	buff_sizer>  r"   r"   r#   r›  s  s    


z%Worksheet._write_optimized_sheet_datac             C   sD   d| j fd| jfd| jfd| jfd| jfd| jfg}|  d|¡ d S )Nrl  rm  rÓ  rÔ  rf   rg   ZpageMargins)rm   rn   ro   rp   rq   rr   r  )r   r=  r"   r"   r#   r¤  ‹  s    zWorksheet._write_page_marginsc             C   sP  g }| j sd S | jr$| d| jf¡ | jdkr>| d| jf¡ | jr^| jdkr^| d| jf¡ | jr~| jdkr~| d| jf¡ | jrŽ| d¡ | jdkr¨| d| jf¡ | j	rº| d	¡ n
| d
¡ | jdkrØ| d¡ | j
r| jrö| d| jf¡ | jr@| d| jf¡ n0| jr(| d| jf¡ | jr@| d| jf¡ |  d|¡ d S )NZ	paperSizer?   r…  r   Z
fitToWidthZfitToHeight)Z	pageOrderZoverThenDownZfirstPageNumber)r]   Zportrait)r]   Z	landscaper   )ZuseFirstPageNumberr.   ZhorizontalDpiZverticalDpiZ	pageSetup)r[   r\   r2  r‚   rx   ry   rz   rv   rw   r]   rJ   rÒ   rÑ   r  )r   r=  r"   r"   r#   r¥  —  s<    





zWorksheet._write_page_setupc             C   s^   g }| j sd S | jr| d¡ | jr.| d¡ | jr>| d¡ | jrN| d¡ |  d|¡ d S )N)ZhorizontalCenteredr   )ZverticalCenteredr   )Zheadingsr   )Z	gridLinesr   ZprintOptions)r^   r_   r2  r`   rc   ra   r  )r   r=  r"   r"   r#   r£  á  s    



zWorksheet._write_print_optionsc             C   st   g }| j s| d¡ | js$| d¡ | jr^|  d|¡ | jrD|  ¡  | jrR|  ¡  |  	d¡ n| j
rp|  d|¡ d S )N)ZscaleWithDocr   )ZalignWithMarginsr   ZheaderFooter)ri   r2  rh   re   r3  rf   Ú_write_odd_headerrg   Ú_write_odd_footerr7  rL   r  )r   r=  r"   r"   r#   r¦  ú  s    

zWorksheet._write_header_footerc             C   s   |   d| j¡ d S )NZ	oddHeader)r6  rf   )r   r"   r"   r#   r@    s    zWorksheet._write_odd_headerc             C   s   |   d| j¡ d S )NZ	oddFooter)r6  rg   )r   r"   r"   r#   rA    s    zWorksheet._write_odd_footerc             C   s.  |   ¡  xt| j| jd ƒD ]}|| jksB|| jksB| j| rt|d ƒ}|| jkrd| j| }nd }| j| rð|| jkrŠ|  	||¡ n|  	||| j| ¡ xDt| j
| jd ƒD ].}|| j| kr²| j| | }|  |||¡ q²W |  d¡ q|| jkr|  ||| j| ¡ q|  ||| j| ¡ qW d S )Nr   rì  rã   )Ú_calculate_spansr  rP   rQ   r   r˜   r’   r   r”   Ú
_write_rowrR   rS   Ú_write_cellr7  Ú_write_empty_row)r   r  Ú
span_indexr2  r  Úcol_refr"   r"   r#   r<    s,    



zWorksheet._write_rowsc             C   sØ   | j }|| _ || jks*|| jks*| j| rÊd }| j| r¶|| jkrP|  ||¡ n|  ||| j| ¡ xDt| j| jd ƒD ].}|| j| krx| j| | }|  |||¡ qxW |  	d¡ n|  
||| j| ¡ | j ¡  d S )Nr   rã   )r»   r   r˜   r’   rC  r  rR   rS   rD  r7  rE  Úclear)r   Zcurrent_row_numr  r2  r  rG  r"   r"   r#   rþ   >  s     


zWorksheet._write_single_rowc             C   sP  i }d }d }x6t | j| jd ƒD ]}|| jkr†xRt | j| jd ƒD ]<}|| j| krF|d krj|}|}qF||k rv|}||krF|}qFW || jkrîx\t | j| jd ƒD ]F}|| jkr¤|| j| kr¤|d krÒ|}|}q¤||k rÞ|}||kr¤|}q¤W |d d dks
|| jkr"t|d ƒ}|d k	r"|d7 }|d7 }d||f ||< d }q"W || _d S )Nr   rì  r   z%s:%s)	r  rP   rQ   r’   rR   rS   r˜   r   r”   )r   ÚspansZspan_minZspan_maxr  r  rF  r"   r"   r#   rB  d  sB    


zWorksheet._calculate_spansc             C   s  d}|r|\}}}}	}
nd\}}}}	}
|d kr4| j }d|d fg}|rN| ¡ }|r`| d|f¡ |rr| d|f¡ |r€| d¡ || jkr˜| d|f¡ |r¦| d	¡ || jkrº| d
¡ |	rÌ| d|	f¡ |
rÚ| d¡ | jdkrî| d¡ |r|  d|¡ n|  d|¡ d S )Nr   )NNr   r   r   r-  r   rI  Ús)ZcustomFormatr   Zht)rV   r   )r5  r   r7  )r^  r   iÚ  )zx14ac:dyDescentz0.25rã   )r   r8  r2  rŒ   rK   Z_xml_empty_tag_unencodedZ_xml_start_tag_unencoded)r   rã   rI  Ú
propertiesÚ	empty_rowr:  re  rø   rV   r_  r^  r=  r"   r"   r#   rC  •  s<    







zWorksheet._write_rowc             C   s   | j |||dd d S )NT)rL  )rC  )r   rã   rI  rK  r"   r"   r#   rE  È  s    zWorksheet._write_empty_rowc             C   sæ  t ||ƒ}d|fg}|jr4|j ¡ }| d|f¡ n`|| jkrn| j| d rn| j| d }| d| ¡ f¡ n&|| jkr”| j| }| d| ¡ f¡ t|ƒj}	|	dkr¸|  |j	|¡ n*|	dkr¢|j
}
| jsÜ|  |
|¡ nÂt dd|
¡}
t dd	d
„ |
¡}
tjd dkrtdƒ}tdƒ}nd}d}t |d|
¡}
t |d|
¡}
t d|
¡rlt d|
¡rl|  |
|¡ n2d}t d|
¡sŒt d|
¡rd}|  |
||¡ n@|	dkr&|j}t|jƒtkrà| d¡ |jrÚd}nd}n4t|jtƒrd}|j|kr
| d¡ n
| d¡ |  |j||¡ n¼|	dkr”yt|jƒ W n  tk
r^   | d¡ Y nX |  d|¡ |  |j|j¡ |   |j¡ |  !d¡ nN|	dkr¬|  "d|¡ n6|	dkrâ| d¡ |  d|¡ |   |j#¡ |  !d¡ d S ) Nr-  rJ  r   r6   r5   z(_x[0-9a-fA-F]{4}_)z_x005F\1z([\x00-\x08\x0B-\x1F])c             S   s   dt |  d¡ƒ S )Nz_x%04X_r   )r¿  Úgroup)rÛ   r"   r"   r#   Ú<lambda>õ  s   z'Worksheet._write_cell.<locals>.<lambda>r   r  iþÿ  iÿÿ  u   ï¿¾u   ï¿¿Z_xFFFE_Z_xFFFF_z^<r>z</r>$z^\sz\s$r:   )r/  r  )z#DIV/0!z#N/Az#NAME?z#NULL!z#NUM!z#REF!z#VALUE!)r/  Úe)r/  rì   r;   Úcr7   r9   )$r   r8   r8  r2  r   r§   ré   r  Z_xml_number_elementr  r÷   rH   Z_xml_string_elementrÚ   r)  rñ   rò   Zunichrr5  Z_xml_rich_inline_stringZ_xml_inline_stringr	  rê   rõ   r	   Z_xml_formula_elementr  rÝ   r   r3  Ú_write_cell_array_formular  Ú_write_cell_valuer7  r  r  )r   rã   r0   rÐ  r  r=  r:  Zrow_xfZcol_xfr  r÷   Z	non_char1Z	non_char2r.  r	  Zerror_codesr"   r"   r#   rD  Ì  s€    














zWorksheet._write_cellc             C   s   |d krd}|   d|¡ d S )Nr>   Úv)r6  )r   r	  r"   r"   r#   rR  <  s    zWorksheet._write_cell_valuec             C   s   dd|fg}|   d||¡ d S )N)r/  Zarrayrk  rä   )r6  )r   r  r  r=  r"   r"   r#   rQ  C  s    
z#Worksheet._write_cell_array_formulac             C   sž   g }| j s&| js&| js&| js&| js&d S | jr<| d| jf¡ | jrL| d¡ | j s^| js^| jrŽ|  d|¡ |  ¡  |  ¡  |  	¡  |  
d¡ n|  d|¡ d S )NZcodeName)Z
filterModer   ZsheetPr)rx   r¢   rW   r‹   rÂ   r2  r3  Ú_write_tab_colorÚ_write_outline_prÚ_write_page_set_up_prr7  r  )r   r=  r"   r"   r#   r•  L  s(    
zWorksheet._write_sheet_prc             C   s    | j s
d S dg}|  d|¡ d S )N)Z	fitToPager   ZpageSetUpPr)rx   r  )r   r=  r"   r"   r#   rV  h  s    zWorksheet._write_page_set_up_prc             C   s(   | j }|sd S d|fg}|  d|¡ d S )Nr  ZtabColor)rW   r  )r   rJ  r=  r"   r"   r#   rT  p  s
    
zWorksheet._write_tab_colorc             C   s^   g }| j sd S | jr| d¡ | js.| d¡ | js>| d¡ | jsN| d¡ |  d|¡ d S )N)ZapplyStylesr   )ZsummaryBelowr   )ZsummaryRightr   )r2  r   Z	outlinePr)r‹   r‡   r2  rˆ   r‰   rŠ   r  )r   r=  r"   r"   r#   rU  {  s    



zWorksheet._write_outline_prc             C   s`   |   | j¡}|sd S t|ƒ}d|fd|fg}|  d|¡ x|D ]}|  |d¡ q>W |  d¡ d S )Nr*  ÚmanualBreakCountZ	rowBreaksiÿ?  )r±  r{   r   r3  Ú
_write_brkr7  )r   Úpage_breaksr*  r=  r  r"   r"   r#   r§    s    

zWorksheet._write_row_breaksc             C   s`   |   | j¡}|sd S t|ƒ}d|fd|fg}|  d|¡ x|D ]}|  |d¡ q>W |  d¡ d S )Nr*  rW  Z	colBreaksiÿÿ )r±  r|   r   r3  rX  r7  )r   rY  r*  r=  r  r"   r"   r#   r¨  ¢  s    

zWorksheet._write_col_breaksc             C   s"   d|fd|fdg}|   d|¡ d S )Nr   rè  )Zmanr   Zbrk)r  )r   Zbrk_idZbrk_maxr=  r"   r"   r#   rX  ·  s    zWorksheet._write_brkc             C   sR   | j }t|ƒ}|sd S d|fg}|  d|¡ x|D ]}|  |¡ q2W |  d¡ d S )Nr*  Z
mergeCells)r“   r   r3  Ú_write_merge_cellr7  )r   Zmerged_cellsr*  r=  Úmerged_ranger"   r"   r#   rŸ  À  s    

zWorksheet._write_merge_cellsc       
      C   sF   |\}}}}t ||ƒ}t ||ƒ}|d | }d|fg}	|  d|	¡ d S )Nr&   rk  Z	mergeCell)r   r  )
r   r[  Zrow_minr9  rò  ró  r)   r*   rk  r=  r"   r"   r#   rZ  Ó  s    


zWorksheet._write_merge_cellc             C   sr  g }d }t | j ¡ ƒ}|sd S xö|D ]î}t | j|  ¡ ƒ}xÖ|D ]Î}| j| | }|d }| jrœ| j| rœ| j| | rœ| j| | }	t|	ƒjdkrœ|d }|dkrì|  jd7  _| |||| j|d ||d g¡ | j d|d dg¡ q@| ||||d |d |d g¡ q@W q$W |  	d	¡ xB|D ]:}
|
 
d
¡}|dkrJ| j|
Ž  n|dkr&| j|
Ž  q&W |  d	¡ d S )Nr&  r5   r  r   rì   r  z
/hyperlinkrÁ  rÄ   r   r  )r÷  rÄ   rœ  r’   ré   r  rª   r2  r­   r3  r1  Ú_write_hyperlink_externalÚ_write_hyperlink_internalr7  )r   r¬   Údisplayrù  r  rú  r  Úlinkr&  rÐ  r   r"   r"   r#   r¢  à  sR    







zWorksheet._write_hyperlinksc       
      C   sx   t ||ƒ}dt|ƒ }d|fd|fg}	|d k	r<|	 d|f¡ |d k	rR|	 d|f¡ |d k	rh|	 d|f¡ |  d|	¡ d S )NÚrIdrk  zr:idr  r^  Útooltipr   )r   rì   r2  r  )
r   rã   r0   Zid_numr  r^  ra  rk  Úr_idr=  r"   r"   r#   r\  '  s    

z#Worksheet._write_hyperlink_externalc             C   sN   t ||ƒ}d|fd|fg}|d k	r0| d|f¡ | d|f¡ |  d|¡ d S )Nrk  r  ra  r^  r   )r   r2  r  )r   rã   r0   r  r^  ra  rk  r=  r"   r"   r#   r]  :  s    

z#Worksheet._write_hyperlink_internalc             C   sL   | j s
d S d| j fg}| jr<|  d|¡ |  ¡  |  d¡ n|  d|¡ d S )Nrk  Ú
autoFilter)r    r¢   r3  Ú_write_autofiltersr7  r  )r   r=  r"   r"   r#   rž  I  s    zWorksheet._write_auto_filterc             C   sX   | j \}}xHt||d ƒD ]6}|| jkr*q| j| }| j| }|  || ||¡ qW d S )Nr   )r¡   r  r£   r¤   Ú_write_filter_column)r   Zcol1Zcol2r0   r:  r¤   r"   r"   r#   rd  Z  s    



zWorksheet._write_autofiltersc             C   sB   d|fg}|   d|¡ |dkr*|  |¡ n
|  |¡ |  d¡ d S )NZcolIdZfilterColumnr   )r3  Ú_write_filtersÚ_write_custom_filtersr7  )r   r  r¤   rw  r=  r"   r"   r#   re  k  s    

zWorksheet._write_filter_columnc             C   s„   dd„ |D ƒ}g }t |ƒt |ƒkr(dg}t |ƒdkrNt |ƒdkrN|  d|¡ n2|  d|¡ xt|ƒD ]}|  |¡ qdW |  d¡ d S )Nc             S   s    g | ]}t |ƒ ¡ d kr|‘qS )rÕ  )rì   r	  )r/   Úfilterr"   r"   r#   r1   |  s    z,Worksheet._write_filters.<locals>.<listcomp>)r  r   r   r   rw  )r   r  r3  r÷  Ú_write_filterr7  )r   rw  Z
non_blanksr=  rl  r"   r"   r#   rf  z  s    zWorksheet._write_filtersc             C   s   d|fg}|   d|¡ d S )Nr  rh  )r  )r   r  r=  r"   r"   r#   ri    s    
zWorksheet._write_filterc             C   sŒ   t |ƒdkr,|  d¡ | j|Ž  |  d¡ n\g }|d dkrDdg}ndg}|  d|¡ |  |d |d ¡ |  |d |d ¡ |  d¡ d S )	Nr  ZcustomFiltersr   )Úandr   )rj  r   r   r=   rn  )r   r3  Ú_write_custom_filterr7  )r   r:  r=  r"   r"   r#   rg  •  s    

zWorksheet._write_custom_filtersc             C   sn   g }ddddddddœ}|| d k	r.|| }nt d| ƒ |dksP| d	|f¡ | d
|f¡ |  d|¡ d S )Nr‘  rŽ  r“  r  r  r’  )r   r  r=   rn  rm  r¶  r¼  zUnknown operator = %sr¾  r  ZcustomFilter)r   r2  r  )r   r¾  r  r=  r½  r"   r"   r#   rk  ¬  s    
zWorksheet._write_custom_filterc             C   s|  g }| j sd S | j }|d r.| d|d f¡ |d r@| d¡ |d rR| d¡ |d sd| d¡ |d sv| d	¡ |d
 rˆ| d¡ |d rš| d¡ |d r¬| d¡ |d r¾| d¡ |d rÐ| d¡ |d râ| d¡ |d rô| d¡ |d r| d¡ |d s| d¡ |d r0| d¡ |d rD| d¡ |d  rX| d!¡ |d" sl| d#¡ |  d$|¡ d S )%Nr\  rL  )rL  r   rM  )rM  r   rN  )rN  r   rO  )rO  r   rP  )ZformatCellsr   rQ  )ZformatColumnsr   rR  )Z
formatRowsr   rS  )ZinsertColumnsr   rT  )Z
insertRowsr   rU  )ZinsertHyperlinksr   rV  )ZdeleteColumnsr   rW  )Z
deleteRowsr   rX  )ZselectLockedCellsr   rY  )rY  r   rl  )rc  r   rZ  )ZpivotTablesr   r[  )ZselectUnlockedCellsr   ZsheetProtection)r}   r2  r  )r   r=  rL  r"   r"   r#   rœ  Ç  sR    






















z!Worksheet._write_sheet_protectionc             C   s(   | j s
d S |  jd7  _|  | j¡ d S )Nr   )r¹   rª   Ú_write_drawing)r   r"   r"   r#   r©  ÷  s    zWorksheet._write_drawingsc             C   s&   dt |ƒ }d|fg}|  d|¡ d S )Nr`  zr:idr¹   )rì   r  )r   rÇ  rb  r=  r"   r"   r#   rl  ÿ  s    
zWorksheet._write_drawingc             C   s@   | j s
d S |  jd7  _dt| jƒ }d|fg}|  d|¡ d S )Nr   r`  zr:idZlegacyDrawing)r•   rª   rì   r  )r   rb  r=  r"   r"   r#   rª    s    
zWorksheet._write_legacy_drawingc             C   s@   | j s
d S |  jd7  _dt| jƒ }d|fg}|  d|¡ d S )Nr   r`  zr:idZlegacyDrawingHF)r–   rª   rì   r  )r   rb  r=  r"   r"   r#   r«    s    
z"Worksheet._write_legacy_drawing_hfc             C   sR   | j }t|ƒ}|sd S d|fg}|  d|¡ x|D ]}|  |¡ q2W |  d¡ d S )Nr*  ZdataValidations)r¼   r   r3  Ú_write_data_validationr7  )r   r¼   r*  r=  Z
validationr"   r"   r#   r¡  !  s    

z!Worksheet._write_data_validationsc       	      C   s.  d}g }x‚|d D ]v}|dkr&|d7 }|\}}}}||krD|| }}||krV|| }}||krv||krv|t ||ƒ7 }q|t||||ƒ7 }qW |d dkrÈ| d|d f¡ |d dkrÈ| d	|d f¡ d
|kr |d
 dkrè| d¡ |d
 dkr | d¡ |d r| d¡ |d s(| d¡ |d r<| d¡ |d rP| d¡ d|krl| d|d f¡ d|krˆ| d|d f¡ d|kr¤| d|d f¡ d|krÀ| d|d f¡ | d|f¡ |d dkrê|  d |¡ n@|  d |¡ |  |d! ¡ |d" d k	r |  |d" ¡ |  d ¡ d S )#Nr>   rš  rÿ  rx  r†  ré   rr  rŒ  r¾  r„  r   )Ú
errorStyler—  r  )rn  r˜  r|  )Z
allowBlankr   r}  )ZshowDropDownr   r~  )ZshowInputMessager   r  )ZshowErrorMessager   r‚  Z
errorTitlerƒ  r?  r  ZpromptTitler€  Úpromptr;  ZdataValidationr	  r{  )r   r   r2  r  r3  Ú_write_formula_1Ú_write_formula_2r7  )	r   rL  r;  r=  rš  Z	row_firstrt  Zrow_lastru  r"   r"   r#   rm  4  s\    
















z Worksheet._write_data_validationc             C   sf   t |ƒtkr | j|Ž }d| }n6yt|ƒ W n( tk
rT   | d¡rP| d¡}Y nX |  d|¡ d S )Nz"%s"rÔ   Zformula1)ré   r0  r  rÝ   r   r×   r  r6  )r   r  r"   r"   r#   rp  ƒ  s    


zWorksheet._write_formula_1c             C   sF   yt |ƒ W n( tk
r4   | d¡r0| d¡}Y nX |  d|¡ d S )NrÔ   Zformula2)rÝ   r   r×   r  r6  )r   r  r"   r"   r#   rq  ”  s    
zWorksheet._write_formula_2c             C   s:   t | j ¡ ƒ}|sd S x|D ]}|  || j| ¡ qW d S )N)r÷  r½   rœ  Ú_write_conditional_formatting)r   r)  Ú
cond_ranger"   r"   r#   r   ¡  s    
z$Worksheet._write_conditional_formatsc             C   s<   d|fg}|   d|¡ x|D ]}|  |¡ qW |  d¡ d S )Nr;  ZconditionalFormatting)r3  Ú_write_cf_ruler7  )r   rs  rñ  r=  Úparamr"   r"   r#   rr  ¬  s
    

z'Worksheet._write_conditional_formattingc             C   s
  d|d fg}d|kr4|d d k	r4|  d|d f¡ |  d|d f¡ | d¡rZ|  d¡ |d dkrÎ|  d|d	 f¡ |  d
|¡ d|kr²d|kr²|  |d ¡ |  |d ¡ n|  |d ¡ |  d
¡ n8|d dkrXt d|d	 ¡rö|  d¡ t d|d	 ¡r|  d¡ t d|d	 ¡rHt d|d	 ¡}|  d| d¡f¡ |  d
|¡ n®|d dkrÈd	|krˆ|d	 dkrˆ|  d¡ d|krœ|  d¡ |d p¨d}|  d|f¡ |  d
|¡ n>|d dkræ|  d
|¡ n |d dkr|  d
|¡ n|d d ks<|d d!ks<|d d"ks<|d d#krˆ|  d|d	 f¡ |  d$|d f¡ |  d
|¡ |  |d% ¡ |  d
¡ n~|d d&krÐ|  d&|d	 f¡ |  d
|¡ |  |d% ¡ |  d
¡ n6|d d'ks|d d(ks|d d)ks|d d*kr.|  d
|¡ |  |d% ¡ |  d
¡ nØ|d d+kr^|  d
|¡ |  	|¡ |  d
¡ n¨|d d,kr¤|  d
|¡ |  
|¡ | d-¡r˜|  |¡ |  d
¡ nb|d d.krØ|  d
|¡ |  |d	 ¡ |  d
¡ n.|d d/kr|  d
|¡ |  |¡ |  d
¡ d S )0Nré   r8   ZdxfIdrã  r£  )Z
stopIfTruer   rÁ  r¾  rr  ZcfRulerz  r{  r	  rÂ  Zbelow)rÂ  r   rŽ  )ZequalAverager   z[123] std devz([123]) std devr  r   rÅ  rº  )r'  r   rØ  )rÔ  r   rF  ÚrankrÃ  rÄ  rÙ  rå  rÚ  rÛ  rO  r  rÆ  rÇ  rÈ  rÉ  rÊ  ræ  rÍ  rä  rÎ  rÏ  )r2  rG  r3  Ú_write_formula_elementr7  rÚ   r5  rM  r  Ú_write_color_scaleÚ_write_data_barÚ_write_data_bar_extÚ_write_icon_set)r   rñ  r=  rÛ   rv  r"   r"   r#   rt  µ  s”    










zWorksheet._write_cf_rulec             C   sF   yt |ƒ W n( tk
r4   | d¡r0| d¡}Y nX |  d|¡ d S )NrÔ   r  )rÝ   r   r×   r  r6  )r   r  r"   r"   r#   rw    s    
z Worksheet._write_formula_elementc             C   sœ   |   d¡ |  |d |d ¡ |d d k	r>|  |d |d ¡ |  |d |d ¡ |  d|d	 ¡ |d
 d k	r~|  d|d
 ¡ |  d|d ¡ |  d¡ d S )Nræ  r¤  r§  r¥  r¨  r¦  r©  r  rª  r«  r¬  )r3  Ú_write_cfvor  r7  )r   ru  r"   r"   r#   rx  *  s    
zWorksheet._write_color_scalec             C   s¢   g }|  d¡r | d|d f¡ |  d¡r<| d|d f¡ |  d¡rP| d¡ |  d|¡ |  |d |d	 ¡ |  |d
 |d ¡ |  d|d ¡ |  d¡ d S )Nr­  Ú	minLengthr®  Ú	maxLengthr»  )Ú	showValuer   rÍ  r¤  r§  r¦  r©  r  r°  )rG  r2  r3  r|  r  r7  )r   ru  r=  r"   r"   r#   ry  ?  s    



zWorksheet._write_data_barc             C   sp   | j d }t| jƒd }d||f }||d< | j |¡ |  d¡ |  d¡ |  d|¡ |  d¡ |  d¡ d S )Nr   z{DA7ABA51-AAAA-BBBB-%04X-%012X}ÚguidÚextLstz&{B025F937-C7B1-47D3-B67F-A62EFF666E3E}zx14:idÚext)rF   r   r¾   r2  r3  Ú
_write_extr6  r7  )r   ru  Zworksheet_countZdata_bar_countr€  r"   r"   r#   rz  V  s    



zWorksheet._write_data_bar_extc             C   s   g }|d dkrd|d fg}|  d¡r2| d¡ |  d¡rF| d¡ |  d|¡ x.t|d ƒD ]}|  |d	 |d
 |d ¡ q`W |  d¡ d S )Nr½  rÞ  rÏ  r¿  )r  r   r¾  )r!  r   rÀ  ré   r	  rr  )rG  r2  r3  Úreversedr|  r7  )r   ru  r=  Ziconr"   r"   r#   r{  i  s    



zWorksheet._write_icon_setc             C   s>   d|fg}|d k	r |  d|f¡ |r.|  d¡ |  d|¡ d S )Nré   r  )Zgter   Zcfvo)r2  r  )r   Zcf_typer  rr  r=  r"   r"   r#   r|  ‚  s    

zWorksheet._write_cfvoc             C   s   ||fg}|   d|¡ d S )NrJ  )r  )r   rE   r	  r=  r"   r"   r#   r  Ž  s    
zWorksheet._write_colorc             C   s   x| j D ]}| j|Ž  qW d S )N)rU   Ú_write_selection)r   Ú	selectionr"   r"   r#   r4  ”  s    zWorksheet._write_selectionsc             C   sJ   g }|r|  d|f¡ |r(|  d|f¡ |r:|  d|f¡ |  d|¡ d S )Nr9  Z
activeCellr;  r†  )r2  r  )r   r9  r:  r;  r=  r"   r"   r#   r…  ™  s    zWorksheet._write_selectionc             C   s8   | j }t|ƒsd S |d dkr*| j|Ž  n
| j|Ž  d S )Nrn  r  )rX   r   Ú_write_split_panesÚ_write_freeze_panes)r   rX   r"   r"   r#   r3  ¨  s    zWorksheet._write_panesc             C   sL  g }|}|}t ||ƒ}	d}
d}d}d}| jrB| jd \}}}g | _|rš|ršd}
t |dƒ}t d|ƒ}| j d||g¡ | j d||g¡ | j d||g¡ n2|r¶d}
| j d||g¡ nd}
| j d||g¡ |dkrÚd}n|dkrèd}nd	}|rþ| d
|f¡ |r| d|f¡ | d|	f¡ | d|
f¡ | d|f¡ |  d|¡ d S )Nr>   r   ÚbottomRightÚtopRightÚ
bottomLeftÚfrozenr   ZfrozenSplitr'   ÚxSplitÚySplitÚtopLeftCellÚ
activePaneÚstater9  )r   rU   r2  r  )r   rã   r0   r?  r@  rA  r=  Úy_splitÚx_splitÚtop_left_cellrY   r‘  r:  r;  r2   Úrow_cellÚcol_cellr"   r"   r#   rˆ  ´  sH    


zWorksheet._write_freeze_panesc             C   s®  g }d}d}d}	d}
|}|}| j r<| j d \}}	}
g | _ d}|rPtd| d ƒ}|r^|  |¡}||kr¦||kr¦td|d d d  ƒ}td|d d d	 d
 d  ƒ}t||ƒ}|s¼|}	|}
|r|rd}t|dƒ}td|ƒ}| j  d||g¡ | j  d||g¡ | j  d|	|
g¡ n4|r6d}| j  d|	|
g¡ nd}| j  d|	|
g¡ |rd| dd| f¡ |r|| dd| f¡ | d|f¡ |rž| d|f¡ |  d|¡ d S )Nr   r>   r   rA   i,  g      à?r@   i†  r=   rn  rB   r‰  rŠ  r‹  r  z%.16grŽ  r  r  r9  )rU   r   Ú_calculate_x_split_widthr   r2  r  )r   rã   r0   r?  r@  rA  r=  Zhas_selectionrY   r:  r;  r’  r“  r2   r”  r•  r–  r"   r"   r#   r‡  ì  sT    
 


zWorksheet._write_split_panesc             C   sZ   d}d}|dk r&t |||  d ƒ}nt || d ƒ| }|d d }|d }|d }|S )	Nr`  rm  r   g      à?r=   rn  rA   i†  )r   )r   ra  rá  râ  rã  ZpointsZtwipsr"   r"   r#   r—  3  s    z"Worksheet._calculate_x_split_widthc             C   sb   | j }t|ƒ}|sd S d|fg}|  d|¡ x&|D ]}|  jd7  _|  | j¡ q2W |  d¡ d S )Nr*  Z
tablePartsr   )r¶   r   r3  rª   Ú_write_table_partr7  )r   r¶   r*  r=  r2   r"   r"   r#   r¬  J  s    

zWorksheet._write_table_partsc             C   s&   dt |ƒ }d|fg}|  d|¡ d S )Nr`  zr:idZ	tablePart)rì   r  )r   rb  r=  r"   r"   r#   r˜  _  s    
zWorksheet._write_table_partc             C   sP   t | jƒ}t | jƒ}|s |s d S |  d¡ |r6|  ¡  |rB|  ¡  |  d¡ d S )Nr  )r   r¾   r·   r3  Ú_write_ext_list_data_barsÚ_write_ext_list_sparklinesr7  )r   Zhas_data_barsZhas_sparklinesr"   r"   r#   r­  h  s    


zWorksheet._write_ext_listc             C   sF   |   d¡ |  d¡ x| jD ]}|  |¡ qW |  d¡ |  d¡ d S )Nz&{78C0D931-6437-407d-A8EE-F0AAD7539E65}zx14:conditionalFormattingsr‚  )rƒ  r3  r¾   Ú"_write_conditional_formatting_2010r7  )r   r×  r"   r"   r#   r™  {  s    


z#Worksheet._write_ext_list_data_barsc             C   sì   d}d|fg}|   d|¡ |  |¡ |  |¡ |  |d |d ¡ |  |d |d ¡ |d sl|  |d	 ¡ |d
 s‚|  |d ¡ |d s |d s |  |d ¡ |d dk	rº|  |d ¡ |  d¡ |  d¡ |  	d|d ¡ |  d¡ d S )Nz3http://schemas.microsoft.com/office/excel/2006/mainzxmlns:xmzx14:conditionalFormattingrì  r§  rî  r©  r·  r´  r²  r±  r¶  rµ  r¹  r†  rº  zx14:dataBarz
x14:cfRulezxm:sqrefr  )
r3  Ú_write_x14_cf_ruleÚ_write_x14_data_barÚ_write_x14_cfvoÚ_write_x14_border_colorÚ_write_x14_negative_fill_colorÚ _write_x14_negative_border_colorÚ_write_x14_axis_colorr7  r6  )r   r×  Úxmlns_xmr=  r"   r"   r#   r›  ‰  s,    






z,Worksheet._write_conditional_formatting_2010c             C   s,   d}|d }d|fd|fg}|   d|¡ d S )NrÍ  r€  ré   r   z
x14:cfRule)r3  )r   r×  Ú	rule_typer€  r=  r"   r"   r#   rœ  ¶  s    zWorksheet._write_x14_cf_rulec             C   sÐ   d}d}d|fd|fg}|d s*|  d¡ |d r<|  d¡ |d	 d
krR|  d¡ |d	 dkrh|  d¡ |d rz|  d¡ |d s”|d s”|  d¡ |d dkrª|  d¡ |d dkrÀ|  d¡ |  d|¡ d S )Nr   r?   r}  r~  r·  )Zborderr   r³  )Zgradientr   r¸  rl  )rØ  ZleftToRightrm  )rØ  r1  r²  )ZnegativeBarColorSameAsPositiver   r¶  )Z$negativeBarBorderColorSameAsPositiver   r¹  Úmiddle)ÚaxisPositionr¥  r†  )r¦  r†  zx14:dataBar)r2  r3  )r   r×  r­  r®  r=  r"   r"   r#   r  ¾  s,    








zWorksheet._write_x14_data_barc             C   sF   d|fg}|dkr |   d|¡ n"|  d|¡ |  d|¡ |  d¡ d S )Nré   )rç  rè  rë  rí  zx14:cfvozxm:f)r  r3  r6  r7  )r   r¤  r	  r=  r"   r"   r#   rž  ã  s    
zWorksheet._write_x14_cfvoc             C   s   d|fg}|   d|¡ d S )Nr  zx14:borderColor)r  )r   r  r=  r"   r"   r#   rŸ  î  s    
z!Worksheet._write_x14_border_colorc             C   s   d|fg}|   d|¡ d S )Nr  zx14:negativeFillColor)r  )r   r  r=  r"   r"   r#   r   ó  s    
z(Worksheet._write_x14_negative_fill_colorc             C   s   d|fg}|   d|¡ d S )Nr  zx14:negativeBorderColor)r  )r   r  r=  r"   r"   r#   r¡  ø  s    
z*Worksheet._write_x14_negative_border_colorc             C   s   d|fg}|   d|¡ d S )Nr  zx14:axisColor)r  )r   r  r=  r"   r"   r#   r¢  ý  s    
zWorksheet._write_x14_axis_colorc             C   sÞ   |   d¡ |  ¡  x²t| jƒD ]¤}|  |¡ |  |d ¡ |  |d ¡ |  ¡  |  |d ¡ |  	|d ¡ |  
|d ¡ |  |d ¡ |  |d ¡ |d	 r®|  d
|d	 ¡ |  |¡ |  d¡ qW |  d¡ |  d¡ d S )Nz&{05C60535-1F16-4fd2-B633-F4F36F0B64E0}r  r  r  r  r  r  r  r$  zxm:fzx14:sparklineGroupzx14:sparklineGroupsr‚  )rƒ  Ú_write_sparkline_groupsr„  r·   Ú_write_sparkline_groupÚ_write_color_seriesÚ_write_color_negativeÚ_write_color_axisÚ_write_color_markersÚ_write_color_firstÚ_write_color_lastÚ_write_color_highÚ_write_color_lowr6  Ú_write_sparklinesr7  )r   r4  r"   r"   r#   rš    s$    



z$Worksheet._write_ext_list_sparklinesc             C   sr   |   d¡ xXt|d ƒD ]H}|d | }|d | }|   d¡ |  d|¡ |  d|¡ |  d¡ qW |  d¡ d S )Nzx14:sparklinesr*  r)  r  zx14:sparklinezxm:fzxm:sqref)r3  r  r6  r7  )r   r4  r  r6  r  r"   r"   r#   r±  1  s    

zWorksheet._write_sparklinesc             C   s,   d}|d }d|fd|fg}|   d|¡ d S )Nz$http://schemas.microsoft.com/office/zspreadsheetml/2009/9/mainz	xmlns:x14Úurir‚  )r3  )r   r²  r/  Z	xmlns_x14r=  r"   r"   r#   rƒ  B  s
    
zWorksheet._write_extc             C   s   d}d|fg}|   d|¡ d S )Nz3http://schemas.microsoft.com/office/excel/2006/mainzxmlns:xmzx14:sparklineGroups)r3  )r   r£  r=  r"   r"   r#   r§  N  s    
z!Worksheet._write_sparkline_groupsc             C   sú  |  d¡}g }|  d¡d k	rL|d dkr2d|d< n| d|d f¡ d|d< |  d¡d k	rŠ|d dkrpd|d< n| d	|d f¡ d|d< |d
 dkr¨| d
|d
 f¡ |  d¡rÄ| d|d f¡ |  d¡rØ| d¡ |rê| d|f¡ |  d¡rþ| d¡ |  d¡r| d¡ |  d¡r*| d¡ |  d¡r@| d¡ |  d¡rV| d¡ |  d¡rl| d¡ |  d¡r‚| d¡ |  d¡r˜| d ¡ |  d¡r¶| d!|d f¡ |  d¡rÔ| d"|d f¡ |  d#¡rê| d$¡ |  d%|¡ d S )&Nr1  rè  rM  Zcust_maxZ	manualMaxr‰  rç  Zcust_minZ	manualMinré   r&  r%  Z
lineWeightr$  )ZdateAxisr   ZdisplayEmptyCellsAsr  )r  r   r,  )r,  r   r-  )r-  r   r/  )r/  r   r0  )r0  r   r.  )r.  r   r   )ZdisplayXAxisr   rV   )ZdisplayHiddenr   ZminAxisTypeZmaxAxisTyper!  )r1  r   zx14:sparklineGroup)rG  r2  r3  )r   rL  r1  r=  r"   r"   r#   r¨  V  sV    















z Worksheet._write_sparkline_groupc             C   sh   g }|  d¡r | d|d f¡ |  d¡r<| d|d f¡ |  d¡rX| d|d f¡ |  ||¡ d S )Nr  r  Ztint)rG  r2  r  )r   ÚelementrJ  r=  r"   r"   r#   Ú_write_spark_color°  s    


zWorksheet._write_spark_colorc             C   s   |   d|¡ d S )Nzx14:colorSeries)r´  )r   rJ  r"   r"   r#   r©  ¿  s    zWorksheet._write_color_seriesc             C   s   |   d|¡ d S )Nzx14:colorNegative)r´  )r   rJ  r"   r"   r#   rª  Ã  s    zWorksheet._write_color_negativec             C   s   |   dddi¡ d S )Nzx14:colorAxisr  ZFF000000)r´  )r   r"   r"   r#   r«  Ç  s    zWorksheet._write_color_axisc             C   s   |   d|¡ d S )Nzx14:colorMarkers)r´  )r   rJ  r"   r"   r#   r¬  Ë  s    zWorksheet._write_color_markersc             C   s   |   d|¡ d S )Nzx14:colorFirst)r´  )r   rJ  r"   r"   r#   r­  Ï  s    zWorksheet._write_color_firstc             C   s   |   d|¡ d S )Nzx14:colorLast)r´  )r   rJ  r"   r"   r#   r®  Ó  s    zWorksheet._write_color_lastc             C   s   |   d|¡ d S )Nzx14:colorHigh)r´  )r   rJ  r"   r"   r#   r¯  ×  s    zWorksheet._write_color_highc             C   s   |   d|¡ d S )Nzx14:colorLow)r´  )r   rJ  r"   r"   r#   r°  Û  s    zWorksheet._write_color_lowc             C   s   ddg}|   d|¡ d S )N)ZfontIdÚ0)ré   ZnoConversionZ
phoneticPr)r  )r   r=  r"   r"   r#   r  ß  s    zWorksheet._write_phonetic_pr)N)N)N)N)N)N)Nr   )Nr   )Nr   )Nr   )N)N)N)N)NNN)NNN)N)N)N)N)N)N)NNN)NNN)NF)N)N)N)N)N)r   r   r   r   )NNr   )NN)r?   )r>   N)N)rj  rj  rk  rk  )r>   NN)r>   NN)N)N)r   )N)FF)N)r   )NF)N)NNN)NNN)N)Úr  Ú
__module__Ú__qualname__Ú__doc__rD   rå   r%   rç   ræ   rù   rá   r  rà   r  rÖ   r
  rØ   r-   r  r  r  rð   r  rë   r  rÜ   r+  r*  r@  rA  rN  rP  rR  rU  rV  rX  rY  rZ  r[  r\  r]  r4   rd  rf  rg  rh  rl  rv  rq  r¢  rö  r  r7  r<  r>  rB  rE  rG  rH  rI  rK  r`  rc  rd  re  rf  rg  rh  ri  rn  rz  r{  r|  r}  r~  r  r€  r  r‚  rƒ  r„  r†  rˆ  r‰  rŠ  r’  r®  rü   r  ri  r±  ro  rp  rµ  r]  rÏ  rÑ  rÒ  rÓ  rÃ  rÔ  rß  rà  rS  ra  rû  rü  rþ  r
  r3  r  r  r(  r4  r  r  r  r  rÞ   rß   r%  r&  rï  r”  r–  r—  r0  r˜  r™  r6  rš  r›  r¤  r¥  r£  r¦  r@  rA  r<  rþ   rB  rC  rE  rD  rR  rQ  r•  rV  rT  rU  r§  r¨  rX  rŸ  rZ  r¢  r\  r]  rž  rd  re  rf  ri  rg  rk  rœ  r©  rl  rª  r«  r¡  rm  rp  rq  r   rr  rt  rw  rx  ry  rz  r{  r|  r  r4  r…  r3  rˆ  r‡  r—  r¬  r˜  r­  r™  r›  rœ  r  rž  rŸ  r   r¡  r¢  rš  r±  rƒ  r§  r¨  r´  r©  rª  r«  r¬  r­  r®  r¯  r°  r  Ú__classcell__r"   r"   )rÓ   r#   r<   ”   sò   E#H.  en'9" J>1;( j   j   ;' 3!KK)[!(!R<++:^{?0	8	4K$	17J(&13p		G  0O	h8G	-%/Zr<   )0r  rí   rH  rÚ   rñ   r  Úcollectionsr   r   Úwarningsr   Zcompatibilityr   r   r   r	   r>   r
   r8   r   r¹   r   rÐ  r   r   Zutilityr   r   r   r   r   r   r   r   r   r   Ú
exceptionsr   r%   r-   r4   rÿ   r  r  r  r  r  r<   r"   r"   r"   r#   Ú<module>	   sL   




