o
    ՎjZ                    @   s  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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mZ d dlmZmZmZmZ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%m&Z& d dl'm(Z( ddl)m*Z* ddl+m,Z,m-Z-m.Z. ddl/m0Z0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZA ddl*mBZB eCdejDZEdd ZFdd ZGdd ZHedd ZIed!d"ZJed#d$ZKed%d&ZLed'd(ZMed)d*ZNed+d$ZOed,d-ZPed.d/ZQG d0d1 d1e*jBZRdS )2    N)defaultdict
namedtuple)Decimal)Fractionwraps)BytesIOStringIO)isinfisnan)AnyDictListLiteralOptionalUnion)warn)Chart)Color)CommentType)Image)UrlUrlTypes)
ButtonType   )	xmlwriter)DrawingDrawingInfoDrawingTypes)DuplicateTableNameOverlappingRange)Format)Shape)_datetime_to_excel_datetime_get_sparkline_style_preserve_whitespace_supported_datetimequote_sheetnamexl_cell_to_rowcolxl_col_to_namexl_pixel_widthxl_rangexl_rowcol_to_cellxl_rowcol_to_cell_fast)	XMLwritera  
    \bANCHORARRAY\(    |
    \bBYCOL\(          |
    \bBYROW\(          |
    \bCHOOSECOLS\(     |
    \bCHOOSEROWS\(     |
    \bDROP\(           |
    \bEXPAND\(         |
    \bFILTER\(         |
    \bHSTACK\(         |
    \bLAMBDA\(         |
    \bMAKEARRAY\(      |
    \bMAP\(            |
    \bRANDARRAY\(      |
    \bREDUCE\(         |
    \bSCAN\(           |
    \bSEQUENCE\(       |
    \bSINGLE\(         |
    \bSORT\(           |
    \bSORTBY\(         |
    \bSWITCH\(         |
    \bTAKE\(           |
    \bTEXTSPLIT\(      |
    \bTOCOL\(          |
    \bTOROW\(          |
    \bUNIQUE\(         |
    \bVSTACK\(         |
    \bWRAPCOLS\(       |
    \bWRAPROWS\(       |
    \bXLOOKUP\(c                       t   fdd}|S )zn
    Decorator function to convert A1 notation in cell method calls
    to the default row/col notation.

    c                    sZ   z|r|d }t | W n ty!   t|}||dd   }Y nw  | g|R i |S Nr   r   )int
ValueErrorr(   )selfargskwargs	first_argnew_argsmethod T/home/air/Certificate/back/venv/lib/python3.10/site-packages/xlsxwriter/worksheet.pycell_wrapperf   s   z'convert_cell_args.<locals>.cell_wrapperr   r9   r<   r:   r8   r;   convert_cell_args_   s   r>   c                    r/   )zo
    Decorator function to convert A1 notation in range method calls
    to the default row/col notation.

    c           
         s   z
|r	t |d  W nC tyM   d|d v r-|d d\}}t|\}}t|\}}nt|d \}}||}}||||g}	|	|dd   |	}Y nw  | g|R i |S )Nr   :r   r1   r2   splitr(   extend)
r3   r4   r5   cell_1cell_2row_1col_1row_2col_2r7   r8   r:   r;   r<   ~   s    
z(convert_range_args.<locals>.cell_wrapperr   r=   r:   r8   r;   convert_range_argsw   s   rI   c                    r/   )zq
    Decorator function to convert A1 notation in columns method calls
    to the default row/col notation.

    c           	         s   z
|r	t |d  W n2 ty<   dd |d dD \}}t|\}}t|\}}||g}||dd   |}Y nw  | g|R i |S )Nr   c                 S   s   g | ]}|d  qS )1r:   ).0colr:   r:   r;   
<listcomp>   s    z?convert_column_args.<locals>.column_wrapper.<locals>.<listcomp>r?   r   r@   )	r3   r4   r5   rC   rD   _rF   rH   r7   r8   r:   r;   column_wrapper   s   	z+convert_column_args.<locals>.column_wrapperr   )r9   rO   r:   r8   r;   convert_column_args   s   rP   BlankformatErrorzerror, format, valueNumberznumber, formatStringzstring, formatBooleanzboolean, formatFormulazformula, format, valueDatetime
RichStringzstring, format, raw_stringArrayFormulaz$formula, format, value, range, atypec                       s  e Zd ZdZd$ fddZdedefdd	Zedededee	d
 e
f fddZdedefddZe	d%dedededee de	d f
ddZ	d%dedededee de	d f
ddZe	d%dededeeeef dee de	d
 f
ddZ	d%dededeeeef dee de	d
 f
ddZe	d%dedede
dee fddZ	d%dededee de	d
 fddZe		 d&deded!edee de	d f
d"d#Z		 d&deded!edee de	d f
d$d%Ze		 d&d&ed'ed(ed)ed!edee de	d
 fd*d+Ze		 d&d&ed'ed(ed)ed!edee de	d
 fd,d-Zd'd/d0Zed1d2 Z		 	3d(de	d
 fd4d5Z e	d%deded6e!j!dee de	d
 f
d7d8Z"d%dededefd9d:Z#e	d%deded;e$dee fd<d=Z%d%dededefd>d?Z&e			d)deded@edee dee dAee fdBdCZ'	d)dededefdDdEZ(edededFeeef de	dG fdHdIZ)dededefdJdKZ*d$dLdMZ+e	d%dededee dee	d  e
f fdNdOZ,e	d%dededee dee	d  e
f fdPdQZ-e	d%dededReee.e/f dSee0ee
f  de	d
 f
dTdUZ1e	d%dededReee.e/f dSee0ee
f  de	d
 f
dVdWZ2e	d%dededXedSee0ee
f  de	d
 f
dYdZZ3e	d%deded[e4dSee0ee
f  de	d f
d\d]Z5e	d%deded^edSee0ee
f  de	d f
d_d`Z6d$dadbZ7	.d'dReee.e/f dce$de	d  fdddeZ8d$dfdgZ9dhdi Z:d$djdkZ;d$dldmZ<d$dndoZ=d$dpdqZ>d$drdsZ?e@			d)d'ed)edtee dee dSee0ee
f  de	d
 fdudvZAe@			d)d'ed)edtee dee dSee0ee
f  de	d
 fdwdxZBd*dzeddfd{d|ZC			d)ded}ee dee dSee0ee
f  de	d
 f
d~dZD			d)ded}ee dee dSee0ee
f  de	d
 f
ddZE	.d+d}ee de$ddfddZFe	d%d&ed'ed(ed)ede
dee defddZGed&ed'ed(ed)eddf
ddZHdededdfddZIdedeJe ddfddZKe	d%d&ed'ed(ed)edSee0ee
f  de	d fddZLe	d%d&ed'ed(ed)edSee0ee
f  de	d fddZMe	d%d&ed'ed(ed)edSee0ee
f  de	d fddZNe	d%dededSee0ee
f  de	d fddZOed&ed'ed(ed)eddf
ddZPed,dededdfddZQ				 d-de$de$de$de$ddf
ddZRe			 d.dededee dee deddfddZSe		d/dededee dee ddf
ddZTd0deddfddZUd$ddZVd$ddZWdeeeXf ddfddZY	d1dedSee0ee
f  ddfddZZ		d/dedee dee defddZ[e	d%dededSee0ee
f  de	d
 fddZ\e	d%deded;e$dee fddÄZ]d$ddńZ^d$ddǄZ_d2de	d ddfdd˄Z`d$dd̈́Zadee	d ef ddfddфZbd$ddӄZcd$ddՄZd				אd3dededededdf
dd݄Ze	d4dedSee0ee
f  ddfddZf	d4dedSee0ee
f  ddfddZgd%d&ed(ee ddfddZhe@d%d'ed)ee ddfddZid2de	d ddfddZjd$ddZkd$ddZled&ed'ed(ed)ede	d
 f
ddZmd$ddZndted}eddfddZodeddfddZpdeddfddZqd$ddZrdeJe ddfddZsdeJe ddfd dZtd%dee ddfddZud%dSee0ee
f  de	d
 fddZvd$ddZwd$d	d
Zx	.d5dededefddZydd Zzdd Z{dd Z|dd Z}dd Z~dd ZdefddZd%dSee0ee
f  fddZde/dededdfd d!Zd$d"d#Zd$d$d%Zd$d&d'Zd$d(d)Zd*d+ Zd,d- Zd6defd.d/Zd6defd0d1Zd2d3 Zd4d5 Zd^efd6d7Zd8efd9d:Zd;d< Zd$d=d>Zd$d?d@ZdAdB Zd$dCdDZdEdF ZdGdH ZdIdJ Zd%dKdLZd%dMdNZd$dOdPZd$dQdRZd$dSdTZd$dUdVZd$dWdXZd$dYdZZd%d[d\Zd$d]d^Zd$d_d`Zd$dadbZd$dcddZd$dedfZd$dgdhZd$didjZd$dkdlZd$dmdnZd$dodpZd$dqdrZd$dsdtZd$dudvZd$dwdxZd$dydzZd$d{d|Zd6d$d}d~Zd$ddZd+deddfddZd%deddfddZdededdfddZd$ddZd$ddZd$ddZd$ddZd$ddZd$ddZd$ddZd$ddZd$ddZd$ddZd$ddZd$ddZdededed@eddf
ddZdeded@eddfddZŐd$ddZƐd$ddZǐd$ddZȐd$ddZɐd$ddZʐd$ddZːd$ddZ̐d$ddZ͐d$ddZΐd$ddZϐd$ddZАd$ddZѐd$ddZҐd$ddZӐd$ddZԐd$ddÄZՐd$dĐdńZ֐d$dƐdǄZאd$dȐdɄZؐd$dʐd˄Zِd$d̐d̈́Zڐd$dΐdτZېd$dАdфZܐd$dҐdӄZݐd$dԐdՄZސd$d֐dׄZߐd$dؐdلZd%d$dڐdۄZd$dܐd݄Zd$dސd߄Zd$ddZd$ddZdededdfddZdededdfddZdd Zd$ddZd$ddZd$ddZd$ddZd$ddZd$ddZd$ddZd$ddZd$ddZd$ddZd$ddZd$d dZd$ddZd$ddZd$ddZd$dd	Zd$d
dZd$ddZd$ddZd$ddZd$ddZd$ddZd$ddZd$ddZ d$ddZd$ddZd$ddZd$d d!Zd$d"d#Z  ZS (7  	Worksheetz=
    A class for writing the Excel XLSX Worksheet file.

    returnNc                    sH  t    d| _d| _d| _d| _d| _d| _d| _g | _	d| _
