我有一个老的ruby程序,它从一个excel文件中提取值并将摘要存储在另一个excel文件中。为此,程序使用ruby中的win32ole库。在切换到使用Windows 7 64位(而不是Windows XP 32位)、Office 2007而不是Office 2003的新计算机后,程序现在在存储生成的Excel文件时抛出错误:
ana.rb:120:in `method_missing': SaveAs (WIN32OLERuntimeError)
OLE error code:800A03EC in Microsoft Office Excel
'c:/my/dir' could not be accessed. The file could be corrupt, is on a server that does not react, or the file is write protected.
(German: Auf 'c:/my/dir' konnte nicht zugegriffen werden. Unter Umstaenden ist die Datei beschaedigt, befindet sich auf einem Server, der nicht mehr reagiert, oder die Datei ist schreibgeschuzetzt.)
HRESULT error code:0x80020009
Ausnahmefehler aufgetreten.
from ana.rb:120:in `save'
from ana.rb:54:in `generateReport'
from ana.rb:13:in `ana'
from ana.rb:191
该计划的相关部分包括:
def generateReport
...
report.save(basicdir + reportfile)
...
end
在报告中:
class EasyExcel
def initialize(path)
@path = path
@excel = excel = WIN32OLE.new("excel.application")
@workbook = @excel.Application.Workbooks.Open(@path)
@cache = Array.new
end
def save(filename)
saveCache
@workbook.SaveAs(filename)
end
第120行是
@workbook.SaveAs(filename)
。此时filename
的值为c:/projekte/itcampus/feedback-analyse/feedback_report.xls
。经过一些调试,我注意到由于我的ruby异常处理不好,在ruby解释器停止之后,有两个excel挂起的实例。因此,问题似乎真的是由于在Windows7上的Excel中处理路径的改变。有人知道下列问题的答案吗:
失败的原因可能是什么:64位而不是32位,使用office 2007而不是2003,或者两者兼而有之?
是否有解决方法或修复方法来使用到Windows764bit的网桥以及来自Ruby的Word或Excel之类的应用程序?
如何从ruby的windows应用程序中找到可用的api?
我试过的ruby解释器是:
Ruby 1.8.7(2011-02-18补丁级别334)[i386-mingw32]
红宝石1.9.2p180(2011-02-18)[i386-mingw32]
最佳答案
感谢所有对我的问题提出意见和评论的人。最后,我找到了解决办法。
class EasyExcel
....
def save(filename)
saveCache
dos_file = filename.gsub(/\//, "\\\\")
@workbook.SaveAs(filename)
end
这将(ruby)路径中的每个正斜杠替换为2个反斜杠,然后在最后计算为1个反斜杠。
所以打开一个excel
@workbook = @excel.Application.Workbooks.Open(@path)
(与
@path
类似C:/projekte/itcampus/feedback-analyse/feedback/Bewertungsbogen_XX1404.xls
)工作,但
@workbook.SaveAs("c:/projekte/itcampus/feedback-analyse/feedback_report.xls")
没有。很奇怪!