
    ^b                     ~   d Z ddlZddlmZ ddlmZ  ej        d          ZdZdZ	d	Z
 ej        d
e
z   dz   ej                  ZdZ ej        d                    ee
          ej                  Zd Zd Zd Zd Zi Zi Z edd          D ]Z ee          Zeee<   eee<   d Zd Zd Zd Zd Zd Zd Zd Z dS )zT
Collection of utilities used within the package and also available for client code
    N)digits   )CellCoordinatesExceptionz^[$]?([A-Za-z]{1,3})[$]?(\d+)$z[A-Z]{1,3}:[A-Z]{1,3}:z\d+:\d+:zq
[$]?(?P<min_col>[A-Za-z]{1,3})?
[$]?(?P<min_row>\d+)?
(:[$]?(?P<max_col>[A-Za-z]{1,3})?
[$]?(?P<max_row>\d+)?)?
^$z7
(('(?P<quoted>([^']|'')*)')|(?P<notquoted>[^'^ ^!]*))!z{0}(?P<cells>{1})(?=,?)c                     t          | t                    rt          |           } t          |t                    rt          |          }d t          | |dz             D             S )z
    Given the start and end columns, return all the columns in the series.

    The start and end columns can be either column letters or 1-based
    indexes.
    c                 ,    g | ]}t          |          S  get_column_letter).0xs     3lib/python3.11/site-packages/openpyxl/utils/cell.py
<listcomp>z'get_column_interval.<locals>.<listcomp>'   s!    @@@Qa  @@@    r   )
isinstancestrcolumn_index_from_stringrange)startends     r   get_column_intervalr      sd     % 0(//#s ,&s++@@%sQw*?*?@@@@r   c                     t                               |           }|sd|  d}t          |          |                                \  }}t	          |          }|sd|  d}t          |          ||fS )z;Convert a coordinate string like 'B12' to a tuple ('B', 12)zInvalid cell coordinates ()zThere is no row 0 ()COORD_REmatchr   groupsint)coord_stringr   msgcolumnrows        r   coordinate_from_stringr#   *   s    NN<((E ,:<:::&s+++,,..KFC
c((C ,3L333&s+++3;r   c                    t                               |           }|st          |  d          |                    d          }|                                D ]\  }}|rd| ||<   |d         s|d         rd}nd} |j        di |S )	zDConvert a coordinate to an absolute coordinate string (B12 -> $B$12)z  is not a valid coordinate range r   max_colmax_rowz%{min_col}{min_row}:{max_col}{max_row}z{min_col}{min_row}r
   )ABSOLUTE_REr   
ValueError	groupdictitemsformat)r   mdkvfmts         r   absolute_coordinater2   8   s    ,''A LLJJJKKK	BA		  1 	q77AaD| #q| #5"3:????r   c                 N   d| cxk    rdk    s$n t          d                    |                     g }| dk    rKt          | d          \  } }|dk    rd}| dz  } |                    t	          |dz                        | dk    Kd                    t          |                    S )zConvert a column number into a column letter (3 -> 'C')

    Right shift the column col_idx by 26 to find column letters in reverse
    order.  These numbers are 1-based, and can be converted to ASCII
    ordinals by adding 64.

    r   ifG  Invalid column index {0}r      @   r%   )r)   r,   divmodappendchrjoinreversed)col_idxletters	remainders      r   _get_column_letterr?   J   s      E E E E5 E E E E3::7CCDDDG
A+ *#GR00> 	IqLGs9R<(())) A+ * 778G$$%%%r   igG  c                 ~    	 t           |          S # t          $ r# t          d                    |                     w xY w)z?Convert a column index into a column letter
    (3 -> 'C')
    r4   )_STRING_COL_CACHEKeyErrorr)   r,   )idxs    r   r   r   i   sO    A %% A A A3::3??@@@As    -<c                     	 t           |                                          S # t          $ r# t          d                    |                     w xY w)z@Convert a column name into a numerical index
    ('A' -> 1)
    z{0} is not a valid column name)_COL_STRING_CACHEupperrB   r)   r,   )str_cols    r   r   r   s   sW    
