o
    Eh+                     @  s   d dl mZ d dlmZ d dl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 erDd dlmZmZmZmZ d dlmZ G d	d
 d
eZdS )    )annotations)defaultdictN)TYPE_CHECKINGAnyDefaultDictcastoverload)ExcelWriter)combine_kwargsvalidate_freeze_panes)ExcelWriterIfSheetExistsFilePathStorageOptionsWriteExcelBuffer)	ExcelCellc                      s   e Zd ZdZdZ							d6d7 fddZedd Zed8ddZd9ddZ					d:d;d&d'Z
d<d)d*Zd=d,d-Zed>d/d0Zed?d1d0Zd@d2d0ZdAd4d5Z  ZS )B	ODSWriterZodf)z.odsNwpath)FilePath | WriteExcelBuffer | ExcelWriterengine
str | Nonedate_formatmodestrstorage_optionsStorageOptions | Noneif_sheet_existsExcelWriterIfSheetExists | Noneengine_kwargsdict[str, Any] | NonereturnNonec	                   sV   ddl m}
 |dkrtdt||	}|
di || _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__r$   :lib/python3.10/site-packages/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.   bookA   s   zODSWriter.bookdict[str, Any]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)ZgetAttribute).0sheetr$   r$   r.   
<dictcomp>O   s    
z$ODSWriter.sheets.<locals>.<dictcomp>)	odf.tabler1   r/   ZgetElementsByType)r*   r1   resultr$   r$   r.   sheetsJ   s
   
zODSWriter.sheetsc                 C  s2   | j  D ]	}| jj| q| j| jj dS )z(
        Save workbook to disk.
        N)r9   valuesr/   spreadsheet
addElementZsaveZ_handlesZhandle)r*   r5   r$   r$   r.   _saveU   s   zODSWriter._saver   cellslist[ExcelCell]
sheet_namestartrowintstartcolfreeze_panestuple[int, int] | Nonec                 C  s  ddl m}m}m} ddlm}	 | |}|dusJ || jv r&| j| }
n||d}
| jj	
|
 t|rEttttf |}| || t|D ]}|

|  qIt|}tt}t|dd dD ]X}||j syt|D ]}||j 
|  qmt|j||j  D ]}||j 
|  ||j  d	7  < q| |\}}||j 
| ||j  d	7  < |	|d
}|
| qbt|dkrtt| d	 D ]}|

||  qdS dS )z1
        Write the frame cells using odf
        r   )r1   	TableCellTableRow)PNr2   c                 S  s   | j | jfS N)rowcol)cellr$   r$   r.   <lambda>   s    z(ODSWriter._write_cells.<locals>.<lambda>)key   )text)r7   r1   rF   rG   Zodf.textrH   Z_get_sheet_namer9   r/   r;   r<   r   r   tuplerB   _create_freeze_panesranger   sortedrJ   rK   _make_table_celllenmaxkeys)r*   r>   r@   rA   rC   rD   r1   rF   rG   rH   Zwks_ZrowsZ	col_countrL   pvalueZtcpZrow_nrr$   r$   r.   _write_cells]   s@   




zODSWriter._write_cellsdict[str, int | str]c                 C  sR   i }|  |j}|dur||d< |jdur'|jdur't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	stylenamerO   ZnumberrowsspannedZnumbercolumnsspanned)_process_stylestyleZ
mergestartZmergeendrW   )r*   rL   
attributesZ
style_namer$   r$   r.   _make_table_cell_attributes   s   
z%ODSWriter._make_table_cell_attributestuple[object, Any]c                 C  s  ddl m} | |}| |j\}}| }}t|tr1t| }t|	 }||d||dfS t|t
j
rI| }|d}||d||dfS t|t
jrl|j d|jd	d|jd	}|d
}||d||dfS t|trz||d||dfS ||d||df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   )rF   Zboolean)	valuetypeZbooleanvaluer`   z%cdate)rc   Z	datevaluer`   -Z02dz%xstring)rc   Zstringvaluer`   float)rc   valuer`   )r7   rF   ra   Z_value_with_fmtval
isinstanceboolr   lowerupperdatetimeZ	isoformatstrftimerd   ZyearZmonthZday)r*   rL   rF   r`   ri   ZfmtrZ   rh   r$   r$   r.   rU      sR   





zODSWriter._make_table_cellr_   c                 C     d S rI   r$   r*   r_   r$   r$   r.   r^         zODSWriter._process_stylec                 C  rp   rI   r$   rq   r$   r$   r.   r^      rr   c                 C  s>  ddl m}m}m}m} |du rdS t|}|| jv r!| j| S dt| jd  }|| j|< ||dd}d|v rL|d }	|		d	d
rL|
|d	d d|v rp|d }
|
 D ]\}}ddi}|
|d| || id qXd|v r|d }|	d}|r|
||d |	d}|r|
||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pdrO   z
table-cell)r3   ZfamilyfontZboldF)Z
fontweightbordersZthinz0.75pt solid #000000Zborder)r`   	alignment
horizontal)Z	textalignvertical)Zverticalalign)Z	odf.stylers   rt   ru   rv   jsondumpsr)   rV   getr<   itemsr/   Zstyles)r*   r_   rs   rt   ru   rv   Z	style_keyr3   Z	odf_stylerx   ry   ZsideZ	thicknessZthickness_translationrz   r{   r|   r$   r$   r.   r^      s@   





tuple[int, int]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HorizontalSplitModeZshort2)r3   typerP   ZVerticalSplitModeZHorizontalSplitPositionrB   ZVerticalSplitPositionrO   ZPositionRightZPositionBottomN)
Z
odf.configr   r   r   r   r   r/   Zsettingsr<   r   )r*   r@   rD   r   r   r   r   r   Zconfig_item_setZconfig_item_map_indexedZconfig_item_map_entryZconfig_item_map_namedr$   r$   r.   rR   ,  sB   







zODSWriter._create_freeze_panes)NNNr   NNN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   )r    r0   )r    r!   )Nr   r   N)r>   r?   r@   r   rA   rB   rC   rB   rD   rE   r    r!   )r    r]   )r    rb   )r_   r0   r    r   )r_   r!   r    r!   )r_   r   r    r   )r@   r   rD   r   r    r!   )__name__
__module____qualname__Z_engineZ_supported_extensionsr(   propertyr/   r9   r=   r\   ra   rU   r   r^   rR   __classcell__r$   r$   r,   r.   r      s:    



;
B
4r   )Z
__future__r   collectionsr   rn   r}   typingr   r   r   r   r   Zpandas.io.excel._baser	   Zpandas.io.excel._utilr
   r   Zpandas._typingr   r   r   r   Zpandas.io.formats.excelr   r   r$   r$   r$   r.   <module>   s    