EliSquared
EliSquared

Reputation: 1559

Using XLWings with parallel processing

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.

Upvotes: 0

Views: 3224

Answers (1)

EliSquared
EliSquared

Reputation: 1559

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()

Upvotes: 6

Related Questions