U
    b&                     @  s   d dl mZ d dlmZ d dlZd dlmZmZ d dlm	  m
Z
 d dlmZ d dlmZ d dlmZmZ d dlmZ G d	d
 d
eZdS )    )annotations)defaultdictN)AnyDefaultDict)StorageOptions)ExcelWriter)combine_kwargsvalidate_freeze_panes)	ExcelCellc                      s   e Zd ZdZdZd%ddddddd	 f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wstrz
str | Noner   zdict[str, Any] | None)pathenginemodestorage_optionsif_sheet_existsengine_kwargsc	                   sR   ddl m}
 |dkrtdt j|||||d t||	}|
f || _i | _d S )Nr   )OpenDocumentSpreadsheetaz&Append mode is not supported with odf!)r   r   r   r   )Zodf.opendocumentr   
ValueErrorsuper__init__r   book_style_dict)selfr   r   Zdate_formatZdatetime_formatr   r   r   r   kwargsr   	__class__ >/tmp/pip-unpacked-wheel-ck39h295/pandas/io/excel/_odswriter.pyr      s    
zODSWriter.__init__None)returnc                 C  s2   | j  D ]}| jj| q
| j| jj dS )z(
        Save workbook to disk.
        N)sheetsvaluesr   Zspreadsheet
addElementsaveZhandleshandle)r   Zsheetr   r   r    r&   7   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|< t	|r|dk	stt| 
|| 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t| d	 D ]}|
||  qdS )z1
        Write the frame cells using odf
        r   )Table	TableCellTableRow)PNnamec                 S  s   | j | jfS )N)rowcol)cellr   r   r    <lambda>d       z'ODSWriter.write_cells.<locals>.<lambda>)key   )text)	odf.tabler.   r/   r0   Zodf.textr1   Z_get_sheet_nameAssertionErrorr#   r	   _create_freeze_panesranger%   r   r(   sortedr4   r5   _make_table_cellmaxkeys)r   r)   r*   r+   r,   r-   r.   r/   r0   r1   Zwks_ZrowsZ	col_countr6   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	stylenamer:   ZnumberrowsspannedZnumbercolumnsspanned)_process_stylestyleZ
mergestartZmergeendrB   )r   r6   
attributesZ
style_namer   r   r    _make_table_cell_attributesy   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|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   )r/   z%cdate)	valuetypeZ	datevaluerJ   z%Y-%m-%dz%xstringfloatboolean)rM   valuerJ   N)r<   r/   rK   Z_value_with_fmtval
isinstanceboolr   lowerupperdatetime	isoformatstrftimerL   r(   rO   type)	r   r6   r/   rJ   rR   fmtrE   rQ   Zclass_to_cell_typer   r   r    rA      sF    




    
zODSWriter._make_table_cellzdict[str, Any])rI   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pdr:   z
table-cell)r3   familyfontZboldF)Z
fontweightbordersZthinz0.75pt solid #000000Zborder)rJ   	alignment
horizontal)Z	textalignvertical)Zverticalalign)Z	odf.styler\   r]   r^   r_   jsondumpsr   lengetr%   itemsr   Zstyles)r   rI   r\   r]   r^   r_   Z	style_keyr3   Z	odf_stylerb   rc   ZsideZ	thicknessZthickness_translationrd   re   rf   r   r   r    rH      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-settingsr2   ZViewsZTablesZHorizontalSplitModeshort2)r3   rZ   r;   ZVerticalSplitModeZHorizontalSplitPositionr(   ZVerticalSplitPositionr:   ZPositionRightZPositionBottomN)
Z
odf.configrl   rm   rn   ro   rp   r   settingsr%   r   )r   r*   r-   rl   rm   rn   ro   rp   Zconfig_item_setZconfig_item_map_indexedZconfig_item_map_entryZconfig_item_map_namedr   r   r    r>      sJ    







  
  
zODSWriter._create_freeze_panes)NNNr   NNN)Nr   r   N)__name__
__module____qualname__r   Zsupported_extensionsr   r&   rG   rK   rA   rH   r>   __classcell__r   r   r   r    r      s(              :34r   )
__future__r   collectionsr   rW   typingr   r   Zpandas._libs.jsonZ_libsrg   Zpandas._typingr   Zpandas.io.excel._baser   Zpandas.io.excel._utilr   r	   Zpandas.io.formats.excelr
   r   r   r   r   r    <module>   s   