与Ruby混淆以保存带有excel列的任何扩展名的文件

时间:2013-01-28 12:04:37

标签: ruby win32ole

我正在创建一个脚本,将文件夹中的文件插入Excel columns,但似乎我做错了。任何人都能帮助我吗?

更新了Ruby代码:

require 'fileutils'
require 'win32ole'

#Excel Application will be started from here.
#--------------------------------------------

    excel = WIN32OLE.new('Excel.Application')
    excel.visible = true
    wb=excel.workbooks.open("E:\\WIPData\\Ruby\\Scripts\\Copy of GSL_File_DownLoad1.xlsx")
    wbs= wb.Worksheets(1)
    rows=2
    column=2

        until wbs.cells(rows,1).value == nil do


            Dir.entries("E:\\WIPData\\Ruby").each do |f|

                if f == wbs.cells(rows,1).value then

                  files_dir = File.expand_path("..", Dir.pwd)
                  column=2
                  Dir.foreach(files_dir.concat("/" + f)) do |x| 

                    full_path=files_dir.concat("/" + x)
                    wbs.cells(rows,column).Select
                    wbs.oleobjects.add({ 
                                            'Filename'      => full_path,
                                            'Link'          => true,
                                            'DisplayAsIcon' => false,
                                      })
                    column = column + 1

                  end

                    break
                end 

            end

        end

    wb.Save
    wb.Close(0)
    excel.Quit()

#Excel Application will be finished here.
#------------

错误:

E:/WIPData/Ruby/Scripts/test.rb:27:in `method_missing': (in OLE method `add': )
(WIN32OLERuntimeError)
    OLE error code:800A03EC in Microsoft Excel
      Cannot insert object.
    HRESULT error code:0x80020009
      Exception occurred.
        from E:/WIPData/Ruby/Scripts/test.rb:27:in `block (2 levels) in <main>'
        from E:/WIPData/Ruby/Scripts/test.rb:23:in `foreach'
        from E:/WIPData/Ruby/Scripts/test.rb:23:in `block in <main>'
        from E:/WIPData/Ruby/Scripts/test.rb:17:in `each'
        from E:/WIPData/Ruby/Scripts/test.rb:17:in `<main>'

1 个答案:

答案 0 :(得分:1)

您的问题出现在代码中的第25行。导致问题的方法是wbs.OLEObjects.Add(,full_path,False,True,,,f)

在VBA中,如果不需要参数,请将参数留空。但是,这在Ruby中不可用。

在原始宏中,您将关键字参数传递给方法。在Ruby中执行此操作的一种方法是使用HashRuby on Windows博客上的一篇文章建议这样做:

wbs.oleobjects.add({
    'Filename'      => full_path,
    'Link'          => false,
    'DisplayAsIcon' => true,
    'IconIndex'     => 0,
    'IconLabel'     => f,
    'IconFileName'  => icon_path
})

我没有看到你在Ruby代码中提供了一个图标路径,所以我在最后一个变量上做了一个假设。

另请注意,truefalse是小写的。 Ruby将大写版本作为常量或类读取。

如果您正在使用Ruby在Microsoft Office中工作,我强烈建议您经常光顾Ruby on Windows.作者似乎不再发布,但它仍然是相关来源。

修改

您的新错误可能是Dir.entries造成的。该方法在提取条目时会抓取...。我想,Excel正试图将这两个添加到工作表中。

有两种方法可以删除它。 1)在each块中跳过它们。

Dir.entries("E:\\WIPData\\Ruby").each do |f|
    next if ['.', '..'].include? f
    # The rest of your block code
end

2)使用不会返回...

Dir#glob
Dir.chdir("E:\\WIPData\\Ruby")
Dir.glob('*').each do |f|
    # Your block code
end

修改

出于文档的考虑,本主题也在Ruby Forums上讨论。