d| _d| _d| _d| _d| _d| _d| _d| _d| _i | _g | _d| _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 | _Bg | _Cd| _Di | _EtFtG| _Hd| _Id
| _Jd| _Kd| _Ld
| _Md| _Nd| _Od| _Pd| _Qd
| _Rd
| _Sd
| _Td| _Ud| _Vd| _Wd| _Xd| _Yd| _Zd| _[d| _\i | _]g | _^tFtG| __g | _`i | _ai | _bi | _cd| _dd| _ed| _ftFtG| _gg | _hd| _id| _jd| _kg | _ld| _md| _nd| _oddg| _pd| _qi | _ri | _si | _ti | _ud| _vd| _wd
| _xd| _yd| _zg | _{g | _|g | _}g | _~g | _g | _g | _g | _g | _g | _g | _g | _g | _g | _i | _d| _i | _d| _i | _d| _d| _d| _d| _g | _i | _g | _d| _d
| _d| _d| _d| _tFtG| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _kd| _d| _d| _d| _d| _i | _d| _d| _d| _d| _d| _dS )z
        Constructor.

        Nr   Fi  i   i @        r   Tffffff?      ?333333?d         \( @@   D      	   i  )super__init__nameindex	str_tablepaletteconstant_memorytmpdiris_chartsheet
ext_sheets
fileclosedexcel_versionexcel2003_style
xls_rowmax
xls_colmax
xls_strmax
dim_rowmin
dim_rowmax
dim_colmin
dim_colmaxcol_info
selectionshiddenactive	tab_colortop_left_cell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_orderblack_whitedraft_qualityprint_comments
page_startfit_page	fit_width
fit_heighthbreaksvbreaksprotect_optionsprotected_rangesnum_protected_rangesset_colsr   dictset_rowszoomzoom_scale_normalprint_scaleis_right_to_left
show_zeros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_widthdefault_col_pixelsdefault_date_pixelsdefault_row_zeroednameswrite_matchtablemergemerged_cellstable_cells	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filter_cells	row_sizescol_size_changedrow_size_changedlast_shape_id	rel_counthlink_count
hlink_refsexternal_hyper_linksexternal_drawing_linksexternal_comment_linksexternal_vml_linksexternal_table_linksexternal_background_linksdrawing_linksvml_drawing_linkschartsimagestables
sparklinesshapes
shape_hashdrawingdrawing_relsdrawing_rels_idvml_drawing_relsvml_drawing_rels_idbackground_image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default_checkbox_formatworkbook_add_formatremove_timezonemax_url_lengthrow_data_filenamerow_data_fhworksheet_metavml_data_idrow_data_fh_closedvertical_dpihorizontal_dpiwrite_handlersignored_errorshas_dynamic_arraysuse_future_functionsignore_write_stringembedded_imagesr3   	__class__r:   r;   rl      sd  






zWorksheet.__init__rowrL   c                 G   s>  |dkr| j ||g|R  S | jr |dr | j||g|R  S |dr4|dr4| j||g|R  S d|v r]| jr]td|sStd|sStd|sStd	|r]| j||g|R  S | j	rz!t
|}| jspt|st|s| j|||g|d
d  R  W S W n	 ty   Y nw | j||g|R  S | j||g|R  S )Nr^   =z{=}r?   z(ftp|http)s?://zmailto:z(in|ex)ternal:zfile://r   )_write_blankr  
startswith_write_formulaendswithr  rematch
_write_urlr  floatr  r   r
   _write_numberr2   _write_string)r3   tokenr  rL   r4   fr:   r:   r;   _write_token_as_string  s:   



	 z Worksheet._write_token_as_string)r   c                 G      | j ||g|R  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r3   r  rL   r4   r:   r:   r;   write  s   zWorksheet.writec           	      G   s4  |st d|d }|j}|| jv r(| j| }|| ||g|R  }|d u r&n|S |d u r6| j||g|R  S |tu rD| j||g|R  S |tttt	fv rV| j
||g|R  S |tu re| j|||g|R  S |tjtjtjtjfv r{| j||g|R  S t|tttt	fr| j
||g|R  S t|tr| j|||g|R  S t|tr| j||g|R  S t|r| j||g|R  S t|tr| j||g|R  S zt|}| j
|||g|dd  R  W S  ty   Y n t y   t dt| dw zt| | j||g|R  W S  ty   t dt| dw )Nz,write() takes at least 4 arguments (3 given)r   r   zUnsupported type z in write())	TypeErrorr  r  r"  bool_write_booleanr)  r1   r   r   r*  strr.  datetimedatetime	timedelta_write_datetime
isinstancer&   r   r(  r2   typer+  )	r3   r  rL   r4   r,  
token_typewrite_handlerfunction_returnr-  r:   r:   r;   r2    sb   




 zWorksheet._writestringcell_format)r   r/  c                 C      |  ||||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+  )r3   r  rL   rC  rD  r:   r:   r;   write_string@     zWorksheet.write_stringc                 C   s~   d}|  ||r
dS t|| jkr|d | j }d}| js$| j|}n|}| jr3|| jkr3| | t||| j	| |< |S Nr   r/  rE  )
_check_dimensionslenrz   rq   ro   _get_shared_string_indexr   _write_single_rowCellStringTupler   )r3   r  rL   rC  rD  	str_errorstring_indexr:   r:   r;   r+  V  s   
zWorksheet._write_stringnumberc                 C   rF  )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*  r3   r  rL   rQ  rD  r:   r:   r;   write_numbers     zWorksheet.write_numberc                 C   s   t |st|r:| jr6t |r| ||d|dS |tjkr&| ||d|dS |tj kr5| ||d|dS ntd|jtu rCt	|}| 
||rKdS | jrX|| jkrX| | t||| j| |< dS )N#NUM!z1/0#DIV/0!z-1/0zUNAN/INF not supported in write_number() without 'nan_inf_to_errors' Workbook() optionr/  r   )r   r
   r  r$  mathinfr5  r  r   r)  rJ  rq   r   rM  CellNumberTupler   rR  r:   r:   r;   r*    s(   


zWorksheet._write_numberblankc                 C   rF  )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"  )r3   r  rL   rZ  rD  r:   r:   r;   write_blank  rH  zWorksheet.write_blankc                 C   sL   |d u rdS |  ||rdS | jr|| jkr| | t|| j| |< dS )Nr   r/  )rJ  rq   r   rM  CellBlankTupler   )r3   r  rL   rN   rD  r:   r:   r;   r"    s   
zWorksheet._write_blankr   formulac                 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.
            -2: Formula can't be None or empty.

        )r$  r3   r  rL   r]  rD  valuer:   r:   r;   write_formula  s   zWorksheet.write_formulac              	   C   s   |  ||rdS |d u s|dkrtd dS t|r&| |||||||S |dr;|dr;| |||||||S | |}| j	rM|| j
krM| | t|||| j| |< dS )Nr/  r^   zFormula can't be None or empty{r!  r   )rJ  r   re_dynamic_functionsearchwrite_dynamic_array_formular#  r%  _write_array_formula_prepare_formularq   r   rM  CellFormulaTupler   r^  r:   r:   r;   r$    s$   


zWorksheet._write_formula	first_row	first_collast_rowlast_colc              
   C   s8   t |r| |||||||S | |||||||dS )an  
        Write a formula to a worksheet cell/range.

        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.

        static)rb  rc  rd  re  )r3   rh  ri  rj  rk  r]  rD  r_  r:   r:   r;   write_array_formula!  s   
zWorksheet.write_array_formulac           	   
   C   s*   |  |||||||d}|dkrd| _|S )a|  
        Write a dynamic array formula to a worksheet cell/range.

        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.

        dynamicr   T)re  r  )	r3   rh  ri  rj  rk  r]  rD  r_  errorr:   r:   r;   rd  N  s   z%Worksheet.write_dynamic_array_formulaFc                 C   sT	  | dr|dd  }| dr|dd  }|dr!|d d }d|v r'|S tdd|}td	d
|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd |}td!d"|}td#d$|}td%d&|}td'd(|}td)d*|}td+d,|}td-d.|}td/d0|}td1d2|}td3d4|}td5d6|}td7d8|}td9d:|}td;d<|}td=d>|}td?d@|}| js|s|S tdAdB|}tdCdD|}tdEdF|}tdGdH|}tdIdJ|}tdKdL|}tdMdN|}tdOdP|}tdQdR|}tdSdT|}tdUdV|}tdWdX|}tdYdZ|}td[d\|}td]d^|}td_d`|}tdadb|}tdcdd|}tdedf|}tdgdh|}tdidj|}tdkdl|}tdmdn|}tdodp|}tdqdr|}tdsdt|}tdudv|}tdwdx|}tdydz|}td{d||}td}d~|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd |}tdd|}tdd|}tdd|}tdd|}td	d
|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd|}tdd |}td!d"|}td#d$|}td%d&|}td'd(|}td)d*|}td+d,|}td-d.|}td/d0|}td1d2|}td3d4|}td5d6|}td7d8|}td9d:|}td;d<|}|S (=  Nra  r   r   r!  r/  z_xlfn.z\bANCHORARRAY\(z_xlfn.ANCHORARRAY(z	\bBYCOL\(z_xlfn.BYCOL(z	\bBYROW\(z_xlfn.BYROW(z\bCHOOSECOLS\(z_xlfn.CHOOSECOLS(z\bCHOOSEROWS\(z_xlfn.CHOOSEROWS(z\bDROP\(z_xlfn.DROP(z
\bEXPAND\(z_xlfn.EXPAND(z
\bFILTER\(z_xlfn._xlws.FILTER(z
\bHSTACK\(z_xlfn.HSTACK(z
\bLAMBDA\(z_xlfn.LAMBDA(z\bMAKEARRAY\(z_xlfn.MAKEARRAY(z\bMAP\(z
_xlfn.MAP(z\bRANDARRAY\(z_xlfn.RANDARRAY(z
\bREDUCE\(z_xlfn.REDUCE(z\bSCAN\(z_xlfn.SCAN(z	\SINGLE\(z_xlfn.SINGLE(z\bSEQUENCE\(z_xlfn.SEQUENCE(z\bSORT\(z_xlfn._xlws.SORT(z
\bSORTBY\(z_xlfn.SORTBY(z
\bSWITCH\(z_xlfn.SWITCH(z\bTAKE\(z_xlfn.TAKE(z\bTEXTSPLIT\(z_xlfn.TEXTSPLIT(z	\bTOCOL\(z_xlfn.TOCOL(z	\bTOROW\(z_xlfn.TOROW(z
\bUNIQUE\(z_xlfn.UNIQUE(z
\bVSTACK\(z_xlfn.VSTACK(z\bWRAPCOLS\(z_xlfn.WRAPCOLS(z\bWRAPROWS\(z_xlfn.WRAPROWS(z\bXLOOKUP\(z_xlfn.XLOOKUP(z	\bACOTH\(z_xlfn.ACOTH(z\bACOT\(z_xlfn.ACOT(z\bAGGREGATE\(z_xlfn.AGGREGATE(z
\bARABIC\(z_xlfn.ARABIC(z\bARRAYTOTEXT\(z_xlfn.ARRAYTOTEXT(z\bBASE\(z_xlfn.BASE(z\bBETA.DIST\(z_xlfn.BETA.DIST(z\bBETA.INV\(z_xlfn.BETA.INV(z\bBINOM.DIST.RANGE\(z_xlfn.BINOM.DIST.RANGE(z\bBINOM.DIST\(z_xlfn.BINOM.DIST(z\bBINOM.INV\(z_xlfn.BINOM.INV(z
\bBITAND\(z_xlfn.BITAND(z\bBITLSHIFT\(z_xlfn.BITLSHIFT(z	\bBITOR\(z_xlfn.BITOR(z\bBITRSHIFT\(z_xlfn.BITRSHIFT(z
\bBITXOR\(z_xlfn.BITXOR(z\bCEILING.MATH\(z_xlfn.CEILING.MATH(z\bCEILING.PRECISE\(z_xlfn.CEILING.PRECISE(z\bCHISQ.DIST.RT\(z_xlfn.CHISQ.DIST.RT(z\bCHISQ.DIST\(z_xlfn.CHISQ.DIST(z\bCHISQ.INV.RT\(z_xlfn.CHISQ.INV.RT(z\bCHISQ.INV\(z_xlfn.CHISQ.INV(z\bCHISQ.TEST\(z_xlfn.CHISQ.TEST(z\bCOMBINA\(z_xlfn.COMBINA(z
\bCONCAT\(z_xlfn.CONCAT(z\bCONFIDENCE.NORM\(z_xlfn.CONFIDENCE.NORM(z\bCONFIDENCE.T\(z_xlfn.CONFIDENCE.T(z\bCOTH\(z_xlfn.COTH(z\bCOT\(z
_xlfn.COT(z\bCOVARIANCE.P\(z_xlfn.COVARIANCE.P(z\bCOVARIANCE.S\(z_xlfn.COVARIANCE.S(z\bCSCH\(z_xlfn.CSCH(z\bCSC\(z
_xlfn.CSC(z\bDAYS\(z_xlfn.DAYS(z\bDECIMAL\(z_xlfn.DECIMAL(z\bERF.PRECISE\(z_xlfn.ERF.PRECISE(z\bERFC.PRECISE\(z_xlfn.ERFC.PRECISE(z\bEXPON.DIST\(z_xlfn.EXPON.DIST(z\bF.DIST.RT\(z_xlfn.F.DIST.RT(z
\bF.DIST\(z_xlfn.F.DIST(z\bF.INV.RT\(z_xlfn.F.INV.RT(z	\bF.INV\(z_xlfn.F.INV(z
\bF.TEST\(z_xlfn.F.TEST(z\bFILTERXML\(z_xlfn.FILTERXML(z\bFLOOR.MATH\(z_xlfn.FLOOR.MATH(z\bFLOOR.PRECISE\(z_xlfn.FLOOR.PRECISE(z\bFORECAST.ETS.CONFINT\(z_xlfn.FORECAST.ETS.CONFINT(z\bFORECAST.ETS.SEASONALITY\(z_xlfn.FORECAST.ETS.SEASONALITY(z\bFORECAST.ETS.STAT\(z_xlfn.FORECAST.ETS.STAT(z\bFORECAST.ETS\(z_xlfn.FORECAST.ETS(z\bFORECAST.LINEAR\(z_xlfn.FORECAST.LINEAR(z\bFORMULATEXT\(z_xlfn.FORMULATEXT(z\bGAMMA.DIST\(z_xlfn.GAMMA.DIST(z\bGAMMA.INV\(z_xlfn.GAMMA.INV(z\bGAMMALN.PRECISE\(z_xlfn.GAMMALN.PRECISE(z	\bGAMMA\(z_xlfn.GAMMA(z	\bGAUSS\(z_xlfn.GAUSS(z\bHYPGEOM.DIST\(z_xlfn.HYPGEOM.DIST(z\bIFNA\(z_xlfn.IFNA(z\bIFS\(z
_xlfn.IFS(z	\bIMAGE\(z_xlfn.IMAGE(z
\bIMCOSH\(z_xlfn.IMCOSH(z	\bIMCOT\(z_xlfn.IMCOT(z
\bIMCSCH\(z_xlfn.IMCSCH(z	\bIMCSC\(z_xlfn.IMCSC(z
\bIMSECH\(z_xlfn.IMSECH(z	\bIMSEC\(z_xlfn.IMSEC(z
\bIMSINH\(z_xlfn.IMSINH(z	\bIMTAN\(z_xlfn.IMTAN(z\bISFORMULA\(z_xlfn.ISFORMULA(z\bISOMITTED\(z_xlfn.ISOMITTED(z\bISOWEEKNUM\(z_xlfn.ISOWEEKNUM(z\bLET\(z
_xlfn.LET(z\bLOGNORM.DIST\(z_xlfn.LOGNORM.DIST(z\bLOGNORM.INV\(z_xlfn.LOGNORM.INV(z
\bMAXIFS\(z_xlfn.MAXIFS(z
\bMINIFS\(z_xlfn.MINIFS(z\bMODE.MULT\(z_xlfn.MODE.MULT(z\bMODE.SNGL\(z_xlfn.MODE.SNGL(z	\bMUNIT\(z_xlfn.MUNIT(z\bNEGBINOM.DIST\(z_xlfn.NEGBINOM.DIST(z\bNORM.DIST\(z_xlfn.NORM.DIST(z\bNORM.INV\(z_xlfn.NORM.INV(z\bNORM.S.DIST\(z_xlfn.NORM.S.DIST(z\bNORM.S.INV\(z_xlfn.NORM.S.INV(z\bNUMBERVALUE\(z_xlfn.NUMBERVALUE(z\bPDURATION\(z_xlfn.PDURATION(z\bPERCENTILE.EXC\(z_xlfn.PERCENTILE.EXC(z\bPERCENTILE.INC\(z_xlfn.PERCENTILE.INC(z\bPERCENTRANK.EXC\(z_xlfn.PERCENTRANK.EXC(z\bPERCENTRANK.INC\(z_xlfn.PERCENTRANK.INC(z\bPERMUTATIONA\(z_xlfn.PERMUTATIONA(z\bPHI\(z
_xlfn.PHI(z\bPOISSON.DIST\(z_xlfn.POISSON.DIST(z\bQUARTILE.EXC\(z_xlfn.QUARTILE.EXC(z\bQUARTILE.INC\(z_xlfn.QUARTILE.INC(z\bQUERYSTRING\(z_xlfn.QUERYSTRING(z\bRANK.AVG\(z_xlfn.RANK.AVG(z\bRANK.EQ\(z_xlfn.RANK.EQ(z\bRRI\(z
_xlfn.RRI(z\bSECH\(z_xlfn.SECH(z\bSEC\(z
_xlfn.SEC(z
\bSHEETS\(z_xlfn.SHEETS(z	\bSHEET\(z_xlfn.SHEET(z
\bSKEW.P\(z_xlfn.SKEW.P(z\bSTDEV.P\(z_xlfn.STDEV.P(z\bSTDEV.S\(z_xlfn.STDEV.S(z\bT.DIST.2T\(z_xlfn.T.DIST.2T(z\bT.DIST.RT\(z_xlfn.T.DIST.RT(z
\bT.DIST\(z_xlfn.T.DIST(z\bT.INV.2T\(z_xlfn.T.INV.2T(z	\bT.INV\(z_xlfn.T.INV(z
\bT.TEST\(z_xlfn.T.TEST(z\bTEXTAFTER\(z_xlfn.TEXTAFTER(z\bTEXTBEFORE\(z_xlfn.TEXTBEFORE(z\bTEXTJOIN\(z_xlfn.TEXTJOIN(z\bUNICHAR\(z_xlfn.UNICHAR(z\bUNICODE\(z_xlfn.UNICODE(z\bVALUETOTEXT\(z_xlfn.VALUETOTEXT(z	\bVAR.P\(z_xlfn.VAR.P(z	\bVAR.S\(z_xlfn.VAR.S(z\bWEBSERVICE\(z_xlfn.WEBSERVICE(z\bWEIBULL.DIST\(z_xlfn.WEIBULL.DIST(z
\bXMATCH\(z_xlfn.XMATCH(z\bXOR\(z
_xlfn.XOR(z
\bZ.TEST\(z_xlfn.Z.TEST()r#  r%  r&  subr  )r3   r]  expand_future_functionsr:   r:   r;   rf  |  sT  



zWorksheet._prepare_formulac                 C   sd   d| vr| S g }d}| D ] }|dkr| }|r| | q|dkr'| d q| | qd|S )N@F"z[#This Row],r^   )appendjoin)r]  escaped_formulain_string_literalcharr:   r:   r;   _prepare_table_formula3  s   

z Worksheet._prepare_table_formularl  c	                 C   s  ||kr	||}}||kr||}}|  ||rdS |  ||r"dS ||kr0||kr0t||}	nt||d t|| }	| |}| jrN|| jkrN| | t||||	|| j| |< | jst||d D ]}
t||d D ]}|
|ksx||kr| 	|
|d| qnqedS )Nr/  r?   r   r   )
rJ  r,   rf  rq   r   rM  CellArrayFormulaTupler   ranger*  )r3   rh  ri  rj  rk  r]  rD  r_  atype
cell_ranger  rL   r:   r:   r;   re  Q  s<   




zWorksheet._write_array_formular:  c                 C   rF  )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=  )r3   r  rL   r:  rD  r:   r:   r;   write_datetime  rT  zWorksheet.write_datetimec                 C   sZ   |  ||rdS | jr|| jkr| | | |}|d u r!| j}t||| j| |< dS )Nr/  r   )rJ  rq   r   rM  _convert_date_timer	  CellDatetimeTupler   )r3   r  rL   r:  rD  rQ  r:   r:   r;   r=    s   

zWorksheet._write_datetimebooleanc                 C   rF  )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.

        )r7  r3   r  rL   r  rD  r:   r:   r;   write_boolean  s   zWorksheet.write_booleanc                 C   sP   |  ||rdS | jr|| jkr| | |rd}nd}t||| j| |< dS )Nr/  r   r   )rJ  rq   r   rM  CellBooleanTupler   )r3   r  rL   r  rD  r_  r:   r:   r;   r7    s   
zWorksheet._write_booleanurltipc                 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(  )r3   r  rL   r  rD  rC  r  r:   r:   r;   	write_url  s   zWorksheet.write_urlc           
      C   s  |  ||rdS t|tsL| j}d|v r|dd\}}	n|}d}	t||ks-t|	|kr:td| d| d dS t|}|d urE||_|d urL||_|  j	d7  _	| j	d	krctd|j
 d
 dS |d u rj| j}| js| jrz|| jkrz| | | |||j| || j| |< dS )Nr/  #r   r^   zIgnoring URL 'z!' with link or location/anchor > z4 characters since it exceeds Excel's limit for URLs.i  z>' since it exceeds Excel's limit of 65,530 URLs per worksheet.r   )rJ  r>  r   r  rA   rK  r   _text_tipr   _original_urlr
  r  rq   r   rM  r+  textr  )
r3   r  rL   r  rD  rC  r  max_urlurl_str
anchor_strr:   r:   r;   r(    s@   


zWorksheet._write_urlr4   )r   r/  rE  r  r  c                 G   r0  )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_stringr3  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 |D ]G}t|tsn|dkrW|
|	 |
| n|
| |dkrgt
d  d	S ||7 }d
}n|dkr}|dkr}t
d  dS |
| d}|d7 }qAt|
d ts| jd |
D ],}t|tr| jd | | qg }t|r|d | jd|| | jd q| jj }t	|| jkrt
d dS | js| j|}n|}| jr|| jkr| | t|||| j| |< dS )Nr   r^   r/  rR      zfYou must specify more than 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  rC  zaExcel doesn't allow 2 consecutive formats in rich strings. Ignoring input in write_rich_string().r  r   r)z	xml:spacepreservetzfString length must be less than or equal to Excel's limit of 32,767 characters in write_rich_string().rE  )listrJ  r>  r!   popr	   r.   r   _set_filehandlerK  r   rt  _xml_start_tag_write_fontr%   _xml_data_element_xml_end_tagfhgetvaluerz   rq   ro   rL  r   rM  CellRichStringTupler   )r3   r  rL   r4   tokensrD  rP  
raw_stringr  default	fragmentspreviousposr,  
attributesrC  r:   r:   r;   r  Z  s   







zWorksheet._write_rich_stringc                 C   s   || j |< dS )a"  
        Add a callback function to the write() method to handle user defined
        types.

        Args:
            user_type:      The user type() to match on.
            user_function:  The user defined function to write the type data.
        Returns:
            Nothing.

        N)r  )r3   	user_typeuser_functionr:   r:   r;   add_write_handler  s   zWorksheet.add_write_handlerc                 C   s2   |D ]}|  ||||}|r|  S |d7 }q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   r1  r3   r  rL   datarD  r,  ro  r:   r:   r;   	write_row     
zWorksheet.write_rowc                 C   s2   |D ]}|  ||||}|r|  S |d7 }q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   r1  r  r:   r:   r;   write_column  r  zWorksheet.write_columnsourceoptionsc                 C   s\   |  ||ddrtd| d| d dS | ||}||_||_|| | j| 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).
            source:   Filename, BytesIO, or Image object.
            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 (, ).r/  r   )rJ  r   _image_from_source_row_col_set_user_optionsr   rt  )r3   r  rL   r  r  imager:   r:   r;   insert_image  s   
zWorksheet.insert_imagec                 C   s   |  ||rtd| d| d dS |du ri }| ||}|| |dd}|jrC|du r4| j}d| _| |||j| d| _| j	
|}td	||| j| |< d
S )a  
        Embed an image in a worksheet cell.

        Args:
            row:      The cell row (zero indexed).
            col:      The cell column (zero indexed).
            source:   Filename, BytesIO, or Image object.
            options:  Url and data stream of the image.

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

        zCannot embed image at (r  r  r/  NrD  TF#VALUE!r   )rJ  r   r  r  getr  r
  r  r  r  get_image_indexCellErrorTupler   )r3   r  rL   r  r  r  rD  image_indexr:   r:   r;   embed_image:  s"   
zWorksheet.embed_imager  c                 C   s   |  ||ddrtd| d| d dS |du rd}|du r!i }|dd	}|d
d	}|dd}|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 (r  r  r/  Nr^   x_offsetr   y_offsetx_scaler   y_scaleobject_positiondescription
decorativeF)rJ  r   r  r   rt  )r3   r  rL   r  r  r  r  r  r  anchorr  r  r:   r:   r;   insert_textboxm  s:   zWorksheet.insert_textboxchartc                 C   s  |  ||ddrtd| d| d dS |du ri }|js%|jr+|jjr+td dS d|_|jr5d|j_|d	d
}|dd
}|dd}|dd}|dd}	|dd}
|dd}|jdkrg|j}|jdkro|j}|jru|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 (r  r  r/  Nz7Chart cannot be inserted in a worksheet more than once.rE  r  r   r  r  r   r  r  r  r  F)rJ  r   already_insertedcombinedr  r  r  r  r  r   rt  )r3   r  rL   r  r  r  r  r  r  r  r  r  r:   r:   r;   insert_chart  sP   

zWorksheet.insert_chartcommentc                 C   sN   |  ||rdS t|| jkrdS d| _d| _t||||}|| 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.

        r/  rE  Tr   )rJ  rK  rz   r   r   r   r   )r3   r  rL   r  r  r:   r:   r;   write_comment  s   zWorksheet.write_commentc                 C   
   d| _ dS )z
        Make any comments in the worksheet visible.

        Args:
            None.

        Returns:
            Nothing.

        TN)r   r  r:   r:   r;   show_comments     
zWorksheet.show_commentsis_byte_streamc                 C   s    |  |}|| _|rtd dS )z
        Set a background image for a worksheet.

        Args:
            source:         Filename, BytesIO, or Image object.
            is_byte_stream: Deprecated. Use a BytesIO object instead.

        Returns:
            0:  Success.

        zThe `is_byte_stream` parameter in `set_background()` is deprecated. This argument can be omitted if you are using a BytesIO object.r   )r  r   r   )r3   r  r  r  r:   r:   r;   set_background  s   
zWorksheet.set_backgroundc                 C   
   || _ dS )z
        Set the default author of the cell comments.

        Args:
            author: Comment author name. String.

        Returns:
            Nothing.

        N)r   )r3   authorr:   r:   r;   set_comments_author8  r  zWorksheet.set_comments_authorc                 C   s   | j S )zw
        Retrieve the worksheet name.

        Args:
            None.

        Returns:
            Nothing.

        )rm   r  r:   r:   r;   get_nameE  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)r   r   rn   r  activesheetr  r:   r:   r;   activateS  s   zWorksheet.activatec                 C      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)r   r   r  r:   r:   r;   selecte  s   
zWorksheet.selectc                 C   r  )zv
        Hide the current worksheet.

        Args:
            None.

        Returns:
            Nothing.

        r   r   Nr   r   r  r:   r:   r;   hidev     
zWorksheet.hidec                 C   r  )z
        Hide the current worksheet. This can only be unhidden by VBA.

        Args:
            None.

        Returns:
            Nothing.

        r  r   Nr  r  r:   r:   r;   very_hidden  r  zWorksheet.very_hiddenc                 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)r   rn   r  
firstsheetr  r:   r:   r;   set_first_sheet  s   zWorksheet.set_first_sheetwidthc                 C   s   |du ri }||kr||}}d}| dd}| dd}| dd}	|s)|r,|r,d}
nd}
| d|||
r8dS | d|||
rBdS t|	d}	t|	d	}	t| j|	| _t||d
 D ]}||||	|dg| j|< qZd| _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.

        NTr   F	collapsedlevelr   r/     r   )r  rJ  maxminr   r{  r   r   )r3   ri  rk  r  rD  r  
ignore_rowr   r  r  
ignore_colrL   r:   r:   r;   
set_column  s,   


zWorksheet.set_columnc                 C   s$   |dur	|  |}| |||||S )a;  
        Set the width, and other properties of a single column or a
        range of columns, where column width is in pixels.

        Args:
            first_col:   First column (zero-indexed).
            last_col:    Last column (zero-indexed). Can be same as first_col.
            width:       Column width in pixels. (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.

        N)_pixels_to_widthr  )r3   ri  rk  r  rD  r  r:   r:   r;   set_column_pixels  s   
zWorksheet.set_column_pixels  	max_widthc                 C   s  | j r	td dS | jdu rdS i }t| |d}t| jj| jjjd}t	| j
| jd D ]}| j|s7q.t	| j| jd D ]}|| j| v r| j| | }|jj}d}|dv r|dkrf|j}	||	 }
n|j}
d	|
vrrt|
}nj|
d	D ]}
t|
}t||}qwnX|d
krdtt|j }nJ|dkr| j}nB|dkr|jrd}n8d}n5|dv rt|jttfr|jdkrdtt|j }nt|jtrt|j}nt|jtr|jrd}nd}| j ||fr|dkr|d7 }||d}||kr|||< q@q.|! D ]^\}}| |d }t||}| j"|rR| j"|}|d }|d }|durB|sB||kr@|| j"| d< d| j"| d< q || j"| d< d| j"| d< q |dddddg| j"|< q dS )z
        Simulate autofit based on the data, and datatypes in each column.

        Args:
            max_width (optional): max column width to autofit, in pixels.

        Returns:
            Nothing.

        z1Autofit is not supported in constant_memory mode.Ng     o@)keyr   r   rU   rY   rU   
rT   r  rX   rV      $   rW   rZ         TF)#rq   r   r|   r  r  sortedro   string_table__getitem__r{  r{   r   r  r}   r~   r  __name__rC  r  r*   rA   r  rK  r8  rQ  r   r  r>  r_  r)  r1   r6  r   itemsr   )r3   r  col_width_maxstringsrow_numcol_numcell	cell_typelength	string_idrC  
seg_length	width_maxpixel_widthr  r   
user_widthr   r:   r:   r;   autofit	  s   



U

zWorksheet.autofitheightc           	      C   s   |du ri }| j dur| j }nd}| ||rdS |du r | j}|dd}|dd}|dd}|dkr;d}| j}t|d}t|d	}t| j|| _|||||g| j|< d
| _||g| j	|< dS )a  
        Set the width, and other properties of a row.

        Args:
            row:         Row number (zero-indexed).
            height:      Row height. (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/  r   Fr  r  r   r  T)
r}   rJ  r   r  r  r  r   r   r   r   )	r3   r  r  rD  r  min_colr   r  r  r:   r:   r;   set_row  s,   


zWorksheet.set_rowc                 C   s"   |dur	|  |}| ||||S )a  
        Set the width (in pixels), and other properties of a row.

        Args:
            row:         Row number (zero-indexed).
            height:      Row height in pixels. (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.

        N)_pixels_to_heightr  )r3   r  r  rD  r  r:   r:   r;   set_row_pixels  s   
zWorksheet.set_row_pixelshide_unused_rowsc                 C   s6   |du r| j }|| jkrd| _|| _ |rd| _dS 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   )r3   r  r  r:   r:   r;   set_default_row  s   

zWorksheet.set_default_rowr  c                 C   s  ||kr||krt d dS ||kr||}}||kr ||}}| ||r(dS | ||r0dS t||||}t||d D ]I}t||d D ]?}	| j||	frd| j||	f}
td| d|
 d| j||	fr| j||	f}
td| d|
 d|| j||	f< qGq>| j	||||g | 
|||| t||d D ]}t||d D ]}	||kr|	|krq| ||	d| qqd	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 cellr/  r   zMerge range '!' overlaps previous merge range ''.!' overlaps previous table range 'r^   r   )r   rJ  r+   r{  r   r  r    r   r   rt  r2  r"  )r3   rh  ri  rj  rk  r  rD  r}  r  rL   previous_ranger:   r:   r;   merge_range	  sN   

zWorksheet.merge_rangec           
      C   s   ||k r	||}}||k r||}}|  ||||}t||||}|| _|| _||g| _t||d D ],}| j||frV| j||f\}}	|dkrVtd| d|	 dd|f| j||f< q3d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.

        r   r   zWorksheet autofilter range 'z,' overlaps previous Table autofilter range 'r  	worksheetN)	_convert_name_arear+   r   r   r   r{  r   r  r    )
r3   rh  ri  rj  rk  arearefrL   r   r   r:   r:   r;   
autofilterd	  s(   


zWorksheet.autofiltercriteriac                 C   sf  | j s	td dS zt| W n# ty2   |}t|d \}}|| jkr0td| d Y dS Y nw | j\}}||k s@||krPtd| d| d| d	 dS | |}t|d
vrctd| d | 	||}t|dkr|d dkr| 
||d g n/t|dkr|d dkr|d dkr|d dkr| 
||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.

        -Must call autofilter() before filter_column()NrJ   Invalid column ''Column '%' outside autofilter() column range (r  ))r_   r  z(Incorrect number of tokens in criteria 'r  r   r   r  r_      )r   r   r1   r2   r(   ry   r   _extract_filter_tokensrK  _parse_filter_expressionfilter_column_listr   r   r   )r3   rL   r  
col_letterrN   	col_firstcol_lastr  r:   r:   r;   filter_column	  sD   

	
0


zWorksheet.filter_columnfiltersc                 C   s   | j s	td dS zt| W n# ty2   |}t|d \}}|| jkr0td| d Y dS Y nw | j\}}||k s@||krPtd| d| d| d	 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.

        r  NrJ   r  r  r   r!  ,r"  r   )
r   r   r1   r2   r(   ry   r   r   r   r   )r3   rL   r+  r'  rN   r(  r)  r:   r:   r;   r&  	  s4   

	


zWorksheet.filter_column_listc                 C   s  |  ||ddr
dS |  ||ddrdS |du ri }n| }h d}| D ]}||vr8td| d  dS q'd|v rC|d |d	< d
|v rM|d
 |d	< d|vrWtd dS ddddddddddddd}|d |vrxtd|d  d dS ||d  |d< |d dkr|ddu r|ddu rdS |d dks|d dks|d dkrd|d< d|d< d|vrtd dS i 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/d0d/d1d2d3d2}	|d |	vrtd4|d  d5 dS |	|d  |d< |d dks|d dkr d|vrtd6 dS nd|d< d7d8d9d:}
d;|vr4d7|d;< n|d; |
vrGtd4|d;  d< dS |
|d;  |d;< |d d=v r|d	 rt|d	 r| |d	 }|d>|d	< |d rt|d r| |d }|d>|d< |drt|d d?krtd@|d  dA dS |dBrt|dB d?krtdC|dB  dA dS |drt|d dDkrtdE|d  dF dS |dGrt|dG dDkrtdH|dG  dF dS |d dkrt|d	 t	r| j
|d	  }t|dDkrtdI| dJ dS dK|vr$d8|dK< dL|vr-d8|dL< dM|vr6d8|dM< dN|vr?d8|dN< ||||gg|dO< dP|v rV|dO |dP  dQ|v re|dQ dRdS|dQ< | j| d7S )Ta  
        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>   r_  r  maximumminimumr  dropdownvalidate
error_type
show_error
show_inputerror_titleinput_titlemulti_rangeother_cellsignore_blankerror_messageinput_messageUnknown parameter 'z' in data_validation()rE  r  r_  r.  r0  z5Parameter 'validate' is required in data_validation()nonewholedecimalr  r:  r;  
textLengthcustom)anyz	any valuezwhole numberr=  integerr>  r  r:  r;  ztext lengthr  r@  zUnknown validation type 'z/' for parameter 'validate' in data_validation()r5  r:  betweenr  r-  z5Parameter 'criteria' is required in data_validation()not between
notBetweenequal toequalr   ==not equal tonotEqual!=<>greater thangreaterThan>	less thanlessThan<greater than or equal togreaterThanOrEqual>=less than or equal tolessThanOrEqual<=zUnknown criteria type 'z/' for parameter 'criteria' in data_validation()zcParameter 'maximum' is required in data_validation() when using 'between' or 'not between' criteriar   r   r  )stopwarninginformationr1  z' for parameter 'error_type'.r:  r;  .16g    zLength of input title 'z' exceeds Excel's limit of 32r4  zLength of error title '   zLength of input message 'z' exceeds Excel's limit of 255r9  zLength of error message 'zLength of list items 'z;' exceeds Excel's limit of 255, use a formula range insteadr8  r/  r3  r2  cellsr7  r6  $r^   )rJ  copykeysr   r  r&   r  rK  r>  r  	_csv_joinrB   replacer   rt  )r3   rh  ri  rj  rk  r  valid_parameters	param_keyvalid_typescriteria_typeserror_types	date_timer]  r:   r:   r;   data_validation	  sD  	











zWorksheet.data_validationc                 C   s`  |  ||ddr
dS |  ||ddrdS |du ri }n| }h d}| D ]}||vr8td| d  dS q'd|vrCtd	 dS i 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(}|d |vrtd)|d  d* dS |d dkrd|d+< ||d  |d< i d,d,d-d.d/d0d1d0d2d0d3d4d5d4d6d4d7d8d9d8d:d;d<d;d=d>d?d>d@dAdBdAdCdDdEdFdGdHdIdJdKdLdMdNdOdPdMdPdQ}	dR|v r|dR |	v r|	|dR  |dR< dS|v rt|dS trt|dS  |dS< |d dTv rxd|d< dS|v r:t|dS s-tdU dS | 	|dS }
|
dV|dS< dW|v rYt|dW sLtdX dS | 	|dW }
|
dV|dW< dY|v rxt|dY sktdZ dS | 	|dY }
|
dV|dY< i d[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|}|d d'kr|
d}std~ dS |d} |vrtd|d}  d dS ||d}  |d}< d|d< |d} drd|d< n|d} drd|d< | |
d|
d|d< ||kr||}}||kr||}}t||||}t||}d|v r5|d }|dd}d|v rG|d rG|d  |d< | j|d< |  jd7  _| js|
ds|
ds|
ds|
ds|
ds|
ds|
ds|
ds|
ds|
ds|
drd|d< |d dkr|dS }t|}|dR }|dR dDkrdD|d< d| d| d|d< nS|dR dEkrd|d< d| d| d|d< n<|dR dFkrdF|d< d| d| d| d|d< n"|dR dGkrdG|d< d| d| d| d|d< ntd| d |d dkr|dR dHkr1d| d|d< n|dR dIkrAd| d|d< n|dR dkrQd| d|d< n|dR dJkrdd| d| d|d< n|dR dKkrwd| d| d|d< nr|dR dLkrd| d| d|d< n_|dR dMkrd| d| d|d< nL|dR dNkrd| d| d| d|d< n6|dR dOkrd| d| d|d< n#|dR dPkrd| d| d| d| d	|d< n
td|dR  d |d dkrd| dÝ|d< |d dkrd| dĝ|d< |d dkrd| dƝ|d< |d d!kr%d| d|d< |d d"krvd|d< d|d< d|d< d|d< |dd̡ |ddΡ |ddС |ddС |dtdӃ |dtdՃ t|d |d< t|d |d< |d d#krd|d< d|d< |dd̡ |dd֡ |ddΡ |ddС |ddС |dtd׃ |dtd؃ |dtdك t|d |d< t|d |d< t|d |d< d|vrd|d< |d d%krd|d< |
dˡsd|d< d|d< n|d |d< |
d͡sd|d< d|d< n|d |d< |ddС |ddС |dtd |d|d  |dd |dd |dd |dd |dtd |dtd |dd |dd |dd |dtd t|d |d< t|d |d< t|d |d< t|d |d< t|d |d< |
drd| _|d dkr|d dkrd|d< |d dkr|d dkrd|d< ||d< z|d d1|d< W n ttfy   Y nw z|d d1|d< W n ttfy   Y nw z|d d1|d< W n ttfy   Y nw || jv r(| j| | dS |g| j|< dS )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?  iconsr_  rR   r-  r.  bar_onlyr  max_typemid_typemin_type	bar_color	bar_solid	max_color	max_value	mid_color	mid_value	min_color	min_value
icon_style
icons_only
max_length
min_lengthr6  stop_if_truebar_directionbar_no_borderdata_bar_2010reverse_iconsbar_axis_colorbar_border_colorbar_axis_positionbar_negative_colorbar_negative_color_samebar_negative_border_colorbar_negative_border_color_samer;  z' in conditional_format()rE  r?  z4Parameter 'type' is required in conditional_format()r  cellIsr:  r;  averageaboveAverage	duplicateduplicateValuesuniqueuniqueValuestoptop10bottomr  time_period
timePeriodblankscontainsBlanks	no_blanksnotContainsBlankserrorscontainsErrors	no_errorsnotContainsErrors2_color_scale3_color_scaledata_bardataBar
expressioniconSet)r]  icon_setzUnknown value 'z.' for parameter 'type' in conditional_format()	directionrC  rD  rE  rF  rG  r   rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  
containingcontainsTextnotContains
beginsWithendsWith	yesterdaytoday	last7DayslastWeekthisWeeknextWeek	lastMonth	thisMonth	nextMonth)z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 monthr  r_  r\  z5Conditional format 'value' must be a datetime object.r]  r.  z7Conditional format 'minimum' must be a datetime object.r-  z7Conditional format 'maximum' must be a datetime object.3_arrows3Arrows3_flags3Flags3_traffic_lights_rimmed3TrafficLights23_symbols_circled3Symbols4_arrows4Arrows4_red_to_black4RedToBlack4_traffic_lights4TrafficLights5_arrows_gray5ArrowsGray
5_quarters	5Quarters3_arrows_gray3ArrowsGray3_traffic_lights3TrafficLights3_signs3Signs	3_symbols	3Symbols24_arrows_gray4ArrowsGray	4_ratings4Rating5_arrows5Arrows	5_ratings5Ratingrz  z_The 'icon_style' parameter must be specified when 'type' == 'icon_set' in conditional_format().r  zUnknown icon_style 'z' in conditional_format().r_   total_icons4r#  5r  rm  r6  ra  r^   rR   priorityr   r  rs  r  r  r  r  r  r  r  r  r  is_data_bar_2010zNOT(ISERROR(SEARCH("z",z)))r]  notContainsTextzISERROR(SEARCH("z))zLEFT(r,  z)="rs  zRIGHT(zInvalid text criteria 'zFLOOR(z,1)=TODAY()-1z,1)=TODAY()tomorrowz,1)=TODAY()+1zAND(TODAY()-FLOOR(z,1)<=6,FLOOR(z,1)<=TODAY())zAND(TODAY()-ROUNDDOWN(z*,0)>=(WEEKDAY(TODAY())),TODAY()-ROUNDDOWN(z,0)<(WEEKDAY(TODAY())+7))z",0)<=WEEKDAY(TODAY())-1,ROUNDDOWN(z ,0)-TODAY()<=7-WEEKDAY(TODAY()))zAND(ROUNDDOWN(z+,0)-TODAY()>(7-WEEKDAY(TODAY())),ROUNDDOWN(z",0)-TODAY()<(15-WEEKDAY(TODAY())))z
AND(MONTH(z)=MONTH(TODAY())-1,OR(YEAR(z)=YEAR(TODAY()),AND(MONTH(z)=1,YEAR(A1)=YEAR(TODAY())-1)))z)=MONTH(TODAY()),YEAR(z)=YEAR(TODAY()))z)=MONTH(TODAY())+1,OR(YEAR(z
)=12,YEAR(z)=YEAR(TODAY())+1)))zInvalid time_period criteria 'z	LEN(TRIM(z))=0z))>0zISERROR(r"  zNOT(ISERROR(
colorScalerp  rv  rq  r  ro  r  ry  r   ru  rx  z#FF7128rt  z#FFEF9C
percentilez#F8696Bz#FFEB84z#63BE7Brw  2   autoMinx14_min_typeautoMaxx14_max_typerr  z#638EC6rn  Fz#FF0000#000000  r{  )rJ  rb  rc  r   r>  r6  r8  upperr&   r  r  r#  _set_icon_propsr+   r,   re  _get_dxf_indexr   r   rK  
setdefaultr   _from_valuerv   lstripKeyErrorAttributeErrorr   rt  )r3   rh  ri  rj  rk  r  valid_parameterrg  
valid_typecriteria_typerk  valid_iconsr}  
start_cellr_  r  r  r:   r:   r;   conditional_format   s  (	
	
$


	








	



zWorksheet.conditional_format)r   r/  rE  r  c           &      C   s  i }i }|du ri }n|  }| jrtd dS | ||ddr"dS | ||ddr,dS ||kr5||}}||kr>||}}t||||}t||d D ]I}	t||d D ]?}
| j|	|
frr| j|	|
f}td| d| d	| j	|	|
fr| j	|	|
f}td| d
| d	|| j|	|
f< qUqLh d}|
 D ]}||vrtd| d  dS q|dd|d< |dd|d< |dd|d< || }|d r|d8 }|dk rtd dS |dd|d< |dd|d< |dd|d< |dd|d< |dd|d< |dd|d< d|v rm|d }||d< d |v r*td!| d" dS td#|tjr:td$|rDtd%| d& dS td'|rUtd(| d& dS td)|sctd*|rmtd+| d, dS d-|v r|d- |d-< |d- du rd.|d-< |d- d d.|d-< nd/|d-< |}|}|dr|d7 }|dr|d8 }t|||||d0< t|||||d1< |d sd|d< |d r|d1 |d< d}g |d2< i }t||d D ]}|d3t| d.d.d.dd.ddd4	}d2|v r|t|d2 kr	|d2 |d  }nd}|r|d5d}|d6r |d6 |d< |d }| }||v r8td7| d&  dS d||< |d8|d9< d:|v rk|d: rk|d: }|d;r\|d;}| |}| |d}||d:< |d<r|d< }|d=kr|d>}|d?krd@}tg dA}||v r| ||d }n| |d}||dB< dC}||d<< |dDd}| ||||| n|dEr|dE }||dE< | ||||d5 |dur| |d5< |||d < |d2 | |d r| |||d |d9  |d7 }qdF|v rX|dF }d}t||d D ]F}	d} t||d D ]5}
|t|k rL| t|| k rL|| |  }!| |v rD| |	|
|!||   n| |	|
|!d | d7 } q|d7 }qtt||d D ]/\}}|d2 | }"|"r|"d: r||}#|"d: }t||d D ]}	| |	|||# qqa| j| |d rt||d D ]/}
| j||
fr| j||
f\}$}%|$dGkrtdH| dI|% d	dJ|f| j||
f< qdS )KaY  
        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: Row or column is out of worksheet bounds.
            -2: Incorrect parameter or option.
            -3: Not supported in constant_memory mode.
        Nz5add_table() isn't supported in 'constant_memory' moder  Tr/  r   zTable range 'r  r  r  >   r  rm   stylecolumns	total_rowr  
header_rowbanded_rowslast_columnfirst_columnbanded_columnsr;  ' in add_table()rE  r  r  r  r   z1Must have at least one data row in in add_table()r  Fshow_first_colr  show_last_colshow_row_stripesr  show_col_stripesheader_row_countr  totals_row_shownrm    zName 'z&' in add_table() cannot contain spacesz^[\w\\][\w\\.]*$z^\dz*Invalid Excel characters in add_table(): 'r  z^[a-zA-Z][a-zA-Z]?[a-dA-D]?\d+$z-Name looks like a cell name in add_table(): 'z^[rcRC]$z^[rcRC]\d+[rcRC]\d+$zInvalid name 'z#' like a RC cell ref in add_table()r  r^   TableStyleMedium9r{  a_ranger  Column)	idrm   total_stringtotal_functioncustom_totaltotal_valuer]  rR   name_formatrR   r   z'Duplicate header name in add_table(): 'header_formatr  r]  r   r	  
count_nums	countNumsstd_devstdDevr  r  countr  r  r  sumvarr
  r@  r  r  r  r  zTable autofilter range 'z0' overlaps previous Worksheet autofilter range 'r   ) rb  rq   r   rJ  r+   r{  r   r  r    r   rc  r&  r'  UNICODEre  r8  rK  lowerr#  r  ry  rf  set_table_function_to_formular$  r+  r  rt  r2  	enumerater   r   )&r3   rh  ri  rj  rk  r  r   col_formatsr}  r  rL   r  r  rg  num_rowsrm   first_data_rowlast_data_rowcol_id
seen_namesr  col_data	user_dataxformatheader_namer]  function	subtotalsr_  r  r  ijr,  column_dataformula_formatr   r   r:   r:   r;   	add_table  s  

















 



zWorksheet.add_tablec                 C   s  |  ||ddr
dS dt||gi}|du ri }h d}| D ]}||vr1td| d  dS q d|vr<td	 d
S |dd}|dvrLtd d
S |dkrRd}||d< d|v rot|d trh|d |d< n|d g|d< t|d tr}|d |d< n|d g|d< t|d }t|d }	||	krtd d
S t|d |d< t| j	}
g }|d D ]}|
dd}|d}d|vr|
d | }|| q||d< g }|d D ]}|
dd}|| q||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rJd-|d.< n|d/krTd0|d.< nd1|d.< |d2}|rkd|vrk|
d | }||d2< |d3d-}t|}|d4 |d5< |d |d6< |d# |d7< |d  |d8< |d" |d9< |d |d:< |d |d;< | ||d5 | ||d6 | ||d7 | ||d8 | ||d9 | ||d: | ||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>   r  r  axisr?  r{  r  weightmarkersreverselocation	date_axis	low_color	low_point
high_color
high_point
last_color
last_pointempty_cellsfirst_colorfirst_pointplot_hiddenshow_hiddenseries_colormarkers_colornegative_colornegative_pointsr;  z' in add_sparkline()r{  z0Parameter 'range' is required in add_sparkline()rE  r?  line)rB  columnwin_losszJParameter 'type' must be 'line', 'column' or 'win_loss' in add_sparkline()rD  stackedr1  rangeszMMust have the same number of location and range parameters in add_sparkline()r  ra  r^   r   !r6  highr4  lowrA  negativer;  firstr8  lastr/  r  r  r-  r0  r=  r   r.  r9  zeror   emptyconnectspangapr2  r  seriesr>  r@  r?  r:  r7  r5  r3  )rJ  r,   rc  r   r  r>  r  rK  r'   rm   re  r  rt  r$   _set_spark_colorr   )r3   r  rL   r  	sparklinerf  rg  
spark_typerange_countlocation_count	sheetname
new_rangesspark_rangenew_locationsr1  rN  
date_rangestyle_idr  r:   r:   r;   add_sparkline[  s   






zWorksheet.add_sparklinec                 C   s^   d}t ||}||kr||}}||kr||}}t||||}|dkr&d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+   r   )r3   rh  ri  rj  rk  paneactive_cellsqrefr:   r:   r;   set_selection  s   


zWorksheet.set_selectionc                 C   s$   |dkr
|dkr
dS t ||| _dS )z
        Set the first visible cell at the top left of a worksheet.

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

        Returns:
            0:  Nothing.
        r   N)r,   r   )r3   r  rL   r:   r:   r;   set_top_left_cellB  s   zWorksheet.set_top_left_cellr   visiblesymbols_belowsymbols_right
auto_stylec                 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   )r3   re  rf  rg  rh  r:   r:   r;   outline_settingsT  s
   
zWorksheet.outline_settingstop_rowleft_col	pane_typec                 C   s,   |du r|}|du 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)r   )r3   r  rL   rj  rk  rl  r:   r:   r;   freeze_panesp  s
   zWorksheet.freeze_panesxyc                 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)rm  )r3   rn  ro  rj  rk  r:   r:   r;   split_panes  s   zWorksheet.split_panesrc   r   c                 C   s2   |dk s|dkrt d| d d}t|| _dS )z
        Set the worksheet zoom factor.

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

        Returns:
            Nothing.

        
     zZoom factor 'z"' outside range: 10 <= zoom <= 400rc   N)r   r1   r   )r3   r   r:   r:   r;   set_zoom  s   zWorksheet.set_zoomc                 C   r  )z
        Display the worksheet right to left for some versions of Excel.

        Args:
            None.

        Returns:
            Nothing.

        TN)r   r  r:   r:   r;   right_to_left  r  zWorksheet.right_to_leftc                 C   r  )z
        Hide zero values in worksheet cells.

        Args:
            None.

        Returns:
            Nothing.

        r   N)r   r  r:   r:   r;   	hide_zero  r  zWorksheet.hide_zerocolorc                 C   s   t || _dS )z
        Set the color of the worksheet tab.

        Args:
            color: A #RGB color index.

        Returns:
            Nothing.

        N)r   r  r   r3   rv  r:   r:   r;   set_tab_color  s   zWorksheet.set_tab_colorr^   passwordc                 C   s   |dkr	|  |}|si }i 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 ]}||v rS|| ||< qFtd| d qF||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^   sheetTcontentFobjects	scenariosformat_cellsformat_columnsformat_rowsinsert_columnsinsert_rowsinsert_hyperlinksdelete_columnsdelete_rowsselect_locked_cellssortr  pivot_tablesselect_unlocked_cellszUnknown protection object: 'r  ry  N)_encode_passwordrc  r   r   )r3   ry  r  defaultsr  r:   r:   r;   protect  sZ   
	

zWorksheet.protectr}  
range_namec                 C   sr   |du r
t d dS |d}|dd}|  jd7  _|du r'dt| j }|r.| |}| j|||f d	S )
aU  
        Unprotect ranges within a protected worksheet.

        Args:
            cell_range: The cell or cell range to unprotect.
            range_name: An optional name for the range.
            password:   An optional password string. (undocumented)

        Returns:
            0:  Success.
            -1: Parameter error.

        Nz1Cell range must be specified in unprotect_range()r/  r   ra  r^   r   Ranger   )r   r  re  r   r8  r  r   rt  r3   r}  r  ry  r:   r:   r;   unprotect_range  s   

zWorksheet.unprotect_rangec                 C   sx   |  ||ddrtd| d| d dS |du ri }| j}| j}dt| j }t||||||}| 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 (r  r  r/  Nr   r   )	rJ  r   r   r   rK  r   r   rt  r   )r3   r  rL   r  r  r  button_numberbuttonr:   r:   r;   insert_button;  s   zWorksheet.insert_buttonc                 C   sF   |r	|j s	|  |s| js|  | _| j  | j}| ||||S )a  
        Insert a boolean checkbox in a worksheet cell.

        Args:
            row:          The cell row (zero indexed).
            col:          The cell column (zero indexed).
            boolean:      The boolean value to display as a checkbox.
            cell_format:  Cell Format object.  (optional)

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

        )checkboxset_checkboxr  r  r7  r  r:   r:   r;   insert_checkboxa  s   


zWorksheet.insert_checkboxc                 C   r  )z
        Set the page orientation as landscape.

        Args:
            None.

        Returns:
            Nothing.

        r   TNr   r   r  r:   r:   r;   set_landscape     
zWorksheet.set_landscapec                 C   r  )z
        Set the page orientation as portrait.

        Args:
            None.

        Returns:
            Nothing.

        r   TNr  r  r:   r:   r;   set_portrait  r  zWorksheet.set_portraitview)r   r   r  c                 C   r  )z
        Set the page view mode.

        Args:
            0: Normal view mode
            1: Page view mode (the default)
            2: Page break view mode

        Returns:
            Nothing.

        Nr  )r3   r  r:   r:   r;   set_page_view  s   
zWorksheet.set_page_viewc                 C   r  )zr
        Set the page view mode.

        Args:
            None.

        Returns:
            Nothing.

        r  Nr  r  r:   r:   r;   set_pagebreak_view  r  zWorksheet.set_pagebreak_viewr   )r   rj   c                 C   s   |r
|| _ d| _dS dS )z
        Set the paper type. US Letter = 1, A4 = 9.

        Args:
            paper_size: Paper index.

        Returns:
            Nothing.

        TN)r   r   )r3   r   r:   r:   r;   	set_paper  s   
zWorksheet.set_paperc                 C   r  )zx
        Center the page horizontally.

        Args:
            None.

        Returns:
            Nothing.

        Tr   N)r   r   r  r:   r:   r;   center_horizontally  r  zWorksheet.center_horizontallyc                 C   r  )zv
        Center the page vertically.

        Args:
            None.

        Returns:
            Nothing.

        Tr   N)r   r   r  r:   r:   r;   center_vertically  r  zWorksheet.center_verticallyr`   ra   leftrightr  r  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)r   r   r   r   )r3   r  r  r  r  r:   r:   r;   set_margins  s   
zWorksheet.set_marginsr   c                 C     |}| dd}t|dkrtd dS |dur"t|ts!d|i}ni }| }|dur0||d< g | _|drQ|d|d	< | |d|}d
|_	| j
| |dro|d|d	< | |d|}d|_	| j
| |dr|d|d	< | |d|}d|_	| j
| |d}t| j}||krtd| d| d|  g | _dS d|v r|d | _d|v r|d | _|| _|dd| _d| _|rd| _dS 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.

        
&[Picture]&Gr_  zCHeader string cannot be longer than Excel's limit of 255 charactersNmargin
image_leftimage_data_left
image_dataLHimage_centerimage_data_centerCHimage_rightimage_data_rightRHNumber of footer images '#' doesn't match placeholder count '' in string: align_with_marginsscale_with_docrb   T)re  rK  r   r>  r   rb  r   r  r  _header_positionrt  r  r   r   r   r   r   r   )r3   r   r  r  header_origr  placeholder_countimage_countr:   r:   r;   
set_header  f   








zWorksheet.set_headerr   c                 C   r  )z
        Set the page footer caption and optional margin.

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

        Returns:
            Nothing.

        r  r  r_  zCFooter string cannot be longer than Excel's limit of 255 charactersNr  r  r  r  LFr  r  CFr  r  RFr  r  r  r  r  rb   T)re  rK  r   r>  r   rb  r   r  r  r  rt  r  r   r   r   r   r   r   )r3   r   r  r  footer_origr  r  r  r:   r:   r;   
set_footerT  r  zWorksheet.set_footerc                 C   sH   |du r|}|d7 }|d7 }d| d| }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   ra  z:$rG  )r'   rm   r   )r3   rh  rj  r  rX  r:   r:   r;   repeat_rows  s   
zWorksheet.repeat_rowsc                 C   sH   |du 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?   rG  )r)   r'   rm   r   )r3   ri  rk  r  rX  r:   r:   r;   repeat_columns  s   


zWorksheet.repeat_columnsoptionc                 C   sF   |dkrd| _ d| _d| _dS |dkrd| _ d| _dS 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)r   r   r   )r3   r  r:   r:   r;   hide_gridlines  s   


zWorksheet.hide_gridlinesc                 C      d| _ d| _dS )z
        Set the option to print the row and column headers on the printed page.

        Args:
            None.

        Returns:
            Nothing.

        TN)r   r   r  r:   r:   r;   print_row_col_headers  r  zWorksheet.print_row_col_headersc                 C   r  )z
        Set the option to hide the row and column headers on the worksheet.

        Args:
            None.

        Returns:
            Nothing.

        TN)r   r  r:   r:   r;   hide_row_col_headers   r  zWorksheet.hide_row_col_headersc                 C   sJ   |dkr|dkr|| j d kr|| jd krd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   r/  )rx   ry   r  r   )r3   rh  ri  rj  rk  r  r:   r:   r;   
print_area  s   zWorksheet.print_areac                 C   r  )z
        Set the order in which pages are printed.

        Args:
            None.

        Returns:
            Nothing.

        r   TN)r   r   r  r:   r:   r;   print_across0  r  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)r   r   r   r   )r3   r  r  r:   r:   r;   fit_to_pages>  s   
zWorksheet.fit_to_pages
start_pagec                 C   r  )z
        Set the start page number when printing.

        Args:
            start_page: Start page number.

        Returns:
            Nothing.

        N)r   )r3   r  r:   r:   r;   set_start_pageP  r  zWorksheet.set_start_pagescalec                 C   s>   |dk s|dkrt d| 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.

        rq  rr  zPrint scale 'z#' outside range: 10 <= scale <= 400Nr   T)r   r   r1   r   r   )r3   r  r:   r:   r;   set_print_scale]  s   

zWorksheet.set_print_scalec                 C   r  )z
        Set the option to print the worksheet in black and white.

        Args:
            None.

        Returns:
            Nothing.

        TN)r   r   r  r:   r:   r;   print_black_and_whites  r  zWorksheet.print_black_and_whitebreaksc                 C   r  )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   r3   r  r:   r:   r;   set_h_pagebreaks  r  zWorksheet.set_h_pagebreaksc                 C   r  )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;   set_v_pagebreaks  r  zWorksheet.set_v_pagebreaksrm   c                 C   s*   |dur	|| _ dS dt| jd  | _ 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Sheetr   )r  r8  rn   )r3   rm   r:   r:   r;   set_vba_name  s   
zWorksheet.set_vba_namec                 C   sR   |du rdS |  }h d}| D ]}||vr#td| d  dS q|| _dS )a  
        Ignore various Excel errors/warnings in a worksheet for user defined
        ranges.

        Args:
            options: A dict of ignore errors keys with cell range values.

        Returns:
            0: Success.
           -1: Incorrect parameter or option.

        Nr/  >	   
eval_errorformula_rangeformula_differsformula_unlockedcalculated_columntwo_digit_text_yearempty_cell_referencelist_data_validationnumber_stored_as_textr;  z' in ignore_errors()r   )rb  rc  r   r  )r3   r  rf  rg  r:   r:   r;   ignore_errors  s   zWorksheet.ignore_errorsc                 C   sH  |d | _ |d | _|d | _|d | _|d | _|d | _|d | _|d | _|d	 | _|d
 | _	|d | _
|d | _|d | _|d | _|d | _|d | _|d | _|d | _|d | _| jrd| _d| _d| _d| _d| _d| _d| _d| _d| _d| _| jrtj| jd\}}t | || _!t"|ddd| _#| j#| _$d S d S )Nrm   rn   ro   r  rq   rr   r  r  r  r  r  r	  r
  r  rw   r  r  r  r  g     )@   ra   r         ?F)dirzw+utf-8modeencoding)%rm   rn   ro   r  rq   rr   r  r  r  r  r  r	  r
  r  rw   r  r  r  r  r   r   r   r   r   r   r   r   r   r   tempfilemkstemposcloser  openr  r  )r3   	init_datafdfilenamer:   r:   r;   _initialize  sJ   



















zWorksheet._initializec                 C   s  |    |   |   |   |   |   |   | js$|   n| 	  | 
  |   | jr7|   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |  d | !  d S )Nr  )"_xml_declaration_write_worksheet_write_sheet_pr_write_dimension_write_sheet_views_write_sheet_format_pr_write_colsrq   _write_sheet_data_write_optimized_sheet_data_write_sheet_protection_write_protected_rangesrw   _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_ignored_errors_write_drawings_write_legacy_drawing_write_legacy_drawing_hf_write_picture_write_table_parts_write_ext_listr  
_xml_closer  r:   r:   r;   _assemble_xml_file	  sD   

zWorksheet._assemble_xml_filec                 C   s   |dk s|dk r
dS || j ks|| jkrdS |s$|s$| jr$|| jk r$dS |s@| jd u s0|| jk r3|| _| jd u s=|| jkr@|| _|s\| jd u sL|| jk rO|| _| jd u sY|| jkr\|| _dS rI  )rx   ry   rq   r   r{   r|   r}   r~   )r3   r  rL   r  r  r:   r:   r;   rJ  m  s$   

zWorksheet._check_dimensionsc                 C   s   t || j| jS N)r#   r  r  )r3   dt_objr:   r:   r;   r       zWorksheet._convert_date_timec                 C   s   d}d}d}d}t |d}	t |d}
dt|d  }dt|d  }|dkr4|| jd kr4|	}|
}d}n|dkrF|| jd krF|}|}d}n|	| }|
| }||krW|sW|}n|d | }t| j}|d | }|S )Nr^   r   r   ra  r?   rG  )r)   r8  rx   ry   r'   rm   )r3   	row_num_1	col_num_1	row_num_2	col_num_2range1range2r  row_col_only
col_char_1
col_char_2
row_char_1
row_char_2rX  r:   r:   r;   r    s0   


