0

我正在创建一个脚本来将文件夹中的文件插入到 . 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>'
4

1 回答 1

1

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

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

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

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

我没有看到您在 Ruby 代码中提供图标路径,因此我对最终变量进行了假设。

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

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

编辑:

您的新错误可能是由于Dir.entries. 此方法将抓取...何时拉取条目。我想 Excel 会尝试将这两个添加到工作表中。

有两种方法可以删除它。each1)在你的街区跳过它们。

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 论坛上进行了讨论。

于 2013-01-28T13:51:57.553 回答