
    Owg                       U d dl mZ d dlmZmZmZmZ d dlmZm	Z	m
Z
mZmZmZ d dlmZ d dlmZmZ erd dlmZ ee   Z ede
egef         Zi Zd	ed
<   ddZdddZddZd dZd!dZed"d       Z ed#d       Z ed$d       Z ed%d       Z 	 	 	 	 d&dZ ed'd       Z!ed(d       Z!d)dZ!	 	 	 	 	 	 d*dZ"	 	 	 	 	 	 d+dZ#d,dZ$y)-    )annotations)HashableIterableMutableMappingSequence)TYPE_CHECKINGAnyCallableLiteralTypeVaroverloadimport_optional_dependency)
is_integeris_list_like)ExcelWriterusecols_func)boundz"MutableMapping[str, ExcelWriter_t]_writersc                Z    t        |       st        d      | j                  }| t        |<   y)z
    Add engine to the excel writer registry.io.excel.

    You must use this method to integrate with ``to_excel``.

    Parameters
    ----------
    klass : ExcelWriter
    z&Can only register callables as enginesN)callable
ValueError_enginer   )klassengine_names     L/var/www/horilla/myenv/lib/python3.12/site-packages/pandas/io/excel/_util.pyregister_writerr   "   s*     E?ABB--K!H[    c                r    dddddd}ddddd}|dv sJ |dk(  rt        d	d
      }|rd	|d<   ||    S ||    S )a  
    Return the default reader/writer for the given extension.

    Parameters
    ----------
    ext : str
        The excel file extension for which to get the default engine.
    mode : str {'reader', 'writer'}
        Whether to get the default engine for reading or writing.
        Either 'reader' or 'writer'

    Returns
    -------
    str
        The default engine for the extension.
    openpyxlpyxlsbxlrdodf)xlsxxlsmxlsbxlsods)r$   r%   r&   r(   )readerwriterr*   