zWorksheet._convert_name_areac                 C   sR   |sg S t |}d|v r|d t|}|  d}t||kr'|d | }|S )Nr   i  )r  remover  r  rK  )r3   r  
breaks_setbreaks_listmax_num_breaksr:   r:   r;   _sort_pagebreaks  s   
zWorksheet._sort_pagebreaksc                 C   sp   |sg S t d}||}g }|D ]#}|dr|dd  }|dr*|d d }|dd}|| q|S )Nz"(?:[^"]|"")*"|\S+rs  r   r/  z"")r&  compilefindallr#  r%  re  rt  )r3   r  token_rer  
new_tokensr,  r:   r:   r;   r$    s   



z Worksheet._extract_filter_tokensc                 C   s   t |dkrB|d }td|rd}ntd|rd}ntd| d| d	 | ||dd }| ||d
d }||g | S | ||S )Nr  r_   z(and|&&)r   z	(or|\|\|)r   Token 'z3' is not a valid conditional in filter expression 'r  r#  )rK  r&  r'  r   _parse_filter_tokens)r3   r  r  conditionalexpression_1expression_2r:   r:   r;   r%    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	  rlt|d }|dk s3|d
kr>td| d| d | }|dvrQtd| d| d |d	  dkr\d}nd}|d dkrh|d7 }t|}|s|d	 rtd|d	  d| d td| r|dvrtd|d  d| d | }|dkr|dkrd}n|dkrd}d}nd}d}|dkrtd|rd}||gS ) Nr  r  r   r_   r#     )rH  r   z=~eqrK  z!~nerL  rR  rX  rO  rU  z
top|bottomr   i  zThe value 'z' in expression 'z' must be in the range 1 to 500)r  %z
The type 'z ' must be either 'items' or '%%'r     r^  r1  r)  z0' is not a valid operator in filter expression 'r  zblanks|nonblanks)r  r  zThe operator 'z0' is not valid in relation to Blanks/NonBlanks'.r  r  z[*?]   )r  r&  r'  r  r1   r   r8  rc  )r3   r  r  	operatorsoperatorr,  r_  r:   r:   r;   r*    sp   zWorksheet._parse_filter_tokensc                 C   sp   d}|d d d D ]}|d? d@ |d> d@ B }|t |N }q	|d? d@ |d> d@ B }|t|N }|dN }|dS )Nr   r/     r   r]   iK  X)ordrK  )r3   ry  digestrx  r:   r:   r;   r  k  s   zWorksheet._encode_passwordc                 C   sF   t |tr	|}|S |d ur|drt|d }||_|S t|}|S )Nr  )r>  r   r  
image_name)r3   r  r  r  r:   r:   r;   r  |  s   
zWorksheet._image_from_sourcer  image_id
drawing_idc              	   C   s  |j |j }|j|j }|d|j 9 }|d|j 9 }| |j|j|j	|j
|||j}td|d  }td|d  }| jsVt }d|_|| _| jddt| d d g n| j}t }tj|_||_|j|_||_ ||_d |_|j|_d|_|j|_|jd ur|j|_|jr|j}	|	 }
|	  }| j!"|	j#s| j$d	|
|g | %|	j#|	_|	|_| j!"|j&s| j$d
dt| d |j' g | %|j&|_|(| d S )Ng      X@r  5%  r   /drawing../drawings/drawing.xmlr   
/hyperlink/image../media/image.))_width_x_scale_height_y_scale_x_dpi_y_dpi_position_object_emusr  r  	_x_offset	_y_offset_anchorr1   r   r   embeddedr   rt  r8  r   r   IMAGE_drawing_type_dimensionsr:  _description_shape
_rel_index_decorativer  _url_target_target_moder   r  _linkr   _get_drawing_rel_index_digest_image_extension_add_drawing_object)r3   r  r;  r<  r  r  
dimensionsr   drawing_objectr  targettarget_moder:   r:   r;   _prepare_image  sf   	
zWorksheet._prepare_imagec                 C   sx  | j | \}}}}}}}	}
}}}|d| jd }|d| jd }||9 }||9 }| |||||||
}td|d  }td|d  }| jsat }d|_|| _| j	
dd	t| d
 d g n| j}tdd|}|	|_t }tj|_||_||_||_||_||_|
