U
    ùQ”i¬)  ã                   @  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Z d dlmZmZmZ d dlmZ d dlmZmZ erˆd d	lmZ G d
d„ deƒZdS )é    )Úannotations)ÚdefaultdictN)ÚTYPE_CHECKINGÚAnyÚDefaultDictÚTupleÚcast)Újson)ÚFilePathÚStorageOptionsÚWriteExcelBuffer)ÚExcelWriter)Úcombine_kwargsÚvalidate_freeze_panes)Ú	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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||	ƒ}|
f |Ž| _tƒ j|||||d� i | _d S )Nr   )ÚOpenDocumentSpreadsheetÚaz&Append mode is not supported with odf!)r   r   r   r   )Zodf.opendocumentr   Ú
ValueErrorr   Ú_bookÚsuperÚ__init__Ú_style_dict)Úselfr   r   r   Zdatetime_formatr   r   r   r   Úkwargsr   ©Ú	__class__© ú>/tmp/pip-unpacked-wheel-58ppya8e/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)   Úbook@   s    zODSWriter.bookz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>N   s   ÿ z$ODSWriter.sheets.<locals>.<dictcomp>)Ú	odf.tabler+   r*   ZgetElementsByType)r$   r+   Úresultr(   r(   r)   ÚsheetsI   s
    
þzODSWriter.sheetsc                 C  s2   | j  ¡ D ]}| jj |¡ q
| j | jj¡ dS )z(
        Save workbook to disk.
        N)r4   Úvaluesr*   ÚspreadsheetÚ
addElementÚsaveZ_handlesÚhandle)r$   r0   r(   r(   r)   Ú_saveT   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|ƒrŠttttf |ƒ}|  ||¡ t|ƒD ]}|
 |ƒ ¡ q’t|ƒ}ttƒ}t|dd„ d�D ]²}||j sòt|ƒD ]}||j  |ƒ ¡ qÚt|j||j  ƒD ]*}||j  |ƒ ¡ ||j  d	7  < �q|  |¡\}}||j  |¡ ||j  d	7  < |	|d
�}| |¡ qÄt|ƒdk�r°tt| ¡ ƒd	 ƒD ]}|
 || ¡ �qšd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)r2   r+   rA   rB   Zodf.textrC   Z_get_sheet_nameÚAssertionErrorr4   r*   r6   r7   r   r   r   r;   Ú_create_freeze_panesÚranger   ÚsortedrD   rE   Ú_make_table_cellÚlenÚmaxÚkeys)r$   r<   r=   r>   r?   r@   r+   rA   rB   rC   ZwksÚ_ZrowsZ	col_countrF   ÚpvalueZtcÚpZrow_nrr(   r(   r)   Ú_write_cells\   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	stylenamerJ   ZnumberrowsspannedZnumbercolumnsspanned)Ú_process_styleÚstyleZ
mergestartZmergeendrR   )r$   rF   Ú
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   )rA   z%cÚdate)Ú	valuetypeZ	datevaluerZ   ú-Z02dz%xÚstringÚfloatÚboolean)r]   ÚvaluerZ   N)r2   rA   r[   Z_value_with_fmtÚvalÚ
isinstanceÚboolr   ÚlowerÚupperÚdatetimeÚ	isoformatÚstrftimer\   ÚyearÚmonthÚdayr;   r`   Útype)	r$   rF   rA   rZ   rc   ÚfmtrU   rb   Zclass_to_cell_typer(   r(   r)   rP   ­   sF    


þ
þ    ü
ýþzODSWriter._make_table_cell)rY   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�¡ q°d|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ÚpdrJ   z
table-cell)r-   ÚfamilyÚfontZboldF)Z
fontweightÚbordersZthinz0.75pt solid #000000Zborder)rZ   Ú	alignmentÚ
horizontal)Z	textalignÚvertical)Zverticalalign)Z	odf.stylerp   rq   rr   rs   r	   Údumpsr#   rQ   Úgetr7   Úitemsr*   Zstyles)r$   rY   rp   rq   rr   rs   Z	style_keyr-   Z	odf_stylerv   rw   ZsideZ	thicknessZthickness_translationrx   ry   rz   r(   r(   r)   rX   ä   s@    



ÿÿ


zODSWriter._process_styleztuple[int, int])r=   r@   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-   rn   rK   ZVerticalSplitModeZHorizontalSplitPositionr;   ZVerticalSplitPositionrJ   ZPositionRightZPositionBottomN)
Z
odf.configr~   r   r€   r�   r‚   r*   Úsettingsr7   r   )r$   r=   r@   r~   r   r€   r�   r‚   Zconfig_item_setZconfig_item_map_indexedZconfig_item_map_entryZconfig_item_map_namedr(   r(   r)   rM     sJ    







ÿÿ  
ÿÿ  
ÿÿÿÿzODSWriter._create_freeze_panes)NNNr   NNN)Nr   r   N)Ú__name__Ú
__module__Ú__qualname__Z_engineZ_supported_extensionsr"   Úpropertyr*   r4   r:   rW   r[   rP   rX   rM   Ú__classcell__r(   r(   r&   r)   r      s0          ÷"

    ú;74r   )Ú
__future__r   Úcollectionsr   rh   Útypingr   r   r   r   r   Zpandas._libsr	   Zpandas._typingr
   r   r   Zpandas.io.excel._baser   Zpandas.io.excel._utilr   r   Zpandas.io.formats.excelr   r   r(   r(   r(   r)   Ú<module>   s   