динамически читать и / или перезаписывать файл Excel с помощью Python без появления предупреждения о перезаписи

1

По какой-то причине следующий код работает нормально, но предупреждение о перезаписи файла продолжает появляться, хотя я установил xl.EnableEvents = False, код не будет выполняться дальше, пока я не нажму вручную всплывающее окно перезаписи файла. Кто-нибудь знает, как это исправить?

Код открывает файл Excel, который содержит строку, которая позволяет файлу Excel подключаться к API Bloomberg. Я использовал это решение здесь, чтобы заставить это работать. Пока файл открыт в течение достаточного времени, данные извлекаются в файл, а затем сохраняются и завершаются. Получение данных занимает около 35 секунд, и таблица панд начинает отображать запрашиваемое мной содержимое.

Проблема в всплывающих окнах! - Мне нужно увидеть, когда строки "# N/A Requesting Data..." больше нет в файле, и я не вижу способа сделать это без периодического сохранения файла. Было бы замечательно решение, позволяющее мне динамически просматривать содержимое файла без необходимости сохранения.

Приведенное здесь решение не помогло мне остановить всплывающие окна, я мог бы каждый раз создавать новый файл, а затем удалять их все в конце, но это кажется немного неуклюжим. Этот вопрос расширяет эту проблему здесь, если кто-то хочет увидеть код и проблему в более полном контексте.

WB = 'C:/path/to/my/file.xlsx'
location = "EGLL"

def run_VWA(WB, location):
    """open the excel file, allow enough time to pull the data, then close and save"""

    bb = 'C:/blp/API/Office Tools/BloombergUI.xla'
    xl=win32com.client.DispatchEx("Excel.Application")  
    xl.Workbooks.Open(bb)
    xl.AddIns("Bloomberg Excel Tools").Installed = True

    wb = xl.Workbooks.Open(Filename=WB) #opens workbook in readonly mode.

    xl.Visible = False
    xl.EnableEvents = False
    xl.DisplayAlerts = False

    total=0
    colstring='#N/A Requesting Data...'
    while total < 40:
        wb.Save()   
        df = df_from_excel(WB, location)
        if colstring not in df:
            break
        time.sleep(3)
        total+=3


    wb.Close(SaveChanges=1)
    xl.DisplayAlerts = True
    xl.Quit()
    #Cleanup the com reference. 
    del xl   

    return

Любая помощь с этим очень ценится, у меня очень ограниченный опыт работы с библиотекой win32com.

  • 0
    Вы уверены, что вам нужно wb.Save() на каждой итерации? Должен быть другой способ запроса данных в электронной таблице.
  • 0
    Да, это то, на что я надеялся, но не был достаточно знаком с библиотекой, чтобы знать, как, я не смог найти никаких примеров ее переполнения стека - хотя, возможно, не зная правильных ключевых слов для поиска, мог подорвать мой поиск. Кто-нибудь еще сталкивается с этой проблемой, смотрите ответ ниже.
Теги:
excel
win32com
bloomberg

1 ответ

1

После нескольких часов копания я нашел, как решить эту проблему динамически без необходимости сохранять файл каждую итерацию. Если кто-то еще сталкивается с этой проблемой, большая часть решения была найдена здесь. Большое спасибо assylias за некоторые полезные указатели.

def run_VWA(WB, location):
    """open the excel file, allow enough time to pull the data, then close and save"""

    bb = 'C:/blp/API/Office Tools/BloombergUI.xla'
    xl=win32com.client.DispatchEx("Excel.Application")  
    xl.Workbooks.Open(bb)
    xl.AddIns("Bloomberg Excel Tools").Installed = True

    wb = xl.Workbooks.Open(Filename=WB) #opens workbook in readonly mode.

    xl.Visible = False
    xl.EnableEvents = False
    xl.DisplayAlerts = False

    count=0
    while True:
        readData = wb.Worksheets(location)
        allData = readData.UsedRange
        if allData.Rows.Count > 1 or allData.Columns.Count > 1:
            print('rows: {}'.format(allData.Rows.Count))
            print('cols: {}'.format(allData.Columns.Count))
            break
        print(wb)
        print(count)
        time.sleep(3)
        count+=3


    wb.Close(SaveChanges=1)
    xl.DisplayAlerts = True
    xl.Quit()
    #Cleanup the com reference. 
    del xl   

    return

Ещё вопросы

Сообщество Overcoder
Наверх
Меню