|_d|_||_t|}|r| }| }| j|js| j 
d||g | !|j|_||_"|#| d S )Nr  r_   r  r.  r  r=  r   r>  r?  r@  rectTextBoxr   rA  )$r   r  r   r   rK  r1   r   r   rO  r   rt  r8  r"   r  r   r   SHAPErQ  rR  rE  rG  rS  rT  rN  rU  rV  r   from_optionsrX  rY  r   rZ  r   r[  rW  r^  )r3   rn   r<  r  rL   r  r  r  r  r  r  r  r  r  r  r  r_  r   shaper`  r  ra  rb  r:   r:   r;   _prepare_shape  sf   
zWorksheet._prepare_shapec                 C   s`   t dd|j|_| j|js!| jddt| d |j	 g | 
|j|_| j| d S )Nz\..*$r^   rB  rC  rD  )r&  rp  r:  r   r  r\  r   rt  r8  r]  _get_vml_drawing_rel_index_ref_idr   )r3   r;  r  r:   r:   r;   _prepare_header_image  s   zWorksheet._prepare_header_imagec                 C   s$   | j ddt| d | g d S )NrB  rC  rD  )r   rt  r8  )r3   r;  image_extensionr:   r:   r;   _prepare_background/  s   zWorksheet._prepare_backgroundc              
   C   s  | j | \
}}}}}}	}
}}}|d |_td|j|	  }td|j|
  }| |||||||}|j}| jsOt }d|_	|| _| j
