o
    ȷe)                    @   s  d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d d	lmZ d
dlmZ d
dlmZ d
dlmZ d
dlmZ d
dlmZ d
dlmZ d
dlmZ d
dlmZ d
dlmZ d
dlm Z  d
dlm!Z! d
dlm"Z" d
dlm#Z# d
dlm$Z$ d
dlm%Z% d
dlm&Z& d
dl'm(Z( e)dZ*e)dZ+e)dej,Z-dd  Z.d!d" Z/d#d$ Z0ed%d&Z1ed'd(Z2ed)d*Z3ed+d,Z4ed-d.Z5ed/d0Z6G d1d2 d2ejZ7dS )3    N)defaultdict)
namedtuple)Decimal)Fraction)StringIO)isinf)isnan)warn   )	xmlwriter)Format)Drawing)Shape)	XMLwriter)xl_rowcol_to_cell)xl_rowcol_to_cell_fast)xl_cell_to_rowcol)xl_col_to_name)xl_rangexl_color)get_sparkline_style)supported_datetime)datetime_to_excel_datetime)preserve_whitespace)quote_sheetname)DuplicateTableNamez(_x[0-9a-fA-F]{4}_)z([\x00-\x08\x0b-\x1f])z
    \bSORT\(       |
    \bLET\(        |
    \bLAMBDA\(     |
    \bSINGLE\(     |
    \bSORTBY\(     |
    \bUNIQUE\(     |
    \bXMATCH\(     |
    \bFILTER\(     |
    \bXLOOKUP\(    |
    \bSEQUENCE\(   |
    \bRANDARRAY\(  |
    \bANCHORARRAY\(c                        fdd}|S )zn
    Decorator function to convert A1 notation in cell method calls
    to the default row/col notation.

    c                    s^   zt |r|d }t| W n ty#   t|}||dd   }Y nw  | g|R i |S Nr   r
   )lenint
ValueErrorr   )selfargskwargs	first_argnew_argsmethod K/var/www/ideatree/venv/lib/python3.10/site-packages/xlsxwriter/worksheet.pycell_wrapperI   s   z'convert_cell_args.<locals>.cell_wrapperr)   r(   r+   r)   r'   r*   convert_cell_argsC   s   r-   c                    r   )zo
    Decorator function to convert A1 notation in range method calls
    to the default row/col notation.

    c           
         s   zt |rt|d  W nC tyO   d|d v r/|d d\}}t|\}}t|\}}nt|d \}}||}}||||g}	|	|dd   |	}Y nw  | g|R i |S )Nr   :r
   r   r    r!   splitr   extend)
r"   r#   r$   cell_1cell_2row_1col_1row_2col_2r&   r'   r)   r*   r+   `   s    
z(convert_range_args.<locals>.cell_wrapperr)   r,   r)   r'   r*   convert_range_argsZ   s   r8   c                    r   )zq
    Decorator function to convert A1 notation in columns method calls
    to the default row/col notation.

    c           	         s   zt |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/   )	r"   r#   r$   r2   r3   _r5   r7   r&   r'   r)   r*   column_wrapper   s   	z+convert_column_args.<locals>.column_wrapperr)   )r(   r>   r)   r'   r*   convert_column_argsy   s   r?   Stringzstring, formatNumberznumber, formatBlankformatBooleanzboolean, formatFormulazformula, format, valueArrayFormulaz$formula, format, value, range, atypec                       s
  e Zd ZdZ fddZdd Zedd Zdd	 ZedddZ	dddZ
edddZdddZedddZdddZedddZdddZe	dddZe	dddZd d! Z		"dd#d$Zedd%d&Zdd'd(Zedd)d*Zdd+d,Ze	
	
dd-d.Z	
	
dd/d0Zed1d2 Zd3d4 Zd5d6 Zedd7d8Zedd9d:Z edd;d<Z!edd=d>Z"edd?d@Z#eddAdBZ$dCdD Z%ddFdGZ&dHdI Z'dJdK Z(dLdM Z)dNdO Z*dPdQ Z+dRdS Z,e-	
	
ddTdUZ.e-	
	
ddVdWZ/ddXdYZ0ddZd[Z1dd\d]Z2e	
dd^d_Z3ed`da Z4dbdc Z5ddde Z6e	
ddfdgZ7e	
ddhdiZ8e	
ddjdkZ9eddldmZ:edndo Z;eddpdqZ<	r	ddsdtZ=eddudvZ>eddwdxZ?ddzd{Z@d|d} ZAd~d ZBdd ZCdddZDdddZEedddZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLdddZMdddZNdddZOdddZPe-dddZQdddZRdd ZSdd ZTedd ZUdd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dd Z\dddZ]dddZ^dd Z_dd Z`dddZadd ZbddĄ ZcddƄ ZdddȄ Zeddʄ Zfdd̄ Zgdd΄ ZhddЄ Zidd҄ ZjddԄ Zkddք Zldd؄ Zmddڄ Zndd܄ ZodddބZpdddZqdd Zrdd Zsdd Ztdd Zudd Zvdd Zwdd Zxdd Zydd Zzdd Z{dd Z|dd Z}dddZ~dddZdd Zdd  Zdd Zdd Zdd Zdd Zd	d
 ZdӐddZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zdd-d.Zd/d0 Zdؐd1d2ZdӐd3d4Zd5d6 Zd7d8 Zd9d: Zd;d< Zd=d> Zd?d@ ZdAdB ZdCdD ZdEdF ZdGdH ZdIdJ ZdKdL ZdMdN Z	
	
d֐dOdPZ	
	
d֐dQdRZdSdT ZdUdV ZdWdX ZdYdZ Zd[d\ Zd]d^ Zd_d` Zdadb Zdcdd Zdedf Zdgdh Zdidj Zdkdl Zdmdn Zdodp Zdqdr Zdsdt Zdudv Zdwdx Zdydz Zd{d| Zd}d~ Zdd Zdd Zdd ZÐdd ZĐdd ZŐdӐddZƐdd Zǐdd ZȐdd Zɐdd Zʐdd Zːdd Z̐dd Z͐dd Zΐdd Zϐdd ZАdd Zѐdd ZҐdd ZӐdd ZԐdd ZՐdd Z֐dd Zאdd Zؐdd Zِdd Zڐdd Zېdd Zܐdd Zݐdd Zސdd Zߐdd Zdd Zdd ZdÐdĄ ZdŐdƄ ZdǐdȄ Zdɐdʄ Zdːd̄ Zd͐d΄ ZdϐdЄ Zdѐd҄ Z  ZS (  	Worksheetz=
    A class for writing the Excel XLSX Worksheet file.

    c                    s*  t t|   d| _d| _d| _d| _d| _d| _d| _	g | _
d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _i | _g | _d| _d| _d| _d| _g | _d	| _d| _d| _d| _d
| _ d| _!d| _"d| _#d| _$d| _%d| _&d| _'d| _(d| _)d| _*d| _+d| _,g | _-g | _.g | _/d| _0d| _1d| _2d| _3d| _4d| _5d| _6d| _7d| _8d| _9d| _:d| _;d| _<d| _=d| _>d| _?d| _@g | _Ag | _Bi | _Cg | _Dd| _Ei | _FtGtH| _Id| _Jd
| _Kd| _Ld| _Md
| _Nd| _Od| _Pd| _Qd| _Rd
| _Sd
| _Td
| _Ud| _Vd| _Wd| _Xd| _Yd| _Zd| _[d| _\i | _]g | _^tGtH| __g | _`i | _ad| _bd| _cd| _dtGtH| _eg | _fd| _gd| _hd| _ig | _jd| _kd| _ld| _mg | _nd| _oi | _pi | _qi | _ri | _si | _td| _ud| _vd
| _wd| _xd| _yg | _zg | _{g | _|g | _}g | _~g | _g | _g | _g | _g | _g | _g | _g | _g | _i | _d| _i | _d| _i | _d| _d| _d| _d| _d| _g | _i | _g | _d| _d
| _d| _d| _d| _tGtH| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _id| _d| _d| _d| _d| _i | _d| _d| _d| _dS )z
        Constructor.

        Nr   Fi  i   i @        r
   Tffffff?      ?333333?d         \( @@      i  )superrG   __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colinfo
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_row_zeroednameswrite_matchtablemerge	row_spanshas_vmlhas_header_vmlhas_commentscommentscomments_listcomments_authorcomments_visiblevml_shape_idbuttons_listvml_header_idautofilter_areaautofilter_reffilter_range	filter_onfilter_colsfilter_type	col_sizes	row_sizescol_formatscol_size_changedrow_size_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background_bytesrstringprevious_rowvalidationscond_formatsdata_bars_2010use_data_bars_2010dxf_priority	page_viewvba_codename	date_1904
hyperlinksstrings_to_numbersstrings_to_urlsnan_inf_to_errorsstrings_to_formulasdefault_date_formatdefault_url_formatremove_timezone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r"   	__class__r)   r*   rU      sZ  




zWorksheet.__init__c                 G   sf  |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 rq| jrKtd|rK| j||g|R  S | jr^td|r^| j||g|R  S | jrqtd|rq| j||g|R  S | j	rz!t
|}| jst|st|s| j|||g|d	d  R  W S W n	 ty   Y nw | j||g|R  S | j||g|R  S )
NrI   =z{=}r.   (ftp|http)s?://mailto:z(in|ex)ternal:r
   )_write_blankr   
startswith_write_formulaendswithr   rematch
_write_urlr   floatr   r   r   _write_numberr!   _write_string)r"   tokenrowr;   r#   fr)   r)   r*   _write_token_as_string  s8    z Worksheet._write_token_as_stringc                 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r"   r  r;   r#   r)   r)   r*   write  s   zWorksheet.writec           	      G   s  t |std|d }t|}|| jv r+| j| }|| ||g|R  }|d u r)n|S |d u r9| j||g|R  S |tu rG| j||g|R  S |ttt	t
fv rY| j||g|R  S |tu rh| 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 zt|}| j|||g|dd  R  W S  ty   Y n ty   tdt| w zt| | j||g|R  W S  ty	   tdt| w )Nz,write() takes at least 4 arguments (3 given)r   r
   zUnsupported type %s in write())r   	TypeErrortyper   r  bool_write_booleanr  r    r   r   r  strr  datetimedatetime	timedelta_write_datetime
isinstancer   r!   r  )	r"   r  r;   r#   r  
token_typewrite_handlerfunction_returnr  r)   r)   r*   r    s\   



 zWorksheet._writeNc                 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  )r"   r  r;   stringcell_formatr)   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   )
_check_dimensionsr   rc   rZ   rX   _get_shared_string_indexr   _write_single_rowcell_string_tupler   )r"   r  r;   r)  r*  	str_errorstring_indexr)   r)   r*   r  "  s   
zWorksheet._write_stringc                 C   r(  )a  
        Write a number to a worksheet cell.

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

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

        )r  r"   r  r;   numberr*  r)   r)   r*   write_number>     zWorksheet.write_numberc                 C   s   t |st|r*| jr&t |r| ||d|dS t|r%| ||d|dS ntd| ||r2dS | jr?|| jkr?| | t	||| j
| |< dS )N#NUM!z1/0#DIV/0!zUNAN/INF not supported in write_number() without 'nan_inf_to_errors' Workbook() optionr.  r   )r   r   r   r	  r  r0  rZ   r   r2  cell_number_tupler   r6  r)   r)   r*   r  Q  s(   
zWorksheet._write_numberc                 C   r(  )a  
        Write a blank cell with formatting to a worksheet cell. The blank
        token is ignored and the format only is written to the cell.

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

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

        )r  r"   r  r;   blankr*  r)   r)   r*   write_blankm  r,  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.  )r0  rZ   r   r2  cell_blank_tupler   r=  r)   r)   r*   r    s   
