o
    ȷe4                     @   s  d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZmZmZmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z  ddl!m"Z" ddl#m$Z$ ddl%m&Z& ddl'm(Z( ddl)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl3m5Z5 ddl3m6Z6 ddl3m7Z7 ddl3m8Z8 ddl3m9Z9 G dd  d ej:Z;G d!d" d"e<Z=dS )#    N)datetime)Decimal)Fractionunpack)warn)ZipFileZipInfoZIP_DEFLATEDLargeZipFile   )	xmlwriter)	Worksheet)
Chartsheet)SharedStringTable)FormatPackager)xl_cell_to_rowcol)	ChartArea)ChartBar)ChartColumn)ChartDoughnut)	ChartLine)ChartPie)
ChartRadar)ChartScatter)
ChartStock)InvalidWorksheetName)DuplicateWorksheetName)UndefinedImageSize)UnsupportedImageFormat)FileCreateError)FileSizeErrorc                       s&  e Zd ZdZeZeZd fdd	Zdd Z	dd Z
dd	d
ZdddZdddZdd ZdddZdd Zdd ZdddZdd ZdddZdddZd d! Zd"d# Zd$d% Zd&d' Zd(d) Zdd*d+Zd,d- Zd.d/ Zd0d1 Zdd2d3Zdd4d5Z d6d7 Z!d8d9 Z"d:d; Z#d<d= Z$d>d? Z%d@dA Z&dBdC Z'dDdE Z(dFdG Z)dHdI Z*dJdK Z+dLdM Z,dNdO Z-dPdQ Z.dRdS Z/dTdU Z0dVdW Z1dXdY Z2dZd[ Z3d\d] Z4d^d_ Z5d`da Z6dbdc Z7ddde Z8dfdg Z9dhdi Z:djdk Z;dldm Z<dndo Z=dpdq Z>drds Z?dtdu Z@dvdw ZAdxdy ZBdzd{ ZCd|d} ZDd~d ZE  ZFS )Workbookz=
    A class for writing the Excel XLSX Workbook file.


    Nc                    s  |du ri }t t|   || _|dd| _|dd| _|dd| _|dd| _|dd| _	|d	d| _
|d
d| _|dd| _|dd| _|dd| _|dd| _|dd| _|di | _|dd| _| jdk rzd| _|drd| _nd| _t | _d| _d| _d| _d| _d| _d| _d| _d| _g | _g | _g | _ i | _!g | _"g | _#i | _$g | _%i | _&g | _'d| _(d| _)g | _*g | _+g | _,i | _-g | _.t/0 | _1d| _2d| _3d| _4d| _5d| _6d| _7d| _8t9 | _:d| _;d| _<d| _=i | _>g | _?d| _@d| _Ad| _Bd| _Cd| _Dd| _Ed| _Fd| _Gd| _H| jr$d| _| jr1| Iddd n| Id di | Id!di| _J| jdurQ| Id"| ji| _dS dS )#z
        Constructor.

        Ntmpdir	date_1904Fstrings_to_numbersstrings_to_formulasTstrings_to_urlsnan_inf_to_errorsdefault_date_formatconstant_memory	in_memoryexcel2003_styleremove_timezoneuse_future_functionsdefault_format_propertiesmax_url_lengthi     	use_zip64r   SheetChart      >  %  X  autoig )xf_indexfont_familyr=   	hyperlink
num_format)Ksuperr$   __init__filenamegetr%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   allow_zip64WorksheetMetaworksheet_metaselected
fileclosed
filehandleinternal_fh
sheet_name
chart_namesheetname_countchartname_countworksheets_objschartsdrawings
sheetnamesformats
xf_formatsxf_format_indicesdxf_formatsdxf_format_indicespalette
font_countnum_format_countdefined_namesnamed_rangescustom_colorsdoc_propertiescustom_propertiesr   utcnow
createtimenum_vml_filesnum_comment_filesx_windowy_windowwindow_widthwindow_height	tab_ratior   	str_tablevba_projectvba_is_streamvba_codenameimage_typesimagesborder_count
fill_countdrawing_count	calc_modecalc_on_loadcalc_idhas_comments	read_onlyhas_metadata
add_formatdefault_url_format)selfrC   options	__class__ J/var/www/ideatree/venv/lib/python3.10/site-packages/xlsxwriter/workbook.pyrB   ?   s   