ddt| d g n| j}t }tj|_||_||_||_||_d |_||_|  |_||_||_|| | jddt| d g d S )Nr   r  r>  r?  r@  z/chartz../charts/chart)r   r  r1   r  r  rK  
chart_namer   r   rO  r   rt  r8  r   r   CHARTrQ  rR  rE  rG  _namerT  rN  r[  rU  rS  rV  r^  r   )r3   rn   chart_idr<  r  rL   r  r  r  r  r  r  r  r  r  r  r_  rm   r   r`  r:   r:   r;   _prepare_chart5  sT   


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 )Nr  r=  )_position_object_pixelsr1   )r3   	col_start	row_startx1y1r  r  r  col_endrow_endx2y2x_absy_absr:   r:   r;   rK  o  s*   zWorksheet._position_object_emusc              
   C   s:  d}d}	|dk r!|dkr!||  |d 7 }|d8 }|dk r!|dks|dk r>|dkr>|| |d 7 }|d8 }|dk r>|dks)td|}td|}| jrZt|D ]	}
||  |
7 }qOn|| j| 7 }||7 }| jrwt|D ]	}|	| |7 }	qln|	| j| 7 }	|	|7 }	||  ||kr||  |8 }|d7 }||  ||ks|| ||kr|| |8 }|d7 }|| ||ks|}|}|  ||dkr|| }| ||dkr|| }||  ||kr||  ||8 }|d7 }||  ||ks|| ||kr|| ||8 }|d7 }|| ||ks|}|}||||||||||	g
S r0   )	_size_col	_size_rowr  r   r{  r   r   r   )r3   ru  rv  rw  rx  r  r  r  r}  r~  r  row_idry  rz  r{  r|  r:   r:   r;   rt    sb   

z!Worksheet._position_object_pixelsc                 C   s   d}d}d}|| j v rF| j | d }| j | d }|d u r | j}|r*|dkr*d}|S |dk r:t|||  d }|S t|| d | }|S | j}|S )Nr  r  r   r  r#  r   r  )r   r   r1   r   )r3   rL   r  max_digit_widthpaddingpixelsr  r   r:   r:   r;   r    s$   
zWorksheet._size_colc                 C   s`   d}|| j v r'| j | d }| j | d }|r|dkrd}|S td| }|S td| j }|S )Nr   r   r#  gUUUUUU?)r   r1   r   )r3   r  r  r  r  r   r:   r:   r;   r  /  s   
zWorksheet._size_rowc                 C   s0   d}d}|dkr|||  }|S || | }|S )Ng      @g      @   r:   )r3   r  r  r  r  r:   r:   r;   r  D  s   zWorksheet._pixels_to_widthc                 C   s   d| S )Nra   r:   )r3   r  r:   r:   r;   r  P  s   zWorksheet._pixels_to_heightc              	   C   B   d}|  |j|j|j|j|j|j|}||j ||j |S Nr   )rt  	start_col	start_rowr  r  r  r  rt  )r3   r  r  verticesr:   r:   r;   _comment_verticesT     zWorksheet._comment_verticesr  c              	   C   r  r  )rt  rL   r  r  r  r  r  rt  )r3   r  r  r  r:   r:   r;   _button_verticesg  r  zWorksheet._button_verticesc                 C   s(  g }t | j }|D ]4}t | j|  }|D ]&}	| j| |	 }
| |
|
_|
jd u r0| j|
_|
jd u r9| j|
_|	|
 qq| j
