U
    ùQ”iè  ã                   @  s\  d Z ddlmZ ddlmZmZ ddlZddlZddlm	Z	m
Z
mZmZmZmZmZ ddlZddlZddlmZ ddlmZmZ ddlmZ dd	lmZ dd
lmZ ddlmZm Z  ddl!m"Z"m#Z#m$Z$m%Z% ddl&m'  m(Z) ddl*m+Z+ ddl,m-Z- ddl.m/Z/m0Z0 ddl1m2Z2 ddl3m4Z4 G dd„ dƒZ5G dd„ de5ƒZ6G dd„ dƒZ7G dd„ dƒZ8dS )zC
Utilities for conversion to writer-agnostic Excel representation.
é    )Úannotations)Ú	lru_cacheÚreduceN)ÚAnyÚCallableÚHashableÚIterableÚMappingÚSequenceÚcast)Úis_list_like)Ú
IndexLabelÚStorageOptions)Údoc)Úfind_stack_level)Úmissing)Úis_floatÚ	is_scalar)Ú	DataFrameÚIndexÚ
MultiIndexÚPeriodIndex)Ú_shared_docs)ÚCSS4_COLORS)ÚCSSResolverÚ
CSSWarning)Úget_level_lengths)Úpprint_thingc                   @  s,   e Zd ZdZeZd	ddddddœdd„ZdS )
Ú	ExcelCell©ÚrowÚcolÚvalÚstyleÚ
mergestartÚmergeendNÚintú
int | NoneÚNone)r    r!   r$   r%   Úreturnc                 C  s(   || _ || _|| _|| _|| _|| _d S ©Nr   )Úselfr    r!   r"   r#   r$   r%   © r,   ú;/tmp/pip-unpacked-wheel-58ppya8e/pandas/io/formats/excel.pyÚ__init__=   s    	zExcelCell.__init__)NNN)Ú__name__Ú
__module__Ú__qualname__Z
__fields__Ú	__slots__r.   r,   r,   r,   r-   r   9   s      ùr   c                	      s0   e Zd Zdddddddddœ‡ fdd„Z‡  ZS )	ÚCssExcelCellr&   zdict | Nonez3dict[tuple[int, int], list[tuple[str, Any]]] | NoneúCallable | Noner(   )r    r!   r#   Ú
css_stylesÚcss_rowÚcss_colÚcss_converterr)   c	                   sR   |r2|r2dd„ |||f D ƒ}
t |
 ¡ ƒ}||ƒ}tƒ jf ||||dœ|	—Ž d S )Nc                 S  s   i | ]\}}|  ¡ |“qS r,   ©Úlower)Ú.0Úpropr"   r,   r,   r-   Ú