zWorkbook.__init__c                 C   s   | S )z0Return self object to use with "with" statement.r   r{   r   r   r   	__enter__   s   zWorkbook.__enter__c                 C   s   |    dS )z-Close workbook when exiting "with" statement.N)close)r{   typevalue	tracebackr   r   r   __exit__   s   zWorkbook.__exit__c                 C      |du r| j }| j||dS )z
        Add a new worksheet to the Excel workbook.

        Args:
            name: The worksheet name. Defaults to 'Sheet1', etc.

        Returns:
            Reference to a worksheet object.

        Nworksheet_class)r   
_add_sheet)r{   namer   r   r   r   add_worksheet      zWorkbook.add_worksheetc                 C   r   )z
        Add a new chartsheet to the Excel workbook.

        Args:
            name: The chartsheet name. Defaults to 'Sheet1', etc.

        Returns:
            Reference to a chartsheet object.

        Nr   )chartsheet_classr   )r{   r   r   r   r   r   add_chartsheet   r   zWorkbook.add_chartsheetc                 C   sJ   | j  }| jrdddd}|r|| t|| j| j}| j| |S )z
        Add a new Format to the Excel Workbook.

        Args:
            properties: The format properties.

        Returns:
            Reference to a Format object.

        Arial
   )	font_name	font_sizetheme)	r1   copyr.   updater   rV   rX   rT   append)r{   
propertiesformat_properties	xf_formatr   r   r   ry      s   

zWorkbook.add_formatc                 C   s  | d}|du rtd dS |dkrt|}nP|dkr!t|}nG|dkr*t|}n>|dkr3t|}n5|dkr<t|}n,|d	krEt|}n#|d
krNt|}n|dkrWt	|}n|dkr`t
|}ntd|  dS d|v rq|d |_d|_| j|_| j|_| j| |S )z
        Create a chart object.

        Args:
            options: The chart type and subtype options.

        Returns:
            Reference to a Chart object.

        r   Nz)Chart type must be defined in add_chart()areabarcolumndoughnutlinepieradarscatterstockz&Unknown chart type '%s' in add_chart()r   T)rD   r   r   r   r   r   r   r   r   r   r   rM   embeddedr&   r/   rQ   r   )r{   r|   
chart_typechartr   r   r   	add_chart   s>   










zWorkbook.add_chartFc                 C   s@   |st j|std|  dS | jdu rd| _|| _|| _dS )z
        Add a vbaProject binary to the Excel workbook.

        Args:
            vba_project: The vbaProject binary file name.
            is_stream:   vba_project is an in memory byte stream.

        Returns:
            Nothing.

        z'VBA project binary file '%s' not found.r   NThisWorkbook)ospathexistsr   rm   rk   rl   )r{   rk   	is_streamr   r   r   add_vba_project   s   

zWorkbook.add_vba_projectc              
   C   s~   | j s9z|   W n ty } zt|d}~w ty#   tdw d| _ | jr5|  D ]}|  q.dS dS t	d dS )z
        Call finalization code and close file.

        Args:
            None.

        Returns:
            Nothing.

        NzBFilesize would require ZIP64 extensions. Use workbook.use_zip64().Tz'Calling close() on already closed file.)
rI   _store_workbookIOErrorr"   r   r#   r,   
worksheets
_opt_closer   )r{   e	worksheetr   r   r   r   6  s    
zWorkbook.closec                 C   sB   |rt |d d | _nd| _|rt |d d | _dS d| _dS )z
        Set the size of a workbook window.

        Args:
            width:  Width  of the window in pixels.
            height: Height of the window in pixels.

        Returns:
            Nothing.

        i  `   r9   r:   N)intrg   rh   )r{   widthheightr   r   r   set_sizeU  s   
zWorkbook.set_sizec                 C   s>   |du rdS |dk s|dkrt d|  dS t|d | _dS )z
        Set the ratio between worksheet tabs and the horizontal slider.

        Args:
            tab_ratio: The tab ratio, 0 <= tab_ratio <= 100

        Returns:
            Nothing.

        Nr   d   z-Tab ratio '%d' outside: 0 <= tab_ratio <= 100r   )r   r   ri   )r{   ri   r   r   r   set_tab_ratiol  s
   zWorkbook.set_tab_ratioc                 C   s
   || _ dS )z
        Set the document properties such as Title, Author etc.

        Args:
            properties: Dictionary of document properties.

        Returns:
            Nothing.

        N)r_   )r{   r   r   r   r   set_properties     
zWorkbook.set_propertiesc                 C   s   |du s|du rt d dS |du r8t|trd}nt|tr"d}nt|tr*d}nt|ttttfr6d}nd}|dkrA|d	}|dkrQt	|d
krQt d|  t	|d
kr]t d|  | j
|||f dS )a'  
        Set a custom document property.

        Args:
            name:          The name of the custom property.
            value:         The value of the custom property.
            property_type: The type of the custom property. Optional.

        Returns:
            Nothing.

        NzGThe name and value parameters must be non-None in set_custom_property()r   booldate