D ]}| ||_qC| j	ddt| d g | jrn|| _| j	ddt| d g t|}|}tt|d D ]}|| d }| d	| }q||| _|| _|S )
N/vmlDrawing../drawings/vmlDrawing.vmlz	/commentsz../commentsr@  ri   r   r,  )r  r   rc  r  r  
is_visibler   r  r   rt  r   r  r   r8  r   r   r   rK  r{  r1   r  r   )r3   r  r   vml_drawing_id
comment_idr   row_numsr  col_numsrL   r  r  r  start_data_idr'  data_idr:   r:   r;   _prepare_vml_objectsz  s>   


zWorksheet._prepare_vml_objectsc                 C   s&   || _ | jddt| d g d S )Nr  r  r  )r   r   rt  r8  )r3   r   r  r:   r:   r;   _prepare_header_vml_objects  s   z%Worksheet._prepare_header_vml_objectsc                 C   s   | j D ]?}||d< |dd u rdt| |d< |d  }||v r,td|d  dd||< | jddt| d	 g |d
7 }qd S )Nr  rm   TablezDuplicate name 'z ' used in worksheet.add_table().Tz/tablez../tables/tabler@  r   )r   r  r8  r  r   r   rt  )r3   table_idseenr   rm   r:   r:   r;   _prepare_tables  s   

zWorksheet._prepare_tablesc              	   C   s   d}| dd}| dd}| dd}| dd	}d
dddddddd}||v r8|| }d| d| d}|S td| d |S )Nr^   r  z''r  z'#]z'][z'[e   f   g   h   i   k   m   n   r  z	SUBTOTAL(z,[z])zUnsupported function 'r  )re  r   )r3   r%  col_namer]  r&  func_numr:   r:   r;   r    s(   z$Worksheet._table_function_to_formulac                 C   s"   ||vrd S t || ||< d S r  )r   r  )r3   rT  r  
user_colorr:   r:   r;   rS    s   zWorksheet._set_spark_colorc                 C   s   | j rdS g }t||d D ]k}|| jvr|d  qt||d D ]V}|| j| v rs| j| | }|jj}	|	dv rC||jd q"|	dkrV|j}
| j	|
}|| q"|	dv ri|j
}|d u rcd}|| q"|	dkrr|d	 q"|d  q"q|S )
Nr:   r   rT   rX   r]  rU   r  r   rQ   r^   )rq   r{  r   rt  r  r  rQ  rC  ro   _get_shared_stringr_  )r3   rv  ru  rz  ry  r  r   r  r  r  rn   rC  r_  r:   r:   r;   _get_range_data  s8   


!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>  r8  )rK   itemr:   r:   r;   rM   .  s   " z'Worksheet._csv_join.<locals>.<listcomp>r,  )ru  )r3   r  r:   r:   r;   rd  *  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}r1  z%25rs  z%22r  z%20rR  z%3crO  z%3er  z%5br  z%5d^z%5e`z%60ra  z%7br!  z%7d)r&  rc  re  )r3   r  r:   r:   r;   _escape_url2  s   zWorksheet._escape_urlc                 C   sR   |d u r|  j d7  _ | j S | j|r| j| S |  j d7  _ | j | j|< | j S Nr   )r   r   r  r3   ra  r:   r:   r;   r[  F  s   
z Worksheet._get_drawing_rel_indexc                 C   s6   | j |r| j | S |  jd7  _| j| j |< | jS r  )r   r  r   r  r:   r:   r;   rj  S  s
   
z$Worksheet._get_vml_drawing_rel_indexc                 C   s~  | j }|d |jr|d |jr|d |jr |d |jr(|d |jr0|d |jr9| 	|j |j
dkrC| d |j
d	krM| d
 |dd|jfg |jdkr]n5|jrk| dd|jfg n'|jry| dd|jfg n|jr|j}|js| d|  n| ddg |dd|jfg |dd|jfg |jdkr|js|dd|jfg |d d S )NrPrbr'  strikeoutlineshadowr   superscriptr  	subscriptszvalr/  rv  themeindexed)r  r   rFontfamilyCalibrischeme)r   r  bold_xml_empty_tagitalicfont_strikeoutfont_outlinefont_shadow	underline_write_underlinefont_script_write_vert_align	font_sizer  _write_rstring_colorcolor_indexed
font_color_is_automatic_attributes	font_namefont_family	hyperlinkfont_schemer  )r3   	xf_format
xml_writerrv  r:   r:   r;   r  b  sH   










zWorksheet._write_fontc                 C   sD   g }|dkr
dg}n|dkrdg}n|dkrdg}| j d| d S )Nr  )r  double!   )r  singleAccounting"   )r  doubleAccountingur   r  )r3   r  r  r:   r:   r;   r    s   zWorksheet._write_underlinec                 C   s   d|fg}| j d| d S )Nr  	vertAlignr  r3   r  r  r:   r:   r;   r    s   
zWorksheet._write_vert_alignc                 C   s   | j || d S r  r  r3   rm   r  r:   r:   r;   r       zWorksheet._write_rstring_colorc                 C   s   | j s| j  d| _ d S d S )NT)r  r  r  r  r:   r:   r;   
_opt_close  s   

zWorksheet._opt_closec                 C   s2   | j r| j}t|ddd| _d| _ | j| _d S d S )Nza+r  r  F)r  r  r  r  r  )r3   r  r:   r:   r;   _opt_reopen  s   zWorksheet._opt_reopenc           
      C   s  g }t |D ]}|dddd q|dkr"d|d d< d|d	 d< |d
kr8d|d d< d|d	 d< d|d d< |dkrTd|d d< d|d	 d< d|d d< d|d d< |rt|}||krb|d	 }t |D ]w}|| dd ur|| d || d< || d }t|tr|dr|d|| d< || drd}|| d |vrtd|| d  d n|| d || d< || d dkrd|| d< || d}	|	r|	dkrd|| d< qf|S )NFr   percent)r  r_  r?  r_   C   r_  r  r   r#  K   r     r  r  P   <   (   re   r   r?  )r  r  rQ  r]  zUnknown icon property type 'z2' for sub-property 'type' in conditional_format().rQ  numr  rO  T)	r{  rt  rK  r  r>  r8  r#  r  r   )
r3   r  
user_propspropsrN   max_datar'  tmprh  r  r:   r:   r;   r    sN   zWorksheet._set_icon_propsc                 C   sx   d}|d }|d }|d }d}|d }d|fd|fg}| j d	kr4|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:rr  zxmlns:mczxmlns:x14ac)zmc:Ignorablex14acr  )rv   rt  r  )r3   schemar  xmlns_rxmlns_mc	ms_schemaxmlns_x14acr  r:   r:   r;   r    s   

zWorksheet._write_worksheetc                 C   s   | j d u r| jd u rd}nR| j d u r7| jd ur7| j| jkr$td| j}n;td| j}td| j}|d | }n(| j | jkrK| j| jkrKt| j | j}nt| j | j}t| j| j}|d | }| dd|fg d S )Nr_  r   r?   	dimensionr  )r{   r}   r~   r,   r|   r  )r3   r  rC   rD   r:   r:   r;   r    s   zWorksheet._write_dimensionc                 C   s    |  d |   | d d S )N
sheetViews)r  _write_sheet_viewr  r  r:   r:   r;   r  <  s   
zWorksheet._write_sheet_viewsc                 C   sf  g }| j s
|d | jr|d | js|d | jr"|d | jr*|d | js2|d | jdkr=|d n
| jd	krG|d
 | jdkrT|d| jf | j	dkr|d| j	f | jdkrq| j
rq|d| j	f | jdkr~|d| j	f | jd	kr|d| j	f |d | js| jr| d| |   |   | d d S | d| d S )N)showGridLinesr   )showRowColHeadersr   )	showZerosr   rightToLeftr   )tabSelectedr   showOutlineSymbolsr   r   )r  
pageLayoutr  )r  pageBreakPreviewr^   topLeftCellrc   	zoomScaler   zoomScaleNormalzoomScalePageLayoutViewzoomScaleSheetLayoutView)workbookViewIdr   	sheetView)r   rt  r   r   r   r   r   r  r   r   r   r   r   r  _write_panes_write_selectionsr  r  r3   r  r:   r:   r;   r  E  sD   













zWorksheet._write_sheet_viewc                 C   s   | j }| j}| j}d|fg}| j | jkr|d | jr!|d |r*|d|f |r3|d|f | jdkr=|d | d| d S )	NdefaultRowHeightcustomHeightr   )
zeroHeightr   outlineLevelRowoutlineLevelColr  zx14ac:dyDescentz0.25sheetFormatPr)r   r   r   r   rt  r   rv   r  )r3   r   	row_level	col_levelr  r:   r:   r;   r    s   




z Worksheet._write_sheet_format_prc                 C   s   | j sd S | d t| j  d }|}| j | }| j |= |}|}t| j  D ]!}| j | }||d kr=||kr=|}q)| ||| |}|}|}q)| ||| || j |< | d d S )Ncolsr   r   )r   r  r  rc  _write_col_infor  )r3   ri  rk  prev_col_optionsdeleted_coldeleted_col_optionsrL   col_optionsr:   r:   r;   r    s(   



zWorksheet._write_colsc                 C   sD  |\}}}}}}	d}
d}|r|  }|d u r |sd}d}
n	d}n|dkr&d}
|dkr[d}d}|dk rGtt|||  d t| d d }ntt|| d | t| d d }d|d fd	|d fd
|dfg}|ru|d|f |r||d |	r|d |
r|d |r|d|f |r|d | d| d S )Nr   r   rf   r  r  r  g      p@r  r  r  r]  r  )r   rJ   )bestFitrJ   )customWidthrJ   outlineLevel)r  rJ   rL   )_get_xf_indexr1   r)  rt  r  )r3   col_mincol_maxr   r  rD  r   r  r  r
  custom_widthxf_indexr  r  r  r:   r:   r;   r    sj   