<dictcomp>]   s     z)CssExcelCell.__init__.<locals>.<dictcomp>©r    r!   r"   r#   )Ú	frozensetÚitemsÚsuperr.   )r+   r    r!   r"   r#   r5   r6   r7   r8   ÚkwargsZdeclaration_dictZunique_declarations©Ú	__class__r,   r-   r.   O   s    
ÿzCssExcelCell.__init__)r/   r0   r1   r.   Ú__classcell__r,   r,   rC   r-   r3   N   s   r3   c                   @  s.  e Zd ZU dZeZdddddddœZddddddddddddddœZdddd	œZd
ddddœZ	dd„ dD ƒZ
ded< dgdddœdd„Zeƒ Zdddœdd„Zdddœdd „Zd!dd"œd#d$„Zd!d%d"œd&d'„Zd!dd"œd(d)„Zd!d*d"œd+d,„Zd!d-d"œd.d/„Zdddd0œd1d2„Zddd3œd4d5„Zdd6d7œd8d9„Zd:d6d;œd<d=„Zd!d>œd?d@„Zd!dAd"œdBdC„Zd!dDd"œdEdF„Zd!d*d"œdGdH„Zd!d*d"œdIdJ„Zd!dKd"œdLdM„ZdKddNœdOdP„Z d!d*d"œdQdR„Z!d!dKd"œdSdT„Z"d!dUd"œdVdW„Z#dXdYœdZd[„Z$ddd\œd]d^„Z%d:d_d`œdadb„Z&d:d:d`œdcdd„Z'd:d_d`œdedf„Z(dS )hÚCSSToExcelConverteraK  
    A callable for converting CSS declarations to ExcelWriter styles

    Supports parts of CSS 2.2, with minimal CSS 3.0 support (e.g. text-shadow),
    focusing on font styling, backgrounds, borders and alignment.

    Operates by first computing CSS styles in a fairly generic
    way (see :meth:`compute_css`) then determining Excel style
    properties from CSS properties (see :meth:`build_xlstyle`).

    Parameters
    ----------
    inherited : str, optional
        CSS declarations understood to be the containing scope for the
        CSS processed by :meth:`__call__`.
    ÚtopÚcenterÚbottom)rG   ztext-topZmiddleZbaselinerI   ztext-bottomTF)ÚboldZbolderZ600Z700Z800Z900ÚnormalZlighterZ100Z200Z300Z400Ú500)rK   ÚitalicZobliqueé   é   é   é   )Zserifz
sans-serifZcursiveZfantasyc                 C  s   i | ]}|  ¡ |“qS r,   r9   )r;   r#   r,   r,   r-   r=   ¢   s   ÿ zCSSToExcelConverter.<dictcomp>)
ÚdashedZmediumDashDotZ
dashDotDotÚhairÚdottedÚmediumDashDotDotÚdoubleZdashDotZslantDashDotÚmediumDashedzdict[str, str] | NoneÚ	inheritedNú
str | Noner(   )rX   r)   c                 C  s2   |d k	r|   |¡| _nd | _td d�| jƒ| _d S )N)Úmaxsize)Úcompute_cssrX   r   Ú_call_uncachedÚ_call_cached)r+   rX   r,   r,   r-   r.   ¸   s    zCSSToExcelConverter.__init__z str | frozenset[tuple[str, str]]zdict[str, dict[str, str]])Údeclarationsr)   c                 C  s
   |   |¡S )aå  
        Convert CSS declarations to ExcelWriter style.

        Parameters
        ----------
        declarations : str | frozenset[tuple[str, str]]
            CSS string or set of CSS declaration tuples.
            e.g. "font-weight: bold; background: blue" or
            {("font-weight", "bold"), ("background", "blue")}

        Returns
        -------
        xlstyle : dict
            A style as interpreted by ExcelWriter when found in
            ExcelCell.style.
        )r]   )r+   r^   r,   r,   r-   Ú__call__Ä   s    zCSSToExcelConverter.__call__c                 C  s   |   || j¡}|  |¡S r*   )r[   rX   Úbuild_xlstyle)r+   r^   Z
propertiesr,   r,   r-   r\   Ù   s    z"CSSToExcelConverter._call_uncachedzMapping[str, str])Úpropsr)   c                   sN   |   |¡|  |¡|  |¡|  |¡|  |¡dœ}dddœ‡ fdd„‰ ˆ |ƒ |S )N)Ú	alignmentZborderÚfillÚfontZnumber_formatúdict[str, str | None]r(   )Údr)   c                   sF   t |  ¡ ƒD ]4\}}|dkr$| |= qt|tƒrˆ |ƒ |s| |= qdS )z4Remove key where value is None, through nested dictsN)Úlistr@   Ú
isinstanceÚdict)rf   ÚkÚv©Úremove_noner,   r-   rm   ê   s    
z6CSSToExcelConverter.build_xlstyle.<locals>.remove_none)Úbuild_alignmentÚbuild_borderÚ
build_fillÚ
build_fontÚbuild_number_format)r+   ra   Úoutr,   rl   r-   r`   ß   s    û

