win32com + Excel + Django + Apache = 问题
我在一个运行在Apache(mod_wsgi)和Windows 2008 Server上的网页应用中遇到了一些打开Excel文档的问题(在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), None)
我知道问题可能和线程有关,但具体在哪里呢?我使用了pythoncom.CoInitializeEx(pythoncom.COINIT_MULTITHREADED)。也许换个服务器就能解决这个问题?
使用的库:Django 1.2,Apache 2.2 (mod_wsgi),win32com(最新版本)
希望有人能帮我。
谢谢,祝好。
3 个回答
ichorev 提出的解决办法对我没用。
不过我在 WSGIScriptAlias 中加上了 application-group=%{GLOBAL},这样就解决了问题。
这个解决方案的基础是 无法在除根目录以外的地方托管我的 wsgi 应用
像这样:
WSGIScriptAlias / "C:/Users/myuser/Documents/Platform/test-temp/test js playground/webproject/webproject/wsgi.py" application-group=%{GLOBAL}
我建议你使用 xlrd 这个模块来读取Excel文件,特别是在一个有多线程的django项目中,因为Office对运行环境比较挑剔,不喜欢在主线程或者图形界面线程中运行。
经过几个小时的研究,我终于找到了解决办法。这个问题和pythoncom或win32com没有关系,而是因为apache作为服务在运行。
解决方案可以在这里找到:
解决办法很简单,就是创建一个文件夹,并给相关的(apache)用户设置写入权限:
对于64位的Windows系统 - 创建这个文件夹:
C:\Windows\SysWOW64\config\systemprofile\Desktop
对于32位的Windows系统 - 创建这个文件夹:
C:\Windows\System32\config\systemprofile\Desktop