a
    Of                     @  sz  d Z ddlmZ ddlmZmZmZmZ ddlZddl	Z	ddl
Z
ddl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 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,m-Z- ddl.m/Z/ ddl0m1Z1 er<ddl2m3Z3m4Z4m5Z5m6Z6 ddlm7Z7 G dd dZ8G dd de8Z9G dd dZ:G dd dZ;dS )zC
Utilities for conversion to writer-agnostic Excel representation.
    )annotations)HashableIterableMappingSequenceN)TYPE_CHECKINGAnyCallablecast)is_list_like)doc)find_stack_level)missing)is_float	is_scalar)	DataFrameIndex
MultiIndexPeriodIndex)_shared_docs)CSS4_COLORS)CSSResolver
CSSWarning)get_level_lengths)pprint_thing)FilePath
IndexLabelStorageOptionsWriteExcelBufferExcelWriterc                   @  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/   P/var/www/ai-form-bot/venv/lib/python3.9/site-packages/pandas/io/formats/excel.py__init__C   s    	zExcelCell.__init__)NNN)__name__
__module____qualname__Z
__fields__	__slots__r1   r/   r/   r/   r0   r!   ?   s      r!   c                	      s0   e Zd Zddddddddd fddZ  ZS )	CssExcelCellr)   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/   r0   
<dictcomp>c   s   z)CssExcelCell.__init__.<locals>.<dictcomp>r#   r$   r%   r&   )	frozensetitemssuperr1   )r.   r#   r$   r%   r&   r9   r:   r;   r<   kwargsZdeclaration_dictZunique_declarations	__class__r/   r0   r1   U   s    
zCssExcelCell.__init__)r2   r3   r4   r1   __classcell__r/   r/   rG   r0   r6   T   s   r6   c                   @  s0  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#dKdXdY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)rK   ztext-topmiddleZbaselinerM   ztext-bottomTF)boldZbolderZ600Z700Z800Z900normalZlighter100Z200Z300Z400500)rP   italicZoblique            )Zserifz
sans-serifZcursiveZfantasyc                 C  s   i | ]}|  |qS r/   r=   )r?   r&   r/   r/   r0   rA      s   zCSSToExcelConverter.<dictcomp>)
dashedZmediumDashDotZ
dashDotDothairdottedmediumDashDotDotdoubleZdashDotZslantDashDotmediumDashedzdict[str, str] | None	inheritedN
str | Noner+   )r^   r,   c                 C  s.   |d ur|  || _nd | _t| j| _d S r-   )compute_cssr^   	functoolscache_call_uncached_call_cached)r.   r^   r/   r/   r0   r1      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.
        )rd   )r.   re   r/   r/   r0   __call__   s    zCSSToExcelConverter.__call__c                 C  s   |  || j}| |S r-   )r`   r^   build_xlstyle)r.   re   
propertiesr/   r/   r0   rc      s    z"CSSToExcelConverter._call_uncachedzMapping[str, str])propsr,   c                   sN   |  || || || || |d}ddd fdd  | |S )N)	alignmentborderfillfontZnumber_formatdict[str, str | None]r+   )dr,   c                   sF   t |  D ]4\}}|du r$| |= qt|tr | |s| |= qdS )z4Remove key where value is None, through nested dictsN)listrD   
isinstancedict)ro   kvremove_noner/   r0   rv      s    
z6CSSToExcelConverter.build_xlstyle.<locals>.remove_none)build_alignmentbuild_border
build_fill
build_fontbuild_number_format)r.   ri   outr/   ru   r0   rg      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.   ri   r/   r/   r0   rw      s    z#CSSToExcelConverter.build_alignmentc                 C  s   | d}|r| j |S d S )Nzvertical-align)r   VERTICAL_MAP)r.   ri   Zvertical_alignr/   r/   r0   r     s    
z+CSSToExcelConverter._get_vertical_alignmentzbool | Nonec                 C  s"   | dd u rd S t|d dvS )Nzwhite-space)Znowrapprezpre-line)r   boolr   r/   r/   r0   r     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_styler   color_to_excel)r?   Zsideri   r.   r/   r0   rA     s   	z4CSSToExcelConverter.build_border.<locals>.<dictcomp>rK   rightrM   leftr/   r   r/   r   r0   rx     s    	z CSSToExcelConverter.build_border)r&   widthr   c                 C  s   |d u r|d u r|d u rd S |d u r0|d u r0dS |dv r<dS |  |}|d u rRdS |dv r^|S |dkrjdS |dkr|dv r~dS dS |dkr|dv rdS d	S || jv r| j| S tjd
t| tt d dS d S )Nnone)r   Zhidden)NZgrooveZridgeZinsetZoutsetsolidr\   rZ   )rY   thinr[   rX   r]   zUnhandled border style format: 
stacklevel)_get_width_nameBORDER_STYLE_MAPwarningswarnreprr   r   )r.   r&   r   r   Z
width_namer/   r/   r0   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 )Ngh㈵>g?r   gffffff@ZmediumZthick)_width_to_float)r.   r   r   r/   r/   r0   r   V  s    
z#CSSToExcelConverter._get_width_namefloat)r   r,   c                 C  s   |d u rd}|  |S )NZ2pt)_pt_to_float)r.   r   r/   r/   r0   r   `  s    z#CSSToExcelConverter._width_to_floatstr)	pt_stringr,   c                 C  s   | dsJ t|dS )Npt)endswithr   rstrip)r.   r   r/   r/   r0   r   e  s    z CSSToExcelConverter._pt_to_float)ri   c                 C  s&   | d}|dvr"| |ddS d S )Nzbackground-color)Ntransparentr   r   )ZfgColorZpatternType)r   r   )r.   ri   Z
fill_colorr/   r/   r0   ry   i  s    
zCSSToExcelConverter.build_fillrn   c                 C  s,   | d}t|tr |ddn|}d|iS )Nznumber-format   §;Zformat_code)r   rq   r   replace)r.   ri   fcr/   r/   r0   r{   p  s    
z'CSSToExcelConverter.build_number_formatz$dict[str, bool | float | str | None]c                 C  sv   |  |}| |}|r |d nd | || || || |d|v rNdnd d|v pZd | |d| |d	S )Nr   	underlinesinglezline-throughr   )	namefamilysizerO   rS   r   striker   Zshadow)	_get_font_names_get_decoration_select_font_family_get_font_size_get_is_bold_get_is_italicr   r   _get_shadow)r.   ri   
font_names
decorationr/   r/   r0   rz   u  s    


zCSSToExcelConverter.build_fontc                 C  s   | d}|r| j |S d S )Nzfont-weight)r   BOLD_MAP)r.   ri   weightr/   r/   r0   r     s    
z CSSToExcelConverter._get_is_boldc                 C  s   | d}|r| j |S d S )Nz
font-style)r   
ITALIC_MAP)r.   ri   Z
font_styler/   r/   r0   r     s    
z"CSSToExcelConverter._get_is_italiczSequence[str]c                 C  s"   | d}|d ur| S dS d S )Nztext-decorationr/   )r   split)r.   ri   r   r/   r/   r0   r     s    
z#CSSToExcelConverter._get_decoration)r   r,   c                 C  s   d|v rdS d S )Nr   r   r/   )r.   r   r/   r/   r0   _get_underline  s    z"CSSToExcelConverter._get_underlinec                 C  s    d|v rt td|d S d S )Nztext-shadowz^[^#(]*[1-9])r   researchr   r/   r/   r0   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 rT   "z\"'z\')r   findallr   r   stripappend)r.   ri   Zfont_names_tmpr   r   r/   r/   r0   r     s    	
z#CSSToExcelConverter._get_font_nameszfloat | Nonec                 C  s    | d}|d u r|S | |S )Nz	font-size)r   r   )r.   ri   r   r/   r/   r0   r     s    
z"CSSToExcelConverter._get_font_sizer*   )r   r,   c                 C  s&   d }|D ]}| j |}|r q"q|S r-   )
FAMILY_MAPr   )r.   r   r   r   r/   r/   r0   r     s    z'CSSToExcelConverter._select_font_family)r%   r,   c                 C  s`   |d u rd S |  |r | |S z| j| W S  tyZ   tjdt| tt d Y n0 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/   r0   r     s    

