0

So I am new to parallel processing, but I was starting to get it working for parsing multiple Excel files simultaneously. It works well with when I only use openpyxl, but that is a basic XML parser as I understand it. When I include the part that uses XLWings (I like to take advantage of its ability to evaluate equations in Excel for file verification purposes), I get the following error:

pywintypes.com_error: (-2147221008, 'CoInitialize has not been called.', None, None)

This is roughly the code I use to initialize a new XLWings instance and load a workbook:

def openWorkbook(self, filePath):
    app = xw.apps.add()
    app.display_alerts = False
    app.screen_updating = False
    wb = self.app.books(filePath) #Note that this is called only once for each workbook.
    app.screen_updating = True
    app.quit()

Is there some way to get XLWings to open several simultaneous instances of Excel? Should I try doing something like this? If so, I am not sure how the initialization would work with giving threads over to XLWings.

EliSquared
  • 1,409
  • 5
  • 20
  • 44

1 Answers1

6

So I figured out the solution, it was actually surprisingly easy. I just added pythoncom.CoInitialize() from pythoncom package before my xw.apps.add() call:

ParallelProcessController.py

from multiprocessing.dummy import Pool
from LoadWorkbook import openWorkbook

def callOpenWorkbookInParallel(self, lsExcelFiles):
    pool = Pool(processes=3)
    
    pool.map(openWorkbook, lsExcelFiles)

LoadWorkbook.py

import xlwings as xw
import pythoncom

def openWorkbook(self, filePath):
  
  pythoncom.CoInitialize()

  app = xw.apps.add()
  wb = app.books(filePath)
  app.quit()
EliSquared
  • 1,409
  • 5
  • 20
  • 44
  • 1
    Wondering if you have a full example of this function? I'm struggling to adapt your code. Posted my question here: https://stackoverflow.com/questions/76714818/how-to-open-multiple-workbooks-with-xlwings-via-multiprocessing – user791411 Jul 18 '23 at 16:43