B
    Y0d                 @  s\   d dl mZ d dlZd dl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)FilePathOrBuffer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``)
    Nr   r   )filepath_or_bufferstorage_optionsc               s   t d t j||d d S )NZodf)r
   )r   super__init__)selfr	   r
   )	__class__ L/var/www/html/venv/lib/python3.7/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_value0   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>;   s    z)ODFReader.sheet_names.<locals>.<listcomp>)	odf.tabler   bookgetElementsByType)r   r   tablesr   r   r   sheet_names5   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_index)r   c             C  s^   ddl m} | | | j|}x|D ]}|d|kr(|S q(W |   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_nameD   s    

zODFReader.get_sheet_by_nameboolzlist[list[Scalar]])convert_floatr   c               s  ddl m}m}m} | j}| j}||h ||}d}	d}
g }x|D ]} fdd|jD }d}g }xn|D ]f}|j|kr| ||}n| j}| 	|}|| jkr||7 }qp|
| jg|  d}|
|g|  qpW |
t|k rt|}
| |}| |r|	|7 }	qJ|
| jgg|	  d}	xt|D ]}|| q0W qJW x6|D ].}t||
k rN|
| jg|
t|   qNW |S )z9
        Parse an ODF Table into a list of lists
        r   )CoveredTableCell	TableCellTableRowc               s   g | ]}|j  kr|qS r   )qname)r   x)
cell_namesr   r   r   f   s    z,ODFReader.get_sheet_data.<locals>.<listcomp>)r    r.   r/   r0   r1   r"   
childNodes_get_cell_valuer   _get_column_repeatextendlen_get_row_repeat_is_empty_rowrangeappend)r   Zsheetr-   r.   r/   r0   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   )r3   r   get_sheet_dataQ   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.namespacesrA   r%   
attributesget)r   r?   rA   r   r   r   r9      s    zODFReader._get_row_repeatc             C  s"   ddl m} t|j|dfdS )Nr   )rA   znumber-columns-repeatedrB   )rC   rA   r%   rD   rE   )r   cellrA   r   r   r   r6      s    zODFReader._get_column_repeatc             C  s&   x |j D ]}t|j dkrdS qW dS )z4
        Helper function to find empty rows
        r   FT)r4   r8   )r   r?   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 krX| jS |d	krt|j|d
f}|rt	|}||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floatr=   
percentagestringcurrencydatez
date-valuetimezUnrecognized type )rC   rH   r   npnanrD   rE   r   rK   r%   _get_cell_string_valuepdto_datetimerP   r(   r)   )r   rF   r-   rH   Z	cell_typeZ
cell_valuevalZstampr   r   r   r5      sB    



zODFReader._get_cell_valuec       	      C  s   ddl m} ddlm} ddlm} | j}g }xh|jD ]^}t||r|j|krvt	|j
|dfd}|d|  q|| | q8|t| q8W d|S )	z
        Find and decode OpenDocument text:s tags that represent
        a run length encoded sequence of space characters.
        r   )Element)TEXTNS)ScrB    r   )Zodf.elementrW   rC   rX   Zodf.textrY   r1   r4   
isinstancer%   rD   rE   r<   rS   r   join)	r   rF   rW   rX   rY   Ztext_sr=   fragmentspacesr   r   r   rS      s    

z ODFReader._get_cell_string_value)N)__name__
__module____qualname____doc__r   propertyr   r   r   r$   r'   r+   r@   r9   r6   r:   r5   rS   __classcell__r   r   )r   r   r      s   
=

(r   )
__future__r   numpyrQ   Zpandas._typingr   r   r   Zpandas.compat._optionalr   ZpandasrT   Zpandas.io.excel._baser   r   r   r   r   r   <module>   s   