zWorksheet._write_blankr   c                 C   s   |  |||||S )a  
        Write a formula to a worksheet cell.

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

        Returns:
            0:  Success.
            -1: Row or column is out of worksheet bounds.
            -2: Formula can't be None or empty.

        )r	  r"   r  r;   formular*  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.  rI   zFormula can't be None or empty{r  r   )r0  r	   re_dynamic_functionsearchwrite_dynamic_array_formular  r
  _write_array_formula_prepare_formularZ   r   r2  cell_formula_tupler   rA  r)   r)   r*   r	    s&   


zWorksheet._write_formulac              
   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)rF  rG  rH  rI  )r"   	first_row	first_collast_rowlast_colrB  r*  rC  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)rI  r   )	r"   rM  rN  rO  rP  rB  r*  rC  errorr)   r)   r*   rH    s   
z%Worksheet.write_dynamic_array_formulac                 C   s  | 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|}| js|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/d0|}td1d2|}td3d4|}td5d6|}td7d8|}td9d:|}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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|}|S (  NrE  r
   r  r  r.  z_xlfn.z\bLET\(z
_xlfn.LET(z
\bLAMBDA\(z_xlfn.LAMBDA(z
\bSINGLE\(z_xlfn.SINGLE(z
\bSORTBY\(z_xlfn.SORTBY(z
\bUNIQUE\(z_xlfn.UNIQUE(z
\bXMATCH\(z_xlfn.XMATCH(z\bSORT\(z_xlfn._xlws.SORT(z\bXLOOKUP\(z_xlfn.XLOOKUP(z\bSEQUENCE\(z_xlfn.SEQUENCE(z
\bFILTER\(z_xlfn._xlws.FILTER(z\bRANDARRAY\(z_xlfn.RANDARRAY(z\bANCHORARRAY\(z_xlfn.ANCHORARRAY(z\bCOT\(z
_xlfn.COT(z\bCSC\(z
_xlfn.CSC(z\bIFS\(z
_xlfn.IFS(z\bPHI\(z
_xlfn.PHI(z\bRRI\(z
_xlfn.RRI(z\bSEC\(z
_xlfn.SEC(z\bXOR\(z
_xlfn.XOR(z\bACOT\(z_xlfn.ACOT(z\bBASE\(z_xlfn.BASE(z\bCOTH\(z_xlfn.COTH(z\bCSCH\(z_xlfn.CSCH(z\bDAYS\(z_xlfn.DAYS(z\bIFNA\(z_xlfn.IFNA(z\bSECH\(z_xlfn.SECH(z	\bACOTH\(z_xlfn.ACOTH(z	\bBITOR\(z_xlfn.BITOR(z	\bF.INV\(z_xlfn.F.INV(z	\bGAMMA\(z_xlfn.GAMMA(z	\bGAUSS\(z_xlfn.GAUSS(z	\bIMCOT\(z_xlfn.IMCOT(z	\bIMCSC\(z_xlfn.IMCSC(z	\bIMSEC\(z_xlfn.IMSEC(z	\bIMTAN\(z_xlfn.IMTAN(z	\bMUNIT\(z_xlfn.MUNIT(z	\bSHEET\(z_xlfn.SHEET(z	\bT.INV\(z_xlfn.T.INV(z	\bVAR.P\(z_xlfn.VAR.P(z	\bVAR.S\(z_xlfn.VAR.S(z
\bARABIC\(z_xlfn.ARABIC(z
\bBITAND\(z_xlfn.BITAND(z
\bBITXOR\(z_xlfn.BITXOR(z
\bCONCAT\(z_xlfn.CONCAT(z
\bF.DIST\(z_xlfn.F.DIST(z
\bF.TEST\(z_xlfn.F.TEST(z
\bIMCOSH\(z_xlfn.IMCOSH(z
\bIMCSCH\(z_xlfn.IMCSCH(z
\bIMSECH\(z_xlfn.IMSECH(z
\bIMSINH\(z_xlfn.IMSINH(z
\bMAXIFS\(z_xlfn.MAXIFS(z
\bMINIFS\(z_xlfn.MINIFS(z
\bSHEETS\(z_xlfn.SHEETS(z
\bSKEW.P\(z_xlfn.SKEW.P(z
\bSWITCH\(z_xlfn.SWITCH(z
\bT.DIST\(z_xlfn.T.DIST(z
\bT.TEST\(z_xlfn.T.TEST(z
\bZ.TEST\(z_xlfn.Z.TEST(z\bCOMBINA\(z_xlfn.COMBINA(z\bDECIMAL\(z_xlfn.DECIMAL(z\bRANK.EQ\(z_xlfn.RANK.EQ(z\bSTDEV.P\(z_xlfn.STDEV.P(z\bSTDEV.S\(z_xlfn.STDEV.S(z\bUNICHAR\(z_xlfn.UNICHAR(z\bUNICODE\(z_xlfn.UNICODE(z\bBETA.INV\(z_xlfn.BETA.INV(z\bF.INV.RT\(z_xlfn.F.INV.RT(z\bNORM.INV\(z_xlfn.NORM.INV(z\bRANK.AVG\(z_xlfn.RANK.AVG(z\bT.INV.2T\(z_xlfn.T.INV.2T(z\bTEXTJOIN\(z_xlfn.TEXTJOIN(z\bAGGREGATE\(z_xlfn.AGGREGATE(z\bBETA.DIST\(z_xlfn.BETA.DIST(z\bBINOM.INV\(z_xlfn.BINOM.INV(z\bBITLSHIFT\(z_xlfn.BITLSHIFT(z\bBITRSHIFT\(z_xlfn.BITRSHIFT(z\bCHISQ.INV\(z_xlfn.CHISQ.INV(z\bF.DIST.RT\(z_xlfn.F.DIST.RT(z\bFILTERXML\(z_xlfn.FILTERXML(z\bGAMMA.INV\(z_xlfn.GAMMA.INV(z\bISFORMULA\(z_xlfn.ISFORMULA(z\bMODE.MULT\(z_xlfn.MODE.MULT(z\bMODE.SNGL\(z_xlfn.MODE.SNGL(z\bNORM.DIST\(z_xlfn.NORM.DIST(z\bPDURATION\(z_xlfn.PDURATION(z\bT.DIST.2T\(z_xlfn.T.DIST.2T(z\bT.DIST.RT\(z_xlfn.T.DIST.RT(z\bBINOM.DIST\(z_xlfn.BINOM.DIST(z\bCHISQ.DIST\(z_xlfn.CHISQ.DIST(z\bCHISQ.TEST\(z_xlfn.CHISQ.TEST(z\bEXPON.DIST\(z_xlfn.EXPON.DIST(z\bFLOOR.MATH\(z_xlfn.FLOOR.MATH(z\bGAMMA.DIST\(z_xlfn.GAMMA.DIST(z\bISOWEEKNUM\(z_xlfn.ISOWEEKNUM(z\bNORM.S.INV\(z_xlfn.NORM.S.INV(z\bWEBSERVICE\(z_xlfn.WEBSERVICE(z\bERF.PRECISE\(z_xlfn.ERF.PRECISE(z\bFORMULATEXT\(z_xlfn.FORMULATEXT(z\bLOGNORM.INV\(z_xlfn.LOGNORM.INV(z\bNORM.S.DIST\(z_xlfn.NORM.S.DIST(z\bNUMBERVALUE\(z_xlfn.NUMBERVALUE(z\bQUERYSTRING\(z_xlfn.QUERYSTRING(z\bCEILING.MATH\(z_xlfn.CEILING.MATH(z\bCHISQ.INV.RT\(z_xlfn.CHISQ.INV.RT(z\bCONFIDENCE.T\(z_xlfn.CONFIDENCE.T(z\bCOVARIANCE.P\(z_xlfn.COVARIANCE.P(z\bCOVARIANCE.S\(z_xlfn.COVARIANCE.S(z\bERFC.PRECISE\(z_xlfn.ERFC.PRECISE(z\bFORECAST.ETS\(z_xlfn.FORECAST.ETS(z\bHYPGEOM.DIST\(z_xlfn.HYPGEOM.DIST(z\bLOGNORM.DIST\(z_xlfn.LOGNORM.DIST(z\bPERMUTATIONA\(z_xlfn.PERMUTATIONA(z\bPOISSON.DIST\(z_xlfn.POISSON.DIST(z\bQUARTILE.EXC\(z_xlfn.QUARTILE.EXC(z\bQUARTILE.INC\(z_xlfn.QUARTILE.INC(z\bWEIBULL.DIST\(z_xlfn.WEIBULL.DIST(z\bCHISQ.DIST.RT\(z_xlfn.CHISQ.DIST.RT(z\bFLOOR.PRECISE\(z_xlfn.FLOOR.PRECISE(z\bNEGBINOM.DIST\(z_xlfn.NEGBINOM.DIST(z\bPERCENTILE.EXC\(z_xlfn.PERCENTILE.EXC(z\bPERCENTILE.INC\(z_xlfn.PERCENTILE.INC(z\bCEILING.PRECISE\(z_xlfn.CEILING.PRECISE(z\bCONFIDENCE.NORM\(z_xlfn.CONFIDENCE.NORM(z\bFORECAST.LINEAR\(z_xlfn.FORECAST.LINEAR(z\bGAMMALN.PRECISE\(z_xlfn.GAMMALN.PRECISE(z\bPERCENTRANK.EXC\(z_xlfn.PERCENTRANK.EXC(z\bPERCENTRANK.INC\(z_xlfn.PERCENTRANK.INC(z\bBINOM.DIST.RANGE\(z_xlfn.BINOM.DIST.RANGE(z\bFORECAST.ETS.STAT\(z_xlfn.FORECAST.ETS.STAT(z\bFORECAST.ETS.CONFINT\(z_xlfn.FORECAST.ETS.CONFINT(z\bFORECAST.ETS.SEASONALITY\(z_xlfn.FORECAST.ETS.SEASONALITY()r  r
  r  subr   r"   rB  r)   r)   r*   rJ    sL  


zWorksheet._prepare_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   )
r0  r   rJ  rZ   r   r2  cell_arformula_tupler   ranger  )r"   rM  rN  rO  rP  rB  r*  rC  atype
cell_ranger  r;   r)   r)   r*   rI    s<   



zWorksheet._write_array_formulac                 C   r(  )a  
        Write a date or time to a worksheet cell.

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

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

        )r#  )r"   r  r;   r   r*  r)   r)   r*   write_datetime  r9  zWorksheet.write_datetimec                 C   sZ   |  ||rdS | jr|| jkr| | | |}|d u r!| j}t||| j| |< dS )Nr.  r   )r0  rZ   r   r2  _convert_date_timer   r<  r   )r"   r  r;   r   r*  r7  r)   r)   r*   r#    s   

zWorksheet._write_datetimec                 C   r(  )a  
        Write a boolean value to a worksheet cell.

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

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

        )r  )r"   r  r;   booleanr*  r)   r)   r*   write_boolean  r9  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   )r0  rZ   r   r2  cell_boolean_tupler   )r"   r  r;   r\  r*  rC  r)   r)   r*   r    s   
zWorksheet._write_booleanc                 C   s   |  ||||||S )a  
        Write a hyperlink to a worksheet cell.

        Args:
            row:    The cell row (zero indexed).
            col:    The cell column (zero indexed).
            url:    Hyperlink url.
            format: An optional cell Format object.
            string: An optional display string for the hyperlink.
            tip:    An optional tooltip.
        Returns:
            0:  Success.
            -1: Row or column is out of worksheet bounds.
            -2: String longer than 32767 characters.
            -3: URL longer than Excel limit of 255 characters.
            -4: Exceeds Excel limit of 65,530 urls per worksheet.
        )r  )r"   r  r;   urlr*  r)  tipr)   r)   r*   	write_url5  s   zWorksheet.write_urlc                 C   s  |  ||rdS |d u r|}d}|dr#|dd}|dd}d}d}|drD|dd}|dd	}|dd}|dd	}d
}|dd}d}	t|| jkrYtd dS |}
|dkrd|v rl|dd\}}
nd }
| |}|
d ur~|s~| |
}
t	d|st	d|rd| }t
dd|}|
pd}| j}t||kst||krtd||f  dS |  jd7  _| jdkrtd|  dS | jr|| jkr| | |d u r| j}| |||| |||
|d| j| |< |	S )Nr.  r
   	internal:rI      F	external:/\Tr  r   zFIgnoring URL since it exceeds Excel's string limit of 32767 charactersr/  #\w:\\file:///z^\.\\zfIgnoring URL '%s' with link or location/anchor > %d characters since it exceeds Excel's limit for URLSi  zNIgnoring URL '%s' since it exceeds Excel's limit of 65,530 URLS per worksheet.)	link_typer_  r  r`  )r0  r  replacer   rc   r	   r0   _escape_urlr  r  rT  r   r   rZ   r   r2  r   r  r   )r"   r  r;   r_  r*  r)  r`  rm  externalr4  url_strtmp_url_strmax_urlr)   r)   r*   r  L  sp   





zWorksheet._write_urlc                 G   r  )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_stringr  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 ]I}t|tsp|dkrW|
|	 |
| n|
| |dkrgt
d  d	S |t	|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 }|| jkrt
d dS | js| j|}n|}| jr|| jkr| | t||| j| |< dS )Nr   r.  rC   rc  zfYou must specify more than 2 format/fragments for rich strings. Ignoring input in write_rich_string().rI   zYExcel doesn't allow empty strings in rich strings. Ignoring input in write_rich_string().rl  r)  zaExcel doesn't allow 2 consecutive formats in rich strings. Ignoring input in write_rich_string().rk  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().r/  )listr0  r$  r   popr   r   r   _set_filehandler   r	   append_xml_start_tag_write_fontr   _xml_data_element_xml_end_tagfhgetvaluerc   rZ   rX   r1  r   r2  r3  r   )r"   r  r;   r#   tokensr*  
str_lengthr5  r  default	fragmentspreviousposr  
attributesr)  r)   r)   r*   rt    sr   








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   )r"   	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   r  r"   r  r;   datar*  r  rS  r)   r)   r*   	write_rowJ     
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   r  r  r)   r)   r*   write_columna  r  zWorksheet.write_columnc                 C   s   |  ||ddrtd||f  dS |du ri }|dd}|dd}|dd	}|d
d	}|dd}	|dd}
|dd}|dd}|dd}|dd}|d|}|sjtj|sjtd|  dS | j||||||||	|
||||g dS )a  
        Insert an image with its top-left corner in a worksheet cell.

        Args:
            row:      The cell row (zero indexed).
            col:      The cell column (zero indexed).
            filename: Path and filename for in supported formats.
            options:  Position, scale, url and data stream of the image.

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

        Tz Cannot insert image at (%d, %d).r.  Nx_offsetr   y_offsetx_scaler
   y_scaler_  r`  object_positionrc  
image_datadescription
decorativeFpositioningImage file '%s' not found.)r0  r	   getospathexistsr   r}  )r"   r  r;   filenameoptionsr  r  r  r  r_  r`  anchorr  r  r  r)   r)   r*   insert_imagex  s0   zWorksheet.insert_imagec                 C   s   |  ||ddrtd||f  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 (%d, %d).r.  NrI   r  r   r  r  r
   r  r  r  r  F)r0  r	   r  r   r}  )r"   r  r;   textr  r  r  r  r  r  r  r  r)   r)   r*   insert_textbox  s&   
zWorksheet.insert_textboxc                 C   s  |  ||ddrtd||f  dS |du ri }|js"|jr(|jjr(td dS d|_|jr2d|j_|dd}|dd}|d	d
}|dd
}|dd
}	|dd}
|dd}|jd
krd|j}|jd
krl|j}|jrr|j}|jrx|j}| j	
||||||||	|
|g
 dS )a  
        Insert an chart with its top-left corner in a worksheet cell.

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

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

        Tz Cannot insert chart at (%d, %d).r.  Nz7Chart cannot be inserted in a worksheet more than once.r  r   r  r  r
   r  r  r  r  F)r0  r	   already_insertedcombinedr  r  r  r  r  r   r}  )r"   r  r;   chartr  r  r  r  r  r  r  r  r)   r)   r*   insert_chart  sF   

zWorksheet.insert_chartc                 C   sT   |du ri }|  ||rdS t|| jkrdS d| _d| _||||g| j| |< dS )a  
        Write a comment to a worksheet cell.

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

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

        Nr.  r/  r
   r   )r0  r   rc   r   r   r   )r"   r  r;   commentr  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.

        r
   N)r   r   r)   r)   r*   show_comments3     
zWorksheet.show_commentsFc                 C   s0   |st j|std|  dS || _|| _dS )z
        Set a background image for a worksheet.

        Args:
            filename:       Path and filename for in supported formats.
            is_byte_stream: File is a stream of bytes.
        Returns:
            Nothing.

        r  r.  N)r  r  r  r	   r   r   )r"   r  is_byte_streamr)   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   )r"   authorr)   r)   r*   set_comments_authorS  r  zWorksheet.set_comments_authorc                 C   s   | j S )zw
        Retrieve the worksheet name.

        Args:
            None.

        Returns:
            Nothing.

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

        Note: An active worksheet cannot be hidden.

        Args:
            None.

        Returns:
            Nothing.

        r   r
   N)rj   rp   rW   r   activesheetr   r)   r)   r*   activaten  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)rp   rj   r   r)   r)   r*   select  s   
zWorksheet.selectc                 C   r  )zv
        Hide the current worksheet.

        Args:
            None.

        Returns:
            Nothing.

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

        Note: A selected worksheet cannot be hidden.

        Args:
            None.

        Returns:
            Nothing.

        r   N)rj   rW   r   
firstsheetr   r)   r)   r*   set_first_sheet  s   zWorksheet.set_first_sheetc                 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 |	dk rHd}	|	d	krNd	}	|	| jkrV|	| _||||||	|g| jd
| < d| _|du rn| j}t||d D ]}||g| j|< |r|| j|< qud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.

        NTrj   F	collapsedlevelr   r.     z%05dr
   )	r  r0  r   rh   r   r   rW  r   r   )r"   rN  rP  widthr*  r  
ignore_rowrj   r  r  
ignore_colr;   r)   r)   r*   
set_column  sD   


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  )r"   rN  rP  r  r*  r  r)   r)   r*   set_column_pixels  s
   

zWorksheet.set_column_pixelsc           	      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}|dk rAd}|d	krGd	}|| jkrO|| _|||||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.  rj   Fr  r  r
   r  T)rf   r0  r   r  r   r   r   r   )	r"   r  heightr*  r  min_colrj   r  r  r)   r)   r*   set_row  s2   

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  )r"   r  r  r*  r  r)   r)   r*   set_row_pixelsW  s   
zWorksheet.set_row_pixelsc                 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   )r"   r  hide_unused_rowsr)   r)   r*   set_default_rowk  s   

zWorksheet.set_default_rowc           	      C   s   ||kr||krt d dS ||kr||}}||kr ||}}| ||r(dS | ||r0dS | j||||g | |||| t||d D ]}t||d D ]}||kr]||kr]qR| ||d| qRqIdS )a3  
        Merge a range of cells.

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

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

        zCan't merge single cellNr.  r
   rI   r   )r	   r0  r   r}  r  rW  r  )	r"   rM  rN  rO  rP  r  r*  r  r;   r)   r)   r*   merge_range  s(   

zWorksheet.merge_rangec                 C   s\   ||k r	||}}||k r||}}|  ||||}t||||}|| _|| _||g| _dS )a  
        Set the autofilter area in the worksheet.

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

        Returns:
             Nothing.

        N)_convert_name_arear   r   r   r   )r"   rM  rN  rO  rP  arearefr)   r)   r*   
autofilter  s   

zWorksheet.autofilterc                 C   s`  | j s	td dS zt| W n! ty0   |}t|d \}}|| jkr.td|  Y dS Y nw | j\}}||k s>||krItd|||f  dS | |}t|dks`t|dks`t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()Nr9   Invalid column '%s'z6Column '%d' outside autofilter() column range (%d, %d)rJ   r  z+Incorrect number of tokens in criteria '%s'rc  r   r
         )r   r	   r    r!   r   rb   r   _extract_filter_tokensr   _parse_filter_expressionfilter_column_listr   r   r   )r"   r;   criteria
col_letterr=   	col_firstcol_lastr  r)   r)   r*   filter_column  s>   

	
$


zWorksheet.filter_columnc                 C   s   | j s	td dS zt| W n! ty0   |}t|d \}}|| jkr.td|  Y dS Y nw | j\}}||k s>||krItd|||f  dS || j|< d| j|< d| _	dS )z
        Set the column filter criteria in Excel 2007 list style.

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

        Returns:
             Nothing.

        r  Nr9   r  z5Column '%d' outside autofilter() column range (%d,%d)r
   )
r   r	   r    r!   r   rb   r   r   r   r   )r"   r;   filtersr  r=   r  r  r)   r)   r*   r    s,   

	


zWorksheet.filter_column_listc                 C   s  |  ||ddr
dS |  ||ddrdS |du ri }n| }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 ]}||vrdtd|   dS qUd|v ro|d |d< d|v ry|d |d< d|vrtd dS ddddddddddddd}|d |vrt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.d0d1d2d1d3d4d5d4d6d7d8d7}	|d |	vr'td9|d   dS |	|d  |d< |d d!ks=|d d$krId	|vrHtd: dS nd|d	< d;d<d=d>}
d|vr]d;|d< n|d |
vrntd?|d   dS |
|d  |d< |d dks|d dkr|d rt|d r| |d }d@| |d< |d	 rt|d	 r| |d	 }d@| |d	< |drt|d dAkrtdB|d   dS |drt|d dAkrtdC|d   dS |drt|d dDkrtdE|d   dS |drt|d dDkrtdF|d   dS |d dkr@t|d t	u r@| j
|d  }t|dDkr@tdG|  dS d
|vrId<|d
< d|vrRd<|d< d|vr[d<|d< d|vrdd<|d< ||||gg|dH< d|v r{|dH |d  | j| d;S )Ia  
        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validater  rC  sourceminimummaximumignore_blankdropdown
show_inputinput_titleinput_message
show_errorerror_titleerror_message
error_typeother_cellsz+Unknown parameter '%s' in data_validation()r/  z5Parameter 'validate' is required in data_validation()nonewholedecimalrz  r   r!  
textLengthcustom)anyz	any valuezwhole numberr  integerr  rz  r   r!  ztext lengthlengthr  zJUnknown validation type '%s' for parameter 'validate' in data_validation()betweenz5Parameter '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<=zHUnknown criteria type '%s' for parameter 'criteria' in data_validation()zcParameter 'maximum' is required in data_validation() when using 'between' or 'not between' criteriar   r
   rc  )stopwarninginformationzJUnknown criteria type '%s' for parameter 'error_type' in data_validation()%.16g    z6Length of input title '%s' exceeds Excel's limit of 32z6Length of error title '%s' exceeds Excel's limit of 32   z9Length of input message '%s' exceeds Excel's limit of 255z9Length of error message '%s' exceeds Excel's limit of 255zSLength of list items '%s' exceeds Excel's limit of 255, use a formula range insteadcells)r0  copykeysr	   r  r   r[  r   r  rz  	_csv_joinr1   r   r}  )r"   rM  rN  rO  rP  r  valid_parameters	param_keyvalid_typescriteria_typeserror_types	date_timerB  r)   r)   r*   data_validation:  s  	
	





 




zWorksheet.data_validationc                 C   sj  |  ||ddr
dS |  ||ddrdS |du ri }n| }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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(S qd|vrtd) d(S i d*d+d,d,d-d-d.d/d0d1d2d3d4d5d6d5d7d7d8d9d:d;d<d=d>d?d@dAdBdBdCdCdDdEdFdGdH}|d |vrtdI|d   d(S |d d6krd6|dJ< ||d  |d< i dKdKdLdMdNdOdPdOdQdOdRdSdTdSdUdSdVdWdXdWdYdZd[dZd\d]d^d]d_d`dad`dbdcdddedfdgdhdidjdkdldmdndodldodp}	d|v rc|d |	v rc|	|d  |d< |d d,ksq|d d-krd+|d< d|v rt|d stdq d(S | |d }
dr|
 |d< d|v rt|d stds d(S | |d }
dr|
 |d< d	|v rt|d	 stdt d(S | |d	 }
dr|
 |d	< i dudvdwdxdydzd{d|d}d~dddddddddddddddddddddddd}|d dGkr^|d$std dS |d$ |vr+td|d$   d(S ||d$  |d$< d|d< |d$ drDd|d< n|d$ drPd|d< | |d|d|d< ||krh||}}||krr||}}t	||||}t
||}d|v r|d }|dd}d|v r|d r|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 d7krf|d dckrdc|d< d|d |f |d< nT|d ddkr(d|d< d|d |f |d< n>|d dekrCde|d< d|t|d |d f |d< n#|d dfkr^df|d< d|t|d |d f |d< ntd|d   |d d9kr|d dgkr{d| |d< n|d dhkrd| |d< n|d dkrd| |d< n{|d dikrd||f |d< nk|d djkrd||f |d< n[|d dkkrd||f |d< nK|d dlkrd||f |d< n;|d dmkrd|||f |d< n*|d dnkrd||f |d< n|d dokr
d||||f |d< ntd|d   |d d;krd| |d< |d d=kr,d| |d< |d d?kr9d| |d< |d dAkrFd| |d< |d dBkrd|d< d|d< d|d< d|d< |dd |dd |dd |dd |dd |dd¡ t|d |d< t|d |d< |d dCkrd|d< d|d< |dd |ddá |dd |dd |dd |ddġ |ddš |ddơ t|d |d< t|d |d< t|d |d< d|vrd|d< |d dEkrd|d< |dsd|d< d|d< n|d |d< |ds d|d< d|d< n|d |d< |dd |dd |dd̡ |d|d  |d"d͡ |dd͡ |dd͡ |dd |ddΡ |ddΡ |dd͡ |dd͡ |d d |d!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 dP|d< W n ttfy   Y nw z|d dP|d< W n ttfy   Y nw z|d dP|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.  Nr  rC   r  rC  r  r  stop_if_truemin_typemid_typemax_type	min_value	mid_value	max_value	min_color	mid_color	max_color
min_length
max_lengthmulti_range	bar_colorbar_negative_colorbar_negative_color_same	bar_solidbar_border_colorbar_negative_border_colorbar_negative_border_color_samebar_no_borderbar_directionbar_axis_positionbar_axis_colorbar_onlydata_bar_2010
icon_stylereverse_icons)
icons_onlyiconsz.Unknown parameter '%s' in conditional_format()r/  z4Parameter 'type' is required in conditional_format()cell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)rB  icon_setz?Unknown value '%s' for parameter 'type' in conditional_format()	directionr  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r	  r
  
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 monthz5Conditional format 'value' must be a datetime object.r  z7Conditional format 'minimum' must be a datetime object.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5Ratingz^The 'icon_style' parameter must be specified when 'type' == 'icon_set' in conditional_format()rk  z/Unknown icon_style '%s' in conditional_format()rJ   total_icons4r  5r  r9  $rI   priorityr
   is_data_bar_2010zNOT(ISERROR(SEARCH("%s",%s)))rB  notContainsTextzISERROR(SEARCH("%s",%s))zLEFT(%s,%d)="%s"zRIGHT(%s,%d)="%s"z2Invalid text criteria '%s' in conditional_format()zFLOOR(%s,1)=TODAY()-1zFLOOR(%s,1)=TODAY()tomorrowzFLOOR(%s,1)=TODAY()+1z0AND(TODAY()-FLOOR(%s,1)<=6,FLOOR(%s,1)<=TODAY())z]AND(TODAY()-ROUNDDOWN(%s,0)>=(WEEKDAY(TODAY())),TODAY()-ROUNDDOWN(%s,0)<(WEEKDAY(TODAY())+7))z\AND(TODAY()-ROUNDDOWN(%s,0)<=WEEKDAY(TODAY())-1,ROUNDDOWN(%s,0)-TODAY()<=7-WEEKDAY(TODAY()))z_AND(ROUNDDOWN(%s,0)-TODAY()>(7-WEEKDAY(TODAY())),ROUNDDOWN(%s,0)-TODAY()<(15-WEEKDAY(TODAY())))zdAND(MONTH(%s)=MONTH(TODAY())-1,OR(YEAR(%s)=YEAR(TODAY()),AND(MONTH(%s)=1,YEAR(A1)=YEAR(TODAY())-1)))z4AND(MONTH(%s)=MONTH(TODAY()),YEAR(%s)=YEAR(TODAY()))zeAND(MONTH(%s)=MONTH(TODAY())+1,OR(YEAR(%s)=YEAR(TODAY()),AND(MONTH(%s)=12,YEAR(%s)=YEAR(TODAY())+1)))z9Invalid time_period criteria '%s' in conditional_format()zLEN(TRIM(%s))=0zLEN(TRIM(%s))>0zISERROR(%s)zNOT(ISERROR(%s))
colorScaleminmaxr   z#FF7128z#FFEF9C
percentilez#F8696Bz#FFEB84z#63BE7B2   autoMinx14_min_typeautoMaxx14_max_typez#638EC6Fz#FF0000z#000000  rW  )r0  r  r  r	   r   r[  r  r  _set_icon_propsr   r   rn  _get_dxf_indexr   r   r   
setdefaultr   r_   lstripKeyErrorAttributeErrorr   r}  )r"   rM  rN  rO  rP  r  valid_parameterr  
valid_typecriteria_typer  valid_iconsrY  
start_cellr)   r)   r*   conditional_format&	  s  	
 !"#'	
	
#


	








	














zWorksheet.conditional_formatc                 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>||}}dddddddddddd}| D ]}	|	|vr_td|	   dS qP|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 r|d }||d< d|v rtd|  dS td|tjrtd|rtd|  dS td |rtd!|  dS td"|s	td#|rtd$|  dS d%|v r2|d% |d%< |d% du r'd&|d%< |d% 	dd&|d%< nd'|d%< |}|}|d
rD|d7 }|drN|d8 }t
|||||d(< t
|||||d)< |d
 sid|d< |d rt|d) |d< d}g |d*< i }t||d D ]!}|d+t| d&d&dd&ddd,}d*|v r|t|d* kr|d* |d  }nd}|r|d-d}|d.r|d. |d< |d }| }||v rtd/|   dS d||< |d0|d1< d2|v r|d2 r|d2 }|d3r|d3}|	d4d5}||d2< t||d D ]}| |||| q|d6r^|d6 }| }|	d7d&}|	dd&}|d8kr;d9}|d:krBd;}||d6< | ||d }|d<d}| ||||| n|d=rw|d= }||d=< | ||||d- |dur| |d-< |||d < |d* | |d
 r| |||d |d1  |d7 }qd>|v r|d> }d}t||d D ]F}d}t||d D ]5}|t|k r|t|| k r|| | }||v r| |||||  n| |||d |d7 }q|d7 }q| j| dS )?aY  
        Add an Excel table to a worksheet.

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

        Returns:
            0:  Success.
            -1: Not supported in constant_memory mode.
            -2: Row or column is out of worksheet bounds.
            -3: Incorrect parameter or option.
        Nz5add_table() isn't supported in 'constant_memory' moder.  Tr/  )r  banded_columnsbanded_rowscolumnsr  first_column
header_rowlast_columnrV   style	total_rowz%Unknown parameter '%s' in add_table()rk  r  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_shownrV    z.Name '%s' in add_table() cannot contain spacesz^[\w\\][\w\\.]*$z^\dz-Invalid Excel characters in add_table(): '%s'z"^[a-zA-Z][a-zA-Z]?[a-dA-D]?[0-9]+$z0Name looks like a cell name in add_table(): '%s'z^[rcRC]$z^[rcRC]\d+[rcRC]\d+$z3Invalid name '%s' like a RC cell ref in add_table()r  rI   TableStyleMedium9rW  a_ranger  Column)idrV   total_stringtotal_functiontotal_valuerB  rC   name_formatrC   r|   z*Duplicate header name in add_table(): '%s'header_formatr  rB  r  @z[#This Row],r  r=   	countnums	countNumsstddevstdDevr  r  r  )r  rZ   r	   r0  r  r  r  r  UNICODErn  r   rW  r  r   lowerr  r  r	  _table_function_to_formular  r  r}  r  r   )r"   rM  rN  rO  rP  r  r   r   r  r  num_rowsrV   first_data_rowlast_data_rowcol_id
seen_namescol_numcol_data	user_dataxformatheader_namerB  r  functionrC  r  r  ijr;   r  r)   r)   r*   	add_table  sb  


















 
zWorksheet.add_tablec                 C   s6  |  ||ddr
dS dt||gi}|du r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ddddddddd	}| D ]}||vrltd|   dS q]d|vrwtd dS |dd}|dvrtd dS |dkrd}||d< d|v rt|d tu r|d |d< n|d g|d< t|d tu 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/|d0< |d1|d1< |d2d#}|d3krd4|d5< n|d6krd7|d5< nd8|d5< |d9}|rd%|vr|
d% | }||d9< |dd4}t|}|d: |d< |d( |d< |d |d< |d) |d< |d* |d< |d& |d< |d' |d< | ||d | ||d | ||d | ||d | ||d | ||d | ||d | j| d4S );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locationrW  r  
high_point	low_pointnegative_pointsfirst_point
last_pointmarkersr  series_colornegative_colormarkers_colorfirst_color
last_color
high_color	low_color)	r  r  axisreverseempty_cellsshow_hiddenplot_hidden	date_axisweightz)Unknown parameter '%s' in add_sparkline()z0Parameter 'range' is required in add_sparkline()r/  line)r  columnwin_losszJParameter 'type' must be 'line', 'column' or 'win_loss' in add_sparkline()r  stackedrangeszMMust have the same number of location and range parameters in add_sparkline()countr  rI   r  !highlownegativefirstlastr  r  r  r  r  rj   r  r  zeror   emptyconnectspangapr  series)r0  r   r  r	   r  r  rz  r   r   rV   rn  r  r}  r   _set_spark_colorr   )r"   r  r;   r  	sparkliner  r  
spark_typerange_countlocation_count	sheetname
new_rangesspark_rangenew_locationsr  r  
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   ri   )r"   rM  rN  rO  rP  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   rm   )r"   r  r;   r)   r)   r*   set_top_left_cell
  s   zWorksheet.set_top_left_cellr
   c                 C   s"   || _ || _|| _|| _d| _dS )a  
        Control outline settings.

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

        Returns:
            0:  Nothing.
        TN)r   r   r   r   r   )r"   visiblesymbols_belowsymbols_right
auto_styler)   r)   r*   outline_settings  s
   
zWorksheet.outline_settingsc                 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)rn   )r"   r  r;   top_rowleft_col	pane_typer)   r)   r*   freeze_panes3  s
   zWorksheet.freeze_panesc                 C   s   |  ||||d dS )a  
        Create worksheet panes and mark them as split.

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

        Returns:
            0:  Nothing.

        rc  N)r  )r"   xyr  r  r)   r)   r*   split_panesJ  s   zWorksheet.split_panesrN   c                 C   s.   |dk s|dkrt d|  d}t|| _dS )z
        Set the worksheet zoom factor.

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

        Returns:
            Nothing.

        
     z/Zoom factor %d outside range: 10 <= zoom <= 400rN   N)r	   r    r   )r"   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.

        r
   N)r   r   r)   r)   r*   right_to_leftn  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_zeroc                 C   s   t || _dS )z
        Set the color of the worksheet tab.

        Args:
            color: A #RGB color index.

        Returns:
            Nothing.

        N)r   rl   r"   colorr)   r)   r*   set_tab_color  s   zWorksheet.set_tab_colorrI   c                 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|  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.

        rI   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: '%s'passwordN)_encode_passwordr  r	   r   )r"   r1  r  defaultskeyr)   r)   r*   protect  sZ   
	

zWorksheet.protectc                 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 )	a0  
        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:
            Nothing.

        Nz1Cell range must be specified in unprotect_range()r.  r  r  rI   r
   Range)r	   r  rn  r   r  r2  r   r}  r"   rY  
range_namer1  r)   r)   r*   unprotect_range  s   

zWorksheet.unprotect_rangec                 C   sT   |  ||ddrtd||f  dS |du ri }| |||}| j| d| _dS )aM  
        Insert a button form object into the worksheet.

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

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

        Tz!Cannot insert button at (%d, %d).r.  Nr
   r   )r0  r	   _button_paramsr   r}  r   )r"   r  r;   r  buttonr)   r)   r*   insert_button  s   zWorksheet.insert_buttonc                 C   r  )z
        Set the page orientation as landscape.

        Args:
            None.

        Returns:
            Nothing.

        r   TNrs   rq   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_portraitc                 C   r  )zr
        Set the page view mode.

        Args:
            None.

        Returns:
            Nothing.

        r
   N)r   r   r)   r)   r*   set_page_view'  r  zWorksheet.set_page_viewc                 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)rr   rq   )r"   rr   r)   r)   r*   	set_paper4  s   
zWorksheet.set_paperc                 C   r  )zx
        Center the page horizontally.

        Args:
            None.

        Returns:
            Nothing.

        Tr
   N)rt   ru   r   r)   r)   r*   center_horizontallyC  r?  zWorksheet.center_horizontallyc                 C   r  )zv
        Center the page vertically.

        Args:
            None.

        Returns:
            Nothing.

        Tr
   N)rt   rv   r   r)   r)   r*   center_verticallyQ  r?  zWorksheet.center_verticallyrK   rL   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   )r"   leftrightrB  rD  r)   r)   r*   set_margins_  s   
zWorksheet.set_marginsc                 C   f  |}| 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rG| j|d|dd	g |d
r[| j|d
|ddg |dro| j|d|ddg |	d}t| j}||krtd|||f  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LHimage_centerimage_data_centerCHimage_rightimage_data_rightRHzONumber of header images (%s) doesn't match placeholder count (%s) in string: %salign_with_marginsscale_with_docrM   T)rn  r   r	   r$  r   r  r   r  r}  r  r~   r   r|   r   r{   r   )r"   r|   r  rK  header_origplaceholder_countimage_countr)   r)   r*   
set_headerr  ^   








zWorksheet.set_headerc                 C   rH  )z
        Set the page footer caption and optional margin.

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

        Returns:
            Nothing.

        rI  rJ  r  zCFooter string cannot be longer than Excel's limit of 255 charactersNrK  rL  rM  LFrO  rP  CFrR  rS  RFzONumber of footer images (%s) doesn't match placeholder count (%s) in string: %srU  rV  rM   T)rn  r   r	   r$  r   r  r   r  r}  r  r~   r   r}   r   r{   r   )r"   r}   r  rK  footer_origrX  rY  r)   r)   r*   
set_footer  r[  zWorksheet.set_footerc                 C   sD   |du r|}|d7 }|d7 }d||f }t | j}|d | | _dS )z
        Set the rows to repeat at the top of each printed page.

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

        Returns:
            Nothing.

        Nr
   z$%d:$%dr  )r   rV   r   )r"   rM  rO  r  r   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.   r  )r   r   rV   r   )r"   rN  rP  r  r   r)   r)   r*   repeat_columns$  s   


zWorksheet.repeat_columnsc                 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)rw   rx   rt   )r"   optionr)   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)ry   rt   r   r)   r)   r*   print_row_col_headersW  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)rz   r   r)   r)   r*   hide_row_col_headerse  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
   N)ra   rb   r  r   )r"   rM  rN  rO  rP  r  r)   r)   r*   
print_arear  s   zWorksheet.print_areac                 C   r  )z
        Set the order in which pages are printed.

        Args:
            None.

        Returns:
            Nothing.

        r
   TN)r   rq   r   r)   r)   r*   print_across  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   rq   )r"   r  r  r)   r)   r*   fit_to_pages  s   
zWorksheet.fit_to_pagesc                 C   r  )z
        Set the start page number when printing.

        Args:
            start_page: Start page number.

        Returns:
            Nothing.

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

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

        Returns:
            Nothing.

        r  r  z2Print scale '%d' outside range: 10 <= scale <= 400Nr   T)r	   r   r    r   rq   )r"   scaler)   r)   r*   set_print_scale  s   

zWorksheet.set_print_scalec                 C   re  )z
        Set the option to print the worksheet in black and white.

        Args:
            None.

        Returns:
            Nothing.

        TN)r   rq   r   r)   r)   r*   print_black_and_white  r?  zWorksheet.print_black_and_whitec                 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   r"   breaksr)   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   rp  r)   r)   r*   set_v_pagebreaks  r  zWorksheet.set_v_pagebreaksc                 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   r  rW   )r"   rV   r)   r)   r*   set_vba_name  s   
zWorksheet.set_vba_namec              
   C   s^   |du rdS |  }dddddddddd	}| D ]}||vr)t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.  T)	number_stored_as_text
eval_errorformula_differsformula_rangeformula_unlockedempty_cell_referencelist_data_validationcalculated_columntwo_digit_text_yearz)Unknown parameter '%s' in ignore_errors()r   )r  r  r	   r   )r"   r  r  r  r)   r)   r*   ignore_errors  s(   zWorksheet.ignore_errorsc                 C   s4  |d | _ |d | _|d | _|d | _|d | _|d | _|d | _|d | _|d	 | _|d
 | _	|d | _
|d | _|d | _|d | _|d | _|d | _|d | _| jrvd| _d| _d| _d| _d| _d| _d| _d| _d| _d| _| jrtj| jd\}}t| || _t |ddd| _!| j!| _"d S d S )NrV   rW   rX   r   rZ   r[   r   r   r   r   r   r   r   r`   r   r   r   g     )@   rL   r
         ?F)dirzw+utf-8modeencoding)#rV   rW   rX   r   rZ   r[   r   r   r   r   r   r   r   r`   r   r   r   r   r   r   r   r   r   r   r   r   r~   tempfilemkstempr  closer   openr   r  )r"   	init_datafdr  r)   r)   r*   _initialize<  sF   

















zWorksheet._initializec                 C   s  |    |   |   |   |   |   |   | js$|   n| 	  | 
  |   | jr7|   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |  d | !  d S )N	worksheet)"_xml_declaration_write_worksheet_write_sheet_pr_write_dimension_write_sheet_views_write_sheet_format_pr_write_colsrZ   _write_sheet_data_write_optimized_sheet_data_write_sheet_protection_write_protected_rangesr`   _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_fileg  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 r-  )ra   rb   rZ   r   rd   re   rf   rg   )r"   r  r;   r  r  r)   r)   r*   r0    s$   
zWorksheet._check_dimensionsc                 C   s   t || j| jS N)r   r   r   )r"   dt_objr)   r)   r*   r[    s   zWorksheet._convert_date_timec                 C   s   d}d}d}d}t |d}	t |d}
dt|d  }dt|d  }|dk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 )NrI   r   r
   r  r.   r  )r   r  ra   rb   r   rV   )r"   	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_2r   r)   r)   r*   r    s0   


zWorksheet._convert_name_areac                 C   sR   |sd S t |}d|v r|d t|}|  d}t||kr'|d | }|S )Nr   i  )setremoverz  r.  r   )r"   rq  
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+"r
   r.  z"")r  compilefindallr  r
  rn  r}  )r"   rS  token_rer  
new_tokensr  r)   r)   r*   r  4  s   



z Worksheet._extract_filter_tokensc                 C   s   t |dkr?|d }td|rd}ntd|rd}ntd||f  | ||dd }| ||dd }||g | S | ||S )	Nr  rJ   z(and|&&)r   z	(or|\|\|)r
   z?Token '%s' is not a valid conditional in filter expression '%s'r  )r   r  r  r	   _parse_filter_tokens)r"   rS  r  conditionalexpression_1expression_2r)   r)   r*   r  U  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	  rjt|d }|dk s3|d
kr;td||f  | }|dkrO|dkrOtd||f  |d	  dkrZd}nd}|d dkrf|d7 }t|}|sz|d	 rztd|d	 |f  td| r|dkr|dkrtd|d |f  | }|dkr|dkrd}n|dkrd}d}nd}d}|dkrtd|rd}||gS )Nrc  r  r
   rJ   r     )r  r  z=~eqr  z!~ner  r  r
  r  r  z
top|bottomr   i  z?The value '%d' in expression '%s' must be in the range 1 to 500items%z?The type '%s' in expression '%s' must be either 'items' or '%%'rB     r  z<Token '%s' is not a valid operator in filter expression '%s'zblanks|nonblankszRThe operator '%s' in expression '%s' is not valid in relation to Blanks/NonBlanks'rG  r  z[*?]   )r  r  r  r  r    r	   r  rG  )r"   rS  r  	operatorsoperatorr  rC  r)   r)   r*   r  q  sl   

zWorksheet._parse_filter_tokensc           
      C   s   d}t |}g }|D ]!}|d7 }t||> }|d@ }|d@ }|dL }||B }|| q
d}|D ]}	||	N }q0||N }|dN }d| S )Nr   r
   rH   i ?rO   iK  z%X)r   ordr}  )
r"   	plaintextr  r  digitscharlow_15high_15password_hashdigitr)   r)   r*   r2    s"   
zWorksheet._encode_passwordc                 C   s  d}| j | \}}}}}}}}}}}}}||9 }||9 }|d| 9 }|d|	 9 }| |||||||}td|d  }td|d  }| js_t }d|_|| _| jddt| d d g n| j}|	 }||d	< ||d
< ||d< ||d< ||d< d |d< ||d< d|d< d|d< ||d< ||d< |d ur||d< |r#d }d}d}t
d|r| |}t
d|r| |}t
d|r|dd}| |}|dd}t
d|st
d|rd| }n|d d!}t
d"|r|d"d}d }|d ur#t|| jkrtd#|| jf  n| j|s| j|||g | ||d< | j|
s:| jd$d%t| d& | g | |
|d< d S )'Nrc  g      X@r  5%  r
   /drawing../drawings/drawing.xmlr  
dimensionsr  r  r  shaper  r   	rel_indexurl_rel_indexr`  r  
/hyperlinkExternalr  ^mailto:rd  rI   rg  %23rh  ri  rj  rf  re  rb  aIgnoring URL '%s' with link and/or anchor > %d characters since it exceeds Excel's limit for URLS/image../media/image.)r   _position_object_emusr    r   r   embeddedr   r}  r  _add_drawing_objectr  r  ro  rn  r   r   r	   r   r  r   _get_drawing_rel_index)r"   rW   image_id
drawing_idr  r  rV   
image_typex_dpiy_dpidigestdrawing_typer  r;   r=   r  r  r  r  r_  r`  r  r  r  r  r   drawing_objecttargetrel_typetarget_moder)   r)   r*   _prepare_image  s   





zWorksheet._prepare_imagec                 C   sB  d}| j | \}}}}}}	}
}}}}|d| jd }|d| jd }||9 }||	9 }| |||||||}td|d  }td|d  }| jsct }d|_|| _| j	
dd	t| d
 d g n| j}tdd|}|
|_| }||d< ||d< ||d< ||d< ||d< ||d< ||d< d|d< d|d< |d|d< ||d< |dd }|rd }d}d}td|r| |}td|r| |}td|r|dd}| |}|dd}td |r|d d}d }|d urt|| jkrtd!|| jf  d S | j|s| j
|||g | ||d< d S d S d S )"NrJ   r  r  r  r  r  r
   r  r  r  rectTextBoxr  r  r  r  r  r   r  r  r`  r  r_  r  r  r  r  rd  rj  rg  r  rb  r  )r   r  r   r   r  r    r   r   r  r   r}  r  r   r  r  r  r  ro  rn  r   r   r	   r   r   r  )r"   rW   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*   _prepare_shape?  s   






zWorksheet._prepare_shapec
              	   C   sb   t dd|}| j|	s| jddt| d | g | |	}
| j|||||||
g d S )Nz\..*$rI   r  r  r  )	r  rT  r   r  r   r}  r  _get_vml_drawing_rel_indexr   )r"   r  r  r  rV   r  positionr  r  r  ref_idr)   r)   r*   _prepare_header_image  s   

zWorksheet._prepare_header_imagec                 C   s$   | j ddt| d | g d S )Nr  r  r  )r   r}  r  )r"   r  r  r)   r)   r*   _prepare_background  s   
zWorksheet._prepare_backgroundc              
   C   s4  d}| j | \
}}}}}	}
}}}}|d |_td|j|
  }td|j|  }| ||||	|||}|j}| jsQt }d|_	|| _| j
ddt| d g n| j}| }||d< ||d< ||d< ||d	< ||d
< d |d< ||d< |  |d< d|d< d |d< ||d< ||d< | jddt| d g d S )Nr
   r  r  r  r  r  r  r  r  rV   r  r  r  r   r  r`  r  r  z/chartz../charts/chart)r   r  r    r  r  r  