number_intnumbertextz%Y-%m-%dT%H:%M:%SZr3   zbLength of 'value' parameter exceeds Excel's limit of 255 characters in set_custom_property(): '%s'zaLength of 'name' parameter exceeds Excel's limit of 255 characters in set_custom_property(): '%s')r   
isinstancer   r   r   floatr   r   strftimelenr`   r   )r{   r   r   property_typer   r   r   set_custom_property  s0   



zWorkbook.set_custom_propertyc                 C   s6   || _ |dkrd| _n|dkrd| _ |r|| _dS dS )z
        Set the Excel calculation mode for the workbook.

        Args:
            mode: String containing one of:
                * manual
                * auto_except_tables
                * auto

        Returns:
            Nothing.

        manualFauto_except_tablesautoNoTableN)rs   rt   ru   )r{   moderu   r   r   r   set_calc_mode  s   
zWorkbook.set_calc_modec                 C   s   d}d}| dr|d}td}||}|r6|d}|d}| |}|du r5td|  dS nd}td	|tjrFtd
|rNtd|  dS td|r\td|  dS td|shtd|rptd|  dS | j	
|||dg dS )z
        Create a defined name in the workbook.

        Args:
            name:    The defined name.
            formula: The cell or range that the defined name refers to.

        Returns:
            Nothing.

        N =z^(.*)!(.*)$r      z)Unknown sheet name '%s' in defined_name()r   z^[\w\\][\w\\.]*$z^\dz0Invalid Excel characters in defined_name(): '%s'z"^[a-zA-Z][a-zA-Z]?[a-dA-D]?[0-9]+$z3Name looks like a cell name in defined_name(): '%s'z^[rcRC]$z^[rcRC]\d+[rcRC]\d+$z6Invalid name '%s' like a RC cell ref in defined_name()F)
startswithlstriprecompilematchgroup_get_sheet_indexr   UNICODEr\   r   )r{   r   formulasheet_index	sheetnamesheet_partsr   r   r   r   define_name  s>   








zWorkbook.define_namec                 C      | j S )z
        Return a list of the worksheet objects in the workbook.

        Args:
            None.

        Returns:
            A list of worksheet objects.

        )rP   r   r   r   r   r     s   zWorkbook.worksheetsc                 C   s   | j |S )z
        Return a worksheet object in the workbook using the sheetname.

        Args:
            name: The name of the worksheet.

        Returns:
            A worksheet object or None.

        )rS   rD   r{   r   r   r   r   get_worksheet_by_name  s   zWorkbook.get_worksheet_by_namec                 C   r   )a  
        Get the default url format used when a user defined format isn't
        specified with write_url(). The format is the hyperlink style defined
        by Excel for the default theme.

        Args:
            None.

        Returns:
            A format object.

        )rz   r   r   r   r   get_default_url_format%  s   zWorkbook.get_default_url_formatc                 C   
   d| _ dS )z
        Allow ZIP64 extensions when writing xlsx file zip container.

        Args:
            None.

        Returns:
            Nothing.

        TN)rE   r   r   r   r   r4   4  r   zWorkbook.use_zip64c                 C   s   |dur	|| _ dS d| _ dS )z
        Set the VBA name for the workbook. By default the workbook is referred
        to as ThisWorkbook in VBA.

        Args:
            name: The VBA name for the workbook.

        Returns:
            Nothing.

        Nr   )rm   r   r   r   r   set_vba_nameA  s   

zWorkbook.set_vba_namec                 C   r   )z
        Set the Excel "Read-only recommended" option when saving a file.

        Args:
            None.

        Returns:
            Nothing.

        r   N)rw   r   r   r   r   read_only_recommendedR  r   zWorkbook.read_only_recommendedc                 C   sf   |    |   |   |   |   |   |   |   |   | 	  | 
d |   d S )Nworkbook)_prepare_format_properties_xml_declaration_write_workbook_write_file_version_write_file_sharing_write_workbook_pr_write_book_views_write_sheets_write_defined_names_write_calc_pr_xml_end_tag
_xml_closer   r   r   r   _assemble_xml_filee  s   
zWorkbook._assemble_xml_filec                 C   s  zt | jdt| jd}W n ty } z|d }~ww |  }|  s'|   | jj	dkr9d| j
d _d| j
d _|  D ]}|j| jj	krId|_q=| jr]|  D ]}|jd u r\|  qQ|   |   |   |   |   |   |   ||  || j || j | }d }t|D ]i\}}|\}}	}
| jrt |	d}|j!|_"|
r|#||$  q|#||$ %d qt&'d}t()|||f z|*||	 t(+| W q t,y } zt-|t.|d D ]}t(+|| d  q|d }~ww |/  d S )Nw)compression
allowZip64r   r   )  r   r   r   r   r   zutf-8)	r   r      r   r   r   r   r   r   )0r   rC   r
   rE   r   _get_packagerr   r   rG   activesheetrP   rH   hiddenindexactiverk   rm   r   _prepare_sst_string_data_prepare_vml_prepare_defined_names_prepare_drawings_add_chart_data_prepare_tables_prepare_metadata_add_workbook_set_tmpdirr%   _set_in_memoryr-   _create_package	enumerater	   r   compress_typewritestrgetvalueencodetimemktimer   utimewriteremover   ranger   r   )r{   	xlsx_filer   packagersheet	xml_filesfile_id	file_dataos_filenamexml_filename	is_binaryzipinfo	timestampir   r   r   r     sr   






zWorkbook._store_workbookc                 C   s   |r| }n|   }t| j}| |t|t}i d|d|d| jd| jd| jd| j	d| j
d| jd	| jd
| jd| jd| jd| jd| jd| jd| jd| j}|| | j| || j|< |S )Nr   r   rj   rG   r,   r%   r&   r'   r(   r)   r*   r+   rz   r.   r/   r2   r0   )r   r   rP   _check_sheetnamer   r   rj   rG   r,   r%   r&   r'   r(   r)   r*   r+   rz   r.   r/   r2   r0   _initializer   rS   )r{   r   r   r   r   	init_datar   r   r   r     sX   
	


zWorkbook._add_sheetc                 C   s   t d}|r|  jd7  _n|  jd7  _|d u s|dkr1|r)| jt| j }n| jt| j }t|dkr=td| |	|rHtd| |
dsR|drXtd| |  D ]}| |j krmtd	| q\|S )
Nz[\[\]:*?/\\]r   r   r   z.Excel worksheet name '%s' must be <= 31 chars.z4Invalid Excel character '[]:*?/\' in sheetname '%s'.'z7Sheet name cannot start or end with an apostrophe "%s".z5Sheetname '%s', with case ignored, is already in use.)r   r   rO   rN   rM   strrL   r   r   searchr   endswithr   lowerr   r   )r{   r   is_chartsheetinvalid_charr   r   r   r   r     sF   

zWorkbook._check_sheetnamec                 C   s,   |    |   |   |   |   d S N)_prepare_formats_prepare_fonts_prepare_num_formats_prepare_borders_prepare_fillsr   r   r   r   r   C  s
   z#Workbook._prepare_format_propertiesc                 C   s   g }g }| j D ]}|jd ur|| |jd ur|| qd gt| | _d gt| | _|D ]
}|j}|| j|< q0|D ]
}|j}|| j|< q=d S r*  )rT   r=   r   	dxf_indexr   rU   rW   )r{   rU   rW   r   r   
dxf_formatr   r   r   r+  U  s"   




zWorkbook._prepare_formatsc                 C   s6   t | j}|d= | jd ur|d= |D ]}|  qd S )Nr   )listrT   r+   _get_xf_index)r{   rT   r   r   r   r   _set_default_xf_indicesq  s   


z Workbook._set_default_xf_indicesc                 C   s   i }d}| j D ]!}| }||v r|| |_d|_q|||< ||_d|_|d7 }q|| _| jD ]}|js@|js@|js@|j	s@|j
rCd|_q/d S Nr   r   )rU   _get_font_key
font_indexhas_fontrZ   rW   
font_colorbolditalic	underlinefont_strikeouthas_dxf_font)r{   fontsr   r   keyr   r   r   r,    s*   



zWorkbook._prepare_fontsc                 C   s   i }d}d}| j | j D ]D}|j}t|ts$t|}|dkr d}||_q|dkr,d|_q|dkr4d|_q||v r>|| |_q|||< ||_|d7 }|jrP|d7 }q|| _d S )N   r   r   0General)	rU   rW   r@   r   r$  r   num_format_indexr=   r[   )r{   num_formatsr   r[   r   r@   r   r   r   r-    s4   

zWorkbook._prepare_num_formatsc                 C   s   i }d}| j D ]!}| }||v r|| |_d|_q|||< ||_d|_|d7 }q|| _td}| jD ]}| }||rBd|_	q4d S )Nr   r   z[^0:])
rU   _get_border_keyborder_index
has_borderrp   r   r   rW   r%  has_dxf_border)r{   bordersr   r   r@  rH  r   r   r   r.    s&   





zWorkbook._prepare_bordersc                 C   s.  i }d}d|d< d|d< | j D ]}|js|js|jr%d|_|j|_|j|_q| jD ]h}|jdkrD|jdkrD|jdkrD|j}|j|_||_|jdkr]|jdkr]|jdkr]|j|_d|_d|_|jdkrr|jdkrr|jdkrrd|_d|_| }||v r|| |_	d|_
q)|||< ||_	d|_
|d7 }q)|| _d S )Nr   r   z0:0:0r   z17:0:0)rW   patternbg_colorfg_colorhas_dxf_filldxf_bg_colordxf_fg_colorrU   _get_fill_key
fill_indexhas_fillrq   )r{   fillsr   r   tmpr@  r   r   r   r/    sD   







zWorkbook._prepare_fillsc                 C   s   | j }|  D ]O}|jrd}|j}|d|j||g |jr-d}|j}|d|j||g |js3|jrVd}d}|jrF|jrF|jd |j }n|j|j }|d|j||g q| |}|| _ | 	|| _
d S )Nr   _xlnm._FilterDatabaser   z_xlnm.Print_Arear   ,z_xlnm.Print_Titles)r\   r   autofilter_arear   r   print_area_rangerepeat_col_rangerepeat_row_range_sort_defined_names_extract_named_rangesr]   )r{   r\   r  r   sheet_ranger   r   r   r   #  s>   
zWorkbook._prepare_defined_namesc                 C   sn   |D ] }|\}}}}| dd }|d }||d |  q|jtdd |D ]}|  q.|S )N_xlnm.r   r#  z::   r@  )replacer'  r   r   sortoperator
itemgetterpop)r{   names	name_listdefined_name_rL   r   r   r   r\  L  s   
zWorkbook._sort_defined_namesc                 C   s  d}d}d}d}i }i }i }|   D ]}t|j}	t|j}
t|j}t|j}t|j}|j}d}|	s@|
s@|s@|s@|s@|s@q|	sF|
sF|rL|d7 }d}|jr|jrXd}|j}n|j}d }| 	||\}}}}}}}||v rs|| }n|d7 }|}|||< | j
|||g ||| t|
D ]G}|j| d }|j| d }| 	||\}}}}}}}||v r|| }n|d7 }|}|||< | j
|||g |||||||||||
 qt|	D ]}|d7 }|||| qt|D ]}||| qt|D ]N}|j| d }|j| d }|j| d }| 	||\}}}}}}}||v r)|| }n|d7 }|}|||< | j
|||g ||||||||||	 qt|D ]O}|j| d }|j| d }|j| d }| 	||\}}}}}}}||v r||| }n|d7 }|}|||< | j
|||g ||||||||||	 qN|r|j}| j
| q| jd d  D ]}|jdkr| j| qt| jd	d
 d| _|| _d S )Nr   Fr   Tr   r   r   r   c                 S   r   r*  )id)r   r   r   r   <lambda>  s    z,Workbook._prepare_drawings.<locals>.<lambda>ra  )r   r   rQ   ro   shapesheader_imagesfooter_imagesbackground_imagebackground_bytes_get_image_propertiesr   _prepare_backgroundr  _prepare_image_prepare_chart_prepare_shape_prepare_header_imagedrawingrR   rk  r  sortedrr   )r{   chart_ref_idimage_ref_idref_id
drawing_id	image_idsheader_image_idsbackground_idsr  chart_countimage_countshape_countheader_image_countfooter_image_counthas_backgroundhas_drawingrC   
image_data
image_typer   r   r   x_dpiy_dpidigestr   positionrx  r   r   r   r   r  g  s   


















zWorkbook._prepare_drawingsc                 C   s,  d}d}d}d}|st |d}| }n| }t| }	tj|}
t	d|dd d }t	d|d d d }t	d	|d d d }t	d
|d d d }t	d|dd d }t	d|d d d }d}d}d}d}||krd| j
d< | |\}}}}}nl|dkrd| j
d< | |\}}}}}nX||krd| j
d< | |\}}}nF|dkrd| j
d< | |\}}}}}n2|dkr||krd| j
d< | |\}}}}}n||krd| j
d< | |\}}}}}ntd| |r|std| |s|  |dkrd}|dkrd}||||
|||	fS )Nr   r   rb3sr   r`  >Hr   2s<L4s(   ,   s   PNGs   BMs    EMFs   GIF8Tpngi  jpegbmpl   M5 wmfemfgifz-%s: Unknown or unsupported image file format.z%%s: no size data found in image file.)openreadr  hashlibsha256	hexdigestr   r   basenamer   rn   _process_png_process_jpg_process_bmp_process_wmf_process_emf_process_gifr!   r    r   )r{   rC   r  r   r   r  r  fhdatar  
image_namemarker1marker2marker3marker4marker5marker6
png_marker
bmp_marker
emf_marker
gif_markerr  r   r   r   rr    sh   









zWorkbook._get_image_propertiesc                 C   sZ  d}t |}d}d}d}d}d}|s||k rtd||d |d  d }	td||d |d  d }
|
dkrVtd||d |d	  d }td||d	 |d
  d }|
