3
Ud                 @   s\   d dl mZmZ d dlZd dl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 )    )ListcastN)FilePathOrBufferScalar)import_optional_dependency)_BaseExcelReaderc                   s   e Zd ZdZed fddZedd ZedddZee	d	d
dZ
eee	 d	ddZedddZe	dddZeeee  dddZed	ddZed	ddZed	ddZeedddZe	d	dd Z  ZS )!
_ODFReaderz
    Read tables out of OpenDocument formatted files.

    Parameters
    ----------
    filepath_or_buffer: string, path to be parsed or
        an open readable stream.
    )filepath_or_bufferc                s   t d t j| d S )NZodf)r   super__init__)selfr	   )	__class__ N/var/www/html/virt/lib64/python3.6/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_classc             C   s   ddl m} ||S )Nr   )load)r   r   )r   r	   r   r   r   r   load_workbook!   s    z_ODFReader.load_workbook)returnc             C   s   dS )z'Property for compat with other readers. r   )r   r   r   r   empty_value&   s    z_ODFReader.empty_valuec             C   s&   ddl m} | jj|}dd |D S )z4Return a list of sheet names present in the documentr   )Tablec             S   s   g | ]}|j d qS )name)getAttribute).0tr   r   r   
<listcomp>1   s    z*_ODFReader.sheet_names.<locals>.<listcomp>)	odf.tabler   bookgetElementsByType)r   r   tablesr   r   r   sheet_names+   s    z_ODFReader.sheet_names)indexc             C   s    ddl m} | jj|}|| S )Nr   )r   )r   r   r   r    )r   r#   r   r!   r   r   r   get_sheet_by_index3   s    z_ODFReader.get_sheet_by_index)r   c             C   sL   ddl m} | jj|}x|D ]}|jd|kr|S qW td| dd S )Nr   )r   r   zsheet z
 not found)r   r   r   r    r   
ValueError)r   r   r   r!   tabler   r   r   get_sheet_by_name9   s    
z_ODFReader.get_sheet_by_name)convert_floatr   c                s  ddl m}m}m} | j}| j}||h |j|}d}	d}
g }xt|D ]\}} fdd|jD }d}g }xvt|D ]j\}}|j|kr| j||}n| j	}| j
|}|| j	kr||7 }q~|j| j	g|  d}|j|g|  q~W |
t|k rt|}
| j|}| j|r"|	|7 }	qN|j| j	gg|	  d}	xt|D ]}|j| qDW qNW x6|D ].}t||
k rb|j| j	g|
t|   qbW |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   U   s    z-_ODFReader.get_sheet_data.<locals>.<listcomp>)r   r)   r*   r+   r,   r    	enumerate
childNodes_get_cell_valuer   _get_column_repeatextendlen_get_row_repeat_is_empty_rowrangeappend)r   Zsheetr(   r)   r*   r+   Zcovered_cell_nameZtable_cell_nameZ
sheet_rowsZ
empty_rowsZmax_row_lenr&   iZ	sheet_rowZsheet_cellsZempty_cellsZ	table_rowjZ
sheet_cellvalueZcolumn_repeatZ
row_repeat_rowr   )r.   r   get_sheet_dataD   sF    







 z_ODFReader.get_sheet_datac             C   s"   ddl m} t|j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.namespacesr?   int
attributesget)r   r=   r?   r   r   r   r5   }   s    z_ODFReader._get_row_repeatc             C   s"   ddl m} t|jj|dfdS )Nr   )r?   znumber-columns-repeatedr@   )rA   r?   rB   rC   rD   )r   cellr?   r   r   r   r2      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)r0   r4   )r   r=   columnr   r   r   r6      s    z_ODFReader._is_empty_rowc             C   sD  ddl m} t|dkrtjS |jj|df}|dkrJt|dkrFdS dS |d krX| jS |d	krt|jj|d
f}|rt	|}||kr|S |S |dkr|jj|d
f}t|S |dkr| j
|S |dkr|jj|d
f}t|S |dkr|jj|df}tj|S |dkr2tjt|}ttj|}|j S td| d S )Nr   )OFFICENSz#N/Az
value-typebooleanTRUETFfloatr;   
percentagestringcurrencydatez
date-valuetimezUnrecognized type )rA   rG   strnpnanrC   rD   r   rJ   rB   _get_cell_string_valuepdto_datetimer   	TimestamprO   r%   )r   rE   r(   rG   Z	cell_typeZ
cell_valuevalresultr   r   r   r1      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
j|dfd}|jd|  q|j| j| q8|jt| q8W dj|S )	z
        Find and decode OpenDocument text:s tags that represent
        a run length encoded sequence of space characters.
        r   )Element)TEXTNS)Scr@    r   )Zodf.elementrY   rA   rZ   Zodf.textr[   r,   r0   
isinstancerB   rC   rD   r8   rS   rP   join)	r   rE   rY   rZ   r[   Ztext_sr;   fragmentspacesr   r   r   rS      s    

z!_ODFReader._get_cell_string_value)__name__
__module____qualname____doc__r   r   propertyr   r   rP   r   r   r"   rB   r$   r'   boolr   r>   r5   r2   r6   r1   rS   __classcell__r   r   )r   r   r      s    9

'r   )typingr   r   ZnumpyrQ   Zpandas._typingr   r   Zpandas.compat._optionalr   ZpandasrT   Zpandas.io.excel._baser   r   r   r   r   r   <module>   s   