xlsxwriterwarn)errorsr$   r   )extmode_default_readers_default_writersr+   s        r   get_default_enginer2   2   sz    $  	 ''''x/VL
'3V$$$$$r   c                X    	 t         |    S # t        $ r}t        d|  d      |d }~ww xY w)NzNo Excel writer '')r   KeyErrorr   )r   errs     r   
get_writerr7   [   s<    F$$ F,[M;<#EFs    	)$)c                    d}| j                         j                         D ]N  }t        |      }|t        d      k  s|t        d      kD  rt        d|        |dz  |z   t        d      z
  dz   }P |dz
  S )ai  
    Convert Excel column name like 'AB' to 0-based column index.

    Parameters
    ----------
    x : str
        The Excel column name to convert to a 0-based column index.

    Returns
    -------
    num : int
        The column index corresponding to the name.

    Raises
    ------
    ValueError
        Part of the Excel column name was invalid.
    r   AZzInvalid column name:       )upperstripordr   )xindexccps       r   
_excel2numrD   b   s}    & EWWY__ /VC=BSM4QC899
R#c(*Q./ 19r   c           
        g }| j                  d      D ]h  }d|v rH|j                  d      }|j                  t        t        |d         t        |d         dz                O|j	                  t        |             j |S )a  
    Convert comma separated list of column names and ranges to indices.

    Parameters
    ----------
    areas : str
        A string containing a sequence of column ranges (or areas).

    Returns
    -------
    cols : list
        A list of 0-based column indices.

    Examples
    --------
    >>> _range2cols('A:E')
    [0, 1, 2, 3, 4]
    >>> _range2cols('A,C,Z:AB')
    [0, 2, 25, 26, 27]
    ,:r   r<   )splitextendrangerD   append)areascolsrngrngss       r   _range2colsrP      sv    * D{{3 )#:99S>DKKja1:d1g3F3JKLKK
3() Kr   c                     y N usecolss    r   maybe_convert_usecolsrV          r   c                     y rR   rS   rT   s    r   rV   rV      rW   r   c                     y rR   rS   rT   s    r   rV   rV      rW   r   c                     y rR   rS   rT   s    r   rV   rV      rW   r   c                p    | | S t        |       rt        d      t        | t              rt	        |       S | S )a  
    Convert `usecols` into a compatible format for parsing in `parsers.py`.

    Parameters
    ----------
    usecols : object
        The use-columns object to potentially convert.

    Returns
    -------
    converted : object
        The compatible format of `usecols`.
    z}Passing an integer for `usecols` is no longer supported.  Please pass in a list of int from 0 to `usecols` inclusive instead.)r   r   
isinstancestrrP   rT   s    r   rV   rV      sE      'R
 	

 '37##Nr   c                     y rR   rS   freeze_paness    r   validate_freeze_panesra      rW   r   c                     y rR   rS   r_   s    r   ra   ra      rW   r   c                `    | ,t        |       dk(  rt        d | D              ryt        d      y)N   c              3  <   K   | ]  }t        |t                y wrR   )r\   int).0items     r   	<genexpr>z(validate_freeze_panes.<locals>.<genexpr>   s      *
&*JtS!*
s   TzLfreeze_panes must be of form (row, column) where row and column are integersF)lenallr   r_   s    r   ra   ra      sE    |!c *
.:*
 '
 0
 	
 r   c                    | d   }t        dt        |             D ])  }||   s| |   }| |   dk(  s| |   || |<    d||<   | |   }+ | |fS )a  
    Forward fill blank entries in row but only inside the same parent index.

    Used for creating headers in Multiindex.

    Parameters
    ----------
    row : list
        List of items in a single row.
    control_row : list of bool
        Helps to determine if particular column is in same parent index as the
        previous value. Used to stop propagation of empty cells between
        different indexes.

    Returns
    -------
    Returns changed row and control_row
    r   r<    F)rJ   rj   )rowcontrol_rowlastis       r   fill_mi_headerrr      sr    * q6D1c#h 1~q6Dq6R<3q6>CF"KNq6D r   c                    t        |      rt        |t              sJ t        |      }nt        |t              rJ |}| |   }|dk(  rdn|}|| d| dgz   | |dz   d z   fS )a  
    Pop the header name for MultiIndex parsing.

    Parameters
    ----------
    row : list
        The data row to parse for the header name.
    index_col : int, list
        The index columns for our data. Assumed to be non-null.

    Returns
    -------
    header_name : str
        The extracted header name.
    trimmed_row : list
        The original data row with the header name removed.
    rm   Nr<   )r   r\   r   max)rn   	index_colrq   header_names       r   pop_header_namerw     sw    * I)X...	Ni222a&K%+$KBQ2$QUW555r   c                R    | i }n| j                         }|j                  |       |S )a  
    Used to combine two sources of kwargs for the backend engine.

    Use of kwargs is deprecated, this function is solely for use in 1.3 and should
    be removed in 1.4/2.0. Also _base.ExcelWriter.__new__ ensures either engine_kwargs
    or kwargs must be None or empty respectively.

    Parameters
    ----------
    engine_kwargs: dict
        kwargs to be passed through to the engine.
    kwargs: dict
        kwargs to be psased through to the engine (deprecated)

    Returns
    -------
    engine_kwargs combined with kwargs
    )copyupdate)engine_kwargskwargsresults      r   combine_kwargsr~   6  s.    & ##%
MM&Mr   N)r   ExcelWriter_treturnNone)r)   )r.   r]   r/   zLiteral['reader', 'writer']r   r]   )r   r]   r   r   )r@   r]   r   rf   )rL   r]   r   	list[int])rU   zstr | list[int]r   r   )rU   	list[str]r   r   )rU   r   r   r   )rU   r   r   r   )rU   z1str | list[int] | list[str] | usecols_func | Noner   z+None | list[int] | list[str] | usecols_func)r`   ztuple[int, int]r   zLiteral[True])r`   r   r   zLiteral[False])r`   ztuple[int, int] | Noner   bool)rn   list[Hashable]ro   z
list[bool]r   z!tuple[list[Hashable], list[bool]])rn   r   ru   zint | Sequence[int]r   z&tuple[Hashable | None, list[Hashable]])r{   zdict[str, Any] | Noner|   dictr   r   )%
__future__r   collections.abcr   r   r   r   typingr   r	   r
   r   r   r   pandas.compat._optionalr   pandas.core.dtypes.commonr   r   pandas.io.excel._baser   typer   objectr   r   __annotations__r   r2   r7   rD   rP   rV   ra   rr   rw   r~   rS   r   r   <module>r      sK   "   ?
 1%M>8*f:L1MNL/1
, 1" &%RF@B 
 
 
 
 
 
 
 
>0> 
 
 
 
" 	 &0 & F6	6$76+6Dr   