z"CSSToExcelConverter.color_to_excelr   )color_stringr,   c                 C  s   t |dS )N#)r   
startswith)r.   r   r/   r/   r0   r     s    z!CSSToExcelConverter._is_hex_colorc                 C  sH   | d}| |r<|d d |d d  |d d   S | S d S )Nr   r   rU   rT   )lstrip_is_shorthand_colorupperr.   r   coder/   r/   r0   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/   r0   r     s    
z'CSSToExcelConverter._is_shorthand_color)N))r2   r3   r4   __doc__r   r   r   r   r   r   r   __annotations__r1   r   r`   rf   rc   rg   rw   r   r   rx   r   r   r   r   ry   r{   rz   r   r   r   r   r   r   r   r   r   r   r   r   r/   r/   r/   r0   rJ   m   s   

7
	rJ   c                   @  s  e Zd ZdZdZdZd:d	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d;d3d	d)d)d4d
d5d6dd7	d8d9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   r_   zSequence[Hashable] | NonezSequence[Hashable] | boolr   zIndexLabel | Noner8   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 u r:t }
|
| _nd | _d | _|| _	|d urt
t||jsxtdt
t||jt
t|krt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   rq   r   stylerZ_computedatarJ   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/   r0   r1     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 )	NrO   Tr   r   rL   rK   )r}   r~   )rm   Zbordersrj   r/   r.   r/   r/   r0   header_styleG  s    zExcelFormatter.header_stylec                 C  s   t |rt|r| j}nJt|rdt|r4| j}n0t|rLd| j }n| jd urdt	| j| }t
|dd d u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/   r0   _format_valueT  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}t|}d}d}| jrxt	| j
jtrxt| j
jd d }| jrFt|jD ]\}}t|||| jdV  qtt||j|jD ]\}\}}}	||	}
| D ]d\}}d\}}|dkr||| |  }}t||| d |
| | jt| jdd ||| j||d	
V  qqnXtt| D ]J\}}
d
tt|
}t||| d || jt| jdd ||| jdV  qR|| _d S )NrT   z]Writing to Excel with MultiIndex columns and no index ('index'=False) is not yet implemented.FZsparsifyZinclude_namesr   rB   NNctx_columns
r#   r$   r%   r&   r9   r:   r;   r<   r'   r(   .r#   r$   r%   r&   r9   r:   r;   r<   )r   Znlevelsr   NotImplementedError_has_aliasesr   _format_multir   r   rq   r   r   r   	enumeratenamesr!   r   ziplevelscodestakerD   r6   r   r   r   joinmapr   r   )r.   r   
level_strslevel_lengths	coloffsetlnumr   spansr   level_codesvaluesispan_valr'   r(   rt   r/   r/   r0   _format_header_mif  sr    




