win32com + Excel + Django + Apache = проблема

У меня есть проблема с открытием документа Excel в веб-приложении, работающем под Apache (mod_wsgi)/Windows 2008 Server (нет проблем, когда приложение работает на сервере разработчика django - один поток).

Мой код:

def my_view(request):
   import pythoncom
   from win32com.client import DispatchEx

   pythoncom.CoInitializeEx(pythoncom.COINIT_MULTITHREADED)
   xl = win32com.client.dynamic.Dispatch('Excel.Application')
   xl.DisplayAlerts = False
   xl.Visible = 0
   doc = xl.Workbooks.Open("C:\\path\\to\\file.xlsx")
   doc.Saved = True
   ...
   wb.Close(SaveChanges=0)
   xl.Quit()
   pythoncom.CoUninitialize()

Сообщение об ошибке:

(-2147352567, 'Исключение произошло.', (0, u'Microsoft Office Excel', u"Microsoft Office Excel не может получить доступ к файлу 'C:\path\to \file.xlsx'. Возможных причин несколько: файл имя или путь не существуют. Файл используется другой программой. Книга, которую вы пытаетесь сохранить, имеет то же имя, что и открытая в данный момент книга.", u'C:\Program Files (x86)\Microsoft Office\Office12 \\1033\XLMAIN11.CHM', 0, -2146827284), нет)

Я знаю, что проблема локализована где-то в многопоточности, но где? Я использую pythoncom.CoInitializeEx(pythoncom.COINIT_MULTITHREADED). Может смена сервера решит проблему?

Библиотеки: Django 1.2, Apache 2.2 (mod_wsgi), win32com (последняя версия)

Я надеюсь, что кто-нибудь может мне помочь.

Спасибо! С уважением.


person meme    schedule 26.01.2011    source источник


Ответы (2)


После нескольких часов изучения той же самой проблемы я нашел решение. Это не связано с pythoncom/win32com, а с тем, что апач работает как сервис. Решение можно найти здесь:

http://social.msdn.microsoft.com/Forums/en/innovateonoffice/thread/b81a3c4e-62db-488b-af06-44421818ef91

Решение состоит в том, чтобы просто создать одну папку и предоставить ей права на запись от соответствующего пользователя (apache):

64-битные окна - создайте эту папку:

C:\Windows\SysWOW64\config\systemprofile\Desktop

32-битные окна - создайте эту папку:

C:\Windows\System32\config\systemprofile\Desktop
person ichorev    schedule 04.09.2011

Я бы рекомендовал использовать модуль xlrd для чтения файлов Excel из (потокового) проекта django, поскольку Сам Office привередлив к тому, чтобы не находиться в потоке main/GUI.

person Ryan Ginstrom    schedule 26.01.2011
comment
К сожалению, я не могу. Мне приходится управлять многими макросами и выполнять другие тяжелые операции в Excel. - person meme; 26.01.2011
comment
В таком случае сработает ли решение для опроса? Создайте отдельный процесс, который ожидает запросов на чтение файлов Excel и обрабатывает их в основном (GUI) потоке. - person Ryan Ginstrom; 26.01.2011
comment
Я пытался. В этом случае вам нужно вызвать этот отдельный процесс из процесса apache, и результат будет таким же;/ - person meme; 26.01.2011