2011-01-26 3 views
0

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

Мой код: сообщение

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», и" Microsoft Office Excel не может получить доступ к file 'C: \ path \ to \ file.xlsx'. Существует несколько возможных причин. Имя файла или путь не существует. Файл используется другой программой. В рабочей книге, которую вы пытаетесь сохранить, есть . то же имя, что и в настоящее время открытая книга . ", u'C: \ Progra m Файлы (x86) \ Microsoft Office \ Office12 \ \ 1033 \ XLMAIN11.CHM ', 0, -2146827284), None)

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

Libs: Django 1.2, Apache 2.2 (mod_wsgi), win32com (последний)

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

Thank you, Отношения.

ответ

0

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

+0

К сожалению, я не могу. Мне нужно управлять многими макросами и выполнять другие тяжелые операции Excel. – meme

+0

В таком случае, будет ли опробованное решение? Имейте отдельный процесс, который ждет запросов на чтение файлов Excel и обрабатывает их в основном потоке (GUI). –

+0

Я пробовал. В этом случае вы должны вызвать этот выделенный процесс из процесса apache, и результат будет таким же: / – meme

3

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

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

Решение состоит из просто сделать одну папку и придав ей написать разрешения от соответствующего (Apache) пользователь:

64-разрядные Windows - создать эту папку :

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

32-разрядные окна - создать эту папку:

C:\Windows\System32\config\systemprofile\Desktop 
Смежные вопросы