
    o[we                         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rd d	lmZ d d
lmZ  eed                    G d ded                               ZdS )    )annotations)TYPE_CHECKINGcastN)FilePath
ReadBufferScalarStorageOptions)import_optional_dependency)doc)_shared_docs)BaseExcelReaderOpenDocument)NaTTypestorage_options)r   c                       e Zd Z	 	 d#d$ f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,dZd-dZd-dZd.dZd/d!Zd'd"Z xZS )0	ODFReaderNfilepath_or_bufferFilePath | ReadBuffer[bytes]r   StorageOptions | Noneengine_kwargsdict | NonereturnNonec                n    t          d           t                                          |||           dS )aF  
        Read tables out of OpenDocument formatted files.

        Parameters
        ----------
        filepath_or_buffer : str, path to be parsed or
            an open readable stream.
        {storage_options}
        engine_kwargs : dict, optional
            Arbitrary keyword arguments passed to excel engine.
        odf)r   r   N)r
   super__init__)selfr   r   r   	__class__s       :lib/python3.11/site-packages/pandas/io/excel/_odfreader.pyr   zODFReader.__init__    sG    " 	#5)))+' 	 	
 	
 	
 	
 	
    type[OpenDocument]c                    ddl m} |S )Nr   r   )odf.opendocumentr   )r   r   s     r!   _workbook_classzODFReader._workbook_class8   s    111111r"   r   c                     ddl m}  ||fi |S )Nr   )load)r%   r(   )r   r   r   r(   s       r!   load_workbookzODFReader.load_workbook>   s/     	*)))))t&88-888r"   strc                    dS )z'Property for compat with other readers.  )r   s    r!   empty_valuezODFReader.empty_valueE   s	     rr"   	list[str]c                Z    ddl m} | j                            |          }d |D             S )z4Return a list of sheet names present in the documentr   Tablec                8    g | ]}|                     d           S )name)getAttribute).0ts     r!   
<listcomp>z)ODFReader.sheet_names.<locals>.<listcomp>P   s$    7771v&&777r"   )	odf.tabler2   bookgetElementsByType)r   r2   tabless      r!   sheet_nameszODFReader.sheet_namesJ   s?     	$#####,,U33777777r"   indexintc                |    ddl m} |                     |           | j                            |          }||         S )Nr   r1   )r9   r2   raise_if_bad_sheet_by_indexr:   r;   )r   r>   r2   r<   s       r!   get_sheet_by_indexzODFReader.get_sheet_by_indexR   sG    ######((///,,U33e}r"   r4   c                    ddl m} |                     |           | j                            |          }|D ]}|                    d          |k    r|c S  |                                  t          d| d          )Nr   r1   r4   zsheet z
 not found)r9   r2   raise_if_bad_sheet_by_namer:   r;   r5   close
ValueError)r   r4   r2   r<   tables        r!   get_sheet_by_namezODFReader.get_sheet_by_nameY   s    ######''---,,U33 	 	E!!&))T11 2 	

2$222333r"   file_rows_needed
int | Nonelist[list[Scalar | NaTType]]c                   ddl m}m}m}  |            j        } |            j        }||h|                    |          }d}	d}
g }|D ]^}fd|j        D             }d}g |D ]}|j        |k    r|                     |          }n| j        }| 	                    |          }|| j        k    r||z  }P
                    | j        g|z             d}
                    |g|z             |
