Confusion with Ruby to save the files with any extensions to the excel columns

0

I am creating a script to insert the files from folders to the Excel columns, but it seems I am doing wrong. Can any one help me for the same?

updated Ruby Code:

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.
#------------

Error:

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>'
ruby
win32ole
asked on Stack Overflow Jan 28, 2013 by Arup Rakshit • edited Jan 28, 2013 by Arup Rakshit

1 Answer

1

Your problem is on line 25 in your code. It is the method wbs.OLEObjects.Add(,full_path,False,True,,,f) that is causing the problem.

In VBA, it is perfectly fine to leave parameters to a method blank if they are not required. However, this is not available in Ruby.

In your original Macro, you passed keyword arguments to the method. One way of doing this in Ruby is with a Hash. An article on the Ruby on Windows blog suggests doing it like so:

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

I did not see you provide an icon path in your Ruby code so I'm making an assumption on that final variable.

Also note that true and false are lowercase. Uppercase versions would be read by Ruby as either a constant or a class.

If you are doing work in Microsoft Office with Ruby, I would highly recommend frequenting Ruby on Windows. The author doesn't appear to post anymore but it is still a relevant source.

EDIT:

Your new error is probably due to Dir.entries. This method will grab . and .. when it pulls entries. I'd imagine Excel is tripping up on trying to add those two to the Worksheet.

There are two ways to remove this. 1) Skip them in your each block.

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

2) Use Dir#glob which will not return . and ..

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

EDIT:

For documentation's sake, this topic is also discussed on Ruby Forums.

answered on Stack Overflow Jan 28, 2013 by Charles Caldwell • edited Jan 28, 2013 by Charles Caldwell

User contributions licensed under CC BY-SA 3.0