z!CSSToExcelConverter.build_xlstylezdict[str, bool | str | None]c                 C  s   |  d¡|  |¡|  |¡dœS )Nz
text-align)Ú
horizontalÚverticalÚ	wrap_text)ÚgetÚ_get_vertical_alignmentÚ_get_is_wrap_text©r+   ra   r,   r,   r-   rn   ÷   s    ýz#CSSToExcelConverter.build_alignmentc                 C  s   |  d¡}|r| j  |¡S d S )Nzvertical-align)rw   ÚVERTICAL_MAP)r+   ra   Zvertical_alignr,   r,   r-   rx   ÿ   s    
z+CSSToExcelConverter._get_vertical_alignmentzbool | Nonec                 C  s"   |  d¡d krd S t|d dkƒS )Nzwhite-space)ZnowrapÚprezpre-line)rw   Úboolrz   r,   r,   r-   ry     s    z%CSSToExcelConverter._get_is_wrap_textz dict[str, dict[str, str | None]]c                   s   ‡ ‡fdd„dD ƒS )Nc                   sf   i | ]^}|ˆ  ˆ  d |› d�¡ˆ  d |› d�¡ˆ ˆ  d |› d�¡¡¡ˆ ˆ  d |› d�¡¡dœ“qS )zborder-z-stylez-widthz-color)r#   Úcolor)Ú_border_stylerw   Úcolor_to_excel)r;   Zside©ra   r+   r,   r-   r=     s   	øýúz4CSSToExcelConverter.build_border.<locals>.<dictcomp>©rG   ÚrightrI   Úleftr,   rz   r,   r�   r-   ro   
  s    	÷z CSSToExcelConverter.build_border)r#   Úwidthr~   c                 C  sÒ   |d kr|d kr|d krd S |d kr0|d kr0dS |dkr<dS |   |¡}|d krRdS |dkr^|S |dkrjdS |dkr‚|dkr~dS dS |dkrš|dkr–dS d	S || jkr®| j| S tjd
t|ƒ› �ttƒ d� dS d S )NÚnone)r†   Úhidden)NZgrooveZridgeZinsetZoutsetÚsolidrV   rT   )rS   ÚthinrU   rR   rW   zUnhandled border style format: ©Ú
stacklevel)Ú_get_width_nameÚBORDER_STYLE_MAPÚwarningsÚwarnÚreprr   r   )r+   r#   r…   r~   Z
width_namer,   r,   r-   r     s:    


ýz!CSSToExcelConverter._border_style)Úwidth_inputr)   c                 C  s2   |   |¡}|dk rd S |dk r"dS |dk r.dS dS )Ngñhãˆµøä>gÍÌÌÌÌÌô?r‰   gffffff@ZmediumZthick)Ú_width_to_float)r+   r‘   r…   r,   r,   r-   rŒ   P  s    
z#CSSToExcelConverter._get_width_nameÚfloat)r…   r)   c                 C  s   |d krd}|   |¡S )NZ2pt)Ú_pt_to_float)r+   r…   r,   r,   r-   r’   Z  s    z#CSSToExcelConverter._width_to_floatÚstr)Ú	pt_stringr)   c                 C  s   |  d¡st‚t| d¡ƒS )NÚpt)ÚendswithÚAssertionErrorr“   Úrstrip)r+   r–   r,   r,   r-   r”   _  s    z CSSToExcelConverter._pt_to_float)ra   c                 C  s&   |  d¡}|dkr"|  |¡ddœS d S )Nzbackground-color)NZtransparentr†   rˆ   )ZfgColorZpatternType)rw   r€   )r+   ra   Z
fill_colorr,   r,   r-   rp   c  s    
zCSSToExcelConverter.build_fillre   c                 C  s,   |  d¡}t|tƒr | dd¡n|}d|iS )Nznumber-formatõ   Â§ú;Zformat_code)rw   rh   r•   Úreplace)r+   ra   Zfcr,   r,   r-   rr   j  s    
z'CSSToExcelConverter.build_number_formatz$dict[str, bool | float | str | None]c                 C  sv   |   |¡}|  |¡}|r |d nd |  |¡|  |¡|  |¡|  |¡d|krNdnd d|kpZd |  | d¡¡|  |¡dœ	S )Nr   Ú	underlineÚsinglezline-throughr~   )	ÚnameÚfamilyÚsizerJ   rM   rž   Ústriker~   Zshadow)	Ú_get_font_namesÚ_get_decorationÚ_select_font_familyÚ_get_font_sizeÚ_get_is_boldÚ_get_is_italicr€   rw   Ú_get_shadow)r+   ra   Ú
font_namesÚ
decorationr,   r,   r-   rq   o  s    