t                    k     rt                    }
|                     |          }|                     |          r|	|z  }	nO|
                    | j        gg|	z             d}	|
                    fdt          |          D                        |t          |          |k    r n`|D ]C}t          |          |
k     r.|
                    | j        g|
t          |          z
  z             D|S )z9
        Parse an ODF Table into a list of lists
        r   )CoveredTableCell	TableCellTableRowc                F    g | ]}t          |d           r|j        v |S )qname)hasattrrQ   )r6   x
cell_namess     r!   r8   z,ODFReader.get_sheet_data.<locals>.<listcomp>}   sD       1g&& ,-7j+@+@ +@+@+@r"   c              3     K   | ]}V  d S Nr-   )r6   _	table_rows     r!   	<genexpr>z+ODFReader.get_sheet_data.<locals>.<genexpr>   s#      BB1YBBBBBBr"   )r9   rM   rN   rO   rQ   r;   
childNodes_get_cell_valuer.   _get_column_repeatextendlen_get_row_repeat_is_empty_rowrange)r   sheetrI   rM   rN   rO   covered_cell_nametable_cell_name
sheet_rows
empty_rowsmax_row_lenrG   	sheet_rowsheet_cellsempty_cells
sheet_cellvaluecolumn_repeat
row_repeatrowrT   rX   s                       @@r!   get_sheet_datazODFReader.get_sheet_dataf   s   	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 -,..4#)+++'9
,,X66

.0# %	 %	I   "-  K
 K02I) > >
#66 00<<EE ,E $ 7 7
 C C D,,,=0KK$$d&6%7+%EFFF"#K$$eW}%<====S^^++!)nn--i88J!!),, Cj(

 t/01J>???
BBBBj0A0ABBBBBB+E

>N0N0N  	J 	JC3xx+%%

D,-s3xx1GHIIIr"   c                b    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.namespacesrs   r?   
attributesget)r   ro   rs   s      r!   r_   zODFReader._get_row_repeat   s<     	+*****3>%%w0F&GKKLLLr"   c                b    ddl m} t          |j                            |dfd                    S )Nr   rr   znumber-columns-repeatedrt   ru   )r   cellrs   s      r!   r\   zODFReader._get_column_repeat   s:    ******4?&&1J'KQOOPPPr"   boolc                P    |j         D ]}t          |j                   dk    r dS dS )z4
        Helper function to find empty rows
        r   FT)rZ   r^   )r   ro   columns      r!   r`   zODFReader._is_empty_row   s>     n 	 	F6$%%))uu * tr"   Scalar | NaTTypec                   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 || j        S |d	k    rBt          |j                            |d
f                    }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    r0|j                            |df          }t          j        |          S |dk    rHt          j        t          |                    }t          t          |                                          S |                                  t#          d|           )Nr   )OFFICENSz#N/Az
value-typebooleanTRUETFfloatrl   
percentagestringcurrencydatez
date-valuetimezUnrecognized type )rv   r   r*   npnanrw   rx   r.   r   r?   _get_cell_string_valuepd	Timestampr   r   r   rE   rF   )r   rz   r   	cell_type
cell_valuevalstamps          r!   r[   zODFReader._get_cell_value   s   ++++++t996MO''<(@AA		!!4yyF""t5##'!!t22Hg3FGGHHJj//Cj  
,&&,,h-@AAJ$$$(""..t444*$$,,h-@AAJ$$$&  ,,h-EFFJ<
+++&  LT++E

---JJLLL=)==>>>r"   c                   ddl m} ddlm} ddlm}  |            j        }g }|j        D ]}t          ||          rw|j        |k    rCt          |j
                            |dfd                    }|                    d|z             `|                    |                     |                     |                    t          |                              d                     d	                    |          S )
z
        Find and decode OpenDocument text:s tags that represent
        a run length encoded sequence of space characters.
        r   )Element)TEXTNS)Scrt    
r,   )odf.elementr   rv   r   odf.textr   rQ   rZ   
isinstancer?   rw   rx   appendr   r*   stripjoin)	r   rz   r   r   r   text_srl   fragmentspacess	            r!   r   z ODFReader._get_cell_string_value   s   
 	(''''')))))) 	8 	8H(G,, 
8>V++ !4!8!8&#!J!JKKFLLv....
 LL!<!<X!F!FGGGGS]]00667777wwu~~r"   )NN)r   r   r   r   r   r   r   r   )r   r#   )r   r   r   r   )r   r*   )r   r/   )r>   r?   )r4   r*   rV   )rI   rJ   r   rK   )r   r?   )r   r{   )r   r~   )__name__
__module____qualname__r   propertyr&   r)   r.   r=   rB   rH   rp   r_   r\   r`   r[   r   __classcell__)r    s   @r!   r   r      sw       
 26%)	
 
 
 
 
 
 
0    X
9 9 9 9    X 8 8 8 X8   4 4 4 4 59B B B B BHM M M MQ Q Q Q
   %? %? %? %?N       r"   r   r   )
__future__r   typingr   r   numpyr   pandas._typingr   r   r   r	   pandas.compat._optionalr
   pandas.util._decoratorsr   pandasr   pandas.core.shared_docsr   pandas.io.excel._baser   r%   r   pandas._libs.tslibs.nattyper   r   r-   r"   r!   <module>r      sn   " " " " " "       
                ? > > > > > ' ' ' ' ' '     0 0 0 0 0 0 1 1 1 1 1 1 4------333333 \"34555d d d d d/ d d 65d d dr"   