chart_namer   r   r  r   r}  r  r  r  r   )r"   rW   chart_idr  r  r  r;   r  r  r  r  r  r  r  r  r  r  r  rV   r   r  r)   r)   r*   _prepare_chart  sV   

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_pixelsr    )r"   	col_start	row_startx1y1r  r  r  col_endrow_endx2y2x_absy_absr)   r)   r*   r    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)|dk rDd}|dk rJd}| jr\t|D ]	}
||  |
7 }qQn|| j| 7 }||7 }| jryt|D ]	}|	| |7 }	qnn|	| 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 r   )	_size_col	_size_rowr   rW  r   r   r   )r"   r  r	  r
  r  r  r  r  r  r  r  row_idr  r  r  r  r)   r)   r*   r    sj   z!Worksheet._position_object_pixelsc                 C   s   d}d}d}|| j v r?| j | d }| j | d }|r#|dkr#d}|S |dk r3t|||  d }|S t|| d | }|S | j}|S )Nr  r  r   r
   r  r  )r   r    r   )r"   r;   r  max_digit_widthpaddingpixelsr  rj   r)   r)   r*   r  z  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   r    r   )r"   r  r  r  r  rj   r)   r)   r*   r    s   
zWorksheet._size_rowc                 C   s0   d}d}|dkr|||  }|S || | }|S )Ng      @g      @   r)   )r"   r  r  r  r  r)   r)   r*   r    s   zWorksheet._pixels_to_widthc                 C   s   d| S )NrL   r)   )r"   r  r)   r)   r*   r    s   zWorksheet._pixels_to_heightc                 C   sV  d}d}d}d dd d d d ||d dd ddddd	}|  D ]}	||	 ||	< q|d
 s-||d