dkrtd||d |d	  d }td||d	 |d
  d }td||d
 |d  d }|dkr|d }|d }|
dkrd}q||	 d	 }|s||k sd||||fS )N   Fr   r   z>Ir`  r  s   IHDR      s   pHYsb   r   g
F%u?s   IENDTr  r   r   )r{   r  offsetdata_length
end_markerr   r   r  r  lengthmarker	x_density	y_densityunitsr   r   r   r  >  s4   zWorkbook._process_pngc                 C   s  d}t |}d}d}d}d}d}|s||k rtd||d |d  d }	td||d |d  d }
|	d@ dkrd|	d	krd|	d
krd|	dkrdtd||d |d  d }td||d |d  d }|	dkrtd||d |d  d }td||d |d  d }td||d |d  d }|dkr|}|}|dkr|d }|d }|dkrd}|dkrd}|	dkrd}q||
 d }|s||k sd||||fS )Nr   Fr   r   r  r`  i  i  i  i  i        	   i  r     r     r  r   gRQ@i  Tr  r  )r{   r  r  r  r  r   r   r  r  r  r  r  r  r  r   r   r   r  f  sH   (zWorkbook._process_jpgc                 C   sB   d}d}t d|dd d }t d|dd d }d||||fS )Nr   <h   r  r   r   r  r   )r{   r  r  r  r   r   r   r   r   r    s
   zWorkbook._process_gifc                 C   s6   t d|dd d }t d|dd d }d||fS )Nr        r      r  r   )r{   r  r   r   r   r   r   r    s   
zWorkbook._process_bmpc                 C   s   d}d}t d|dd d }t d|dd d }t d|dd d }t d|dd d }t d	|dd
 d }t|| | | }	t|| | | }