K 11 K K K9@@IIJJJKs	   ! -Ac                 $   d                     |           }t                              |           }|st          |          |                                \  }}}}}|re||f}||f}	t          ||	z             sKt          |          rt          |	          r-t          |	          rt          |          rt          |          |t          |          }|t          |          }|t          |          }n|}|t          |          }n|}||||fS )z
    Convert a range string into a tuple of boundaries:
    (min_col, min_row, max_col, max_row)
    Cell coordinates will be converted into a range with the cell at both end
    z&{0} is not a valid coordinate or range)	r,   r(   r   r)   r   allanyr   r   )
range_stringr    r-   min_colmin_rowsepr&   r'   colsrowss
             r   range_boundariesrQ   ~   s?    3
9
9,
G
GC,''A oo./hhjj+GWc7G
 	" t	"II	"!$ii	" II	" "$ii	"
 S//! 4*733 g,, *733 g,,GWg--r   c              #      K   t          |           \  }}}}t          ||dz             }d t          ||dz             D             }|D ]t          fd|D                       V   dS )[
    Get individual addresses for every cell in a range.
    Yields one row at a time.
    r   c                 ,    g | ]}t          |          S r
   r   r   cols     r   r   z#rows_from_range.<locals>.<listcomp>   s!    JJJsc""JJJr   c              3   D   K   | ]}d                      |          V  dS z{0}{1}Nr,   )r   rV   r"   s     r   	<genexpr>z"rows_from_range.<locals>.<genexpr>   1      >>#HOOC-->>>>>>r   NrQ   r   tuple)rK   rL   rM   r&   r'   rP   rO   r"   s          @r   rows_from_ranger^      s      
 *:,)G)G&GWgw'A+&&DJJeGWq[.I.IJJJD ? ?>>>>>>>>>>>>>? ?r   c              #      K   t          |           \  }}}}t          ||dz             }d t          ||dz             D             }|D ]t          fd|D                       V   dS )rS   r   c              3   4   K   | ]}t          |          V  d S )Nr   rU   s     r   rZ   z"cols_from_range.<locals>.<genexpr>   s+      HHsc""HHHHHHr   c              3   D   K   | ]}d                      |          V  dS rX   rY   )r   r"   rV   s     r   rZ   z"cols_from_range.<locals>.<genexpr>   r[   r   Nr\   )rK   rL   rM   r&   r'   rP   rO   rV   s          @r   cols_from_rangerb      s      
 *:,)G)G&GWgw'!)$$DHHeGWQY.G.GHHHD ? ?>>>>>>>>>>>>>? ?r   c                     t          |           D ]\  }}|t          v r n| d|                                         }| |d         }t          |          t          |         fS )zA
    Convert an Excel style coordinate to (row, colum) tuple
    N)	enumerater   rF   r   rE   )
coordinaterC   crV   r"   s        r   coordinate_to_tuplerg      st     J''  Q; 	E	
TcT

 
 
"
"C
STT
Cs88&s+++r   c                     t                               |           }|t          d          |                    d          p|                    d          }|                    d          }t	          |          }||fS )zc
    Convert a worksheet range to the sheetname and maximum and minimum
    coordinate indices
    Nz)Value must be of the form sheetname!A1:E4quoted	notquotedcells)SHEETRANGE_REr   r)   grouprQ   )rK   r-   	sheetnamerk   
boundariess        r   range_to_tuplerp      sz    
 	L))A FDEEE!!9QWW[%9%9IGGGE!%((Jj  r   c                 d    d| v r|                      dd          } d                    |           } | S )z>
    Add quotes around sheetnames if they contain spaces.
    'z''z'{0}')replacer,   )rn   s    r   quote_sheetnamert      s=     i 1%%c400		**Ir   )!__doc__restringr   
exceptionsr   compiler   	COL_RANGE	ROW_RANGE
RANGE_EXPRVERBOSEr(   SHEET_TITLEr,   rl   r   r#   r2   r?   rE   rA   r   irV   r   r   rQ   r^   rb   rg   rp   rt   r
   r   r   <module>r      s    
			       0 0 0 0 0 0 2:788(		
 bjz)3.
;;:
8??  j* *A A A    $& & &.   	q%  A

Q

CacA A AK K K(. (. (.V	? 	? 	?	? 	? 	?	, 	, 	,! ! !    r   