< |d s5||d< t|d  |d< |d ddd|d< |d d ur`t|d \}
}|
|d< ||d< | j}| j}|d d u r|dkrud|d< n-||d kr|d |d< n ||d kr|d |d< n||d kr|d |d< n|d |d< |d d u r|dkrd|d< n%||d krd|d< n||d krd|d< n||d krd|d< nd|d< |d d u r||d kr|d |d< n!||d kr|d |d< n||d kr|d |d< n|d |d< |d d u r:||d krd|d< n||d kr*d|d< n||d kr6d|d< nd|d< |d rI|d
 |d  |d
< |d rX|d |d  |d< td |d
  |d
< td |d  |d< | |d |d |d |d |d
 |d |}|	|d
  |	|d  ||||d! |d" |d |d# |d$ |d% g	|g S )&N   J   r   z#ffffe1r
   Tahoma   rc  )r  r  r  	start_col	start_rowr  r  r  r  r  r  r  	font_name	font_sizefont_familyr  r  r  ffrg  r  r  r  rJ   r  r  r  r        r  r  r  1   rO   r  r  r  r  r  r  r   r!  )
r  r   r  rn  r   ra   rb   r    r  r}  )r"   r  r;   r)  r  default_widthdefault_heightr  paramsr4  r  r  row_maxcol_maxverticesr)   r)   r*   _comment_params  s   









zWorksheet._comment_paramsc              	   C   s  | j }| j}d}dt| j }||i d}i }	| D ]}
||
 |	|
< q|	d}|d u r1d| }||d d< |	drEd|	d  |d< nd	| |d< |	d
|d
< |	d||	d< |	d||	d< |	dd|	d< |	dd|	d< |	d |	dd |	d< |	d |	dd |	d< td|	d  |	d< td|	d  |	d< ||	d< ||	d< | |	d |	d |	d |	d |	d |	d |}||	d  ||	d  ||d< |S )Nr   r
   )r  r;   fontcaptionz	Button %dr-  macroz[0]!z[0]!Button%d_Clickr  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  button_numberr;  r(  r4  r.  r+  r)   r)   r*   r:  6  sD   

zWorksheet._button_paramsc                 C   sT  g }t | j }|D ]Y}t | j|  }|D ]K}	| j| |	 }
| j|
 }|| j| |	< | jrD| j| |	 d d u rDd| j| |	 d< | j| |	 d d u rY| j| j| |	 d< || j| |	  qq| jddt| d g | j	r|| _
| jddt| d	 g t|}|}tt|d
 D ]}d||| d f }q|| _|| _|S )Nr  r
   rJ   /vmlDrawing../drawings/vmlDrawing.vmlz	/commentsz../commentsr  rS   z%s,%d)sortedr   r  r,  r   r   r}  r   r  r   r   r   r   rW  r    r   r   )r"   r   r   vml_drawing_id
comment_idr   row_numsr  col_numsr;   user_optionsr(  r  start_data_idr  r)   r)   r*   _prepare_vml_objectsy  sL   
zWorksheet._prepare_vml_objectsc                 C   s&   || _ | jddt| d g d S )Nr1  r2  r3  )r   r   r}  r  )r"   r   r5  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||< | jddt| d g |d	7 }qd S )
Nr  rV   Tablez2Duplicate name '%s' used in worksheet.add_table().Tz/tablez../tables/tabler  r
   )r   r  r  r  r   r   r}  )r"   table_idseenr   rV   r)   r)   r*   _prepare_tables  s*   

zWorksheet._prepare_tablesc              	   C   sz   d}| dd}| dd}| dd}| dd	}d
dddddddd}||v r5|| }d||f }|S td|  |S )NrI   'z''rg  z'#]z'][z'[e   f   g   h   i   k   m   n   )r<  r  r  r  r  r  sumvarzSUBTOTAL(%s,[%s])z(Unsupported function '%s' in add_table())rn  r	   )r"   r  col_namerB  	subtotalsfunc_numr)   r)   r*   r    s(   z$Worksheet._table_function_to_formulac                 C   s$   ||vrd S dt || i||< d S )Nrgbr   )r"   r  r  
user_colorr)   r)   r*   r    s   zWorksheet._set_spark_colorc                 C   s  | j rdS g }t||d D ]p}|| jvr|d  qt||d D ][}|| j| v rx| j| | }t|j}	|	dkrD|d|j  q"|	dkrW|j}
| j	|
}|| q"|	dks_|	dkrn|j
}|d u rhd}|| q"|	d	krw|d
 q"|d  q"q|S )Nr)   r
   rA   r  r@   rE   rF   r   rB   rI   )rZ   rW  r   r}  r  __name__r7  r)  rX   _get_shared_stringrC  )r"   r	  r  r  r  r  row_numr  r:  type_cell_namerW   r)  rC  r)   r)   r*   _get_range_data  s:   



$zWorksheet._get_range_datac                 G   s   dd |D }d |S )Nc                 S   s"   g | ]}t |tst|n|qS r)   )r$  r  )r:   itemr)   r)   r*   r<   0  s    z'Worksheet._csv_join.<locals>.<listcomp>,)join)r"   r  r)   r)   r*   r  ,  s   
zWorksheet._csv_joinc                 C   s   t d|r|S |dd}|dd}|dd}|dd	}|d
d}|dd}|dd}|dd}|dd}|dd}|dd}|S )Nz%[0-9a-fA-F]{2}r  z%25r  z%22r  z%20r  z%3cr  z%3erC  z%5brB  z%5d^z%5e`z%60rE  z%7br  z%7d)r  rG  rn  )r"   r_  r)   r)   r*   ro  5  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  r"   r  r)   r)   r*   r  I  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*   r  U  s
   
