B t `±$ã@s<dZddlZddlZddlZddlmZGdd„deƒZdS)z4 A class for interacting with an Excel spreadsheet. éN)ÚExcelSpreadsheet_basec@sÌeZdZdd„Zdd„Zdd„Zd0d d „Zd1d d „Zdd„Zdd„Z dd„Z dd„Z d2dd„Z d3dd„Z dd„Zd4dd„Zd5dd „Zd6d!d"„Zd7d#d$„Zd8d%d&„Zd'd(„Zd9d)d*„Zd:d+d,„Zd;d.d/„ZdS)<ÚExcelSpreadsheet_openpyxlcCsdS)NT©)ÚselfrrúG/tmp/pip-unpacked-wheel-cqckmaqz/pyutilib/excel/spreadsheet_openpyxl.pyÚcan_readsz"ExcelSpreadsheet_openpyxl.can_readcCsdS)NTr)rrrrÚ can_writesz#ExcelSpreadsheet_openpyxl.can_writecCsdS)NFr)rrrrÚ can_calculatesz'ExcelSpreadsheet_openpyxl.can_calculateN©ér cCs,d|_d|_i|_|dk r(| |||¡dS)z Constructor. N)ÚwbÚxlsfileÚ_wsÚopen)rÚfilenameÚ worksheetsÚdefault_worksheetrrrÚ__init__"s z"ExcelSpreadsheet_openpyxl.__init__c Cst||_t ¡t d¡t |j¡|_WdQRX|jj|_i|_ x&|D]}|j|j|d|j |<qHW||_ dS)z5 Initialize this object from a file. ÚignoreNr ) r ÚwarningsÚcatch_warningsÚ simplefilterÚopenpyxlZ load_workbookr Z sheetnamesrrr)rrrrÚwsidrrrr,s    zExcelSpreadsheet_openpyxl.opencCs |j|jS)z The active worksheet )rr)rrrrÚws@szExcelSpreadsheet_openpyxl.wscCs | ¡dS)zB Close the spreadsheet when deleting this object. N)Úclose)rrrrÚ__del__Dsz!ExcelSpreadsheet_openpyxl.__del__cCs€|dkr dS||jkr,|j |¡}||j_nJ||jkrv|j |¡t|j ¡ƒd}|jj  |¡|j|<|j|  ¡||_ dS)z+ Activate a specific sheet Nr ) rÚindexr ÚactiverZ add_sheetÚlenZget_sheet_namesZ WorksheetsZItemZActivater)rÚnameÚidxrrrÚactivateJs     z"ExcelSpreadsheet_openpyxl.activatecCs$|dkr dS|jdkrdSi|_dS)z' Close the spreadsheet N)r)rrrrrZs  zExcelSpreadsheet_openpyxl.closecCs0|dkr|jjSt|ƒtk r$tdƒ‚||j_dS)Nz=ExcelSpreadsheet calc_iterations can only be set to a boolean)ÚxlZ IterationÚtypeÚboolÚ ValueError)rÚvalrrrÚcalc_iterationsds  z)ExcelSpreadsheet_openpyxl.calc_iterationscCs>|dkr|jjSt|ƒtttgks*|dkr2tdƒ‚||j_dS)NrzFExcelSpreadsheet max_iterations can only be set to nonnegative integer)r#Z MaxIterationsr$ÚintÚfloatÚlongr&)rr'rrrÚmax_iterationsls z(ExcelSpreadsheet_openpyxl.max_iterationscCs|j ¡dS)z7 Perform calculations in a spreadsheet N)r#Z Calculate)rrrrÚ calculatetsz#ExcelSpreadsheet_openpyxl.calculatec CsŠ| |¡|jj}|}|t|ƒd}|}|d} xRt||dƒD]>}x8t| |dƒD]$}||||j||||d_qZWqDWdS)Nr )ÚrowÚcolumn)r"r rrÚrangeÚcellÚvalue) rr.Úcolr'rrÚxloÚxhiÚyloÚyhirrrÚ set_arrayzs z#ExcelSpreadsheet_openpyxl.set_arrayFc Cs‚| |¡|jj}g}xb|j||||dD]L}g} x|D]}|  |j¡q8Wt| ƒdkrh| | d¡q*| t| ƒ¡q*Wt|ƒS)N)Zmin_colZmin_rowZmax_colZmax_rowr r)r"r rZ iter_rowsÚappendr2rÚlist) rr.r3Zrow2Zcol2rÚrawrÚansZans_rrrÚ get_array†s   z#ExcelSpreadsheet_openpyxl.get_arraycCs†t|ƒttfkr|ff}t|ƒtkr*|}nrt|ƒtttfkrœg}xR|D]J}t|ƒtkrb| |¡qFt|ƒtttfkr‚| |f¡qF| t|ƒ¡qFWt|ƒ}| |¡| |¡}|dk rðt|ƒ|  |¡krðt dt t|ƒƒdt |  |¡ƒƒ‚t |j ƒ}|j|dd}tjj |dd¡\} } } } xVt| | dƒD]B} x:t| | dƒD]&}|| ||j| | | |d_qRWqr:rCr r2r9r) rr?r;r<Ú_datarGrr.Zrvalsr1rrrrKßs      z)ExcelSpreadsheet_openpyxl._get_range_datacCs(| |¡| |¡}| |d¡}t|ƒS)z= Get the number of rows in a specified range F)r"r?rKr)rrDrr?rErrrr@üs   z)ExcelSpreadsheet_openpyxl.get_range_nrowscCs@| |¡| |¡}| |d¡}t|dƒtkrr)rrDrr?rErrrÚget_range_ncolumnss     z,ExcelSpreadsheet_openpyxl.get_range_ncolumnsTcCs¨| |¡yxt|ƒtkr$|jj|ŽSy |jj|Stk rDYnX|jj}d|krt| d¡}||d|d…S|||…SWn t dt |ƒdƒ‚YnXdS)z6 Return a range for a given worksheet rPrr zUnknown range name `ú'N) r"r$r>r Zget_squared_rangeZ defined_namesÚKeyErrorrÚsplitrArB)rZrangeidrÚ exceptionrZ_rangeidrrrr?s     z ExcelSpreadsheet_openpyxl._range)Nr r )r r )N)N)N)NF)N)NFF)NF)N)N)NT)Ú__name__Ú __module__Ú __qualname__rrr rrrrr"rr(r,r-r8r=rHrOrJrKr@rRr?rrrrrs*     '   r)Ú__doc__ÚosrrZpyutilib.excel.baserrrrrrÚ s