z ExcelFormatter._format_header_mic                 c  s   | j s| jrd}| jr6d}t| jjtr6t| jjj}| j}| j rt	t
| j| _t| jt| jkrtdt| j dt| j d| j}t|D ]6\}}t| j|| || jt| jdd d|| jdV  qd S )Nr   rT   zWriting z cols but got z aliasesr   r   )r   r   r   rq   r   r   r   r   r   r
   r   r   r   r6   r   r   r   r   r   )r.   r  ZcolnamescolindexZcolnamer/   r/   r0   _format_header_regular  s6    z%ExcelFormatter._format_header_regularc                   s   t  jtr  }n  }d} jjjrdd  jjjD dgt j  }t	
dd dd |D r fd	dt|D }  jd
7  _t||S )Nr/   c                 S  s   g | ]}|d ur|ndqS )Nr   r/   r?   xr/   r/   r0   
<listcomp>      z1ExcelFormatter._format_header.<locals>.<listcomp>r   c                 S  s   | o|S r-   r/   )r  yr/   r/   r0   <lambda>  r  z/ExcelFormatter._format_header.<locals>.<lambda>c                 s  s   | ]}|d kV  qdS )r   Nr/   r  r/   r/   r0   	<genexpr>  r  z0ExcelFormatter._format_header.<locals>.<genexpr>c                 3  s$   | ]\}}t  j|| jV  qd S r-   )r!   r   r   )r?   r  r%   r   r/   r0   r    s   rT   )rq   r   r   r
  r  r   r   r   r   ra   reducer   r   	itertoolschain)r.   genZgen2r#   r/   r   r0   _format_header  s     