z$Worksheet._get_vml_drawing_rel_indexc                 C   sl  | 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]n,|jrh| d|j n!|jrs| d|j n|jr| |j}| d| n| dd |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
   superscriptrc  	subscriptszvalr.  themeindexedrQ  rFontfamilyCalibrischeme)r   r~  bold_xml_empty_tagitalicfont_strikeoutfont_outlinefont_shadow	underline_write_underlinefont_script_write_vert_alignr   rh  _write_colorcolor_indexed
font_color_get_palette_color_write_rstring_colorr  r!  	hyperlinkfont_schemer  )r"   	xf_format
xml_writerr  r)   r)   r*   r  d  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 )Nrc  )rg  double!   )rg  singleAccounting"   )rg  doubleAccountingur   ro  )r"   rt  r  r)   r)   r*   ru    s   zWorksheet._write_underlinec                 C   s   d|fg}| j d| d S )Nrg  	vertAlignr  r"   rg  r  r)   r)   r*   rw       
zWorksheet._write_vert_alignc                 C   s   ||fg}| j d| d S Nr  r  r"   rV   rC  r  r)   r)   r*   r|    r  zWorksheet._write_rstring_colorc                 C   s$   |d dkr|dd  }d|   S )Nr   rg  r
   FF)upperr  r)   r)   r*   r{    s   zWorksheet._get_palette_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  )r"   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 ]u}|| dd ur|| d || d< || d }t|tr|dr|d|| d< || drd}|| d |vrtd|| d   n|| d || d< || d dkrd|| d< || d}	|	r|	dkrd|| d< qf|S )NFr   percent)r  rC  r  rJ   C   rC  r  r
   r  K   r     rc  r  P   <   (   rP   r  r  )r  r  r7  rB  zOUnknown icon property type '%s' for sub-property 'type' in conditional_format()r7  numr  r  T)	rW  r}  r   r  r$  r  r  r  r	   )