özCSSToExcelConverter.build_fontc                 C  s   |  d¡}|r| j  |¡S d S )Nzfont-weight)rw   ÚBOLD_MAP)r+   ra   Zweightr,   r,   r-   r¨   �  s    
z CSSToExcelConverter._get_is_boldc                 C  s   |  d¡}|r| j  |¡S d S )Nz
font-style)rw   Ú
ITALIC_MAP)r+   ra   Z
font_styler,   r,   r-   r©   ‡  s    
z"CSSToExcelConverter._get_is_italiczSequence[str]c                 C  s"   |  d¡}|d k	r| ¡ S dS d S )Nztext-decorationr,   )rw   Úsplit)r+   ra   r¬   r,   r,   r-   r¥   �  s    
z#CSSToExcelConverter._get_decoration)r¬   r)   c                 C  s   d|krdS d S )Nrž   rŸ   r,   )r+   r¬   r,   r,   r-   Ú_get_underline”  s    z"CSSToExcelConverter._get_underlinec                 C  s    d|krt t d|d ¡ƒS d S )Nztext-shadowz^[^#(]*[1-9])r}   ÚreÚsearchrz   r,   r,   r-   rª   ™  s    zCSSToExcelConverter._get_shadowc                 C  sˆ   t  d| dd¡¡}g }|D ]f}|d d… dkrF|dd…  dd¡}n.|d d… dkrl|dd…  d	d¡}n| ¡ }|r| |¡ q|S )
Nz›(?x)
            (
            "(?:[^"]|\\")+"
            |
            '(?:[^']|\\')+'
            |
            [^'",]+
            )(?=,|\s*$)
        zfont-familyÚ rN   ú"éÿÿÿÿz\"ú'z\')r±   Úfindallrw   r�   ÚstripÚappend)r+   ra   Zfont_names_tmpr«   r    r,   r,   r-   r¤   ž  s    	
öz#CSSToExcelConverter._get_font_nameszfloat | Nonec                 C  s    |  d¡}|d kr|S |  |¡S )Nz	font-size)rw   r”   )r+   ra   r¢   r,   r,   r-   r§   ¸  s    
z"CSSToExcelConverter._get_font_sizer'   ©r)   c                 C  s&   d }|D ]}| j  |¡}|r q"q|S r*   )Ú
FAMILY_MAPrw   )r+   r«   r¡   r    r,   r,   r-   r¦   ¾  s    z'CSSToExcelConverter._select_font_family)r"   r)   c                 C  sb   |d krd S |   |¡r |  |¡S z| j| W S  tk
r\   tjdt|ƒ› �ttƒ d� Y nX d S )NzUnhandled color format: rŠ   )	Ú_is_hex_colorÚ_convert_hex_to_excelÚNAMED_COLORSÚKeyErrorrŽ   r�   r�   r   r   ©r+   r"   r,   r,   r-   r€   Ç  s    

