U
    sVc*                     @  s   d dl mZ d dlmZ d dlZd dlmZmZmZm	Z	m
Z
 d dlm  mZ d dlmZmZmZ d dlmZ d dlmZmZ erd dlmZ d d	lmZ G d
d deZdS )    )annotations)defaultdictN)TYPE_CHECKINGAnyDefaultDictTuplecast)FilePathStorageOptionsWriteExcelBuffer)ExcelWriter)combine_kwargsvalidate_freeze_panesOpenDocumentSpreadsheet)	ExcelCellc                
      s   e Zd ZdZdZd-ddddddd	d
d fddZedd Zejdd
dddZeddddZ	d
dddZ
d.ddddd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*d+d,Z  ZS )/	ODSWriterZodf)z.odsNwz)FilePath | WriteExcelBuffer | ExcelWriterz
str | Nonestrr
   zdict[str, Any] | NoneNone)pathenginedate_formatmodestorage_optionsif_sheet_existsengine_kwargsreturnc	                   sR   ddl m}
 |dkrtdt j|||||d t||	}|
f || _i | _d S )Nr   r   az&Append mode is not supported with odf!)r   r   r   r   )odf.opendocumentr   
ValueErrorsuper__init__r   _book_style_dict)selfr   r   r   Zdatetime_formatr   r   r   r   kwargsr   	__class__ >/tmp/pip-unpacked-wheel-xj8nt62q/pandas/io/excel/_odswriter.pyr"   $   s    
zODSWriter.__init__c                 C  s   | j S )z
        Book instance of class odf.opendocument.OpenDocumentSpreadsheet.

        This attribute can be used to access engine-specific features.
        )r#   )r%   r)   r)   r*   bookB   s    zODSWriter.bookr   )otherr   c                 C  s   |    || _dS )zO
        Set book instance. Class type will depend on the engine used.
        N)Z_deprecate_set_bookr#   )r%   r,   r)   r)   r*   r+   K   s    zdict[str, Any])r   c                 C  s&   ddl m} dd | j|D }|S )z(Mapping of sheet names to sheet objects.r   )Tablec                 S  s   i | ]}| d |qS name)getAttribute).0sheetr)   r)   r*   
<dictcomp>X   s    z$ODSWriter.sheets.<locals>.<dictcomp>)	odf.tabler-   r+   ZgetElementsByType)r%   r-   resultr)   r)   r*   sheetsS   s
    
zODSWriter.sheetsc                 C  s2   | j  D ]}| jj| q
| j| jj dS )z(
        Save workbook to disk.
        N)r6   valuesr+   spreadsheet
addElementsaveZ_handleshandle)r%   r2   r)   r)   r*   _save^   s    zODSWriter._saver   zlist[ExcelCell]intztuple[int, int] | None)cells
sheet_namestartrowstartcolfreeze_panesr   c                 C  s  ddl m}m}m} ddlm}	 | |}|dk	s6t|| jkrL| j| }
n||d}
| j	j
|
 t|rttttf |}| || t|D ]}|
|  qt|}tt}t|dd dD ]}||j st|D ]}||j |  qt|j||j  D ]*}||j |  ||j  d	7  < q| |\}}||j | ||j  d	7  < |	|d
}|| qt|dkrtt| d	 D ]}|
||  qdS )z1
        Write the frame cells using odf
        r   )r-   	TableCellTableRow)PNr.   c                 S  s   | j | jfS )N)rowcol)cellr)   r)   r*   <lambda>       z(ODSWriter._write_cells.<locals>.<lambda>)key   )text)r4   r-   rC   rD   Zodf.textrE   Z_get_sheet_nameAssertionErrorr6   r+   r8   r9   r   r   r   r=   _create_freeze_panesranger   sortedrF   rG   _make_table_celllenmaxkeys)r%   r>   r?   r@   rA   rB   r-   rC   rD   rE   Zwks_ZrowsZ	col_countrH   pvalueZtcpZrow_nrr)   r)   r*   _write_cellsf   s<    




zODSWriter._write_cellszdict[str, int | str]c                 C  sR   i }|  |j}|dk	r ||d< |jdk	rN|jdk	rNtd|j|d< |j|d< |S )a*  Convert cell attributes to OpenDocument attributes

        Parameters
        ----------
        cell : ExcelCell
            Spreadsheet cell data

        Returns
        -------
        attributes : Dict[str, Union[int, str]]
            Dictionary with attributes and attribute values
        NZ	stylenamerL   ZnumberrowsspannedZnumbercolumnsspanned)_process_stylestyleZ