r"   r  
user_propspropsr=   max_datar  tmpr  r  r)   r)   r*   r    sT   

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  )r_   r}  r~  )r"   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  )rd   rf   rg   r   re   ro  )r"   r  r2   r3   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  O  s   
zWorksheet._write_sheet_viewsc                 C   s  g }| j s
|d | jr|d | js|d | jr"|d | jr*|d | js2|d | jr:|d | jdkrG|d	| jf | j	d
krb| jsb|d| j	f | j
rb|d| j	f |d | jsot| jr| d| |   |   | d d S | d| d S )N)showGridLinesr   )showRowColHeadersr   )	showZerosr   rightToLeftr
   )tabSelectedr
   showOutlineSymbolsr   )view
pageLayoutrI   topLeftCellrN   	zoomScalezoomScaleNormal)workbookViewIdr   	sheetView)rx   r}  rz   r   r   rp   r   r   rm   r   r   rn   r   ri   r~  _write_panes_write_selectionsr  ro  r"   r  r)   r)   r*   r  X  s:   









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   r}  r   r_   ro  )r"   r   	row_level	col_levelr  r)   r)   r*   r    s   




z Worksheet._write_sheet_format_prc                 C   sF   | j sd S | d t| j  D ]
}| | j |  q| d d S )Ncols)rh   r~  r4  r  _write_col_infor  )r"   r;   r)   r)   r*   r    s   
zWorksheet._write_colsc                 C   s8  |\}}}}}}}d}	d}
|r|  }
|d u r!|sd}d}	n	d}n|dkr'd}	|dkr\d}d}|dk rHtt|||  d t| d d }ntt|| d | t| d d }d|d fd	|d fd
d| fg}|
rv|d|
f |r}|d |	r|d |r|d|f |r|d | d| d S )Nr
   r   rQ   r  r  r  g      p@r  r  r  r  r  )rj   r9   )customWidthr9   outlineLevel)r  r9   r;   )_get_xf_indexr    r  r}  ro  )r"   col_infocol_minr*  r  r*  rj   r  r  custom_widthxf_indexr  r  r  r)   r)   r*   r    s^   