ýz"CSSToExcelConverter.color_to_excelr}   )Úcolor_stringr)   c                 C  s   t | d¡ƒS )Nú#)r}   Ú
startswith)r+   rÁ   r,   r,   r-   r¼   Ø  s    z!CSSToExcelConverter._is_hex_colorc                 C  sH   |  d¡}|  |¡r<|d d |d d  |d d   ¡ S | ¡ S d S )NrÂ   r   rO   rN   )ÚlstripÚ_is_shorthand_colorÚupper©r+   rÁ   Úcoder,   r,   r-   r½   Û  s    

(z)CSSToExcelConverter._convert_hex_to_excelc                 C  s<   |  d¡}t|ƒdkrdS t|ƒdkr*dS td|› �ƒ‚dS )zcCheck if color code is shorthand.

        #FFF is a shorthand as opposed to full #FFFFFF.
        rÂ   é   Té   FzUnexpected color N)rÄ   ÚlenÚ
ValueErrorrÇ   r,   r,   r-   rÅ   â  s    
z'CSSToExcelConverter._is_shorthand_color)N))r/   r0   r1   Ú__doc__r   r¾   r{   r­   r®   r»   r�   Ú__annotations__r.   r   r[   r_   r\   r`   rn   rx   ry   ro   r   rŒ   r’   r”   rp   rr   rq   r¨   r©   r¥   r°   rª   r¤   r§   r¦   r€   r¼   r½   rÅ   r,   r,   r,   r-   rF   g   s€   
úóýüþ
7
	rF   c                   @  s  e Zd ZdZdZdZd8d	d
dddddd	dddœ
dd„Zeddœdd„ƒZdd„ Z	ddœdd„Z
ddœdd„Zddœdd „Zddœd!d"„Zddœd#d$„Zddœd%d&„Zeddœd'd(„ƒZd)dd*œd+d,„Zddœd-d.„Zeed/ d0�d9d	d)d)d3d
d4dd5œd6d7„ƒZdS ):ÚExcelFormattera9  
    Class for formatting a DataFrame to a list of ExcelCells,

    Parameters
    ----------
    df : DataFrame or Styler
    na_rep: na representation
    float_format : str, default None
        Format string for floating point numbers
    cols : sequence, optional
        Columns to write
    header : bool or sequence of str, default True
        Write out column names. If a list of string is given it is
        assumed to be aliases for the column names
    index : bool, default True
        output row names (index)
    index_label : str or sequence, default None
        Column label for index column(s) if desired. If None is given, and
        `header` and `index` are True, then the index names are used. A
        sequence should be given if the DataFrame uses MultiIndex.
    merge_cells : bool, default False
        Format MultiIndex and Hierarchical Rows as merged cells.
    inf_rep : str, default `'inf'`
        representation for np.inf values (which aren't representable in Excel)
        A `'-'` sign will be added in front of -inf.
    style_converter : callable, optional
        This translates Styler styles (CSS) into ExcelWriter styles.
        Defaults to ``CSSToExcelConverter()``.
        It should have signature css_declarations string -> excel style.
        This is only called for body cells.
    i   i @  r³   NTFÚinfr•   rY   zSequence[Hashable] | NonezSequence[Hashable] | boolr}   zIndexLabel | Noner4   r(   )