zWorksheet._write_col_infoc                 C   s8   | j d u r| d d S | d |   | d d S )N	sheetData)r{   r  r  _write_rowsr  r  r:   r:   r;   r    s
   

zWorksheet._write_sheet_datac                 C   s   | j d u r| d d S | d d}| jd | j|}|r/| j| | j|}|s!| j  t	
| j | d d S )Nr(  i   r   )r{   r  r  r  seekreadr  r4  r  r  unlinkr  r  )r3   	buff_sizer  r:   r:   r;   r    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 )Nr  r  r  r  r   r   pageMargins)r   r   r   r   r   r   r  r  r:   r:   r;   r  &  s   	zWorksheet._write_page_marginsc                 C   sX  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rG|d | jdkrT|d| jf | j	r]|d	 n|d
 | j
rj|d | jdkrt|d | jr| jr|d| jf | jr|d| jf n| jr|d| jf | jr|d| jf | d| d S )N	paperSizerc   r  r   
fitToWidthfitToHeight)	pageOrderoverThenDownfirstPageNumber)r   portrait)r   	landscape)blackAndWhiterJ   r   )useFirstPageNumberrJ   horizontalDpiverticalDpi	pageSetup)r   r   rt  r   r   r   r   r   r   r   r   rs   r  r  r  r  r:   r:   r;   r  3  sB   






zWorksheet._write_page_setupc                 C   s^   g }| j sd S | jr|d | jr|d | jr|d | jr'|d | d| d S )N)horizontalCenteredr   )verticalCenteredr   )headingsr   )	gridLinesr   printOptions)r   r   rt  r   r   r   r  r  r:   r:   r;   r    s   



zWorksheet._write_print_optionsc                 C   sz   g }| j s
|d | js|d | jr0| d| | jr"|   | jr)|   | 	d d S | j
r;| d| d S d S )N)scaleWithDocr   )alignWithMarginsr   headerFooter)r   rt  r   r   r  r   _write_odd_headerr   _write_odd_footerr  rw   r  r  r:   r:   r;   r    s   

zWorksheet._write_header_footerc                 C      |  d| j d S )N	oddHeader)r  r   r  r:   r:   r;   rD    r  zWorksheet._write_odd_headerc                 C   rF  )N	oddFooter)r  r   r  r:   r:   r;   rE    r  zWorksheet._write_odd_footerc                 C   s   |    t| j| jd D ]}|| jv s|| jv s| j| rt|d }|| jv r/| j| }nd }| j| rs|| jvrB| 	|| n
| 	||| j|  t| j
| jd D ]}|| j| v rl| j| | }| ||| qU| d q|| jv r| ||| j|  q| ||| j|  qd S )Nr   r  r  )_calculate_spansr{  r{   r|   r   r   r   r1   r   
_write_rowr}   r~   _write_cellr  _write_empty_row)r3   r   
span_indexrP  r  col_refr:   r:   r;   r)    s2   





zWorksheet._write_rowsc                 C   s   | j }|| _ || jv s|| jv s| j| rcd }| j| rY|| jvr(| || n
| ||| j|  t| j| jd D ]}|| j| v rR| j| | }| ||| q;| 	d n
| 
||| j|  | j  d S )Nr   r  )r   r   r   r   rJ  r{  r}   r~   rK  r  rL  clear)r3   current_row_numr   rP  r  rN  r:   r:   r;   rM    s    

zWorksheet._write_single_rowc                 C   s8  i }d }d }t | j| jd D ]}|| jv r<t | j| jd D ]}|| j| v r;|d u r1|}|}qt||}t||}q|| jv rlt | j| jd D ]!}|| jv rk|| j| v rk|d u ra|}|}qJt||}t||}qJ|d d dksy|| jkrt	|d }|d ur|d7 }|d7 }| d| ||< d }q|| _
d S )Nr   r  r   r?   )r{  r{   r|   r   r}   r~   r  r  r   r1   r   )r3   spansspan_minspan_maxr   r  rM  r:   r:   r;   rI    s>   






zWorksheet._calculate_spansc                 C   s>  d}|r|\}}}}	}
nd\}}}}	}
|d u r| j }d|d fg}|r'| }|r0|d|f |r9|d|f |r@|d || jksO|| jkrX|| j krX|d|d	f |r_|d
 || jksn|| jkrs|| j krs|d |	r||d|	f |
r|d | jdkr|d |r| d| d S | d| d S )Nr   )NNr   r   r   r  r   rQ  s)customFormatr   htg)r   r   r  r"  )r  r   r  r  r  )r   r#  rt  r   rv   _xml_empty_tag_unencoded_xml_start_tag_unencoded)r3   r  rQ  
properties	empty_rowr'  r  rD  r   r  r  r  r:   r:   r;   rJ  .  s@   







zWorksheet._write_rowc                 C   s   | j |||dd d S )NT)r[  )rJ  )r3   r  rQ  rZ  r:   r:   r;   rL  e  s   zWorksheet._write_empty_rowc                 C   s  t ||}d|fg}|jr|j }|d|f n6|| jv r7| j| d r7| j| d }|d| f n|| jv rP| j| d }|d urP|d| f |jj}	|	dv ra| |j	| d S |	dv r|j
}
| jss| |
| d S | |
}
|
dr|
dr| |
| d S t|
}| |
|| d S |	dkr|j}t|jtr|d	 |jrd}n!d
}nt|jtrd}|jdkrn|j|v r|d n|d | |j|| d S |	dkr|jdkr|d zt|j W n ty   |d Y nw | d| | |j|j | |j |  d d S |	dkr'| !d| d S |	dkrD|d	 | d| | |j" |  d d S |	dkri|d |d|jf | d| | |j# |  d d S d S )Nr  rT  r   r  r  z<r>z</r>rW   )r  r  r   )rV  z#N/Az#NAME?z#NULL!rU  z#REF!r  r^   )r  e)r  r8  rZ   rn  )cmr   crQ   rV   rS   vm)$r-   rR   r#  rt  r   r   r  r  _xml_number_elementrQ  rC  rq   _xml_string_element_escape_control_charactersr#  r%  _xml_rich_inline_stringr%   _xml_inline_stringr_  r>  r6  r8  _xml_formula_elementr]  r|  r)  r2   r  _write_cell_array_formular{  _write_cell_valuer  r  r  ro  )r3   r  rL   r  r}  r  r'  row_xfcol_xftype_cell_namerC  r  r_  error_codesr:   r:   r;   rK  i  s   

















zWorksheet._write_cellc                 C   s   |d u rd}|  d| d S )Nr^   vr  )r3   r_  r:   r:   r;   rg    s   zWorksheet._write_cell_valuec                 C   s   dd|fg}|  d|| d S )N)r  arrayr  r-  rm  )r3   r]  r}  r  r:   r:   r;   rf    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r&|d | j s/| js/| jrH| d| |   |   | 	  | 
d d S | d| d S )NcodeName)
filterModer   sheetPr)r   r   r   r   r  rt  r  _write_tab_color_write_outline_pr_write_page_set_up_prr  r  r  r:   r:   r;   r    s.   
zWorksheet._write_sheet_prc                 C   s    | j sd S dg}| d| d S )N)	fitToPager   pageSetUpPr)r   r  r  r:   r:   r;   rt    s   zWorksheet._write_page_set_up_prc                 C   s"   | j }|sd S | d|  d S )NtabColor)r   _write_colorr  rw  r:   r:   r;   rr    s   zWorksheet._write_tab_colorc                 C   s^   g }| j sd S | jr|d | js|d | js|d | js'|d | d| d S )N)applyStylesr   )summaryBelowr   )summaryRightr   r  	outlinePr)r   r   rt  r   r   r   r  r  r:   r:   r;   rs    s   



zWorksheet._write_outline_prc                 C   \   |  | j}|s
d S t|}d|fd|fg}| d| |D ]}| |d q| d d S )Nr  manualBreakCount	rowBreaksi?  )r$  r   rK  r  
_write_brkr  )r3   page_breaksr  r  r   r:   r:   r;   r  +     zWorksheet._write_row_breaksc                 C   r}  )Nr  r~  	colBreaksi )r$  r   rK  r  r  r  )r3   r  r  r  r  r:   r:   r;   r  @  r  zWorksheet._write_col_breaksc                 C   s"   d|fd|fdg}|  d| d S )Nr  r  )manr   brkr  )r3   brk_idbrk_maxr  r:   r:   r;   r  U  s   zWorksheet._write_brkc                 C   N   | j }t|}|sd S d|fg}| d| |D ]}| | q| d d S )Nr  
mergeCells)r   rK  r  _write_merge_cellr  )r3   r   r  r  merged_ranger:   r:   r;   r  [     
zWorksheet._write_merge_cellsc           
      C   sF   |\}}}}t ||}t ||}|d | }d|fg}	| d|	 d S )Nr?   r  	mergeCell)r,   r  )
r3   r  row_minr$  row_maxr%  rC   rD   r  r  r:   r:   r;   r  m  s   


zWorksheet._write_merge_cellc                 C   s   t | j }|sd S | d |D ]b}t | j|  }|D ]T}| j| | }| jrG| j| rG| j| | rG| j| | }|jjdkrGd|_|jt	j
t	jfv rl|  jd7  _| ||| j| | jd| dg q| ||| qq| d d S )Nr  rU   Tr   rA  External)r  r  rc  r  r   r  r  _is_object_link
_link_typer   URLEXTERNALr   _write_hyperlink_externalr   rt  rX  _write_hyperlink_internalr  )r3   r  r   r  r  r  r  r:   r:   r;   r  z  s.   

zWorksheet._write_hyperlinksid_numc                 C   sx   t ||}dt| }d|fd|fg}|jr|d|jf |jr)|d|jf |jr4|d|jf | d| d S )NrIdr  r:idr1  displaytooltipr  )r,   r8  rN  rt  r  r  r  r  )r3   r  rL   r  r  r  r_idr  r:   r:   r;   r    s   
z#Worksheet._write_hyperlink_externalc                 C   sR   t ||}d|fd|jfg}|jr|d|jf |d|jf | d| d S )Nr  r1  r  r  r  )r,   rZ  r  rt  r  r  )r3   r  rL   r  r  r  r:   r:   r;   r    s   
z#Worksheet._write_hyperlink_internalc                 C   sN   | j sd S d| j fg}| jr| d| |   | d d S | d| d S )Nr  
autoFilter)r   r   r  _write_autofiltersr  r  r  r:   r:   r;   r    s   zWorksheet._write_auto_filterc                 C   sT   | j \}}t||d D ]}|| jvrq| j| }| j| }| || || qd S r  )r   r{  r   r   _write_filter_column)r3   col1col2rL   r  r   r:   r:   r;   r    s   



zWorksheet._write_autofiltersc                 C   sB   d|fg}|  d| |dkr| | n| | | d d S )NcolIdfilterColumnr   )r  _write_filters_write_custom_filtersr  )r3   r  r   r+  r  r:   r:   r;   r    s   

zWorksheet._write_filter_columnc                 C   s   dd |D }g }t |t |krdg}t |dkr(t |dkr(| d| d S | d| t|D ]}| | q2| d d S )Nc                 S   s    g | ]}t | d kr|qS )r  )r8  r  )rK   filterr:   r:   r;   rM      s     z,Worksheet._write_filters.<locals>.<listcomp>)rZ  r   r   r   r+  )rK  r  r  r  _write_filterr  )r3   r+  
non_blanksr  r  r:   r:   r;   r    s   zWorksheet._write_filtersc                 C   s   d|fg}|  d| d S )Nr  r  r  r  r:   r:   r;   r    s   
zWorksheet._write_filterc                 C   s   t |dkr| d | j|  | d d S g }|d dkr#dg}ndg}| d| | |d |d  | |d |d  | d d S )	Nr  customFiltersr   )andr   )r  r   r   r_   r#  )rK  r  _write_custom_filterr  )r3   r  r  r:   r:   r;   r    s   

zWorksheet._write_custom_filtersc                 C   sp   g }dddddddd}|| d ur|| }nt d|  |dkr)|d	|f |d
|f | d| d S )NrQ  rG  rW  rN  rJ  rT  )r   r  r_   r#  r  r.  r3  zUnknown operator = r5  r  customFilter)r   rt  r  )r3   r5  r  r  r4  r:   r:   r;   r  /  s    
zWorksheet._write_custom_filterc                 C   sp  g }| j sd S | j }|d r|d|d f |d r |d |d r)|d |d s2|d |d s;|d	 |d
 rD|d |d rM|d |d rV|d |d r_|d |d rh|d |d rq|d |d rz|d |d r|d |d s|d |d r|d |d r|d |d  r|d! |d" s|d# | d$| d S )%Nry  rz  )rz  r   r{  )r{  r   r|  )r|  r   r}  )r}  r   r~  )formatCellsr   r  )formatColumnsr   r  )
formatRowsr   r  )insertColumnsr   r  )
insertRowsr   r  )insertHyperlinksr   r  )deleteColumnsr   r  )
deleteRowsr   r  )selectLockedCellsr   r  )r  r   r  )r  r   r  )pivotTablesr   r  )selectUnlockedCellsr   sheetProtection)r   rt  r  )r3   r  r  r:   r:   r;   r  J  sR   
















z!Worksheet._write_sheet_protectionc                 C   sF   | j dkrd S | d | jD ]\}}}| ||| q| d d S )Nr   protectedRanges)r   r  r   _write_protected_ranger  r  r:   r:   r;   r  z  s   

z!Worksheet._write_protected_rangesc                 C   sB   g }|r| d|f | d|f | d|f | d| d S )Nry  rb  rm   protectedRangert  r  )r3   r}  r  ry  r  r:   r:   r;   r    s   z Worksheet._write_protected_rangec                 C   s(   | j sd S |  jd7  _| | j d S r  )r   r   _write_drawingr  r:   r:   r;   r
    s   zWorksheet._write_drawingsc                 C   s&   dt | }d|fg}| d| d S )Nr  r  r   r8  r  )r3   r<  r  r  r:   r:   r;   r    s   
