Source code for capiq_excel.workbook.populate
from win32com.client import constants
from pywintypes import com_error
import time
import traceback, sys
from .wait import _wait_for_capiq_result
from ..exceptions import WorkbookClosedException, CapitalIQInactiveException
from exceldriver.tools import _restart_excel_with_addins_and_attach
[docs]def populate_capiq_for_file(filepath, excel, retries_remaining=3, close_workbook=False, index=0):
"""
Private function has main functionality. This is a wrapper to add retries afer com errors
"""
# Even if things are going normally, restart every 500 worksheets as there is a memory leak
if index % 500 == 0 and retries_remaining == 3:
excel = _restart_excel_with_addins_and_attach()
# Stop retries
if retries_remaining <= 0:
print(fr'ERROR: Could not process {filepath}. Skipping and moving to "..\failed".')
return excel, False
try:
# If we are retrying, need to close the workbook before trying to populate
if close_workbook:
excel.CutCopyMode = False
time.sleep(1)
if excel.ActiveWorkbook:
excel.ActiveWorkbook.Close(SaveChanges=False)
time.sleep(5)
_populate_capiq_for_file(filepath, excel)
return excel, True
except (com_error, WorkbookClosedException, CapitalIQInactiveException) as e:
print(f'Error {e} populating {filepath}. Will wait 30 seconds, restart Excel, and try again.')
traceback.print_tb(sys.exc_info()[2])
time.sleep(30)
excel = _restart_excel_with_addins_and_attach()
return populate_capiq_for_file(filepath, excel, retries_remaining=retries_remaining - 1, close_workbook=True)
def _populate_capiq_for_file(filepath, excel):
wb = excel.Workbooks.Open(filepath)
successful = _wait_for_capiq_result(excel)
_copy_paste_values(excel, wb)
excel.ActiveWorkbook.Close(SaveChanges=True)
return successful
[docs]def populate_capiq_ids_for_file(filepath, excel):
wb = excel.Workbooks.Open(filepath)
successful = _wait_for_capiq_result(excel)
_copy_paste_values(excel, wb, range='A1:H3000')
excel.ActiveWorkbook.Close(SaveChanges=True)
return successful
def _copy_paste_values(excel, wb, range='A1:ZZ20000'):
ws = wb.Sheets('Sheet')
ws.Range(range).Copy()
ws.Range(range.split(':')[0]).PasteSpecial(Paste=constants.xlPasteValues, Operation=constants.xlNone)
excel.CutCopyMode = False