我正在创建一个脚本,将文件夹中的文件插入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>'
答案 0 :(得分: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代码中提供了一个图标路径,所以我在最后一个变量上做了一个假设。
另请注意,true
和false
是小写的。 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上讨论。