d|	|
||fS )Nr   r  r  r  r   r   r  r  z<Hr  r  )r   r   )r{   r  r  r  x1y1x2y2inchr   r   r   r   r   r    s   zWorkbook._process_wmfc                 C   s  t d|dd d }t d|dd d }t d|dd d }t d|dd d }|| }|| }t d|dd d }t d|dd	 d }	t d|d	d
 d }
t d|d
d d }d|
|  }d||	  }|d | }|d | }|d7 }|d7 }d||||fS )Nz<lr  r  r   r               $   r  g{Gz?gffffff9@r   r  r   )r{   r  bound_x1bound_y1bound_x2bound_y2r   r   frame_x1frame_y1frame_x2frame_y2width_mm	height_mmr  r  r   r   r   r    s"   zWorkbook._process_emfc           
      C   s   g }|D ]@}|d }|d }|d }|dkrqd|v rD| dd\}}|dr5|dd}	|d |	 }n
|dkr?|d | }|| q|S )	Nr   r   r   rV  !r_  r   r   )splitr   rb  r   )
r{   r\   r]   ri  r   r   r^  rL   rj  	xlnm_typer   r   r   r]    s"   

zWorkbook._extract_named_rangesc                 C   s$   | d}|| jv r| j| jS d S )Nr#  )striprS   r   )r{   r   r   r   r   r     s   