zExcelFormatter._format_headerc                 C  s"   t | jjtr|  S |  S d S r-   )rq   r   r   r   _format_hierarchical_rows_format_regular_rowsr   r/   r/   r0   _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urt| 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  qd}nd}| |E d H  d S )NrT   r   F	ctx_indexr   )r   r   r   r   r   rq   rp   tuplenpndarrayr   r   r   r   r   r   r!   r   r   Zto_timestampr   r6   r   r   r   _generate_body)r.   r   Zindex_valuesidxZidxvalr  r/   r/   r0   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urt|D ] \}}t| jd ||| jV  q| jr| jjjddd}t|}t|| jjj| jjjD ]\}}}	|j|	|j|jd}
| D ]h\}}d\}}|dkr@| j| | d }|}t| j| ||
| | jt| j dd ||| j!||d	
V  q|d7 }qn^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 )NrT   r   FTr   )Z
allow_fillZ
fill_valuer   r  r   r   )#r   r   r   r   r   r   r   rq   rp   r  r  r  r   r   r   r   comZany_not_noner   r!   r   r   r   r   r   r   r   Z_can_hold_naZ	_na_valuerD   r6   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/   r0   r    sv    


z(ExcelFormatter._format_hierarchical_rowsc                 C  s
   t | jS )z1Whether the aliases for column names are present.)r   r   r   r/   r/   r0   r   c  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   r6   r   r   r   r   )r.   r  ZcolidxZseriesr  r%   r/   r/   r0   r   h  s    zExcelFormatter._generate_bodyc                 c  s2   t |  |  D ]}| |j|_|V  qd S r-   )r  r  r  r  r   r%   )r.   cellr/   r/   r0   get_formatted_cellsx  s    z"ExcelFormatter.get_formatted_cellsstorage_options)r'  Sheet1r   z)FilePath | WriteExcelBuffer | ExcelWriterztuple[int, int] | NonezStorageOptions | Noner7   )	writer
sheet_namestartrowstartcolfreeze_panesenginer'  engine_kwargsr,   c	              	   C  s   ddl m}	 | jj\}
}|
| jks,|| jkrPtd|
 d| d| j d| j |du r\i }|  }t||	rtd}n|	||||d}d	}z$|j	|||||d
 W |r|
  n|r|
  0 dS )ab  
        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}

        engine_kwargs: dict, optional
            Arbitrary keyword arguments passed to excel engine.
        r   r   z-This sheet is too large! Your sheet size is: z, z Max sheet size is: NF)r.  r'  r/  T)r+  r,  r-  )Zpandas.io.excelr    r   shapemax_rowsmax_colsr   r&  rq   Z_write_cellsclose)r.   r)  r*  r+  r,  r-  r.  r'  r/  r    Znum_rowsZnum_colsZformatted_cellsZ	need_saver/   r/   r0   write}  sD    "
	
zExcelFormatter.write)	r   NNTTNFr   N)r(  r   r   NNNN)r2   r3   r4   r   r1  r2  r1   propertyr   r   r
  r  r  r  r  r  r   r   r&  r   r   r4  r/   r/   r/   r0   r     sF             "-E.O       r   )<r   
__future__r   collections.abcr   r   r   r   ra   r  r   typingr   r   r	   r
   r   numpyr  Zpandas._libs.libr   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   Zpandas._typingr   r   r   r   r    r!   r6   rJ   r   r/   r/   r/   r0   <module>   s<      