a
    oÝEb¹  ã                   @  s`   d dl 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Zd dlmZ G dd„ deƒZdS )é    )ÚannotationsN)ÚFilePathÚ
ReadBufferÚScalarÚStorageOptions)Úimport_optional_dependency)ÚBaseExcelReaderc                      sÜ   e Zd ZdZd+dddœ‡ fdd„Zedd	„ ƒZdd
œdd„Zeddœdd„ƒZeddœdd„ƒZ	ddœdd„Z
ddœdd„Zdddœdd„Zddœd d!„Zddœd"d#„Zddœd$d%„Zdd&dœd'd(„Zddœd)d*„Z‡  ZS ),Ú	ODFReadera"  
    Read tables out of OpenDocument formatted files.

    Parameters
    ----------
    filepath_or_buffer : str, path to be parsed or
        an open readable stream.
    storage_options : dict, optional
        passed to fsspec for appropriate URLs (see ``_get_filepath_or_buffer``)
    NzFilePath | ReadBuffer[bytes]r   )Úfilepath_or_bufferÚstorage_optionsc                   s   t dƒ tƒ j||d� d S )NZodf)r   )r   ÚsuperÚ__init__)Úselfr
   r   ©Ú	__class__© úZ/home/ja/django-apps/lartica_env/lib/python3.9/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_class&   s    zODFReader._workbook_class)r
   c                 C  s   ddl m} ||ƒS )Nr   )Úload)r   r   )r   r
   r   r   r   r   Úload_workbook,   s    zODFReader.load_workbookÚstr)Úreturnc                 C  s   dS )z'Property for compat with other readers.Ú r   )r   r   r   r   Úempty_value1   s    zODFReader.empty_valuez	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><   ó    z)ODFReader.sheet_names.<locals>.<listcomp>)Ú	odf.tabler   ÚbookÚgetElementsByType)r   r   Útablesr   r   r   Úsheet_names6   s    zODFReader.sheet_namesÚint)Úindexc                 C  s*   ddl m} |  |¡ | j |¡}|| S )Nr   r   )r%   r   Zraise_if_bad_sheet_by_indexr&   r'   )r   r+   r   r(   r   r   r   Úget_sheet_by_index>   s    
zODFReader.get_sheet_by_indexr   c                 C  s^   ddl m} |  |¡ | j |¡}|D ]}| d¡|kr&|  S q&|  ¡  td|› d�ƒ‚d S )Nr   r   r   zsheet z
 not found)r%   r   Zraise_if_bad_sheet_by_namer&   r'   r    ÚcloseÚ
ValueError)r   r   r   r(   Útabler   r   r   Úget_sheet_by_nameE   s    

zODFReader.get_sheet_by_nameÚboolzlist[list[Scalar]])Úconvert_floatr   c                   sr  ddl m}m}m} |ƒ j}|ƒ j}||h‰ | |¡}d}	d}
g }|D ]ò}‡ fdd„|jD ƒ}d}g }|D ]f}|j|kr†|  ||¡}n| j}|  	|¡}|| jkrª||7 }qj| 
| jg| ¡ d}| 
|g| ¡ qj|
t|ƒk ræt|ƒ}
|  |¡}|  |¡�r|	|7 }	qF| 
| jgg|	 ¡ d}	t|ƒD ]}| |¡ �q&qF|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 | ]}|j ˆ v r|‘qS r   )Úqname)r!   Úx©Ú
cell_namesr   r   r#   g   r$   z,ODFReader.get_sheet_data.<locals>.<listcomp>)r%   r3   r4   r5   r6   r'   Ú
childNodesÚ_get_cell_valuer   Ú_get_column_repeatÚextendÚlenÚ_get_row_repeatÚ_is_empty_rowÚrangeÚappend)r   Zsheetr2   r3   r4   r5   Zcovered_cell_nameZtable_cell_nameZ
sheet_rowsZ
empty_rowsZmax_row_lenr/   Z	sheet_rowZsheet_cellsZempty_cellsZ	table_rowZ
sheet_cellÚvalueZcolumn_repeatZ
row_repeatÚ_Úrowr   r8   r   Úget_sheet_dataR   sF    






zODFReader.get_sheet_datac                 C  s"   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.namespacesrH   r*   Ú
attributesÚget)r   rE   rH   r   r   r   r?   �   s    zODFReader._get_row_repeatc                 C  s"   ddl m} t|j |dfd¡ƒS )Nr   rG   znumber-columns-repeatedrI   rJ   )r   ÚcellrH   r   r   r   r<   ™   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)r:   r>   )r   rE   Úcolumnr   r   r   r@   ž   s    
zODFReader._is_empty_rowr   c                 C  s@  ddl m} t|ƒdkrtjS |j |df¡}|dkrJt|ƒdkrFdS dS |d u rX| jS |d	kr�t|j |d
f¡ƒ}|rŒt	|ƒ}||krŒ|S |S |dkr°|j |d
f¡}t|ƒS |dkrÂ|  
|¡S |dkrâ|j |d
f¡}t|ƒS |dk�r|j |df¡}t |¡S |dk�r&t t|ƒ¡}| ¡ S |  ¡  td|› �ƒ‚d S )Nr   )ÚOFFICENSz#N/Az
value-typeÚbooleanÚTRUETFÚfloatrC   Ú
percentageÚstringÚcurrencyÚdatez
date-valueÚtimezUnrecognized type )rK   rP   r   ÚnpÚnanrL   rM   r   rS   r*   Ú_get_cell_string_valueÚpdÚto_datetimerX   r-   r.   )r   rN   r2   rP   Z	cell_typeZ
cell_valueÚvalZstampr   r   r   r;   ¨   sB    



zODFReader._get_cell_valuec           	      C  s    ddl m} ddlm} ddlm} |ƒ j}g }|jD ]^}t||ƒr†|j|krtt	|j
 |dfd¡ƒ}| d| ¡ q”| |  |¡¡ q6| t|ƒ¡ q6d |¡S )	z„
        Find and decode OpenDocument text:s tags that represent
        a run length encoded sequence of space characters.
        r   )ÚElement)ÚTEXTNS)ÚSÚcrI   ú r   )Zodf.elementr_   rK   r`   Zodf.textra   r6   r:   Ú
isinstancer*   rL   rM   rB   r[   r   Újoin)	r   rN   r_   r`   ra   Ztext_srC   ÚfragmentÚspacesr   r   r   r[   Ð   s    


z ODFReader._get_cell_string_value)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úpropertyr   r   r   r)   r,   r0   rF   r?   r<   r@   r;   r[   Ú__classcell__r   r   r   r   r	      s$    ý
=

(r	   )Ú
__future__r   ÚnumpyrY   Zpandas._typingr   r   r   r   Zpandas.compat._optionalr   Zpandasr\   Zpandas.io.excel._baser   r	   r   r   r   r   Ú<module>   s   