zWorksheet._write_col_infoc                 C   s8   | j d u r| d d S | d |   | d d S )N	sheetData)rd   ro  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   )rd   ro  r~  r   seekreadr  r  r  r  unlinkr   r  )r"   	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 )NrE  rF  rB  rD  r|   r}   pageMargins)r   r   r   r   r   r   ro  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	paperSizerN   rm  r
   
fitToWidthfitToHeight)	pageOrderoverThenDownfirstPageNumber)rs   portrait)rs   	landscape)blackAndWhiter9   r   )useFirstPageNumberr9   horizontalDpiverticalDpi	pageSetup)rq   rr   r}  r   r   r   r   r   r   rs   r   r\   r   r   ro  r  r)   r)   r*   r    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)rt   ru   r}  rv   ry   rw   ro  r  r)   r)   r*   r  g  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   r}  r~   r{   r~  r|   _write_odd_headerr}   _write_odd_footerr  r`   ro  r  r)   r)   r*   r    s   

zWorksheet._write_header_footerc                 C      |  d| j d S )N	oddHeader)r  r|   r   r)   r)   r*   r       zWorksheet._write_odd_headerc                 C   r  )N	oddFooter)r  r}   r   r)   r)   r*   r    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_spansrW  rd   re   r   r   r   r    r   
_write_rowrf   rg   _write_cellr  _write_empty_row)r"   rU  
span_indexr  r  col_refr)   r)   r*   r    s8   



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   r  rW  rf   rg   r  r  r  clear)r"   current_row_numrU  r  r  r  r)   r)   r*   r2    s$   

zWorksheet._write_single_rowc                 C   s>  i }d }d }t | j| jd D ]}|| jv r>t | j| jd D ]}|| j| v r=|d u r1|}|}q||k r7|}||kr=|}q|| jv rpt | j| jd D ]#}|| jv ro|| j| v ro|d u rc|}|}qL||k ri|}||kro|}qL|d d dks}|| jkrt|d }|d ur|d7 }|d7 }d||f ||< d }q|| _d S )Nr
   r#  r   z%s:%s)	rW  rd   re   r   rf   rg   r   r    r   )r"   spansspan_minspan_maxrU  r  r  r)   r)   r*   r    sH   



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rN|dd	| f |rU|d
 || jkr_|d |	rh|d|	f |
ro|d | jdkry|d |r| d| d S | d| d S )Nr   )NNr   r   r   rw  r
   r  s)customFormatr
   htz%g)rj   r
   r  r  )r  r
   r  r  r  )r   r  r}  r   r_   _xml_empty_tag_unencoded_xml_start_tag_unencoded)r"   r  r  
properties	empty_rowr  r  r*  rj   r  r  r  r)   r)   r*   r    s<   







zWorksheet._write_rowc                 C   s   | j |||dd d S )NT)r  )r  )r"   r  r  r  r)   r)   r*   r  N  s   zWorksheet._write_empty_rowc                 C   s  t ||}d|fg}|jr|j }|d|f n0|| jv r7| j| d r7| j| d }|d| f n|| jv rJ| j| }|d| f t|j}	|	dkr\| |j	| d S |	dkr|j
}
| jsn| |
| d S td|
}
tdd |
}
|
d	d
}
|
dd}
|
dr|
dr| |
| d S t|
}| |
|| d S |	dkr|j}t|jtk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r9| $d| d S |	dkrV|d | d| | "|j% | #d d S d S )Nrw  r  r
   rA   r@   z_x005F\1c                 S   s   dt | d S )Nz_x%04X_r
   )r  group)r  r)   r)   r*   <lambda>z  s    z'Worksheet._write_cell.<locals>.<lambda>u   ￾_xFFFE_u   ￿_xFFFF_z<r>z</r>rE   )ry  r`  r   )r;  z#N/Az#NAME?z#NULL!r:  z#REF!z#VALUE!rI   )ry  e)ry  r  rF   rR  )cmr
   crB   rD   )&r   rC   r  r}  r   r   r  rS  _xml_number_elementr7  r)  rZ   _xml_string_elementre_control_chars_1rT  re_control_chars_2rn  r  r
  _xml_rich_inline_stringr   _xml_inline_stringrC  r  r$  r  _xml_formula_elementrB  rX  r  r!   r~  _write_cell_array_formularW  _write_cell_valuer  ro  r\  )r"   r  r;   r:  rY  r  r  row_xfcol_xfrV  r)  rx  rC  error_codesr)   r)   r*   r  R  s~   
















zWorksheet._write_cellc                 C   s   |d u rd}|  d| d S )NrI   vr  )r"   rC  r)   r)   r*   r    s   zWorksheet._write_cell_valuec                 C   s   dd|fg}|  d|| d S )N)ry  arrayr  r  r  )r"   rB  rY  r  r)   r)   r*   r    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   rl   r   r   r}  r~  _write_tab_color_write_outline_pr_write_page_set_up_prr  ro  r  r)   r)   r*   r    s4   
zWorksheet._write_sheet_prc                 C   s    | j sd S dg}| d| d S )N)	fitToPager
   pageSetUpPr)r   ro  r  r)   r)   r*   r    s   zWorksheet._write_page_set_up_prc                 C   s(   | j }|sd S d|fg}| d| d S )NrQ  tabColor)rl   ro  )r"   r  r  r)   r)   r*   r    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   r}  r   r   r   ro  r  r)   r)   r*   r    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   r   r~  
_write_brkr  )r"   page_breaksr  r  rU  r)   r)   r*   r       zWorksheet._write_row_breaksc                 C   r#  )Nr  r$  	colBreaksi )r  r   r   r~  r&  r  )r"   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ro  )r"   brk_idbrk_maxr  r)   r)   r*   r&  :  s
   zWorksheet._write_brkc                 C   N   | j }t|}|sd S d|fg}| d| |D ]}| | q| d d S )Nr  
mergeCells)r   r   r~  _write_merge_cellr  )r"   merged_cellsr  r  merged_ranger)   r)   r*   r  C     
zWorksheet._write_merge_cellsc           
      C   sF   |\}}}}t ||}t ||}|d | }d|fg}	| d|	 d S )Nr.   r  	mergeCell)r   ro  )
r"   r3  row_minr  r)  r*  r2   r3   r  r  r)   r)   r*   r1  V  s   


zWorksheet._write_merge_cellc                 C   s`  g }d }t | j }|sd S |D ]u}t | j|  }|D ]g}| j| | }|d }| jrL| j| rL| j| | rL| j| | }	t|	jdkrL|d }|dkrt|  jd7  _||||| j|d ||d g | jd|d dg q|||||d |d |d g qq| 	d	 |D ]}
|

d
}|dkr| j|
  q|dkr| j|
  q| d	 d S )Nrm  r@   r_  r
   r  r`  r  r  r   r   rc  )r4  r   r  r   r  rS  r   r}  r   r~  r{  _write_hyperlink_external_write_hyperlink_internalr  )r"   r   displayr7  rU  r8  r  linkrm  r:  r#   r)   r)   r*   r  c  s`   	
'

zWorksheet._write_hyperlinksc           
      C   sx   t ||}dt| }d|fd|fg}	|d ur|	d|f |d ur)|	d|f |d ur4|	d|f | d|	 d S )NrIdr  r:idr  r9  tooltipr}  )r   r  r}  ro  )
r"   r  r;   id_numr  r9  r=  r  r_idr  r)   r)   r*   r7    s   
z#Worksheet._write_hyperlink_externalc                 C   sN   t ||}d|fd|fg}|d ur|d|f |d|f | d| d S )Nr  r  r=  r9  r}  )r   r}  ro  )r"   r  r;   r  r9  r=  r  r  r)   r)   r*   r8    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  ro  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   rW  r   r   _write_filter_column)r"   col1col2r;   r  r   r)   r)   r*   rA    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  )r"   r  r   r  r  r)   r)   r*   rB    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 )rG  )r  r  )r:   filterr)   r)   r*   r<     s    z,Worksheet._write_filters.<locals>.<listcomp>)r>  r
   r
   r   r  )r   ro  r~  r4  _write_filterr  )r"   r  
non_blanksr  r  r)   r)   r*   rG    s   zWorksheet._write_filtersc                 C      d|fg}|  d| d S )Nrg  rI  r,  r  r)   r)   r*   rJ       
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 )	Nrc  customFiltersr   )andr
   )rO  r   r
   rJ   r  )r   r~  _write_custom_filterr  )r"   r  r  r)   r)   r*   rH    s   

zWorksheet._write_custom_filtersc                 C   sn   g }dddddddd}|| d ur|| }nt d|  |dks(|d	|f |d
|f | d| d S )Nr  r  r	  r   r  r  )r
   rc  rJ   r  r  r  r  zUnknown operator = %sr  rg  customFilter)r	   r}  ro  )r"   r  rg  r  r  r)   r)   r*   rP  /  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 )%Nr1  r!  )r!  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   r0  )selectUnlockedCellsr
   sheetProtection)r   r}  ro  )r"   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  r7  r)   r)   r*   r  z  s   