zWorksheet._write_drawingc                 C   @   | j sd S |  jd7  _dt| j }d|fg}| d| d S )Nr   r  r  legacyDrawing)r   r   r8  r  r3   r  r  r:   r:   r;   r       
zWorksheet._write_legacy_drawingc                 C   r  )Nr   r  r  legacyDrawingHF)r   r   r8  r  r  r:   r:   r;   r    r  z"Worksheet._write_legacy_drawing_hfc                 C   r  )Nr   r  r  picture)r   r   r8  r  r  r:   r:   r;   r    r  zWorksheet._write_picturec                 C   r  )Nr  dataValidations)r   rK  r  _write_data_validationr  )r3   r   r  r  
validationr:   r:   r;   r    r  z!Worksheet._write_data_validationsc           	      C   s  d}g }|d D ]+}|dkr|d7 }|\}}}}||kr!||}}||kr*||}}|t ||||7 }q|dr=|d }|d dkr[|d|d f |d d	kr[|d
|d f d|v ru|d dkrj|d |d dkru|d |d r~|d |d s|d |d r|d |d r|d d|v r|d|d f d|v r|d|d f d|v r|d|d f d|v r|d|d f |d |f |d dkr| d!| d S | d!| | |d"  |d# d ur| |d#  | d! d S )$Nr^   r`  r  r6  r0  r<  r?  r  rC  r5  r1  r   )
errorStylerZ  r  )r  r[  r8  )
allowBlankr   r/  )showDropDownr   r3  )showInputMessager   r2  )showErrorMessager   r4  
errorTitler9  ro  r5  promptTitler:  promptrb  dataValidationr_  r-  )r+   r  rt  r  r  _write_formula_1_write_formula_2r  )	r3   r  rb  r  r`  	row_firstr(  row_lastr)  r:   r:   r;   r    s\   








z Worksheet._write_data_validationc                 C   sf   t |tr| j| }d| d}nzt| W n ty*   |dr(|d}Y nw | d| d S )Nrs  r   formula1)r>  r  rd  r)  r2   r#  r  r  r3   r]  r:   r:   r;   r  (  s   



zWorksheet._write_formula_1c                 C   D   zt | W n ty   |dr|d}Y nw | d| d S )Nr   formula2r)  r2   r#  r  r  r  r:   r:   r;   r  9     

zWorksheet._write_formula_2c                 C   s6   t | j }|sd S |D ]}| || j|  qd S r  )r  r   rc  _write_conditional_formatting)r3   rF  
cond_ranger:   r:   r;   r   F  s   
z$Worksheet._write_conditional_formatsc                 C   s8   d|fg}|  d| |D ]}| | q| d d S )Nrb  conditionalFormatting)r  _write_cf_ruler  )r3   r  paramsr  paramr:   r:   r;   r  R  s
   
z'Worksheet._write_conditional_formattingc                 C   s  d|d fg}d|v r|d d ur| d|d f | d|d f |dr-| d |d dkrg| d|d	 f | d
| d|v rYd|v rY| |d  | |d  n| |d  | d
 d S |d dkrtd|d	 rz| d td|d	 r| d td|d	 rtd|d	 }| d|df | d
| d S |d dkrd	|v r|d	 dkr| d d|v r| d |d pd}| d|f | d
| d S |d dkr| d
| d S |d dkr| d
| d S |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
 d S |d d&kr^| d&|d	 f | d
| | |d%  | d
 d S |d d'ksz|d d(ksz|d d)ksz|d d*kr| d
| | |d%  | d
 d S |d d+kr| d
| | 	| | d
 d S |d d,kr| d
| | 
| |d-r| | | d
 d S |d d.kr| d
| | |d	  | d
 d S |d d/kr| d
| | | | d
 d S d S )0Nr?  rR   dxfIdr  r~  )
stopIfTruer   r  r5  r  cfRuler.  r-  r_  r  below)r  r   rG  )equalAverager   z[123] std devz([123]) std devr  r   r  r1  )r  r   r  )r  r   rq  rankr  r  r  r  r  r  r  r]  r  r  r  r  r  r  r  r  r  r  )rt  r  r  _write_formula_elementr  r&  rc  groupr  _write_color_scale_write_data_bar_write_data_bar_ext_write_icon_set)r3   r  r  r'  r  r:   r:   r;   r  [  s   









zWorksheet._write_cf_rulec                 C   r  )Nr   r]  r  r  r:   r:   r;   r    r  z Worksheet._write_formula_elementc                 C   s   |  d | |d |d  |d d ur| |d |d  | |d |d  | d|d	   |d
 d urC| d|d
   | d|d   | d d S )Nr  rq  ry  rp  rw  ro  ru  rv  rx  rv  rt  )r  _write_cfvorx  r  r  )r3   r  r:   r:   r;   r    s   
zWorksheet._write_color_scalec                 C   s   g }d|v r| d|d f d|v r| d|d f |dr&| d | d| | |d |d	  | |d
 |d  | d|d   | d d S )Nr}  	minLengthr|  	maxLengthrn  	showValuer   r  rq  ry  ro  ru  rv  rr  )rt  r  r  r  rx  r  r  )r3   r  r  r:   r:   r;   r    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)rn   rK  r   rt  r  
_write_extr  r  )r3   r  worksheet_countdata_bar_countr  r:   r:   r;   r     s   



zWorksheet._write_data_bar_extc                 C   s   g }|d dkrd|d fg}| dr|d | dr#|d | d| t|d D ]}| |d	 |d
 |d  q/| d d S )Nrz  r  r  r{  r  r  )r0  r   rm  r?  r_  r  )r  rt  r  reversedr  r  )r3   r  r  iconr:   r:   r;   r    s   



zWorksheet._write_icon_setc                 C   s>   d|fg}|d ur| d|f |r| d | d| d S )Nr?  r  )gter   cfvor  )r3   cf_typer  r  r  r:   r:   r;   r  (  s   

zWorksheet._write_cfvoc                 C   s   |  || d S r  r  r  r:   r:   r;   rx  4  r  zWorksheet._write_colorc                 C   s   | j D ]}| j|  qd S r  )r   _write_selection)r3   	selectionr:   r:   r;   r  8  s   
zWorksheet._write_selectionsc                 C   sJ   g }|r| d|f |r| d|f |r| d|f | d| d S )Nr`  
activeCellrb  r  r  )r3   r`  ra  rb  r  r:   r:   r;   r  =  s   zWorksheet._write_selectionc                 C   s6   | j }|sd S |d dkr| j|  d S | j|  d S )Nr#  r  )r   _write_split_panes_write_freeze_panes)r3   r   r:   r:   r;   r  L  s   zWorksheet._write_panesc                 C   sJ  g }|}|}t ||}	d}
d}d}d}| jr!| jd \}}}g | _|rM|rMd}
t |d}t d|}| jd||g | jd||g | jd||g n|r[d}
| jd||g nd}
| jd||g |dkrmd}n	|dkrtd}nd	}|r|d
|f |r|d|f |d|	f |d|
f |d|f | d| d S )Nr^   r   bottomRighttopRight
bottomLeftfrozenr   frozenSplitrA   xSplitySplitr  
activePanestater`  )r,   r   rt  r  )r3   r  rL   rj  rk  rl  r  y_splitx_splitr   r   r  ra  rb  rN   row_cellcol_cellr:   r:   r;   r  X  sH   


zWorksheet._write_freeze_panesc                 C   s  g }d}d}d}	d}
|}|}| j r| j d \}}	}
g | _ d}|r(td| d }|r/| |}||krS||krStd|d d d  }td|d	 d d
 d d  }t||}|s^|}	|}
|r|rd}t|d}td|}| j d||g | j d||g | j d|	|
g n|rd}| j d|	|
g nd}| j d|	|
g |r|d|df |r|d|df |d|f |r|d|f | d| d S )NFr^   r   Tre   i,  r  rd     r_   r#  rg   r  r  r  r  r]  r	  r  r
  r`  )r   r1   _calculate_x_split_widthr,   rt  r  )r3   r  rL   rj  rk  rN   r  has_selectionr   ra  rb  r  r  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  r  r   r  r_   r#  re   r  )r1   )r3   r  r  r  r  pointstwipsr:   r:   r;   r    s   z"Worksheet._calculate_x_split_widthc                 C   s^   | j }t|}|sd S d|fg}| d| |D ]}|  jd7  _| | j q| d d S )Nr  
tablePartsr   )r   rK  r  r   _write_table_partr  )r3   r   r  r  rN   r:   r:   r;   r    s   zWorksheet._write_table_partsc                 C   s&   dt | }d|fg}| d| d S )Nr  r  	tablePartr  r  r:   r:   r;   r  	  s   zWorksheet._write_table_partc                 C   sP   t | j}t | j}|s|sd S | d |r|   |r!|   | d d S )Nr  )rK  r   r   r  _write_ext_list_data_bars_write_ext_list_sparklinesr  )r3   has_data_barshas_sparklinesr:   r:   r;   r    s   


zWorksheet._write_ext_listc                 C   sB   |  d | d | jD ]}| | q| d | d d S )Nz&{78C0D931-6437-407d-A8EE-F0AAD7539E65}zx14:conditionalFormattingsr  )r  r  r   "_write_conditional_formatting_2010r  )r3   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 s6| |d	  |d
 sA| |d  |d sP|d sP| |d  |d dkr]| |d  | d | d | 	d|d  | d d S )N3http://schemas.microsoft.com/office/excel/2006/mainxmlns:xmzx14:conditionalFormattingr  ry  r  ru  r  r  r  r  r  r  r  r<  r  x14:dataBar
x14:cfRulexm:sqrefr{  )
r  _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_colorr  r  )r3   r  xmlns_xmr  r:   r:   r;   r  8  s,   




z,Worksheet._write_conditional_formatting_2010c                 C   s,   d}|d }d|fd|fg}|  d| d S )Nr  r  r?  r  r   r  )r3   r  	rule_typer  r  r:   r:   r;   r"  e  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r)| d |d	 dkr4| d |d r=| d |d sJ|d sJ| d |d dkrU| d |d dkr`| d | d| d S )Nr   rc   r  r  r  )borderr   rs  )gradientr   r  r  )r  leftToRightr  )r  r   r  )negativeBarColorSameAsPositiver   r  )$negativeBarBorderColorSameAsPositiver   r  middle)axisPositionr1  r<  )r2  r<  r  )rt  r  )r3   r  r}  r|  r  r:   r:   r;   r#  m  s2   







zWorksheet._write_x14_data_barc                 C   sH   d|fg}|dv r|  d| d S | d| | d| | d d S )Nr?  )r  r  r  r  zx14:cfvoxm:f)r  r  r  r  )r3   r+  r_  r  r:   r:   r;   r$    s   
zWorksheet._write_x14_cfvoc                 C      |  d|  d S )Nzx14:borderColorrx  r  rw  r:   r:   r;   r%       z!Worksheet._write_x14_border_colorc                 C   r4  )Nzx14:negativeFillColorr  r  rw  r:   r:   r;   r&    r6  z(Worksheet._write_x14_negative_fill_colorc                 C   r4  )Nzx14:negativeBorderColorr7  rw  r:   r:   r;   r'    r6  z*Worksheet._write_x14_negative_border_colorc                 C   r4  )Nzx14:axisColorr7  rw  r:   r:   r;   r(    r6  zWorksheet._write_x14_axis_colorc                 C   s   |  d |   t| jD ]R}| | | |d  | |d  |   | |d  | 	|d  | 
|d  | |d  | |d  |d	 rV| d
|d	  | | | d q| d | d d S )Nz&{05C60535-1F16-4fd2-B633-F4F36F0B64E0}r>  r@  r?  r:  r7  r5  r3  r2  r3  x14:sparklineGroup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_lowr  _write_sparklinesr  )r3   rT  r:   r:   r;   r    s$   



z$Worksheet._write_ext_list_sparklinesc                 C   sn   |  d t|d D ]$}|d | }|d | }|  d | d| | d| | d q| d d S )Nzx14:sparklinesr  rF  r,  zx14:sparkliner3  r!  )r  r{  r  r  )r3   rT  r'  rZ  r1  r:   r:   r;   rD    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  r*  )r3   rE  r  	xmlns_x14r  r:   r:   r;   r    s   zWorksheet._write_extc                 C   s   d}d|fg}|  d| d S )Nr  r  r9  r*  )r3   r)  r  r:   r:   r;   r:    s   
z!Worksheet._write_sparkline_groupsc                 C   s  | d}g }| dd ur&|d dkrd|d< n|d|d f d|d< | dd urE|d dkr8d|d< n|d	|d f d|d< |d
 dkrT|d
|d
 f | drb|d|d f | drl|d |ru|d|f | 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r|d!|d f | dr|d"|d f | d#r|d$ | d%| d S )&NrN  r  r  cust_max	manualMaxr@  r  cust_min	manualMinr?  rB  r.  
lineWeightr2  )dateAxisr   displayEmptyCellsAsr/  )r/  r   rH  )rH  r   rI  )rI  r   rK  )rK  r   rL  )rL  r   rJ  )rJ  r   r-  )displayXAxisr   r   )displayHiddenr   minAxisTypemaxAxisTyper0  r  r8  )r  rt  r  )r3   r  rN  r  r:   r:   r;   r;     sV   

























z Worksheet._write_sparkline_groupc                 C   s   |r|  ||  d S d S r  r5  )r3   tagrv  r:   r:   r;   _write_spark_color[   s   zWorksheet._write_spark_colorc                 C      |  d| d S )Nzx14:colorSeriesrS  rw  r:   r:   r;   r<  `   r  zWorksheet._write_color_seriesc                 C   rT  )Nzx14:colorNegativerU  rw  r:   r:   r;   r=  d   r  zWorksheet._write_color_negativec                 C   s   |  dtd d S )Nzx14:colorAxisr  )rS  r   r  r:   r:   r;   r>  h   r6  zWorksheet._write_color_axisc                 C   rT  )Nzx14:colorMarkersrU  rw  r:   r:   r;   r?  l   r  zWorksheet._write_color_markersc                 C   rT  )Nzx14:colorFirstrU  rw  r:   r:   r;   r@  p   r  zWorksheet._write_color_firstc                 C   rT  )Nzx14:colorLastrU  rw  r:   r:   r;   rA  t   r  zWorksheet._write_color_lastc                 C   rT  )Nzx14:colorHighrU  rw  r:   r:   r;   rB  x   r  zWorksheet._write_color_highc                 C   rT  )Nzx14:colorLowrU  rw  r:   r:   r;   rC  |   r  zWorksheet._write_color_lowc                 C   s   ddg}|  d| d S )N)fontId0)r?  noConversion
phoneticPrr  r  r:   r:   r;   r     s   zWorksheet._write_phonetic_prc                 C   sT  | j sd S | d | j dr| j d }| d| | j dr,| j d }| d| | j dr=| j d }| d| | j drN| j d }| d	| | j d
r_| j d
 }| d| | j drp| j d }| d| | j dr| j d }| d| | j dr| j d }| d| | j dr| j d }| d| | d d S )NignoredErrorsr  numberStoredAsTextr  	evalErrorr  r]  r  formulaRanger  unlockedFormular  emptyCellReferencer  listDataValidationr  calculatedColumnr  twoDigitTextYear)r  r  r  _write_ignored_errorr  )r3   ignored_ranger:   r:   r;   r	     s>   









zWorksheet._write_ignored_errorsc                 C   s    d|f|dfg}|  d| d S )Nrb  r   ignoredErrorr  )r3   r1  rd  r  r:   r:   r;   rc     s   zWorksheet._write_ignored_error)r\   Nr  r  )F)Nr   rl  )NNN)r  )NF)r   r   )r   r   r   r   )NNr   )NN)rc   )r^   N)r   )r`   r`   ra   ra   )r^   NN)FF)r   (  r  
__module____qualname____doc__rl   r1   r.  r>   r   r   r   r4  r2  r8  r   r!   rG  r+  r)  r   rS  r*  r[  r"  r`  r$  rI   rm  rd  rf  staticmethodry  re  r9  r~  r=  r6  r  r7  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  rP   r  r  r
  r  r  r  r  r  r*  r   r&  rl  r  r+  r^  rc  rd  ri  rm  rp  rs  rt  ru  r   rx  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  r  rJ  r  r  r$  r$  r%  r*  r  r  rc  ri  rl  rn  rs  rK  rt  r  r  r  r  r   r  r   r  r  r  r  r  rS  r  rd  r  r[  rj  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rD  rE  r)  rM  rI  rJ  rL  rK  rg  rf  r  rt  rr  rs  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  r  r  r  r  r  r  r  rx  r  r  r  r  r  r  r  r  r  r  r  r"  r#  r$  r%  r&  r'  r(  r  rD  r  r:  r;  rS  r<  r=  r>  r?  r@  rA  rB  rC  r  r	  rc  __classcell__r:   r:   r  r;   r[      sv    ]&$U

'
!
'	,	- 8
$

6
=
y%25H#
B 
C

R+<*        ^ B$

8
'%%

R
Q " */.e#(!W"NE:D^5	57	E#	;(D
N(%+7v	20M	l:G-'.Y	-r[   )Sr9  rW  r  r&  r  collectionsr   r   r>  r   	fractionsr   	functoolsr   ior   r	   r
   r   typingr   r   r   r   r   r   warningsr   xlsxwriter.chartr   xlsxwriter.colorr   xlsxwriter.commentsr   xlsxwriter.imager   xlsxwriter.urlr   r   xlsxwriter.vmlr   r^   r   r   r   r   r   
exceptionsr   r    rR   r!   rh  r"   utilityr#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r%  VERBOSErb  r>   rI   rP   r\  r  rY  rN  r  rg  r  r  rz  r[   r:   r:   r:   r;   <module>   sZ    4( 
 