Úna_repÚfloat_formatÚcolsÚheaderÚindexÚindex_labelÚmerge_cellsÚinf_repÚstyle_converterr)   c                 C  sà   d| _ || _t|tƒsB|| _| j ¡  |j}|
d kr:tƒ }
|
| _nd | _d | _|| _	|d k	r®t
t|ƒ |j¡ƒsxtdƒ‚t
t|ƒ |j¡ƒt
t|ƒƒkr tdƒ‚|j|d�| _	| j	j| _|| _|| _|| _|| _|| _|	| _d S )Nr   z,passes columns are not ALL present dataframez.Not all names specified in 'columns' are found)Úcolumns)Ú
rowcounterrÑ   rh   r   ÚstylerZ_computeÚdatarF   rÙ   ÚdfrË   r   ÚintersectionrÚ   r¿   ÚsetZreindexrÒ   rÕ   rÖ   rÔ   r×   rØ   )r+   rÞ   rÑ   rÒ   rÓ   rÔ   rÕ   rÖ   r×   rØ   rÙ   r,   r,   r-   r.     s2    

 
zExcelFormatter.__init__z dict[str, dict[str, str | bool]]rº   c                 C  s    ddidddddœdddœdœS )	NrJ   Tr‰   r‚   rH   rG   )rt   ru   )rd   Zbordersrb   r,   ©r+   r,   r,   r-   Úheader_styleA  s    üøzExcelFormatter.header_stylec                 C  s€   t |ƒrt |¡r| j}nJt|ƒrdt |¡r4| j}n0t |¡rLd| j› �}n| jd k	rdt	| j| ƒ}t
|dd ƒd k	r|tdƒ‚|S )Nú-Útzinfoz{Excel does not support datetimes with timezones. Please ensure that datetimes are timezone unaware before writing to Excel.)r   r   ZisnarÑ   r   Zisposinf_scalarrØ   Zisneginf_scalarrÒ   r“   ÚgetattrrÌ   rÀ   r,   r,   r-   Ú_format_valueN  s    


ÿzExcelFormatter._format_valuezIterable[ExcelCell]c                 c  sª  | j jdkr| jstdƒ‚| js*| js*d S | j }|j| jddd�}t|ƒ}d}d}| jrzt	| j
jtƒrzt| j
jd ƒd }| j�rHt|jƒD ]\}}t|||| jd�V  qŒtt||j|jƒƒD ]†\}\}}}	| |	¡}
| ¡ D ]d\}}d\}}|dk�r
||| |  }}t||| d |
| | jt| jdd ƒ||| j||d	�
V  qÞq¾nXtt|Ž ƒD ]J\}}
d
 tt|