zWorkbook._get_sheet_indexc           
      C   s   d}d}d}d}d}d}d}|   D ]Y}|js|jsq|d7 }|jrT|jr0|d7 }|d7 }d| _|d7 }|||||}	|dtd|	 d  7 }|dtd|	 d  7 }|jre|d7 }|d7 }||| || _|| _qd S )Nr   r   i   T)	r   has_vmlhas_header_vmlrv   _prepare_vml_objectsr   _prepare_header_vml_objectsrc   rd   )
r{   
comment_idvml_drawing_idvml_data_idvml_header_idvml_shape_id	vml_filescomment_filesr  countr   r   r   r     sB   zWorkbook._prepare_vmlc                 C   sB   d}i }|   D ]}t|j}|sq||d | ||7 }qd S r5  )r   r   tablesr  )r{   table_idseenr  table_countr   r   r   r  2  s   

zWorkbook._prepare_tablesc                 C   s   |   D ]}|jrd| _qd S )NT)r   has_dynamic_arraysrx   )r{   r  r   r   r   r  @  s
   zWorkbook._prepare_metadatac                 C   sH  i }i }g }|   D ]}|||j< q
| jD ]}|| |jr%||j q|D ]y}|j D ]q}|j| }|j| d urQ||vsG|| d u rP|j| }|||< q/||v r]|| |j|< q/| |\}	}
|	d u riq/|		drxg |j|< g ||< q/|	|vrt
d|	|f  g |j|< g ||< q/||	 }|j|
 }||j|< |||< q/q(d S )N(zEUnknown worksheet reference '%s' in range '%s' passed to add_series())r   r   rQ   r   combinedformula_idskeysformula_data_get_chart_ranger   r   _get_range_data)r{   r   seen_rangesrQ   r   r   c_ranger_idr  r   cellsr   r   r   r  F  sT   









zWorkbook._add_chart_datac                 C   s   | d}|dkr|d | }||d d  }ndS |ddkr*|dd\}}n||}}|d}|dd}zt|\}}t|\}	}
W n
 tyR   Y dS w ||	kr]||