mergestartZmergeendrT   )r%   rH   
attributesZ
style_namer)   r)   r*   _make_table_cell_attributes   s    
z%ODSWriter._make_table_cell_attributesztuple[object, Any]c           	      C  s   ddl m} | |}| |j\}}| }}t|trPt| }t|	 }t|t
j
r| }|d}||d||dfS t|t
jr|j d|jdd|jd}|d}||d||dfS td	td
td
tdi}|||t| ||dfS dS )a  Convert cell data to an OpenDocument spreadsheet cell

        Parameters
        ----------
        cell : ExcelCell
            Spreadsheet cell data

        Returns
        -------
        pvalue, cell : Tuple[str, TableCell]
            Display value, Cell value
        r   )rC   z%cdate)	valuetypeZ	datevaluer\   -Z02dz%xstringfloatboolean)r_   valuer\   N)r4   rC   r]   Z_value_with_fmtval
isinstanceboolr   lowerupperdatetime	isoformatstrftimer^   yearmonthdayr=   rb   type)	r%   rH   rC   r\   re   fmtrW   rd   Zclass_to_cell_typer)   r)   r*   rR      sF    



    
zODSWriter._make_table_cell)r[   r   c                 C  sD  ddl m}m}m}m} |dkr$dS t|}|| jkrB| j| S dt| jd  }|| j|< ||dd}d|kr|d }	|		d	d
r|
|d	d d|kr|d }
|
 D ].\}}ddi}|
|d| || id qd|kr2|d }|	d}|r|
||d |	d}|r2|
||d | jj
| |S )a  Convert a style dictionary to a OpenDocument style sheet

        Parameters
        ----------
        style : Dict
            Style dictionary

        Returns
        -------
        style_key : str
            Unique style key for later reference in sheet
        r   )ParagraphPropertiesStyleTableCellPropertiesTextPropertiesNpdrL   z
table-cell)r/   familyfontZboldF)Z
fontweightbordersZthinz0.75pt solid #000000Zborder)r\   	alignment
horizontal)Z	textalignvertical)Zverticalalign)Z	odf.stylerr   rs   rt   ru   jsondumpsr$   rS   getr9   itemsr+   Zstyles)r%   r[   rr   rs   rt   ru   Z	style_keyr/   Z	odf_stylerx   ry   ZsideZ	thicknessZthickness_translationrz   r{   r|   r)   r)   r*   rZ      s@    






zODSWriter._process_styleztuple[int, int])r?   rB   r   c                 C  s  ddl m}m}m}m}m} |dd}| jj| |dd}	||	 | }
|	|
 |dd}|
| ||d}
||
 |
|ddd	d
 |
|ddd	d
 |
|ddt	|d d
 |
|ddt	|d d
 |
|ddt	|d d
 |
|ddt	|d d
 dS )z
        Create freeze panes in the sheet.

        Parameters
        ----------
        sheet_name : str
            Name of the spreadsheet
        freeze_panes : tuple of (int, int)
            Freeze pane location x and y
        r   )
ConfigItemConfigItemMapEntryConfigItemMapIndexedConfigItemMapNamedConfigItemSetzooo:view-settingsr.   ZViewsZTablesZHorizontalSplitModeshort2)r/   rp   rM   ZVerticalSplitModeZHorizontalSplitPositionr=   ZVerticalSplitPositionrL   ZPositionRightZPositionBottomN)
Z
odf.configr   r   r   r   r   r+   settingsr9   r   )r%   r?   rB   r   r   r   r   r   Zconfig_item_setZconfig_item_map_indexedZconfig_item_map_entryZconfig_item_map_namedr)   r)   r*   rO   "  sJ    







  
  
zODSWriter._create_freeze_panes)NNNr   NNN)Nr   r   N)__name__
__module____qualname__Z_engineZ_supported_extensionsr"   propertyr+   setterr6   r<   rY   r]   rR   rZ   rO   __classcell__r)   r)   r'   r*   r       s4          "

    ;74r   )
__future__r   collectionsr   rj   typingr   r   r   r   r   Zpandas._libs.jsonZ_libsr}   Zpandas._typingr	   r
   r   Zpandas.io.excel._baser   Zpandas.io.excel._utilr   r   r   r   Zpandas.io.formats.excelr   r   r)   r)   r)   r*   <module>   s   