z!Worksheet._write_protected_rangesc                 C   sB   g }|r| d|f | d|f | d|f | d| d S )Nr1  r
  rV   protectedRanger}  ro  )r"   rY  r8  r1  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   r  ro  )r"   r  r?  r  r)   r)   r*   rb    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   r  ro  r"   r?  r  r)   r)   r*   r       
zWorksheet._write_legacy_drawingc                 C   rd  )Nr
   r;  r<  legacyDrawingHF)r   r   r  ro  rf  r)   r)   r*   r    rg  z"Worksheet._write_legacy_drawing_hfc                 C   rd  )Nr
   r;  r<  picture)r   r   r  ro  rf  r)   r)   r*   r    rg  zWorksheet._write_picturec                 C   r/  )Nr  dataValidations)r   r   r~  _write_data_validationr  )r"   r   r  r  
validationr)   r)   r*   r    r4  z!Worksheet._write_data_validationsc           	      C   s  d}g }|d D ]+}|dkr|d7 }|\}}}}||kr!||}}||kr*||}}|t ||||7 }q|d dkrR|d|d f |d dkrR|d	|d f d
|v rl|d
 dkra|d |d
 dkrl|d |d ru|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 )#NrI   r  r  r  r  r  r  r  r  r  r
   )
errorStyler  rc  )rm  r  r  )
allowBlankr
   r  )showDropDownr
   r  )showInputMessager
   r  )showErrorMessager
   r  
errorTitler  rS  r  promptTitler  promptr
  dataValidationrC  r  )r   r}  ro  r~  _write_formula_1_write_formula_2r  )	r"   r  r
  r  r  	row_firstr  row_lastr  r)   r)   r*   rk    sX   







z Worksheet._write_data_validationc                 C   sd   t |tu r| j| }d| }nzt| W n ty)   |dr'|d}Y nw | d| d S )Nz"%s"r  formula1)r  rz  r  r  r!   r  r  r  rU  r)   r)   r*   rv  '  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  r!   r  r  r  rU  r)   r)   r*   rw  8     

zWorksheet._write_formula_2c                 C   s6   t | j }|sd S |D ]}| || j|  qd S r  )r4  r   r  _write_conditional_formatting)r"   r  
cond_ranger)   r)   r*   r  E  s   z$Worksheet._write_conditional_formatsc                 C   s8   d|fg}|  d| |D ]}| | q| d d S )Nr
  conditionalFormatting)r~  _write_cf_ruler  )r"   r  r(  r  paramr)   r)   r*   r  P  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  rC   dxfIdr  r  )
stopIfTruer
   r;  r  r  cfRuler  r  rC  r=  below)r=  r   r  )equalAverager
   z[123] std devz([123]) std devr  r
   rC  r  )r  r
   rV  )rD  r
   r  rankr?  rA  rX  r  rZ  r[  r  rB  rF  rH  rJ  rL  rN  r  rR  r  rS  rT  )r}  r  r~  _write_formula_elementr  r  rG  r   ro  _write_color_scale_write_data_bar_write_data_bar_ext_write_icon_set)r"   r(  r  r  r  r)   r)   r*   r  Y  s   









zWorksheet._write_cf_rulec                 C   r{  )Nr  rB  r}  rU  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r?| d|d
  | d|d  | d d S )Nr  r  r   r  r!  r  r"  rQ  r#  r$  r%  )r~  _write_cfvorx  r  )r"   r  r)   r)   r*   r    s   
zWorksheet._write_color_scalec                 C   s   g }| dr|d|d f | dr|d|d f | dr(|d | d| | |d |d	  | |d
 |d  | d|d  | d d S )Nr&  	minLengthr'  	maxLengthr4  	showValuer   rR  r  r   r  r"  rQ  r)  )r  r}  r~  r  rx  r  )r"   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)rW   r   r   r}  r~  
_write_extr  r  )r"   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 )Nr6  rz  rT  r8  r  r7  )r  r
   r9  r  rC  r  )r  r}  r~  reversedr  r  )r"   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  rg  )gter   cfvora  )r"   cf_typerg  r  r  r)   r)   r*   r  &  s   

zWorksheet._write_cfvoc                 C   s   ||fg}|  d| d S r  r,  r  r)   r)   r*   rx  2  rM  zWorksheet._write_colorc                 C   s   | j D ]}| j|  qd S r  )ri   _write_selection)r"   	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  
activeCellr
  r  ra  )r"   r  r	  r
  r  r)   r)   r*   r  =  s   zWorksheet._write_selectionc                 C   s:   | j }t|s	d S |d dkr| j|  d S | j|  d S )Nr  rc  )rn   r   _write_split_panes_write_freeze_panes)r"   rn   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 )NrI   r   bottomRighttopRight
bottomLeftfrozenr
   frozenSplitr0   xSplitySplitr  
activePanestater  )r   ri   r}  ro  )r"   r  r;   r  r  r  r  y_splitx_splitrm   ro   r  r	  r
  r=   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 )Nr   rI   r
   rP   i,  r  rO     rJ   r  rR   r  r  r  r  r  r  r  r  r  )ri   r    _calculate_x_split_widthr   r}  ro  )r"   r  r;   r  r  r  r  has_selectionro   r	  r
  r  r  r=   rm   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  rJ   r  rP   r  )r    )r"   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   r   r~  r   _write_table_partr  )r"   r   r  r  r=   r)   r)   r*   r    s   
zWorksheet._write_table_partsc                 C   s&   dt | }d|fg}| d| d S )Nr;  r<  	tablePartrc  rf  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  )r   r   r   r~  _write_ext_list_data_bars_write_ext_list_sparklinesr  )r"   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  )r"   rQ  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  r   r  r"  r0  r-  r+  r*  r/  r.  r2  r  r3  x14:dataBar
x14:cfRulexm:sqrefrW  )
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  )r"   rQ  xmlns_xmr  r)   r)   r*   r  -  s2   




z,Worksheet._write_conditional_formatting_2010c                 C   s,   d}|d }d|fd|fg}|  d| d S )NrR  r  r  r  r  r~  )r"   rQ  	rule_typer  r  r)   r)   r*   r  Z  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   rN   r  r  r0  )borderr
   r,  )gradientr   r1  rE  )rV  leftToRightrF  )rV  r  r+  )negativeBarColorSameAsPositiver
   r/  )$negativeBarBorderColorSameAsPositiver   r2  middle)axisPositionr  r  )r  r  r  )r}  r~  )r"   rQ  r&  r'  r  r)   r)   r*   r  b  s0   







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)ro  r~  r  r  )r"   r  rC  r  r)   r)   r*   r    s   
zWorksheet._write_x14_cfvoc                 C   rL  )NrQ  zx14:borderColorr,  r"   rQ  r  r)   r)   r*   r       
z!Worksheet._write_x14_border_colorc                 C   rL  )NrQ  zx14:negativeFillColorr,  r  r)   r)   r*   r    r  z(Worksheet._write_x14_negative_fill_colorc                 C   rL  )NrQ  zx14:negativeBorderColorr,  r  r)   r)   r*   r    r  z*Worksheet._write_x14_negative_border_colorc                 C   rL  )NrQ  zx14:axisColorr,  r  r)   r)   r*   r    r  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  r  r  r  r  r  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  )r"   r  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  r  r  zx14:sparkliner  r  )r~  rW  r  r  )r"   r  r  r  r  r)   r)   r*   r    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  )r"   r  r  	xmlns_x14r  r)   r)   r*   r    s   zWorksheet._write_extc                 C   s   d}d|fg}|  d| d S )Nr  r  r  r  )r"   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 )&Nr  r  r   cust_max	manualMaxr  r  cust_min	manualMinr  r  r  
lineWeightr  )dateAxisr
   displayEmptyCellsAsr  )r  r
   r  )r  r
   r  )r  r
   r  )r  r
   r  )r  r
   r  )r  r
   r  )displayXAxisr
   rj   )displayHiddenr
   minAxisTypemaxAxisTyper  r  r  )r  r}  r~  )r"   r  r  r  r)   r)   r*   r    sV   

























z Worksheet._write_sparkline_groupc                 C   sh   g }| dr|d|d f | dr|d|d f | dr,|d|d f | || d S )NrQ  rh  tint)r  r}  ro  )r"   elementr  r  r)   r)   r*   _write_spark_colorT  s   


zWorksheet._write_spark_colorc                 C      |  d| d S )Nzx14:colorSeriesr  r  r)   r)   r*   r  c     zWorksheet._write_color_seriesc                 C   r  )Nzx14:colorNegativer  r  r)   r)   r*   r  g  r  zWorksheet._write_color_negativec                 C   s   |  dddi d S )Nzx14:colorAxisrQ  FF000000r  r   r)   r)   r*   r  k  s   zWorksheet._write_color_axisc                 C   r  )Nzx14:colorMarkersr  r  r)   r)   r*   r  o  r  zWorksheet._write_color_markersc                 C   r  )Nzx14:colorFirstr  r  r)   r)   r*   r  s  r  zWorksheet._write_color_firstc                 C   r  )Nzx14:colorLastr  r  r)   r)   r*   r  w  r  zWorksheet._write_color_lastc                 C   r  )Nzx14:colorHighr  r  r)   r)   r*   r  {  r  zWorksheet._write_color_highc                 C   r  )Nzx14:colorLowr  r  r)   r)   r*   r    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ignoredErrorsrv  numberStoredAsTextrw  	evalErrorrx  rB  ry  formulaRangerz  unlockedFormular{  emptyCellReferencer|  listDataValidationr}  calculatedColumnr~  twoDigitTextYear)r   r~  r  _write_ignored_errorr  )r"   rW  r)   r)   r*   r    s>   









zWorksheet._write_ignored_errorsc                 C   s    d|f|dfg}|  d| d S )Nr
  r
   ignoredErrorr,  )r"   r  rW  r  r)   r)   r*   r    s   zWorksheet._write_ignored_errorr  )Nr   )Nr   rL  )NNN)F)NF)r   r   )r
   r
   r
   r   )NNr   )NN)rN   )rI   N)rK   rK   rL   rL   )rI   NN)r
   )FF)r   )rS  
__module____qualname____doc__rU   r  r-   r  r  r+  r  r8  r  r?  r  rD  r	  r8   rQ  rH  rJ  rI  rZ  r#  r]  r  ra  r  ru  rt  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  r   r5  r9  r<  r>  r@  rA  rB  rC  rD  rG  rZ  r`  ra  rb  rd  rf  rg  rh  ri  rj  rl  rn  ro  rr  rs  ru  r  r  r  r0  r[  r  r  r  r  r  r2  r  r  r  r  r  r  r  r  r  r  r  r,  r:  r;  r<  r@  r  r  rW  r  ro  r  r  r  ru  rw  r|  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r2  r  r  r  r  r  r  r  r  r  r  r  r  r&  r  r1  r  r7  r8  r  rA  rB  rG  rJ  rH  rP  r  r  r_  r  rb  r  r  r  r  rk  rv  rw  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  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  __classcell__r)   r)   r  r*   rG      sJ    X#
N *.g
p.'?#J=6
;( l   h   =
"3#LL
/+d!(!RbT3:`|C4	8	
7K$	57N(&13m		G0K	h8G	-%/Z	-rG   )8r  r  r  r  collectionsr   r   r  r   	fractionsr   ior   mathr   r   warningsr	   rI   r   rC   r   r   r   r  r   r   utilityr   r   r   r   r   r   r   r   r   r   r   
exceptionsr   r  r	  r
  VERBOSErF  r-   r8   r?   r3  r<  r@  r^  rK  rV  rG   r)   r)   r)   r*   <module>   s\   	






	