kr]dS ||||	|
gfS )Nr  r   r   NN:r#  z'')rfindfindr  r  rb  r   AttributeError)r{   r  posr   r   cell_1cell_2	row_start	col_startrow_endcol_endr   r   r   r    s&   


zWorkbook._get_chart_rangec                 C   s   | j   d S r*  )rj   _sort_string_datar   r   r   r   r     s   z!Workbook._prepare_sst_string_datac                 C   s   t  S r*  r   r   r   r   r   r     s   zWorkbook._get_packagerc                 C   s4   d}|d }|d }d|fd|fg}|  d| d S )Nz!http://schemas.openxmlformats.orgz/spreadsheetml/2006/mainz"/officeDocument/2006/relationshipsxmlnszxmlns:rr   )_xml_start_tag)r{   schemar  xmlns_r
attributesr   r   r   r     s   zWorkbook._write_workbookc                 C   sL   d}d}d}d}d|fd|fd|fd|fg}| j r|d | d	| d S )
Nxlr`  i  appName
lastEditedlowestEditedrupBuild)codeNamez&{37E998C4-C9E5-D4B9-71C8-EB1FF731991C}fileVersion)rk   r   _xml_empty_tag)r{   app_namelast_editedlowest_edited	rup_buildr  r   r   r   r     s   zWorkbook._write_file_versionc                 C   s$   | j dkrd S dg}| d| d S )Nr   )readOnlyRecommendedr   fileSharing)rw   r  r{   r  r   r   r   r     s   
zWorkbook._write_file_sharingc                 C   sL   d}g }| j r|d| j f | jr|d |d|f | d| d S )NiB r  )date1904r   defaultThemeVersion
workbookPr)rm   r   r&   r  )r{   default_theme_versionr  r   r   r   r     s   
zWorkbook._write_workbook_prc                 C   s    |  d |   | d d S )N	bookViews)r  _write_workbook_viewr   r   r   r   r   r     s   
zWorkbook._write_book_viewsc                 C   s   d| j fd| jfd| jfd| jfg}| jdkr|d| jf | jjdkr2| jjd }|d	|f | jjdkrA|d
| jjf | 	d| d S )NxWindowyWindowwindowWidthwindowHeightr;   tabRatior   r   
firstSheet	activeTabworkbookView)
re   rf   rg   rh   ri   r   rG   
firstsheetr   r  )r{   r  r0  r   r   r   r'    s   
zWorkbook._write_workbook_viewc                 C   sD   |  d d}|  D ]}| |j||j |d7 }q| d d S )Nsheetsr   )r  r   _write_sheetr   r   r   )r{   id_numr   r   r   r   r     s   

zWorkbook._write_sheetsc                 C   sD   d|fd|fg}|r| d | ddt| f | d| d S )Nr   sheetId)stater   zr:idrIdr  )r   r$  r  )r{   r   sheet_idr   r  r   r   r   r2  %  s   
zWorkbook._write_sheetc                 C   sl   d| j fg}| jdkr|d| jf |d n| jdkr&|d| jf | jr.|d | d| d S )NcalcIdr   calcMode)
calcOnSaverB  r   )fullCalcOnLoad1calcPr)ru   rs   r   rt   r  r!  r   r   r   r   3  s   


zWorkbook._write_calc_prc                 C   s8   | j sd S | d | j D ]}| | q| d d S )NdefinedNames)r\   r  _write_defined_namer   )r{   ri  r   r   r   r   B  s   

zWorkbook._write_defined_namesc                 C   s`   |d }|d }|d }|d }d|fg}|dkr | d|f |r'| d | d	|| d S )
Nr   r   r      r   r   localSheetId)r   r   definedName)r   _xml_data_element)r{   ri  r   r7  r^  r   r  r   r   r   r?  N  s   

zWorkbook._write_defined_namer  r*  )F)G__name__
__module____qualname____doc__r   r   r   r   rB   r   r   r   r   ry   r   r   r   r   r   r   r   r   r   r   r   r   r4   r   r   r   r   r   r   r   r+  r4  r,  r-  r.  r/  r   r\  r  rr  r  r  r  r  r  r  r]  r   r   r  r  r  r  r   r   r   r   r   r   r   r'  r   r2  r   r   r?  __classcell__r   r   r}   r   r$   0   s    h



4


,:
'
b
'.+;) M(5
"	*I$	r$   c                   @   s   e Zd ZdZdd ZdS )rF   z]
    A class to track worksheets data such as the active sheet and the
    first sheet.

    c                 C   s   d| _ d| _d S )Nr   )r   r0  r   r   r   r   rB   g  s   
zWorksheetMeta.__init__N)rD  rE  rF  rG  rB   r   r   r   r   rF   `  s    rF   )>r  rd  r   r   r  r   decimalr   	fractionsr   structr   warningsr   zipfiler   r	   r
   r   r   r   r   r   
chartsheetr   sharedstringsr   formatr   r  r   utilityr   
chart_arear   	chart_barr   chart_columnr   chart_doughnutr   
chart_liner   	chart_pier   chart_radarr   chart_scatterr   chart_stockr   
exceptionsr   r   r    r!   r"   r#   	XMLwriterr$   objectrF   r   r   r   r   <module>   sb   	              >