o
    5cv                     @  s   d dl mZ d dlmZmZ d dlZd dlmZm	Z	m
Z
mZ d dlmZ d dlmZ d dlZd dlmZ d dlmZ erBd d	lmZ eed
 dG dd deZdS )    )annotations)TYPE_CHECKINGcastN)FilePath
ReadBufferScalarStorageOptions)import_optional_dependency)doc)_shared_docs)BaseExcelReader)NaTTypestorage_optionsr   c                      s   e Zd ZdZ	d.d/ fd	d
Zedd Zd0ddZed1ddZed2ddZ	d3ddZ
d4ddZ	d.d5d!d"Zd6d#d$Zd6d%d&Zd7d'd(Zd8d*d+Zd1d,d-Z  ZS )9	ODFReaderz
    Read tables out of OpenDocument formatted files.

    Parameters
    ----------
    filepath_or_buffer : str, path to be parsed or
        an open readable stream.
    {storage_options}
    Nfilepath_or_bufferFilePath | ReadBuffer[bytes]r   r   returnNonec                   s   t d t j||d d S )Nodfr   )r	   super__init__)selfr   r   	__class__ P/var/www/html/gps/gps/lib/python3.10/site-packages/pandas/io/excel/_odfreader.pyr   (   s   zODFReader.__init__c                 C  s   ddl m} |S )Nr   )OpenDocument)odf.opendocumentr   )r   r   r   r   r   _workbook_class0   s   zODFReader._workbook_classc                 C  s   ddl m} ||S )Nr   )load)r   r    )r   r   r    r   r   r   load_workbook6   s   zODFReader.load_workbookstrc                 C  s   dS )z'Property for compat with other readers. r   )r   r   r   r   empty_value;   s   zODFReader.empty_value	list[str]c                 C  s&   ddl m} | j|}dd |D S )z4Return a list of sheet names present in the documentr   Tablec                 S  s   g | ]}| d qS )name)getAttribute).0tr   r   r   
<listcomp>F   s    z)ODFReader.sheet_names.<locals>.<listcomp>)	odf.tabler'   bookgetElementsByType)r   r'   tablesr   r   r   sheet_names@   s   zODFReader.sheet_namesindexintc                 C  s*   ddl m} | | | j|}|| S )Nr   r&   )r-   r'   raise_if_bad_sheet_by_indexr.   r/   )r   r2   r'   r0   r   r   r   get_sheet_by_indexH   s   
zODFReader.get_sheet_by_indexr(   c                 C  sZ   ddl m} | | | j|}|D ]}|d|kr |  S q|   td| d)Nr   r&   r(   zsheet z
 not found)r-   r'   raise_if_bad_sheet_by_namer.   r/   r)   close
ValueError)r   r(   r'   r0   tabler   r   r   get_sheet_by_nameO   s   
zODFReader.get_sheet_by_nameconvert_floatboolfile_rows_needed
int | Nonelist[list[Scalar | NaTType]]c                   s  ddl m}m}m} | j}| j}||h ||}	d}
d}g }|	D ]} fdd|jD }d}g }|D ]3}|j|krC| ||}n| j}| 	|}|| jkrU||7 }q5|
| jg|  d}|
|g|  q5|t|k rst|}| |}| |r|
|7 }
n|
| jgg|
  d}
t|D ]}|| q|durt||kr nq#|D ]}t||k r|
| jg|t|   q|S )z9
        Parse an ODF Table into a list of lists
        r   )CoveredTableCell	TableCellTableRowc                   s$   g | ]}t |d r|j v r|qS )qname)hasattrrC   )r*   x
cell_namesr   r   r,   s   s    z,ODFReader.get_sheet_data.<locals>.<listcomp>N)r-   r@   rA   rB   rC   r/   
childNodes_get_cell_valuer$   _get_column_repeatextendlen_get_row_repeat_is_empty_rowrangeappend)r   sheetr;   r=   r@   rA   rB   covered_cell_nametable_cell_name
sheet_rows
empty_rowsmax_row_lenr9   	sheet_rowsheet_cellsempty_cells	table_row
sheet_cellvaluecolumn_repeat
row_repeat_rowr   rF   r   get_sheet_data\   sR   








zODFReader.get_sheet_datac                 C  "   ddl m} t|j|dfdS )z
        Return number of times this row was repeated
        Repeating an empty row appeared to be a common way
        of representing sparse rows in the table.
        r   TABLENSznumber-rows-repeated   odf.namespacesrd   r3   
attributesget)r   r`   rd   r   r   r   rM      s   zODFReader._get_row_repeatc                 C  rb   )Nr   rc   znumber-columns-repeatedre   rf   )r   cellrd   r   r   r   rJ      s   zODFReader._get_column_repeatc                 C  s$   |j D ]}t|j dkr dS qdS )z4
        Helper function to find empty rows
        r   FT)rH   rL   )r   r`   columnr   r   r   rN      s
   
zODFReader._is_empty_rowScalar | NaTTypec                 C  s>  ddl m} t|dkrtjS |j|df}|dkr%t|dkr#dS dS |d u r,| jS |d	krHt|j|d
f}|rFt	|}||krF|S |S |dkrX|j|d
f}t|S |dkra| 
|S |dkrq|j|d
f}t|S |dkr|j|df}t|S |dkrtt|}tt| S |   td| )Nr   )OFFICENSz#N/Az
value-typebooleanTRUETFfloatr\   
percentagestringcurrencydatez
date-valuetimezUnrecognized type )rg   rm   r"   npnanrh   ri   r$   rp   r3   _get_cell_string_valuepdto_datetimer   r   ru   r7   r8   )r   rj   r;   rm   	cell_type
cell_valuevalstampr   r   r   rI      sB   

zODFReader._get_cell_valuec           	      C  s   ddl m} ddlm} ddlm} | j}g }|jD ]2}t||rC|j|kr:t	|j
|dfd}|d|  q|| | q|t|d qd	|S )
z
        Find and decode OpenDocument text:s tags that represent
        a run length encoded sequence of space characters.
        r   )Element)TEXTNS)Scre    
r#   )odf.elementr   rg   r   odf.textr   rC   rH   
isinstancer3   rh   ri   rP   rx   r"   stripjoin)	r   rj   r   r   r   text_sr\   fragmentspacesr   r   r   rx      s   



z ODFReader._get_cell_string_value)N)r   r   r   r   r   r   )r   r   )r   r"   )r   r%   )r2   r3   )r(   r"   )r;   r<   r=   r>   r   r?   )r   r3   )r   r<   )r;   r<   r   rl   )__name__
__module____qualname____doc__r   propertyr   r!   r$   r1   r5   r:   ra   rM   rJ   rN   rI   rx   __classcell__r   r   r   r   r      s(    




E




(r   )
__future__r   typingr   r   numpyrv   pandas._typingr   r   r   r   pandas.compat._optionalr	   pandas.util._decoratorsr
   pandasry   pandas.core.shared_docsr   pandas.io.excel._baser   pandas._libs.tslibs.nattyper   r   r   r   r   r   <module>   s    