我有一个老的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")

没有。很奇怪!

10-08 13:31