o
    ҷh*                     @  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 d dlmZmZ erFd 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)json)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	ODSWriter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     )odf.opendocumentr$   
ValueErrorr   _booksuper__init___style_dict)selfr   r   r   datetime_formatr   r   r   r    kwargsr$   	__class__r&   M/var/www/html/venv/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&   r2   bookB   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)getAttribute).0sheetr&   r&   r2   
<dictcomp>P   s    
z$ODSWriter.sheets.<locals>.<dictcomp>)	odf.tabler5   r3   getElementsByType)r-   r5   resultr&   r&   r2   sheetsK   s
   
zODSWriter.sheetsc                 C  s2   | j  D ]	}| jj| q| j| jj dS )z(
        Save workbook to disk.
        N)r?   valuesr3   spreadsheet
addElementsave_handleshandle)r-   r:   r&   r&   r2   _saveV   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   )r5   	TableCellTableRow)PNr6   c                 S  s   | j | jfS N)rowcol)cellr&   r&   r2   <lambda>   s    z(ODSWriter._write_cells.<locals>.<lambda>)key   )text)r<   r5   rO   rP   odf.textrQ   _get_sheet_namer?   r3   rA   rB   r   r   tuplerK   _create_freeze_panesranger   sortedrS   rT   _make_table_celllenmaxkeys)r-   rG   rI   rJ   rL   rM   r5   rO   rP   rQ   wks_rows	col_countrU   pvaluetcprow_nrr&   r&   r2   _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
        N	stylenamerX   numberrowsspannednumbercolumnsspanned)_process_stylestyle
mergestartmergeendrb   )r-   rU   
attributes
style_namer&   r&   r2   _make_table_cell_attributes   s   
z%ODSWriter._make_table_cell_attributestuple[object, Any]c           	      C  s   ddl m} | |}| |j\}}| }}t|tr(t| }t|	 }t|t
j
r@| }|d}||d||dfS t|t
jrc|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 )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   )rO   z%cdate)	valuetype	datevalueru   -02dz%xstringfloatboolean)rz   valueru   )r<   rO   rw   _value_with_fmtval
isinstanceboolr   lowerupperdatetime	isoformatstrftimery   yearmonthdayrK   r   type)	r-   rU   rO   ru   r   fmtrh   r   class_to_cell_typer&   r&   r2   r`      s>   




zODSWriter._make_table_cellrr   c                 C     d S rR   r&   r-   rr   r&   r&   r2   rq         zODSWriter._process_stylec                 C  r   rR   r&   r   r&   r&   r2   rq      r   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pdrX   z
table-cell)r7   familyfontboldF)
fontweightbordersthinz0.75pt solid #000000border)ru   	alignment
horizontal)	textalignvertical)verticalalign)	odf.styler   r   r   r   r	   ujson_dumpsr,   ra   getrB   itemsr3   styles)r-   rr   r   r   r   r   	style_keyr7   	odf_styler   r   side	thicknessthickness_translationr   r   r   r&   r&   r2   rq      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-settingsr6   ViewsTablesHorizontalSplitModeshort2)r7   r   rY   VerticalSplitModeHorizontalSplitPositionrK   VerticalSplitPositionrX   PositionRightPositionBottomN)

odf.configr   r   r   r   r   r3   settingsrB   r   )r-   rI   rM   r   r   r   r   r   config_item_setconfig_item_map_indexedconfig_item_map_entryconfig_item_map_namedr&   r&   r2   r]   "  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"   r4   )r"   r#   )Nr   r   N)rG   rH   rI   r   rJ   rK   rL   rK   rM   rN   r"   r#   )r"   rm   )r"   rx   )rr   r4   r"   r   )rr   r#   r"   r#   )rr   r!   r"   r   )rI   r   rM   r   r"   r#   )__name__
__module____qualname___engine_supported_extensionsr+   propertyr3   r?   rF   rl   rw   r`   r   rq   r]   __classcell__r&   r&   r0   r2   r       s:    



;
7
4r   )
__future__r   collectionsr   r   typingr   r   r   r   r   pandas._libsr	   pandas.io.excel._baser
   pandas.io.excel._utilr   r   pandas._typingr   r   r   r   pandas.io.formats.excelr   r   r&   r&   r&   r2   <module>   s    