ƒ¡}t||| d || jt| jdd ƒ||| jd�V  �qT|| _d S )NrN   z]Writing to Excel with MultiIndex columns and no index ('index'=False) is not yet implemented.F©ZsparsifyZadjoinÚnamesr   r>   ©NNÚctx_columns©
r    r!   r"   r#   r5   r6   r7   r8   r$   r%   Ú.©r    r!   r"   r#   r5   r6   r7   r8   )rÚ   ZnlevelsrÕ   ÚNotImplementedErrorÚ_has_aliasesrÔ   Úformatr×   r   rh   rÞ   r   rË   Ú	enumeraterè   r   râ   ÚzipÚlevelsÚcodesÚtaker@   r3   rå   rÜ   rÙ   ÚjoinÚmapr   rÛ   )r+   rÚ   Ú
level_strsÚlevel_lengthsÚ	coloffsetÚlnumr    Úspansró   Úlevel_codesÚvaluesÚiÚspan_valr$   r%   rk   r,   r,   r-   Ú_format_header_mi`  sv    ÿ  ÿü
ÿ


ö
øz ExcelFormatter._format_header_mic                 c  sÐ   | j s| jrÌd}| jr6d}t| jjtƒr6t| jjjƒ}| j}| j rŒt	t
| jƒ| _t| jƒt| jƒkr†tdt| jƒ› dt| jƒ› d�ƒ‚| j}t|ƒD ]6\}}t| j|| || jt| jdd ƒd|| jd�V  q”d S )Nr   rN   zWriting z cols but got z aliasesrê   rí   )rï   rÔ   rÕ   rh   rÞ   r   rË   rè   rÚ   r   r
   rÌ   rñ   r3   rÛ   râ   rå   rÜ   rÙ   )r+   rú   ZcolnamesÚcolindexZcolnamer,   r,   r-   Ú_format_header_regular¥  s2    ÿøz%ExcelFormatter._format_header_regularc                   s˜   t ˆ jtƒrˆ  ¡ }nˆ  ¡ }d}ˆ jjjrŒdd„ ˆ jjjD ƒdgtˆ jƒ  }t	dd„ t
dd„ |ƒƒrŒ‡ fdd	„t|ƒD ƒ}ˆ  jd
7  _t ||¡S )Nr,   c                 S  s   g | ]}|d k	r|nd‘qS ©Nr³   r,   )r;   Úxr,   r,   r-   Ú
<listcomp>Ï  s     z1ExcelFormatter._format_header.<locals>.<listcomp>r³   c                 S  s   | o|S r*   r,   )r  Úyr,   r,   r-   Ú<lambda>Ò  ó    z/ExcelFormatter._format_header.<locals>.<lambda>c                 S  s   | dkS r  r,   )r  r,   r,   r-   r  Ò  r	  c                 3  s$   | ]\}}t ˆ j||ˆ jƒV  qd S r*   )r   rÛ   râ   )r;   r  r"   rá   r,   r-   Ú	<genexpr>Ó  s   ÿz0ExcelFormatter._format_header.<locals>.<genexpr>rN   )rh   rÚ   r   r  r  rÞ   rÕ   rè   rË   r   r÷   rñ   rÛ   Ú	itertoolsÚchain)r+   ÚgenZgen2r    r,   rá   r-   Ú_format_headerÄ  s     

ÿþ
þzExcelFormatter._format_headerc                 C  s"   t | jjtƒr|  ¡ S |  ¡ S d S r*   )rh   rÞ   rÕ   r   Ú_format_hierarchical_rowsÚ_format_regular_rowsrá   r,   r,   r-   Ú_format_bodyÚ  s    zExcelFormatter._format_bodyc                 c  s2  | j s| jr|  jd7  _| j�r| jrJt| jtttj	t
fƒrJ| jd }n(| jrdt| jtƒrd| j}n| jjjd }t| jtƒrŒ|  jd7  _|r²| jdk	r²t| jd d|| jƒV  | jj}t| jjtƒrÔ| jj ¡ }t|ƒD ]6\}}t| j| d|| jt| jdd ƒ|d| jd�V  qÜd}nd}|  |¡E d H  d S )NrN   r   FÚ	ctx_indexrí   )rï   rÔ   rÛ   rÕ   rÖ   rh   rg   ÚtupleÚnpÚndarrayr   r•   rÞ   rè   rÚ   r   r   râ   r   Zto_timestamprñ   r3   rå   rÜ   rÙ   Ú_generate_body)r+   rÖ   Zindex_valuesÚidxZidxvalrú   r,   r,   r-   r  à  s@     ÿø

z#ExcelFormatter._format_regular_rowsc                 c  sú  | j s| jr|  jd7  _d}| j�ræ| jjj}| jrRt| jtt	t
jtfƒrR| j}t| jtƒrr| jrr|  jd7  _tj|Ž r°| jdk	r°t|ƒD ] \}}t| jd ||| jƒV  qŽ| j�rˆ| jjjdddd�}t|ƒ}t|| jjj| jjjƒD ]˜\}}}	|j|	|j|jd�}
| ¡ D ]h\}}d\}}|dk�rB| j| | d }|}t| j| ||
| | jt| j dd ƒ||| j!||d	�
V  �q|d7 }qìn^t| jjŽ D ]P}t|ƒD ]8\}}t| j| ||| jt| j dd ƒ||| j!d
�V  �q |d7 }�q”|  "|¡E d H  d S )NrN   r   FTrç   )Z
allow_fillZ
fill_valueré   r  rë   rí   )#rï   rÔ   rÛ   rÕ   rÞ   rè   rÖ   rh   rg   r  r  r  r   rÚ   r   r×   ÚcomZany_not_nonerñ   r   râ   rð   r   rò   ró   rô   rõ   Z_can_hold_naZ	_na_valuer@   r3   rå   rÜ   rÙ   r  )r+   ZgcolidxZindex_labelsZcidxr    rø   rù   rü   ró   rý   rþ   rÿ   r   r$   r%   Zindexcolvalsr  Zindexcolvalr,   r,   r-   r    s€    
 ÿ  ÿ  ÿý
öø
z(ExcelFormatter._format_hierarchical_rowsc                 C  s
   t | jƒS )z1Whether the aliases for column names are present.)r   rÔ   rá   r,   r,   r-   rï   ]  s    zExcelFormatter._has_aliasesr&   )rú   r)   c                 c  sn   t t| jƒƒD ]Z}| jjd d …|f }t|ƒD ]8\}}t| j| || |d t| j	dd ƒ||| j
d�V  q.qd S )NÚctxrí   )ÚrangerË   rÚ   rÞ   Zilocrñ   r3   rÛ   rå   rÜ   rÙ   )r+   rú   ZcolidxZseriesrÿ   r"   r,   r,   r-   r  b  s    øzExcelFormatter._generate_bodyc                 c  s2   t  |  ¡ |  ¡ ¡D ]}|  |j¡|_|V  qd S r*   )r  r  r  r  ræ   r"   )r+   Úcellr,   r,   r-   Úget_formatted_cellsr  s    z"ExcelFormatter.get_formatted_cellsÚstorage_options)r  ÚSheet1r   ztuple[int, int] | Noner   )Ú
sheet_nameÚstartrowÚstartcolÚfreeze_panesÚenginer  r)   c              	   C  s¦   ddl m} | jj\}	}
|	| jks,|
| jkrPtd|	› d|
› d| j› d| j› �ƒ‚|  ¡ }t||ƒrhd}n||||d�}d}z|j
|||||d	� W 5 |r | 	¡  X d
S )a   
        writer : path-like, file-like, or ExcelWriter object
            File path or existing ExcelWriter
        sheet_name : str, default 'Sheet1'
            Name of sheet which will contain DataFrame
        startrow :
            upper left cell row to dump data frame
        startcol :
            upper left cell column to dump data frame
        freeze_panes : tuple of integer (length 2), default None
            Specifies the one-based bottommost row and rightmost column that
            is to be frozen
        engine : string, default None
            write engine to use if writer is a path - you can also set this
            via the options ``io.excel.xlsx.writer``,
            or ``io.excel.xlsm.writer``.

        {storage_options}

            .. versionadded:: 1.2.0
        r   )ÚExcelWriterz-This sheet is too large! Your sheet size is: z, z Max sheet size is: F)r#  r  T)r   r!  r"  N)Zpandas.io.excelr$  rÞ   ÚshapeÚmax_rowsÚmax_colsrÌ   r  rh   ÚcloseZ_write_cells)r+   Úwriterr  r   r!  r"  r#  r  r$  Znum_rowsZnum_colsZformatted_cellsZ	need_saver,   r,   r-   Úwritew  s2     ÿ
  ÿû
	zExcelFormatter.write)	r³   NNTTNFrÐ   N)r  r   r   NNN)r/   r0   r1   rÍ   r&  r'  r.   Úpropertyrâ   ræ   r  r  r  r  r  r  rï   r  r  r   r   r*  r,   r,   r,   r-   rÏ   ð  sD             õ"-E.O      ørÏ   )9rÍ   Ú
__future__r   Ú	functoolsr   r   r  r±   Útypingr   r   r   r   r	   r
   r   rŽ   Znumpyr  Zpandas._libs.libr   Zpandas._typingr   r   Zpandas.util._decoratorsr   Zpandas.util._exceptionsr   Zpandas.core.dtypesr   Zpandas.core.dtypes.commonr   r   Zpandasr   r   r   r   Zpandas.core.commonÚcoreÚcommonr  Zpandas.core.shared_docsr   Zpandas.io.formats._color_datar   Zpandas.io.formats.cssr   r   Zpandas.io.formats.formatr   Zpandas.io.formats.printingr   r   r3   rF   rÏ   r,   r,   r,   r-   Ú<module>   s6   $	   